# GlusterFS 4.1 版本选择和部署
[TOC]
## 1 前言相关
### 1.1 glusterfs优势
1、无元数据设计
GlusterFS设计没有集中或分布式元数据,取而代之的是弹性哈希算法。集群中的任何服务器、客户端都可利用哈希算法、路径及文件名进行计算,就可以对数据进行定位,并执行读写访问操作。
**结论:**
* 无元数据设计带来的好处是极大地提高了扩展性,同时也提高了系统的性能和可靠性。
* 如果需要列出文件或目录,性能会大幅下降,因为列出文件或目录,需要查询所在的节点并对节点中的信息进行聚合。
* 但是如果给定确定的文件名,查找文件位置会非常快。
2、服务器间的部署
GlusterFS集群服务器之间是对等的,每个节点服务器都掌握了集群的配置信息。
所有信息都可以在本地查询。每个节点的信息更新都会向其他节点通告,保证节点信息的一致性。
但是集群规模较大后,信息同步效率会下降,非一致性概率会提高。
3、客户端访问
首先程序通过访问挂载点的形式读写数据,对于用户和程序而言,集群文件系统是透明的,用户和程序根本感觉不到文件系统是本地还是远端服务器上。
读写操作会被交给VFS(Virtual File System,虚拟文件系统) 来处理,VFS会将请求交给FUSE内核模块,而FUSE又会通过设备/dev/fuse将数据交给GlusterFS Client。最后经过GlusterFS Client计算,并最终通过网络将请求或数据发送到GlusterFS Servers上。
>关于glusterfs的原理详情,可以参考以下文章
[glusterfs架构和原理](https://www.jianshu.com/p/a33ff57f32df)
[换个视角深入理解GlusterFS,GlusterFS缺点分析](https://www.jianshu.com/p/c62aee72a0a7)
glusterfs中文资料推荐刘爱贵博士的[GlusterFS原创资源系列](https://blog.csdn.net/liuben/article/details/17331557)
### 1.2 版本选择
网上大部分文章都是基于3.x版本部署的,但是3.x版本已经在centos7中的阿里云的epel源中消失了,最低的也是4.0版本
```sh
[root@kaifa-supply ~]# yum search centos-release-gluster
......
centos-release-gluster-legacy.noarch : Disable unmaintained Gluster repositories from the CentOS Storage SIG
centos-release-gluster40.x86_64 : Gluster 4.0 (Short Term Stable) packages from the CentOS Storage SIG repository
centos-release-gluster41.noarch : Gluster 4.1 (Long Term Stable) packages from the CentOS Storage SIG repository
centos-release-gluster5.noarch : Gluster 5 packages from the CentOS Storage SIG repository
centos-release-gluster6.noarch : Gluster 6 packages from the CentOS Storage SIG repository
centos-release-gluster7.noarch : Gluster 7 packages from the CentOS Storage SIG repository
```
并且明确的提示,4.0版本也是短期支持板,所以我们选择更新一些的4.1版本来部署
### 1.3 volume知识
存储类型介绍详见:[Setting Up Volumes - Gluster Docs](https://link.zhihu.com/?target=https%3A//docs.gluster.org/en/latest/Administrator%20Guide/Setting%20Up%20Volumes/)
在老版本中,共有7种卷类型
在新版本中,共有5种卷类型
共有的卷类型是:
* Distributed (分布式卷 根据hash结果存放,无备份,可直读)
* Replicated (复制卷 类似 RAID1,可直读)
* Distributed Replicated (分布式复制卷 类比 RAID10,可直读)
不同的卷类型是:
* 老版本中有stripe(条带卷),块存储方式,不能直读
* 以及基于条带卷组合的分布式条带卷,复制条带卷,分布式复制条带卷
* 新版本中放弃了stripe,启用了基于EC纠错码的Dispersed(纠错卷)
* 以及组合出的Distributed Dispersed(分布式纠错卷)
不过我们不用考虑那么多,因为常规都用**分布式复制卷**,优点如下
* 分布式存储,效率高
* 基于复制卷,数据有备份
* 文件可直读
* 所有版本都支持
当然Dispersed(纠错卷 类似于RAID5)从3.6开始一直更新到7.x版本,花费了gluster吞对大量心血,想了解的可以看这篇文章
* [GlusterFS Dispersed Volume(纠错卷)总结](https://blog.csdn.net/weiyuefei/article/details/79022639)
* [GlusterFS企业级功能之EC纠删码](https://blog.csdn.net/liuben/article/details/77776570)
## 2 服务部署
**参考** [官方:快速部署指南](https://docs.gluster.org/en/latest/Quick-Start-Guide/Quickstart/#purpose-of-this-document)
### 2.1 服务规划
| 操作系统 | IP | 主机名 | 附加硬盘 |
| ---------- | ---------- | ------------ | -------------------- |
| centos 7.4 | 10.0.0.101 | gf-node1 | sdb:5G |
| centos 7.4 | 10.0.0.102 | gf-node2 | sdb:5G |
| centos 7.4 | 10.0.0.103 | gf-node3 | sdb:5G |
### 2.2 环境准备
5台服务器都做以下相同操作
```sh
# 关闭防火墙、selinux等不解释
# 完成hosts解析
cat >>/etc/hosts <<EOF
10.0.0.101 gf-node01
10.0.0.102 gf-node02
10.0.0.103 gf-node03
EOF
# 安装4.1yum源和程序
yum install -y centos-release-gluster41
yum install -y glusterfs glusterfs-libs glusterfs-server
# 启动服务并开机启动
systemctl start glusterd.service
systemctl enable glusterd.service
systemctl status glusterd.service
```
### 2.3 格式化挂载磁盘
总共创建3个目录,brick1用来挂载sdb,另外两个目录作为本地文件夹
格式化磁盘
```sh
# 查看磁盘列表
[root@gf-node01 ~]# fdisk -l
Disk /dev/sdb: 5368 MB, 5368709120 bytes, 10485760 sectors
Disk /dev/sda: 53.7 GB, 53687091200 bytes, 104857600 sectors
# 不分区直接格式化磁盘
mkfs.xfs -i size=512 /dev/sdb
```
挂载磁盘
```sh
# 创建目录并挂载
mkdir -p /data/brick{1..3}
echo '/dev/sdb /data/brick1 xfs defaults 0 0' >> /etc/fstab
mount -a && mount
# 查看结果
[root@gf-node01 ~]# df -h|grep sd
/dev/sda2 48G 1.7G 47G 4% /
/dev/sdb 5.0G 33M 5.0G 1% /data/brick1
```
### 2.4 建立主机信任池
在任意一台主机上,执行以下命令都可以建立信任池,建立并不需要账号密码,因为默认是将部署环境考虑为安全的可信环境
```sh
# 建立可信池
gluster peer probe gf-node02
gluster peer probe gf-node03
# 查看状态
[root@gf-node01 ~]# gluster peer status
......
[root@gf-node01 ~]# gluster pool list
UUID Hostname State
4068e219-5141-43a7-81ba-8294536fb054 gf-node02 Connected
e3faffeb-4b16-45e2-9ff3-1922791e05eb gf-node03 Connected
3e6a4567-eda7-4001-a5d5-afaa7e08ed93 localhost Connected
```
**注意:** 一旦信任池建立后,只有在信任池中的节点才能添加新服务器信任池中
## 3 使用分布式复制卷
只实验GlusterFs的分布式复制卷,其他卷类型有需要的话参考百度自行测试
### 3.1 分布式复制卷创建说明
1. 命令`gluster volume create gv1 replica 3 DIR1 DIR2 DIR3 ....`
2. 副本数不能小于3 `replica 3`,否则会阻止创建,因为可能脑裂,会提示
```sh
Replica 2 volumes are prone to split-brain. Use Arbiter or Replica 3 to avoid this
```
3. 副本的数量如果等于副本数(3个),则是分布式卷,是倍数则是分布式复制卷
4. 会先将3个副本一组创建为复制卷,然后再将多个复制卷组成分布卷
5. 分布式复制卷的副本顺序,和创建命令相关,不会随机排列
6. 如果不是所有副本卷都是独立硬盘,需要添加`force`参数,否则会提示错误
```sh
volume create: gv1: failed:
The brick gf-node01:/data/brick2/gv1 is being created in the root partition. It is recommended that you don't use the system's root partition for storage backend. Or use 'force' at the end of the command if you want to override this behavior.
```
### 3.2 分布式复制卷创建
```sh
# 创建分布式复制卷
gluster volume create gv1 replica 3 \
gf-node01:/data/brick1/gv1 \
gf-node01:/data/brick2/gv1 \
gf-node02:/data/brick1/gv1 \
gf-node02:/data/brick2/gv1 \
gf-node03:/data/brick1/gv1 \
gf-node03:/data/brick2/gv1 \
force
# 启动卷
gluster volume start gv1
# 查看卷的状态
[root@gf-node01 ~]# gluster volume info
Volume Name: gv1
Type: Distributed-Replicate
Volume ID: e1e004fa-5588-4629-b7ff-048c4e17de91
Status: Started
Snapshot Count: 0
Number of Bricks: 2 x 3 = 6
Transport-type: tcp
Bricks:
Brick1: gf-node01:/data/brick1/gv1
Brick2: gf-node01:/data/brick2/gv1
Brick3: gf-node02:/data/brick1/gv1
Brick4: gf-node02:/data/brick2/gv1
Brick5: gf-node03:/data/brick1/gv1
Brick6: gf-node03:/data/brick2/gv1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
```
### 3.3 分布式复制卷的使用
```sh
# 挂载卷
[root@gf-node01 ~]# mount -t glusterfs gf-node01:/gv1 /mnt
# 写入数据测试
[root@gf-node01 ~]# touch /mnt/test{1..9}
[root@gf-node01 ~]# ls /mnt/test{1..9}
/mnt/test1 /mnt/test2 /mnt/test3 /mnt/test4 /mnt/test5 /mnt/test6 /mnt/test7 /mnt/test8 /mnt/test9
# 验证测试数据
[root@gf-node01 ~]# ls /data/brick*/*
/data/brick1/gv1:
test1 test2 test4 test5 test8 test9
/data/brick2/gv1:
test1 test2 test4 test5 test8 test9
[root@gf-node02 ~]# ls /data/brick*/*
/data/brick1/gv1:
test1 test2 test4 test5 test8 test9
/data/brick2/gv1:
[root@gf-node03 ~]# ls /data/brick*/*
/data/brick1/gv1:
test3 test6 test7
/data/brick2/gv1:
test3 test6 test7
```
**结论:** 可以看出前三个为一个复制集,后三个为一个复制集,所以创建卷的时候,卷的顺序很关键
- shell编程
- 变量1-规范-环境变量-普通变量
- 变量2-位置-状态-特殊变量
- 变量3-变量子串
- 变量4-变量赋值三种方法
- 变量5-数组相关
- 计算1-数值计算命令和案例
- 计算2-expr命令举例
- 计算3-条件表达式和各种操作符
- 计算4-条件表达式和操作符案例
- 循环1-函数的概念与作用
- 循环2-if与case语法
- 循环3-while语法
- 循环4-for循环
- 其他1-判断传入的参数为0或整数的多种思路
- 其他2-while+read按行读取文件
- 其他3-给输出内容加颜色
- 其他4-shell脚本后台运行知识
- 其他5-6种产生随机数的方法
- 其他6-break,continue,exit,return区别
- if语法案例
- case语法案例
- 函数语法案例
- WEB服务软件
- nginx相关
- 01-简介与对比
- 02-日志说明
- 03-配置文件和虚拟主机
- 04-location模块和访问控制
- 05-status状态模块
- 06-rewrite重写模块
- 07-负载均衡和反向代理
- 08-反向代理监控虚拟IP地址
- nginx与https自签发证书
- php-nginx-mysql联动
- Nginx编译安装[1.12.2]
- 案例
- 不同客户端显示不同信息
- 上传和访问资源池分离
- 配置文件
- nginx转发解决跨域问题
- 反向代理典型配置
- php相关
- C6编译安装php.5.5.32
- C7编译php5
- C6/7yum安装PHP指定版本
- tomcxat相关
- 01-jkd与tomcat部署
- 02-目录-日志-配置文件介绍
- 03-tomcat配置文件详解
- 04-tomcat多实例和集群
- 05-tomcat监控和调优
- 06-Tomcat安全管理规范
- show-busy-java-threads脚本
- LVS与keepalived
- keepalived
- keepalived介绍和部署
- keepalived脑裂控制
- keepalived与nginx联动-监控
- keepalived与nginx联动-双主
- LVS负载均衡
- 01-LVS相关概念
- 02-LVS部署实践-ipvsadm
- 03-LVS+keepalived部署实践
- 04-LVS的一些问题和思路
- mysql数据库
- 配置和脚本
- 5.6基础my.cnf
- 5.7基础my.cnf
- 多种安装方式
- 详细用法和命令
- 高可用和读写分离
- 优化和压测
- docker与k8s
- docker容器技术
- 1-容器和docker基础知识
- 2-docker软件部署
- 3-docker基础操作命令
- 4-数据的持久化和共享互连
- 5-docker镜像构建
- 6-docker镜像仓库和标签tag
- 7-docker容器的网络通信
- 9-企业级私有仓库harbor
- docker单机编排技术
- 1-docker-compose快速入门
- 2-compose命令和yaml模板
- 3-docker-compose命令
- 4-compose/stack/swarm集群
- 5-命令补全和资源限制
- k8s容器编排工具
- mvn的dockerfile打包插件
- openstack与KVM
- kvm虚拟化
- 1-KVM基础与快速部署
- 2-KVM日常管理命令
- 3-磁盘格式-快照和克隆
- 4-桥接网络-热添加与热迁移
- openstack云平台
- 1-openstack基础知识
- 2-搭建环境准备
- 3-keystone认证服务部署
- 4-glance镜像服务部署
- 5-nova计算服务部署
- 6-neutron网络服务部署
- 7-horizon仪表盘服务部署
- 8-启动openstack实例
- 9-添加计算节点流程
- 10-迁移glance镜像服务
- 11-cinder块存储服务部署
- 12-cinder服务支持NFS存储
- 13-新增一个网络类型
- 14-云主机冷迁移前提设置
- 15-VXALN网络类型配置
- 未分类杂项
- 部署环境准备
- 监控
- https证书
- python3.6编译安装
- 编译安装curl[7.59.0]
- 修改Redhat7默认yum源为阿里云
- 升级glibc至2.17
- rabbitmq安装和启动
- rabbitmq多实例部署[命令方式]
- mysql5.6基础my.cnf
- centos6[upstart]/7[systemd]创建守护进程
- Java启动参数详解
- 权限控制方案
- app发包仓库
- 版本发布流程
- elk日志系统
- rsyslog日志统一收集系统
- ELK系统介绍及YUM源
- 快速安装部署ELK
- Filebeat模块讲解
- logstash的in/output模块
- logstash的filter模块
- Elasticsearch相关操作
- ES6.X集群及head插件
- elk收集nginx日志(json格式)
- kibana说明-汉化-安全
- ES安装IK分词器
- zabbix监控
- zabbix自动注册模板实现监控项自动注册
- hadoop大数据集群
- hadoop部署
- https证书
- certbot网站
- jenkins与CI/CD
- 01-Jenkins部署和初始化
- 02-Jenkins三种插件安装方式
- 03-Jenkins目录说明和备份
- 04-git与gitlab项目准备
- 05-构建自由风格项目和相关知识
- 06-构建html静态网页项目
- 07-gitlab自动触发项目构建
- 08-pipelinel流水线构建项目
- 09-用maven构建java项目
- iptables
- 01-知识概念
- 02-常规命令实战
- 03-企业应用模板
- 04-企业应用模板[1键脚本]
- 05-企业案例-共享上网和端口映射
- SSH与VPN
- 常用VPN
- VPN概念和常用软件
- VPN之PPTP部署[6.x][7.x]
- 使用docker部署softether vpn
- softEther-vpn静态路由表推送
- SSH服务
- SSH介绍和部署
- SSH批量分发脚本
- 开启sftp日志并限制sftp访问目录
- sftp账号权限分离-开发平台
- ssh配置文件最佳实践
- git-github-gitlab
- git安装部署
- git详细用法
- github使用说明
- gitlab部署和使用
- 缓存数据库
- zookeeper草稿
- mongodb数据库系列
- mongodb基本使用
- mongodb常用命令
- MongoDB配置文件详解
- mongodb用户认证管理
- mongodb备份与恢复
- mongodb复制集群
- mongodb分片集群
- docker部署mongodb
- memcached
- memcached基本概念
- memcached部署[6.x][7.x]
- memcached参数和命令
- memcached状态和监控
- 会话共享和集群-优化-持久化
- memcached客户端-web端
- PHP测试代码
- redis
- 1安装和使用
- 2持久化-事务-锁
- 3数据类型和发布订阅
- 4主从复制和高可用
- 5redis集群
- 6工具-安全-pythonl连接
- redis配置文件详解
- 磁盘管理和存储
- Glusterfs分布式存储
- GlusterFS 4.1 版本选择和部署
- Glusterfs常用命令整理
- GlusterFS 4.1 深入使用
- NFS文件存储
- NFS操作和部署
- NFS文件系统-挂载和优化
- sersync与inotify
- rsync同步服务
- rsyncd.conf
- rsync操作和部署文档
- rsync常见错误处理
- inotify+sersync同步服务
- inotify安装部署
- inotify最佳脚本
- sersync安装部署
- 时间服务ntp和chrony
- 时间服务器部署
- 修改utc时间为cst时间
- 批量操作与自动化
- cobbler与kickstart
- KS+COBBLER文件
- cobbler部署[7.x]
- kickstart部署[7.x]
- kickstar-KS文件和语法解析
- kickstart-PXE配置文件解析
- 自动化之ansible
- ansible部署和实践
- ansible剧本编写规范
- 配置文件示例
- 内网DNS服务
- 压力测试
- 压测工具-qpefr测试带宽和延时