安装包下载链接: https://pan.baidu.com/s/1-HLP6AbAdsy5-v82CBZNIQ 提取码: pkde
本文部署glusterfs集群在四台机器
192.168.117.129 gfs129
192.168.117.130 gfs130
192.168.117.131 gfs131
192.168.117.132 gfs132

GlusterFs离线安装(需在四台机器上操作)

1
2
3
4
5
6
rpm -Uvh xz-libs-5.2.2-1.el7.x86_64.rpm xz-5.2.2-1.el7.x86_64.rpm xz-libs-5.2.2-1.el7.i686.rpm --force --nodeps
rpm -ihv glusterfs-4.0.2-1.el7.x86_64.rpm glusterfs-libs-4.0.2-1.el7.x86_64.rpm --force --nodeps
rpm -ihv glusterfs-fuse-4.0.2-1.el7.x86_64.rpm glusterfs-client-xlators-4.0.2-1.el7.x86_64.rpm glusterfs-cli-4.0.2-1.el7.x86_64.rpm --force --nodeps
rpm -ihv userspace-rcu-0.10.0-3.el7.x86_64.rpm --force --nodeps
rpm -ivh rpcbind-0.2.0-44.el7.x86_64.rpm libtirpc-0.2.4-0.10.el7.x86_64.rpm --force --nodeps
rpm -ihv glusterfs-server-4.0.2-1.el7.x86_64.rpm glusterfs-api-4.0.2-1.el7.x86_64.rpm --force --nodeps

启动 Glusterfs

1
2
systemctl start glusterd.service
systemctl enable glusterd.service

添加hosts文件

1
2
3
4
5
[root@localhost ~]# vim /etc/hosts
192.168.117.129 gfs129
192.168.117.130 gfs130
192.168.117.131 gfs131
192.168.117.132 gfs132

【说明】添加hosts文件这一步不是必需。如果使用IP地址,之后添加节点时也必需使用IP地址。如果使用hosts文件,则4个节点都必需要添加相同的hosts文件

添加GlusterFS集群节点

【说明】本小节操作在任意节点操作即可,且进行操作前要先检查每台机器的防火墙是否关闭。

1
2
3
4
5
6
7
8
[root@gfs129 ~]# gluster peer probe gfs129
peer probe: success. Probe on localhost not needed
[root@gfs129 ~]# gluster peer probe gfs130
peer probe: success.
[root@gfs129 ~]# gluster peer probe gfs131
peer probe: success.
[root@gfs129 ~]# gluster peer probe gfs132
peer probe: success.

【说明】移除节点gluster peer detach gfs132

查看GlusterFS集群状态(任意节点)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@gfs129 ~]# gluster peer status
Number of Peers: 3

Hostname: gfs130
Uuid: f5af69ef-545a-4e34-be4a-4b3ab10b7caa
State: Peer in Cluster (Connected)

Hostname: gfs131
Uuid: 239e6236-ec2f-4b75-a39e-57eb8bd7144e
State: Peer in Cluster (Connected)

Hostname: gfs132
Uuid: 631f8255-06d7-45f3-ade3-da6eef88c908
State: Peer in Cluster (Connected)

查看GlusterFS volume

1
2
[root@gfs129 ~]# gluster volume info
No volumes present

创建Glusterfs所需磁盘

(1)查看磁盘情况
fdisk -l
(2)添加sdb磁盘
关机,菜单栏找到虚拟机—设置,点击硬盘—添加,按步骤走,重新开机就有sdb了
image
image image
image
(3)新建分区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@gfs129 ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x51a8f067.

Command (m for help): #输入n回车,n是“new”新建分区的意思
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): #默认值
Using default response p
Partition number (1-4, default 1): #默认值
First sector (2048-8388607, default 2048): #默认值
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-8388607, default 8388607): #默认值
Using default value 8388607
Partition 1 of type Linux and of size 4 GiB is set

Command (m for help): w # "write"并回车,意思是对刚才的结果进行保存
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

执行完后,效果如下图:
image
(4)格式化分区为XFS

1
mkfs.xfs -i size=512 /dev/sdb1

(5)挂载:

1
2
3
4
5
mkdir -p /glusterfs-data/data01/
mount /dev/sdb1 /glusterfs-data/data01/

vim /etc/fstab
/dev/sdb1 /glusterfs-data/data01 xfs defaults 0 0

注意:所有节点都需创建Glusterfs所需磁盘及glusterfs-data数据目录

创建GlusterFS volume(master节点)

分布式复制模式(组合型), 最少需要4台服务器才能创建。创建分布式复制卷需指定卷类型为replica(复制卷)(否则默认为分布式卷),卷类型后边参数是副本数量。Transport指定传输类型为tcp。传输类型后的brick server数量需是副本数量的倍数,且>=2倍。当副本数量与brick server数量不等且符合倍数关系时,即是分布式复制卷

1
2
[root@gfs129 glusterfs-data]# gluster volume create devops-volume replica 2 transport tcp gfs129:/glusterfs-data/data01/ gfs130:/glusterfs-data/data01/ gfs131:/glusterfs-data/data01/ gfs132:/glusterfs-data/data01/ force
volume create: devops-volume: success: please start the volume to access data

查看GlusterFS volume(任意节点)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@gfs130 ~]# gluster volume info

Volume Name: devops-volume
Type: Distributed-Replicate
Volume ID: 14573cf5-bd1d-4ce0-82b9-b44f13db60b3
Status: Created
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: gfs129:/glusterfs-data/data01
Brick2: gfs130:/glusterfs-data/data01
Brick3: gfs131:/glusterfs-data/data01
Brick4: gfs132:/glusterfs-data/data01
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off

启动GlusterFS volume

1
2
[root@gfs129 glusterfs-data]# gluster volume start devops-volume
volume start: devops-volume: success

再次查看GlusterFS volume(任意节点)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@gfs130 /]# gluster volume info

Volume Name: devops-volume
Type: Distributed-Replicate
Volume ID: 14573cf5-bd1d-4ce0-82b9-b44f13db60b3
Status: Started #与前一次查看,状态有所改变
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: gfs129:/glusterfs-data/data01
Brick2: gfs130:/glusterfs-data/data01
Brick3: gfs131:/glusterfs-data/data01
Brick4: gfs132:/glusterfs-data/data01
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off

客户端挂载GlusterFS

如果GlusterFS集群初始化使用了主机/etc/hosts中的信息,请在客户端也添加对应的信息。否则挂载过程会报错。这里就是需要在harbor所在的服务器上把hosts文件添加成跟glusterfs上一致,并且也需要在这台服务器上装一个glusterfs的客户端。安装方式同1中Glusterfs离线安装。

1
2
3
[root@localhost /]# mkdir -p /gfsdata01volume
[root@localhost /]# mount -t glusterfs gfs130:devops-volume /gfsdata01volume
注意:gfs130:devops-volume中也可为129,131,132

挂载成功后,效果如下:
image

设置开机自动挂载

1
2
[root@localhost harbor]#  vim /etc/fstab
gfs129:devops-volume /gfsdata01volume glusterfs defaults 0 0

Glusterfs的常用命令

参考自 https://blog.csdn.net/lincoln_2012/article/details/52201227

服务器节点

1
2
3
gluster peer status                          //查看所有节点信息,显示时不包括本节点
gluster peer probe   NODE-NAME //添加节点
gluster peer detach  NODE-NAME //移除节点,需要提前将该节点上的brick移除

glusterd服务

1
2
3
/etc/init.d/glusterd start      //启动glusterd服务
/etc/init.d/glusterd stop      //关闭glusterd服务
/etc/init.d/glusterd status   //查看glusterd服务

创建卷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<1>复制卷

语法:  gluster volume create NEW-VOLNAME [replica COUNT] [transport tcp | rdma | tcp, rdma] NEW-BRICK

示例1:gluster volume create test-volume replica 2 transport tcp server1:/exp1/brick server2:/exp2/brick


<2>条带卷

语法:gluster volume create NEW-VOLNAME [stripe COUNT] [transport tcp | rdma | tcp, rdma] NEW-BRICK...

示例:gluster volume create test-volume stripe 2 transport tcp server1:/exp1/brick server2:/exp2/brick


<3>分布式卷

语法:  gluster volume create NEW-VOLNAME [transport tcp | rdma | tcp, rdma] NEW-BRICK

示例1:gluster volume create test-volume server1:/exp1/brick server2:/exp2/brick
示例2:gluster volume create test-volume transport rdma server1:/exp1/brick server2:/exp2/brick server3:/exp3/brick server4:/exp4/brick


<4>分布式复制卷

语法: gluster volume create NEW-VOLNAME [replica COUNT] [transport tcp | rdma | tcp, rdma] NEW-BRICK...
示例: gluster volume create test-volume replica 2 transport tcp server1:/exp1/brick server2:/exp2/brick server3:/exp3/brick server4:/exp4/brick


<5>分布式条带卷

语法:gluster volume create NEW-VOLNAME [stripe COUNT] [transport tcp | rdma | tcp, rdma] NEW-BRICK...

示例:gluster volume create test-volume stripe 2 transport tcp server1:/exp1/brick server2:/exp2/brick server3:/exp3/brick server4:/exp4/brick


<6>条带复制卷

语法:gluster volume create NEW-VOLNAME [stripe COUNT] [replica COUNT] [transport tcp | rdma | tcp, rdma] NEW-BRICK...

示例:gluster volume create test-volume stripe 2 replica 2 transport tcp server1:/exp1/brick server2:/exp2/brick server3:/exp3/brick server4:/exp4/brick

启动卷

1
gluster volume start test-volume

停止卷

1
gluster volume stop test-volume

删除卷

1
gluster volume delete test-volume  //先停止卷后才能删除

查看卷

1
2
3
4
gluster volume list              /*列出集群中的所有卷*/
gluster volume info [all]      /*查看集群中的卷信息*/
gluster volume status [all]  /*查看集群中的卷状态*/
gluster volume status  [detail| clients | mem | inode | fd]

配置卷

1
gluster volume set <VOLNAME> <OPTION> <PARAMETER>

扩展卷

1
gluster volume add-brick <VOLNAME> <NEW-BRICK>

注意,如果是复制卷或者条带卷,则每次添加的Brick数必须是replica或者stripe的整数倍。

收缩卷

1
2
3
4
5
6
先将数据迁移到其它可用的Brick,迁移结束后才将该Brick移除:
# gluster volume remove-brick  start
在执行了start之后,可以使用status命令查看移除进度:
# gluster volume remove-brick  status
不进行数据迁移,直接删除该Brick:
# gluster volume remove-brick  commit

注意,如果是复制卷或者条带卷,则每次移除的Brick数必须是replica或者stripe的整数倍。

迁移卷

1
2
3
4
5
6
7
8
9
10
使用start命令开始进行迁移:
# gluster volume replace-brick  start
在数据迁移过程中,可以使用pause命令暂停迁移:
# gluster volume replace-brick  pause
在数据迁移过程中,可以使用abort命令终止迁移:
# gluster volume replace-brick  abort
在数据迁移过程中,可以使用status命令查看迁移进度:
# gluster volume replace-brick  status
在数据迁移结束后,执行commit命令来进行Brick替换:
# gluster volume replace-brick  commit

重新均衡卷

1
2
3
4
5
6
不迁移数据:
# gluster volume rebalance  lay-outstart
# gluster volume rebalance  start
# gluster volume rebalance  startforce
# gluster volume rebalance  status
# gluster volume rebalance  stop

添加Brick

1
# gluster volume add-brick test-volume 192.168.1.{151,152}:/mnt/brick2

删除Brick

1
2
3
4
5
6
7
若是副本卷,则移除的Bricks数是replica的整数倍
#gluster volume remove-brick test-volume 192.168.1.{151,152}:/mnt/brick2 start
在执行开始移除之后,可以使用status命令进行移除状态查看。
#gluster volume remove-brick test-volume 192.168.1.{151,152}:/mnt/brick2 status

使用commit命令执行Brick移除,则不会进行数据迁移而直接删除Brick,符合不需要数据迁移的用户需求。
#gluster volume remove-brick test-volume 192.168.1.{151,152}:/mnt/brick2 commit

替换Brick

任务:把192.168.1.151:/mnt/brick0 替换为192.168.1.151:/mnt/brick2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<1>开始替换
#gluster volume replace-brick test-volume 192.168.1.:/mnt/brick0 ..152:/mnt/brick2 start
异常信息:volume replace-brick: failed: /data/share2 or a prefix of it is already part of a volume

说明 /mnt/brick2 曾经是一个Brick。具体解决方法
# rm -rf /mnt/brick2/.glusterfs

# setfattr -x trusted.glusterfs.volume-id /mnt/brick2
# setfattr -x trusted.gfid  /mnt/brick2

//如上,执行replcace-brick卷替换启动命令,使用start启动命令后,开始将原始Brick的数据迁移到即将需要替换的Brick上。

<2>查看是否替换完

#gluster volume replace-brick test-volume 192.168.1.151:/mnt/brick0 ..152:/mnt/brick2 status
<3>在数据迁移的过程中,可以执行abort命令终止Brick替换。
#gluster volume replace-brick test-volume 192.168.1.151:/mnt/brick0 ..152:/mnt/brick2 abort

<4>在数据迁移结束之后,执行commit命令结束任务,则进行Brick替换。使用volume info命令可以查看到Brick已经被替换。

#gluster volume replace-brick test-volume 192.168.1.151:/mnt/brick0 .152:/mnt/brick2 commit
# 此时我们再往 /sf/data/vs/gfs/rep2上添加数据的话,数据会同步到 192.168.1.152:/mnt/brick0和192.168.1.152:/mnt/brick2上。而不会同步到
192.168.1.151:/mnt/brick0 上。

文件系统扩展属性

获取文件扩展属性

1
2
getfattr -d -m . -e hex filename
getfattr -d -m "trusted.afr.*" -e hex filename

日志文件路径

相关日志,在客户端机器的/var/log/glusterfs/目录下,可根据需要查看;
如/var/log/glusterfs/brick/下是各brick创建的日志;
如/var/log/glusterfs/cmd_history.log是命令执行记录日志;
如/var/log/glusterfs/glusterd.log是glusterd守护进程日志。

Glusterfs容灾能力研究

glusterfs集群节点关机重启(单节点)

关机的机器没有设置开机自动挂载,关机重启后,挂载点消失 需手动重新挂载

1
mount /dev/sdb1 /glusterfs-data/data01/

若重新挂载后,出现关机重启后的机器的brick不正常,则在glusterfs集群节点重启数据卷即可:

1
2
gluster volume stop devops-volume
gluster volume start devops-volume

image

然后重新进入glusterfs目录,发现在关机期间,客户端新建的文件也同步过来了,但是和同一个副本集下的另一个副本的文件扩展属性有差别,如下(关机重启的是gfs131机器):
image
image
如果属性值如上,则可用gfs132的bcv2.txt文件去恢复gfs131的bcv2.txt文件。

【说明】
如果gfs131和gfs132都正常的情况下,客户端新往这两台机器写入数据(bcv3.txt),那么bcv3.txt的扩展属性都与上图1类似,没有trusted.afr.dirty属性值,两台机器重启时扩展属性值不变。证明此种情况下,两台机器的bcv3.txt数据是正常的。

如果gfs131正常,gfs132离线,客户端新往这两台机器写入数据(bcv4.txt),那么,重启gfs132后,该文件的扩展属性与上图1类似,没有trusted.afr.dirty属性值。bcv4.txt的扩展属性在gfs131中与上图2类似,有trusted.afr.dirty属性值且为0x000000000000。 证明此种情况下,gfs131机器的bcv4.txt数据是正常的,gfs132机器的bcv4.txt数据可能是不可靠的。

glusterfs集群节点关机重启(一个副本集下的双节点)

测试关闭了gfs131和gfs132,然后在客户端创建文件

1
touch distributed-replica{1..6}.txt

出现下述问题:
image
此时,数据就会丢失且无法恢复,应尽量避免此情况发生。

glusterfs集群状态检查

可以通过下述命令,对glusterfs集群进行健康状态的检查:
gluster volume status devops-volume
gluster volume info
下图即为正常
image