环境
CentOS-7.6
IP: 192.168.2.7[1-3]
VIP: 192.168.2.80
hostname=node[1-3].local
配置解析
node[1-3].local
cat >> /etc/hosts <<'EOF'
192.168.2.71 node1.local
192.168.2.72 node2.local
192.168.2.73 node3.local
EOF
hostnamectl set-hostname node1.local
hostnamectl set-hostname node2.local
hostnamectl set-hostname node3.local
selinux firewalld
node[1-3].local
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/conf
firewall-cmd --set-default-zone=trusted
firewall-cmd --complete-reload
配置软件源
node[1-3].local
rm -f /etc/yum.repos.d/*.repo
curl -so /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo
curl -so /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
sed -i '/aliyuncs.com/d' /etc/yum.repos.d/Centos-7.repo /etc/yum.repos.d/epel-7.repo
yum install -y centos-release-gluster41
安装 glusterfs
node[1-3].local
yum install -y glusterfs-server
启动服务跟随系统启动
node[1-3].local
systemctl start glusterd
systemctl enable glusterd
配置集群
node1.local
配置信任池
gluster peer probe node2.local
gluster peer probe node3.local
从信任池中删除
gluster peer detach node3.local force
检查信任池状态
gluster peer status
netstat -antp | grep glusterd
配置分布式卷
node1.local
存储空间为所有设备的容量之和
配置存储位置
# node[1-3].local
mkdir -p /data/glusterfs/gv0
创建Gluster卷
gluster volume create gv0 transport tcp node1.local:/data/glusterfs/gv0 node2.local:/data/glusterfs/gv0 node3.local:/data/glusterfs/gv0 force
启动GlusterFS卷
gluster volume start gv0
gluster volume status
gluster volume info gv0
安装配置 keepalived
node[1-3].local
安装
yum install -y keepalived
配置
cat > /etc/keepalived/keepalived.conf <<'EOF'
! Configuration File for keepalived
global_defs {
router_id 10
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 110
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 125
}
virtual_ipaddress {
192.168.2.80
}
}
EOF
启动服务 跟随系统启动
systemctl start keepalived
systemctl enable keepalived
挂载
mount -t glusterfs -o defaults,_netdev 192.168.2.80:/gv0 /mnt
GlusterFS 五种卷
Distributed:分布式卷,文件通过 hash 算法随机分布到由 bricks 组成的卷上。 Replicated: 复制式卷,类似 RAID 1,replica 数必须等于 volume 中 brick 所包含的存储服务器数,可用性高。 Striped: 条带式卷,类似 RAID 0,stripe 数必须等于 volume 中 brick 所包含的存储服务器数,文件被分成数据块,以 Round Robin 的方式存储在 bricks 中,并发粒度是数据块,大文件性能好。 Distributed Striped: 分布式的条带卷,volume中 brick 所包含的存储服务器数必须是 stripe 的倍数(>=2倍),兼顾分布式和条带式的功能。 Distributed Replicated: 分布式的复制卷,volume 中 brick 所包含的存储服务器数必须是 replica 的倍数(>=2倍),兼顾分布式和复制式的功能。 分布式复制卷的brick顺序决定了文件分布的位置,一般来说,先是两个brick形成一个复制关系,然后两个复制关系形成分布。 企业一般用后两种,大部分会用分布式复制(可用容量为 总容量/复制份数),通过网络传输的话最好用万兆交换机,万兆网卡来做。这样就会优化一部分性能。它们的数据都是通过网络来传输的。
配置分布式卷
node1.local
存储空间为所有设备的容量之和
配置存储位置
mkdir -p /data/glusterfs/gv0
创建Gluster卷
gluster volume create gv0 transport tcp node1.local:/data/glusterfs/gv0 node2.local:/data/glusterfs/gv0 node3.local:/data/glusterfs/gv0 force
启动GlusterFS卷
gluster volume start gv0
gluster volume status
gluster volume info gv0
配置复制卷
存储空间为总容量的一半
# 注:复制模式,既AFR, 创建volume 时带 replica x 数量: 将文件复制到 replica x 个节点中
# gluster volume create gv2 replica 2 node1.local:/data/glusterfs/gv2 node2.local:/data/glusterfs/gv2 force
# gluster volume start gv2
# gluster volume info gv2 # 查看gv2信息 Type
配置条带卷
写入的时候是循环地一点一点在node01和node02的磁盘上
# gluster volume create gv3 stripe 2 node1.local:/data/brick3 node2.local:/data/brick3 force
# gluster volume start gv3
# gluster volume info gv3 # 查看gv2信息 Type
配置分布式复制
最少需要4台服务器才能创建
# 将原有的复制卷gv2进行扩容,使其成为分布式复制卷
# gluster volume stop gv2
# gluster volume add-brick gv2 replica 2 node3.local:/data/glusterfs/gv2 node4.local:/data/glusterfs/gv2 force
# gluster volume start gv2
# gluster volume info gv2 # 查看gv2信息 Type
注意:当你给分布式复制卷和分布式条带卷增加 bricks 时,你增加的 bricks 数目必须是复制或条带数目的倍数, 例如:你给一个分布式复制卷的 replica 为 2,你在增加 bricks 的时候数量必须为2、4、6、8等。 扩容后进行测试,发现文件都分布在扩容前的卷中。
配置分布式条带卷
# 将原有的复制卷gv3进行扩容,使其成为分布式条带卷
# gluster volume stop gv3
# gluster volume add-brick gv3 stripe 2 node3.local:/data/glusterfs/gv3 node4.local:/data/glusterfs/gv3 force
# gluster volume start gv3
# gluster volume info gv3 # 查看gv3信息 Type
分布式复制卷的最佳实践
1)搭建条件
- 块服务器的数量必须是复制的倍数
- 将按块服务器的排列顺序指定相邻的块服务器成为彼此的复制
- 例如,8台服务器:
- 当复制副本为2时,按照服务器列表的顺序,服务器1和2作为一个复制,3和4作为一个复制,5和6作为一个复制,7和8作为一个复制
- 当复制副本为4时,按照服务器列表的顺序,服务器1/2/3/4作为一个复制,5/6/7/8作为一个复制
2)创建分布式复制卷
磁盘存储的平衡 平衡布局是很有必要的,因为布局结构是静态的,当新的 bricks 加入现有卷,新创建的文件会分布到旧的 bricks 中,所以需要平衡布局结构,使新加入的 bricks 生效。布局平衡只是使新布局生效,并不会在新的布局中移动老的数据,如果你想在新布局生效后,重新平衡卷中的数据,还需要对卷中的数据进行平衡。
磁盘存储平衡
# gluster volume rebalance gv2 start
查看平衡存储状态
# gluster volume rebalance gv2 status
移除 brick
你可能想在线缩小卷的大小,例如:当硬件损坏或网络故障的时候,你可能想在卷中移除相关的 bricks。 注意:当你移除 bricks 的时候,你在 gluster 的挂载点将不能继续访问数据,只有配置文件中的信息移除后你才能继续访问 bricks 中的数据。当移除分布式复制卷或者分布式条带卷的时候,移除的 bricks 数目必须是 replica 或者 stripe 的倍数。 但是移除brick在生产环境中基本上不做的,如果是硬盘坏掉的话,直接换个好的硬盘即可,然后再对新的硬盘设置卷标识就可以使用了,后面会演示硬件故障或系统故障的解决办法。
# gluster volume stop gv2
# gluster volume remove-brick gv2 replica 2 node3.local:/data/glusterfs/gv2 node4.local:/data/glusterfs/gv2 force
# gluster volume start gv2
如果误操作删除了后,其实文件还在 /storage/brick1 里面的,加回来就可以了
# gluster volume add-brick gv2 replica 2 node3.local:/data/glusterfs/gv2 node4.local:/data/glusterfs/gv2 force
# gluster volume info gv2
删除卷
gluster volume stop gv1
gluster volume delete gv1
模拟误删除卷信息故障及解决办法
rm -rf /data/glusterfs/gv3
gluster volume sync node2.local
节点故障
物理故障 同时有多块硬盘故障,造成数据丢失 系统损坏不可修复 解决方法:
找一台完全一样的机器,至少要保证硬盘数量和大小一致,安装系统,配置和故障机同样的 IP,安装 gluster 软件, 保证配置一样,在其他健康节点上执行命令 gluster peer status,查看故障服务器的 uuid 例如 node2 故障可在其他节点查看
[root@node1 ~]# gluster peer status
Number of Peers: 2
Hostname: node2.local
Uuid: a2d1e5a4-56ff-498b-aed1-2377b27b1ee6
State: Peer in Cluster (Connected)
Hostname: node3.local
Uuid: c6aae718-c73d-4585-8f02-d1fec473fd38
State: Peer in Cluster (Connected)
[root@node2 ~]# sed -i 's/UUID=.*/UUID=a2d1e5a4-56ff-498b-aed1-2377b27b1ee6/' /var/lib/glusterd/glusterd.info
# 在信任存储池中任意节点执行 就会自动开始同步,但在同步的时候会影响整个系统的性能
# gluster volume heal gv2 full
# 查看状态
# gluster volume heal gv2 info
glustefs分布式存储优化
优化参数
Auth_allow # IP访问授权;缺省值(*.allow all);合法值:Ip地址
Cluster.min-free-disk # 剩余磁盘空间阀值;缺省值(10%);合法值:百分比
Cluster.stripe-block-size # 条带大小;缺省值(128KB);合法值:字节
Network.frame-timeout # 请求等待时间;缺省值(1800s);合法值:1-1800
Network.ping-timeout # 客户端等待时间;缺省值(42s);合法值:0-42
Nfs.disabled # 关闭NFS服务;缺省值(Off);合法值:Off|on
Performance.io-thread-count # IO线程数;缺省值(16);合法值:0-65
Performance.cache-refresh-timeout # 缓存校验时间;缺省值(1s);合法值:0-61
Performance.cache-size # 读缓存大小;缺省值(32MB);合法值:字节
Performance.quick-read # 优化读取小文件的性能
Performance.read-ahead # 用预读的方式提高读取的性能,有利于应用频繁持续性的访问文件
Performance.write-behind # 先写入缓存内,在写入硬盘,以提高写入的性能。
Performance.io-cache # 缓存已经被读过的、
优化参数调整
# 命令格式:
# gluster.volume set <卷><参数>
# 例如:
# 打开预读方式访问存储
[root@node01 ~]# gluster volume set gv2 performance.read-ahead on
# 调整读取缓存的大小
[root@mystorage gv2]# gluster volume set gv2 performance.cache-size 256M
常用命令
#看下节点有没有在线
gluster volume status nfsp
#启动完全修复
gluster volume heal gv2 full
#查看需要修复的文件
gluster volume heal gv2 info
#查看修复成功的文件
gluster volume heal gv2 info healed
#查看修复失败的文件
gluster volume heal gv2 heal-failed
#查看主机的状态
gluster peer status
#查看脑裂的文件
gluster volume heal gv2 info split-brain
#激活quota功能
gluster volume quota gv2 enable
#关闭quota功能
gulster volume quota gv2 disable
#目录限制(卷中文件夹的大小)
gluster volume quota limit-usage /data 30MB --/gv2/data
#quota信息列表
gluster volume quota gv2 list
#限制目录的quota信息
gluster volume quota gv2 list /data
#设置信息的超时时间
gluster volume set gv2 features.quota-timeout 5
#删除某个目录的quota设置
gluster volume quota gv2 remove /data
quota功能,主要是对挂载点下的某个目录进行空间限额。如:/mnt/gulster/data目录,而不是对组成卷组的空间进行限制。