实验环境  
- 10Gb网络环境
- gluster1  192.168.100.155 三块磁盘
- gluster2  192.168.100.156 三块磁盘
- gluster2  192.168.100.157 三块磁盘
- gluster2  192.168.100.158 三块磁盘


安装配置

gluster1存储节点安装如下,其它节点同样操作

# 格式化磁盘 #
    mkfs.ext4 -T largefile /dev/sdb # 超过2T的磁盘需要加入largefile,简称快格
    mkfs.ext4 -T largefile /dev/sdc
    
# 挂载磁盘 #
    mkdir -p /glusterfs/disk{1,2}/ #创建磁盘挂载目录
    
    vim /etc/fstab # 添加如下内容
    /dev/sdb   /glusterfs/disk1    ext4 defaults 0 2
    /dev/sdc   /glusterfs/disk2    ext4 defaults 0 2
    
    mount -a # 根据/etc/fstab挂载所有磁盘
    mkdir -p /glusterfs/disk{1,2}/data  #挂载完毕后,创建data文件夹
# hosts文件 #
    vim /etc/hosts # 添加如下内容
    192.168.1.155 gluster1
    192.168.1.156 gluster2
    192.168.1.157 gluster3
    192.168.1.158 gluster4    
    
# ntp服务 #
    yum -y install ntp
    service ntpd start
    chkconfig ntpd on
       
#  glusterfs server #
    wget -P /etc/yum.repos.d http://download.gluster.org/pub/gluster/glusterfs/LATEST/CentOS/glusterfs-epel.repo
    yum -y install glusterfs-server
    service glusterd start
    chkconfig glusterd on
    
****
    gluster  #直接敲gluster,然后按Enter会进入gluster shell环境,就跟bash shell一样,有命令提示功能
    gluster peer probe gluster2  # probe other servers
    gluster peer probe gluster3
    gluster peer probe gluster4    
    gluster peer status #查看gluster peer状态
    
    #创建一个名称为openstack的volume
    gluster volume create openstack stripe 4 replica 2 transport tcp  gluster1:/glusterfs/disk1/data gluster1:/glusterfs/disk2/data gluster2:/glusterfs/disk1/data gluster2:/glusterfs/disk2/data gluster3:/glusterfs/disk1/data gluster3:/glusterfs/disk2/data gluster4:/glusterfs/disk1/data gluster4:/glusterfs/disk2/data
    #stripe:相当于raid0
    #replica:相当于raid1
    #bricks = stripe * replica
    gluster volume start openstack 
    gluster volume info
    
# glusterfs client #
    wget -P /etc/yum.repos.d http://download.gluster.org/pub/gluster/glusterfs/LATEST/CentOS/glusterfs-epel.repo
    yum -y install glusterfs glusterfs-fuse
    mount -t glusterfs gluster1:/openstack /mnt #挂载volume 
    
    #开机自动挂载glusterfs卷
    cat /etc/fstab
    gluster1:/openstack /mnt glusterfs defaults,_netdev 0 0
    # _netdev:文件系统位于需要网络连接的设备上(系统网络启动时,文件系统才被挂载)


Glusterfs卷类型
    Glusterfs支持五种Volume,即Distribute卷、Stripe卷、Replica卷、Distribute stripe卷和Distribute replica卷,这五种卷可以满足不同应用对高性能、高可用的需求。 
    
    (1)distribute volume:分布式卷,文件通过hash算法分布到brick server上,这种卷是glusterfs的基础和最大特点;    
    
    (2)stripe volume:条带卷,类似RAID0,条带数=brick server数量,文件分成数据块以Round Robin方式分布到brick server上,并发粒度是数据块,大文件性能高;
    
    (3)replica volume:镜像卷,类似RAID1,镜像数=brick server数量,所以brick server上文件数据相同,构成n-way镜像,可用性高;  
    
    (4)distribute stripe volume:分布式条带卷,brick server数量是条带数的倍数,兼具distribute和stripe卷的特点;   
    
    (5)distribute replica volume:分布式镜像卷,brick server数量是镜像数的倍数,兼具distribute和replica卷的特点;

    

GlusterFS specifcation in QEMU

gluster[+transport]://[server[:port]]/volname/p_w_picpath[?socket=...]
    gluster is the protocol. 
    Examples:
    gluster://1.2.3.4/testvol/a.img
    gluster+tcp://1.2.3.4/testvol/a.img
    gluster+tcp://1.2.3.4:24007/testvol/dir/a.img
    gluster+tcp://[1:2:3:4:5:6:7:8]/testvol/dir/a.img
    gluster+tcp://[1:2:3:4:5:6:7:8]:24007/testvol/dir/a.img
    gluster+tcp://server.domain.com:24007/testvol/dir/a.img
    gluster+unix:///testvol/dir/a.img?socket=/tmp/glusterd.socket
    gluster+rdma://1.2.3.4:24007/testvol/a.img


Glusterfs集成flashcache
   Flashcache是Facebook技术团队开发的一个内核模块,通过在文件系统(VFS)和设备驱动之间新增一次缓存层,可以用SSD作为介质的缓存,通过将传统硬盘上的热门数据缓存到SSD上,加速服务器磁盘读写性能。

    #准备编译环境
    flashcache是ko文件,需要在当前版本的内核编译出来的模块才能使用。
    如果安装的目标机器内核版本跟编译机器的内核版本一致,那么如下操作即可:
    yum install -y kernel-devel
    
    #下载flashcache tar包
    wget --no-check-certificate -O flashcache.tar.gz https://github.com/facebook/flashcache/tarball/master
    
    #解压
    tar xf flashcache.tar.gz    
    
    #编译安装
    cd facebook-flashcache-d359499/
    make KERNEL_TREE='/usr/src/kernels/2.6.32-431.20.3.el6.x86_64/' install    
    
    #编译后的产物拷贝到目标机器
    scp src/{flashcache.ko,utils/*} 192.168.1.191:/root/    
   
    #到目标机器上将相应文件拷贝到相应目录
    mkdir /lib/modules/2.6.32-431.20.3.el6.x86_64/extra/flashcache/
    mv flashcache.ko /lib/modules/2.6.32-431.el6.x86_64/extra/flashcache/
    mv utils/* /sbin/
    depmod -a   
   
    #加载模块
    modprobe flashcache    
    
    #创建flashcache盘映射
    flashcache_create -p back cachedev /dev/vdc /dev/vdb
    使用flashcache_create命令来创建映射,需要如下参数:
        -p back|thru|around 模式writeback,writethrough,writearound
        cachedev 生成lvm映射的盘名
        ssd_devname SSD盘盘符(不需要格式化)
        disk_devname 数据盘盘符
    
    #挂载
    mount /dev/mapper/cachedev  /glusterfs/disk1/
    
    #重新加载flashcache盘映射
    系统重启的时候,需要对flashcache重新加载,使用命令flashcache_load来达到目的,执行完load后再进行挂载。
    flashcache_load /dev/vdc
    
    #删除flashcache盘映射
    使用命令flashcache_destroy来对flashcache映射进行删除操作,删除后mapper映射仍然存在,需要对其进行remove操作:
    flashcache_destroy /dev/vdb
    dmsetup remove /dev/mapper/flashcache
    
    #flashcache内核参数调优
    vim /etc/sysctl.conf
    dev.flashcache.vdc+vdb.skip_seq_thresh_kb = 1024 #超过1M的顺序写直接落到磁盘上


Glusterfs 运维常用命令

    1、删除卷 
    gluster volume stop img 
    gluster volume delete img 
    
    2、将机器移出集群 
    gluster peer detach 172.28.26.102 
    
    只允许172.28.0.0的网络访问glusterfs 
    gluster volume set img auth.allow 172.28.26.* 
    
    3、加入新的机器并添加到卷里(由于副本数设置为2,至少要添加2(4、6、8..)台机器) 
    gluster peer probe 172.28.26.105 
    gluster peer probe 172.28.26.106 
    gluster volume add-brick img 172.28.26.105:/data/gluster 172.28.26.106:/data/gluster
    
    #卷扩容后,需要执行rebalance
    a、执行rebalance前
    getfattr -n trusted.glusterfs.pathinfo nova/   # 查看文件系统的扩展属性,getfattr依赖attr rpm包
    file: nova/
    trusted.glusterfs.pathinfo="(( ( 
     ) ( 
     )) 
    (openstack-dht-layout (openstack-replicate-0 0 4294967295) (openstack-replicate-1 0 0)))"  # (openstack-replicate-0 0 4294967295) hash值

    b、执行rebalance后
    gluster volume rebalance openstack fix-layout start   #  fix-layout不搬迁数据
    volume rebalance: openstack: success: Starting rebalance on volume openstack has been successful.
    ID: a7fc8c7f-a3e2-4783-b59e-3051327e52ec

    getfattr -n trusted.glusterfs.pathinfo nova/          #  再次查看文件系统的扩展属性
    file: nova/
    trusted.glusterfs.pathinfo="(( ( 
     ) ( 
     )) 
    (openstack-dht-layout (openstack-replicate-0 0 2147483646) (openstack-replicate-1 2147483647 4294967295)))"  # hash值重新分布了
    
    4、收缩卷 
    #收缩卷前gluster需要先移动数据到其他位置 
    gluster volume remove-brick img 172.28.26.101:/data/gluster/img 172.28.26.102:/data/gluster/img start 
    #查看迁移状态 
    gluster volume remove-brick img 172.28.26.101:/data/gluster/img 172.28.26.102:/data/gluster/img status 
    #迁移完成后提交 
    gluster volume remove-brick img 172.28.26.101:/data/gluster/img 172.28.26.102:/data/gluster/img commit 
    迁移卷 
    # 将172.28.26.101的数据迁移到,先将172.28.26.107加入集群 
    gluster peer probe 172.28.26.107 
    gluster volume replace-brick img 172.28.26.101:/data/gluster/img 172.28.26.107:/data/gluster/img start 
    # 查看迁移状态
    gluster volume replace-brick img 172.28.26.101:/data/gluster/img 172.28.26.107:/data/gluster/img status 
    # 数据迁移完毕后提交
    gluster volume replace-brick img 172.28.26.101:/data/gluster/img 172.28.26.107:/data/gluster/img commit 
    # 如果机器172.28.26.101出现故障已经不能运行,执行强制提交然后要求gluster马上执行一次同步 
    gluster volume replace-brick img 172.28.26.101:/data/gluster/img 172.28.26.102:/data/gluster/img commit -force 
    gluster volume heal imgs full


Glusterfs内核参数调优 

    vm.dirty_background_ratio = 5  # 5%的意思,根据实际内存大小来定,数据从内存flush到磁盘上,
    vm.dirty_ratio = 20
    vm.dirty_writeback_centisecs = 100  # 100%秒,数据flush到磁盘上
    vm.dirty_expire_centisecs = 3000


Glusterfs TroubleShooting

1、错误: GlusterFS: {path} or a prefix of it is already part of a volume    
解决方法: 
     setfattr -x trusted.glusterfs.volume-id $brick_path
     setfattr -x trusted.gfid $brick_path
     rm -rf $brick_path/.glusterfs
     
2、错误:glusterd服务起不来
解决方法:
     less /var/log/glusterfs/etc-glusterfs-glusterd.vol.log  # 查看这个日志文件,一般都是volume配置文件出错
     cd /var/lib/glusterd/vols
     rm -rf openstack/ ssd/
     service glusterd restart


Glusterfs小知识

1、glusterfs集群中的任意一个节点都可以拿到所有volume的配置文件,不一定是brick的volume的节点
2、挂载glusterfs volume的时候,可以通过管理网挂载,只要这个ip可以到达glusterfs节点就行,它就可以拿到
    volume配置;glusterfs集群数据流量还是走存储网。
    
3、glusterfs: 客户端进程名
   glusterfsd: 服务端进程名
   glusterd: volume管理进程、I/O调度进程
   /var/log/glusterfs/[volume挂在点名字].log: glusterfs客户端log


参考链接 
刘爱贵glusterfs分布式文件系统研究
flashcache编译安装
QEMU-GlusterFS native integration