Fork me on GitHub
Suzf  Blog

GlusterFS 集群文件系统介绍

来源:http://opensgalaxy.com 作者:久坐尘埃

1.GlusterFS概述

GlusterFS是Scale-Out存储解决方案Gluster的 核心,它是一个开源的分布式文件系统,具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。GlusterFS借助TCP/IP或 InfiniBand RDMA网络将物理分布的存储资源聚集在一起,使用单一全局命名空间来管理数据。GlusterFS基于可堆叠的用户空间设计,可为各种不同的数据负载提 供优异的性能。

44164_13010488121P5t

图1 GlusterFS统一的挂载点

GlusterFS 支持运行在任何标准IP网络上标准应用程序的标准客户端,如图2所示,用户可以在全局统一的命名空间中使用NFS/CIFS等标准协议来访问应用数据。 GlusterFS使得用户可摆脱原有的独立、高成本的封闭存储系统,能够利用普通廉价的存储设备来部署可集中管理、横向扩展、虚拟化的存储池,存储容量 可扩展至TB/PB级。

How-to fix failed to load ZFS module

在debian 8  使用的过程中 发现 zfs 无法加载

# uname -r
4.x.x-0.bpo.1-amd64
# modprobe zfs
modprobe: FATAL: Module zfs not found.

相关的软件包已经安装了

$ dpkg -l | grep zfs
ii  debian-zfs                          7~jessie                    amd64        Native ZFS filesystem metapackage for Debian.
ii  libzfs2                             0.6.5.7-8-jessie            amd64        Native ZFS filesystem library for Linux
ii  zfs-dkms                            0.6.5.7-8-jessie            all          Native ZFS filesystem kernel modules for Linux
ii  zfsonlinux                          8                           all          archive.zfsonlinux.org trust package
ii  zfsutils                            0.6.5.7-8-jessie            amd64        command-line tools to manage ZFS filesystems
x 是一个正整数

获得注册的模块的版本号

$ dkms  status
spl, 0.6.5.x, 3.x.0-4-amd64, x86_64: installed
zfs, 0.6.5.x, 3.x.0-4-amd64, x86_64: installed

尝试手工编译模块

# dkms remove -m zfs -v 0.6.5.x --all
# dkms remove -m spl -v 0.6.5.x --all
# dkms add -m spl -v 0.6.5.x
# dkms add -m zfs -v 0.6.5.x
# dkms install -m spl -v 0.6.5.x
# dkms install -m zfs -v 0.6.5.x

If you get the same error, then reinstall the headers package:

# apt-get install --reinstall linux-headers-$(uname -r)

重新加载

$ sudo modprobe zfs
$ lsmod  | grep zfs
zfs                  2793472  1 
zunicode              331776  1 zfs
zcommon                53248  1 zfs
znvpair                90112  2 zfs,zcommon
spl                   102400  3 zfs,zcommon,znvpair
zavl                   16384  1 zfs
$ dkms status
spl, 0.6.5.x, 3.x.0-4-amd64, x86_64: installed
spl, 0.6.5.x, 4.x.0-0.bpo.1-amd64, x86_64: installed
zfs, 0.6.5.x, 3.x.0-4-amd64, x86_64: installed
zfs, 0.6.5.x, 4.x.0-0.bpo.1-amd64, x86_64: installed

Reference

[1] https://github.com/zfsonlinux/zfs/issues/1155

[译]Glusterfs Quick Start Guide

Step 1 – Have at least two nodes

在这两个节点上系统为 Fedora 22 (or later)这里以 Ubuntu 14.04.4 LTS 为例

主机名称为:

-- 172.16.9.10 eva.suzf.net  eva

-- 172.16.9.20 cali.suzf.net cali

内部网络互连 至少俩块硬盘,一个安装 OS,一个用来做 GlusterFS 的存储(sdb)。你会想从操作系统安装单独的GlusterFS存储,这将模拟真实的部署。 注意: GlusterFS 在 /var/lib/glusterd 下存储它的动态生成的配置文件。如果在任何时候GlusterFS无法写入这些文件(例如,当备份文件已满),它会给您的系统带来异常的行为; 或者更糟,完全把你的系统脱机。明智的做法是对目录创建单独的分区,例如 /var/log 以确保不会发生这种情况。

[译]How-to set up a redundant storage pool with ZFS and Ubuntu

如果您的数据没有冗余,没有备份,它几乎是不存在的。

大公司将处理任何数据量巨大的关键交易数据,采取数据冗余和备份措施确保数据安全。已经成为行业内的标准。但是对于中小型公司、SOHO(小型办公室、家庭办公室)来说,他们无法承受数据丢失所造成的损失。

不像大公司,许多小型企业,SOHO的和个人工作室甚至没有IT部门,更别说CTOs和CIOs了。

我曾亲自处理庞大的数据 – 我有超过6TB的存储。我在家里有一台文件服务器;
上面有我储存的家庭照片和我的所有文档,这是我生命中最重要的部分之一。

这种方法有很多优势:
因为我所有的数据都存储在同一个位置上,我可以很容易地管理,维护和保护它。
这是一个集中式的文件服务器,因此任何人在我的本地网络可以访问这些文件。
我可以在多个设备上工作 – 笔记本电脑,PC,平板电脑,手机,而不用担心他们之间复制文件。
如果我主要的个人电脑或笔记本电脑坏了,我不用担心抢救存储在计算机上的数据。因为没有什么是永远保存在我家这样的设备。

但是,让所有的鸡蛋放在一个篮子里,这不是一个好主意。所以,你必须给它添加冗余,确保有多个物理备份。

ZFS 就是答案

这里有两个优秀的文件系统可以做这个工作:ZFS 和 Btrfs。
BTRFS是非常新的,仍处于开发状态,所以我不建议使用它。
ZFS,在另一方面,是经过时间考验的,稳定的和极其丰富的功能:
它包括存储池(zpool),写入时复制,快照,数据完整性验证,自动修复,保护功能等。
但也有各地的ZFS一些授权问题,我已经写了以前。

起初,我想到了FreeNAS,跑了一段时间,但我更喜欢使用Linux和完全控制我的服务器。所以我选择了ZFS文件系统与Ubuntu。

以下是如何在Ubuntu上开始使用ZFS。
要求:
14.04 Ubuntu server
至少有三个硬盘驱动器。一个最为 Ubuntu系统的,它必须在一个单独的SSD或硬盘驱动器,两个用于存储池进行安装。
内存至少8GB(1GB为Ubuntu,然后每增加1TB数据增加1GB RAM)
任何像样的CPU。

建议:
我强烈建议任何文件服务器上使用 Ubuntu的LTS(长期支持)版本。
要创建RAID-Z,你最少需要两个具有相同的存储容量的SATA硬盘。如果您有不同容量的硬盘,总存储将是较小的硬盘驱动器的大小。
我强烈建议有第三个外部硬盘驱动器,这样你可以把你的数据定期备份。

一旦你有硬盘驱动器,就可以安装ZFS了。虽然ZFS预装在即将到来的Ubuntu16.04的发布,我们需要在14.04安装 PPA.

sudo apt-add-repository ppa:zfs-native/stable

之后更新 Repo

sudo apt-get update

现在安装软件和加载模块:

sudo apt-get install ubuntu-zfs

sudo /sbin/modprobe zfs

接着运行下面的命令检查在系统上是否有“pools”或硬盘驱动器存在:

sudo zfs list

输出的结果应该是 `no datasets available`。我们知道这里没有创建数据集,但是我们想检验它是否安装正确。 现在是创建磁盘驱动器存储池的时候了。因为您需要在您的系统上识别驱动器。所以第一次运行 lsblk 命令来识别每个驱动器。

sudo lsblk

记下块设备的名称,它应该是 ‘sda, sdb, sdc,’ 现在,我们需要找到每个驱动器的 ID, 我们将在驱动器的“池”中使用它。

sudo ls -l /dev/disk/by-id/

这个命令将会给你一段很长的输出。这是我的系统的一个例子(在我的Ubuntu系统中,我已删除输出的驱动器 SDA。在我的情况下,我将池中使用两个驱动器SDC和SDD):

[email protected]:~$ sudo ls -l /dev/disk/by-id/
total 0
lrwxrwxrwx 1 root root 9 Feb 20 17:48 ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E0318132 -> ../../sdc
lrwxrwxrwx 1 root root 9 Feb 20 17:48 ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E4LRJ111 -> ../../sdd
lrwxrwxrwx 1 root root 9 Feb 20 17:48 wwn-0x50014ee20922e8a8 -> ../../sdc
lrwxrwxrwx 1 root root 9 Feb 20 17:48 wwn-0x50014ee20b453ec7 -> ../../sdd

From this output note down the IDs that start with ‘wwn’, so in my case it was ‘wwn-0x50014ee20922e8a8’ and ‘wwn-0x50014ee20b453ec7’

现在让我以这种格式创建 zpool:

zpool create -f -o ashift=12 -m <mount_point> <pool_name> raidz <ID_of_the_first_drive> <id_of_the_second_drive>

在我的这种情况下,挂在点是 ‘/mnt/bank’, pool 是 ‘swapool’

zpool create -f -o ashift=12 -m /mnt/bank swapool raidz wwn-0x50014ee20922e8a8 wwn-0x50014ee20b453ec7

一旦做检查状态,这可能需要一段时间。

sudo zfs list

这一次,你会得到一些输出,这意味着你的 pool 创建成功。现在这两个硬盘将镜像文件。为了进一步增加冗余,你可以添加更多的驱动器。 在开始将文件复制到 pool 之前,您还有更多的工作要做。您必须创建 “数据集”,并将这些数据存储在这些数据集内。数据集是ZFS的功能创建的像目录或文件夹一样。您可以为不同的文件类型创建一些数据集或只创建一个数据集。一旦创建了一个数据集,您就可以在里面创建普通的目录或文件了。 这是创建数据集的命令:

sudo zfs create <pool_name>/directory_name

这里是在我的系统中的例子,我对不同类型的文件创建了不同的数据集:

sudo zfs create swapool/images
sudo zfs create swapool/music
sudo zfs create swapool/movies
sudo zfs create swapool/documents
sudo zfs create swapool/ebooks

这样,你将为您的数据有一个非常有组织的结构。 一旦创建了所有所需的数据集,您就需要在池中更改文件权限,以便正常的系统用户可以对其进行写入。

sudo chown -R user_name:group_name /path_of_pool

Example:

sudo chown -R swapnil:users /mnt/bank/

现在您的所有配置都配置完毕。开始将您的文件存储在新创建的冗余文件存储中。在后续的文章中,我将涉及到此存储的定期维护,如何自动备份驱动器上的数据,并通过本地网络访问此存储,将其变成一个文件服务器。

源文:How-to set up a redundant storage pool with ZFS and Ubuntu

相关链接:

http://open-zfs.org/wiki/System_Administration

https://www.freebsd.org/doc/zh_CN.UTF-8/books/handbook/filesystems-zfs.html

[译] Couchbase 使用 cbrestore 恢复数据

恢复使用 cbbackup 命令备份的 bucket 数据,使用 cbrestore 命令 恢复数据到一个 新的群集的bucket中。

当恢复数据的时候,你不得不根据你正在执行的还原类型选择一个合适的还原序列。恢复群集数据的方法 取决于备份群集的方式。

如果使用 cbbackup 备份 bucket 数据,你可以恢复数据到相同或者不同配置的群集中去。 这是因为cbbackup存储格式为bucket的数据的信息使其能够被恢复到新的群集上。

注意:如果数据是使用直接拷贝文件的方式备份的, 之后你恢复数据的时候必须恢复到相同群集中。

cbrestore 从使用 cbbackup 命令备份的数据中取信息存储到群集中。群集的配置不必匹配备份数据时所使用的。它可以在灾难恢复的情况下,将数据传送到一个新的群集中。或者是更新或者是扩展现有的群集版本。

因为数据可灵活恢复,它提供了许多不同的方案可以在已经备份的数据上执行:

恢复数据到不同大小和配置的群集中。
在相同 或不同配置的群集中 传输 或者 恢复数据到不同的 bucket。
恢复选定数据到 相同 或不同配置的群集一个不同的 bucket 中。

cbrestore 命令的基本用法:

cbrestore [options] [source] [destination]

Where:

[options]
    Options specifying how the information should be restored into the cluster. Common options include:

        --bucket-source

        Specify the name of the bucket data to be read from the backup data that will be restored.
        --bucket-destination

        Specify the name of the bucket the data will be written to. If this option is not specified, the data will be written to a bucket with the same name as the source bucket.
        --add

        Use --add instead of --set to avoid overwriting the existing items in the destination.

[source]
    The backup directory specified to cbbackup where the backup data was stored.

[destination]
    The REST API URL of a node within the cluster where the information will be restored.

cbrestore 命令一次只能恢复一个单独的bucket的数据。如果你备份了这个群集的bucket,则必须还原每个bucket到集群。所有目的bucket必须已经存在,因为 cbrestore 不会帮你要恢复的节点中创建配置bucket。

举个栗子
恢复一个单独的bucket 到群集中去:

cbrestore \
    /backups/backup-2012-05-10 \
    http://Administrator:[email protected]:8091 \
    --bucket-source=XXX
    [####################] 100.0% (231726/231726 msgs)
    bucket: default, msgs transferred...
    :                total |       last |    per sec
    batch :                  232 |        232 |       33.1
    byte  :             10247683 |   10247683 |  1462020.7
    msg   :               231726 |     231726 |    33060.0
    done

恢复bucket 到 群集中不同的 bucket 中:

cbrestore \
    /backups/backup-2012-05-10 \
    http://Administrator:[email protected]:8091 \
    --bucket-source=XXX \
    --bucket-destination=YYY
    [####################] 100.0% (231726/231726 msgs)
    bucket: default, msgs transferred...
    :                total |       last |    per sec
    batch :                  232 |        232 |       33.1
    byte  :             10247683 |   10247683 |  1462020.7
    msg   :               231726 |     231726 |    33060.0
    done

上面 msg 行统计的信息是恢复到群集中bucket 中文档的数量。

在恢复的时候过滤 key

cbrestore命令包括对于在备份过程中创建的文件过滤 Key 还原到数据库。
这是除了在备份过程中可用的过滤支持的另一方面。

该规范是以一个正则表达式的形式在cbrestore命令提供的一个参数。
例如,将以object开头的key的数据还原到一个bucket中:

cbrestore /backups/backup-20120501 http://HOST:8091 \
    -u Administrator -p password \
    -b default \
    -k '^object.*'
    2013-02-18 10:39:09,476: w0 skipping msg with key: sales_7597_3783_6
    ...
    2013-02-18 10:39:09,476: w0 skipping msg with key: sales_5575_3699_6
    2013-02-18 10:39:09,476: w0 skipping msg with key: sales_7597_3840_6
    [                    ] 0.0% (0/231726 msgs)
    bucket: default, msgs transferred...
    :                total |       last |    per sec
    batch :                    1 |          1 |        0.1
    byte  :                    0 |          0 |        0.0
    msg   :                    0 |          0 |        0.0
    done

只复制匹配到特定前缀的 keys 到默认的 bucket 中。对于跳过的每个键,提供了一个信息消息。
其余的输出显示转移的记录和正常的摘要。

通过拷贝文件恢复数据

要将数据恢复到相同配置的群集中,需要先关闭整个群集。当你恢复完数据之后,你需要将整个群集启动。在这种情况下,您正在用备份的数据文件的备份版本替换整个群集数据和配置,
然后用保存的群集文件的版本重新启动群集。
重要提示: 确保任何恢复的文件数组指定了适当的Couchbase用户。

当在同一个群集中恢复数据时,验证以下过程:
备份和恢复必须使用相同版本的 Couchbase。
整个群集必须包含相同数量的节点。
每个节点必须有相同的IP 或者 在备份的时候配置相同的主机名。
所有的 config.dat 配置文件以及所有数据库文件必须恢复到原来的位置。

完成还原过程所需的步骤是:
在所有节点上停止couchbase服务。
在每个节点上,从你的备份的文件中恢复数据库,stats.json,配置文件config.dat。
在每个节点上重启服务。

Parent topic: Backup and restore

源文: Restoring with cbrestore

 

How to Decrease an LVM Partition

Here we show you how to shrink an LVM volume or partition in Linux by first resizing the file system followed by resizing the logical volume.

See here if you’re instead trying to do the opposite and expand an LVM volume.

 

Note: In this example we are working in CentOS 7, some commands may differ in different Linux distributions. As of CentOS 7 the default file system is XFS which is not currently possible to shrink, this example is working with the ext4 file system.

In this example we will work through shrinking logical volume /var/centos/var from 10GB to 5GB.

Overview of Logical Volume Manager (LVM)

Before working through the resizing process it’s important you first understand some basic concepts around physical volumes, volume groups, logical volumes, and the file system.

  • Physical Volume (PV): This can be created on a whole physical disk (think /dev/sda) or a Linux partition.
  • Volume Group (VG): This is made up of at least one or more physical volumes.
  • Logical Volume (LV): This is sometimes referred to as the partition, it sits within a volume group and has a file system written to it.
  • File System: A file system such as ext4 will be on the logical volume.

[译] Couchbase 使用 cbbackup 备份

cbbackup 工具 是一个灵活的备份命令,使您可以备份本地数据和远程节点和涉及您的集群数据的不同组合:

单节点单buckets 单节点上所有buckets 整个群集上单个buckets 整个群集上所有buckets

备份可以在一个单独的节点直接拷贝文件,也可以通过连接远程群集然后通过数据流的形式保存到备份位置。备份可以运行在运行的节点或集群或脱机节点上执行。

cbbackup 命令可以以一种容易恢复的格式储存数据。当需要恢复的时候使用 cbrestore,你可以还原数据到任何配置的群集。源和目的群集不需要满足你使用 cbbackup 命令时保存的信息。

[译] Couchbase backup and restore

定期备份整个群集的数据,当需要恢复数据的时候可以最小化数据的不一致性。

备份你的数据应该是你的集群上定期的任务,以确保您不会在严重的硬件或安装失败的情况下丢失信息。

有许多用于执行备份的方法:

使用 cbbackup
cbbackup命令,可以在单个节点,单桶,或整个群集备份到一个灵活的备份架构,它可以将数据恢复到相同或不同的集群和水桶。所有的备份可以实时集群或节点上执行。该命令 cbbackup 是最灵活和推荐的备份工具。
使用 文件副本
正在运行的或脱机集群可以通过复制每个节点上的文件进行备份。使用这种方法,你只能还原到相同的配置群集。
注意:
由于Couchbase Server的灵活的特性,不可能创建整个集群的一个完整的即时备份和快照。因为数据总是被更新或修改,这是不可能采取正确的快照。
您必须备份和恢复整个集群,以尽量减少任何数据不一致。Couchbase是每个项目总是一致的,但不保证完全一致集群或顺序持久性。
 相关连接

[faq] Couchbase cant start because of the ip addr nightmare

许久之前,再次打开在本地 VM 创建的 Couchbase 有些异常 服务无法正常运行 查看日志,如下:
# /opt/couchbase/var/lib/couchbase/logs/info.log
[ns_server:warn,2016-08-15T13:47:59.536+08:00,[email protected]:dist_manager<0.129.0>:dist_manager:wait_for_address:121]Cannot listen on address `cb1.suzf.net`: eaddrnotavail
[ns_server:info,2016-08-15T13:47:59.536+08:00,[email protected]:dist_manager<0.129.0>:dist_manager:wait_for_address:125]Configured address `cb1.suzf.net` seems to be invalid. Giving OS a chance to bring it up.
[ns_server:error,2016-08-15T13:48:00.537+08:00,[email protected]:dist_manager<0.129.0>:dist_manager:init:178]Configured address `cb1.suzf.net` seems to be invalid. Will refuse to start for safety reasons.
看起来是说主机名称  cb.suzf.net  无效,以至于服务 无法正常启动。 O 想起来了, 曾经修改过 /etc/hosts 记录
#grep cb /etc/hosts
172.16.9.10     cb1.suzf.net
172.16.9.20     cb2.suzf.net
而当前的IP为
#ifconfig eth1|grep 'inet addr'
          inet addr:172.16.9.11  Bcast:172.16.9.255  Mask:255.255.255.0
下面来更正 hosts 记录
#grep cb /etc/hosts
172.16.9.11     cb1.suzf.net
172.16.9.20     cb2.suzf.net
It worked.

There are several ways you can provide hostnames:

  • When installing a Couchbase Server on a machine.
  • When adding a node to an existing cluster for an online upgrade.
  • Using a REST API call.

Hostname Errors

Provide the hostname and port for the node and administrative credentials for the cluster. The value you provide for hostname must be a valid hostname for the node. Possible errors that can occur:

  • Could not resolve the host name. The host name you provide as a parameter does not resolve to a IP address.
  • Could not listen. The host name resolves to an IP address, but no network connection exists for the address.
  • Could not rename the node because name was fixed at server start-up.
  • Could not save address after rename.
  • Requested name host name is not allowed. Invalid host name provided.
  • Renaming is disallowed for nodes that are already part of a cluster.
节选自: http://developer.couchbase.com/documentation/server/4.1/install/hostnames.html