周氏一族,整理技术文档,给下一代留点教程......
应用场景
项目http采用了高可用性keepalive,双入口接入,那么就存在一个问题,每台服务器的web文件或者接口,需要两台都同时同步,所以,就想到了文件共享。
glusterfs 是在nfs的前提下,进行了升级,而且最近还共享给了apache基金会,发展得很快,最新的版本3.5.x 是比较成熟了,修复了很多bug,很多知名运营商都在用它,特别是搞网盘的,就我所知搜狗是用它最多的营运商之一。
网络结构
192.168.1.202 glusterfs-server 后端存储
192.168.1.203 glusterfs-server 后端存储
192.168.1.204 glusterfs-client 前端调用(挂载)
服务器系统(要求)
CentOS release 6.3 (Final) x64bit
安装步骤:
-------------下面是两台后端存储的配置,配置一样的,不一样会单独说明-----------
1、加入gluster yum 源,这样可以获取最新的version
cd /etc/yum.repos.d/ wget http://download.gluster.org/pub/gluster/glusterfs/3.5/3.5.1/EPEL.repo/glusterfs-epel.repo |
如果这个链接不行,则自己搞一个,也是很简单的事情,如下
[root@server203 yum.repos.d]# cat glusterfs-epel.repo # Place this file in your /etc/yum.repos.d/ directory [glusterfs-epel] name=GlusterFS is a clustered file-system capable of scaling to several petabytes. baseurl=http://download.gluster.org/pub/gluster/glusterfs/LATEST/EPEL.repo/epel-$releasever/$basearch/ enabled=1 skip_if_unavailable=1 gpgcheck=1 gpgkey=http://download.gluster.org/pub/gluster/glusterfs/LATEST/EPEL.repo/pub.key [glusterfs-noarch-epel] name=GlusterFS is a clustered file-system capable of scaling to several petabytes. baseurl=http://download.gluster.org/pub/gluster/glusterfs/LATEST/EPEL.repo/epel-$releasever/noarch enabled=1 skip_if_unavailable=1 gpgcheck=1 gpgkey=http://download.gluster.org/pub/gluster/glusterfs/LATEST/EPEL.repo/pub.key [glusterfs-source-epel] name=GlusterFS is a clustered file-system capable of scaling to several petabytes. - Source baseurl=http://download.gluster.org/pub/gluster/glusterfs/LATEST/EPEL.repo/epel-$releasever/SRPMS enabled=0 skip_if_unavailable=1 gpgcheck=1 gpgkey=http://download.gluster.org/pub/gluster/glusterfs/LATEST/EPEL.repo/pub.key |
2、查看一下yum源加载是否成功
3、那就开始yum吧,非常简单
yum -y install glusterfs-server
4、yum完之后,安装好glusterfs,会在/etc/init.d/下面有两个配置启动文件
glusterd glusterfsd // 一一启动它便可
[root@server203 ~]# /etc/init.d/glusterd start && /etc/init.d/glusterfsd start
5、接下来,在hosts下面,添加两个后端存储的ip/hostname 对应关系
[root@New_server ~]# vi /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.1.202 server202 192.168.1.203 server203 |
6、分别从两台机器,添加对方节点,例如202添加203,203添加202
前面是202添加203 [root@New_server ~]# gluster peer probe server203 peer probe: success. [root@New_server ~]# gluster peer status Number of Peers: 1 Hostname: server203 Uuid: 04aa2530-379b-40ff-9fc1-66552b1defe7 State: Peer in Cluster (Connected) 下面是203添加202的 [root@server203 ~]# gluster peer probe server202 peer probe: success. [root@server203 ~]# gluster peer status Number of Peers: 1 Hostname: server202 Uuid: 05b8fede-9576-4ffa-b525-40c1218d8bac State: Peer in Cluster (Connected) [root@server203 ~]# |
//gluster peer status 是查看节点状态
7、创建一个主目录,用来作为后端存储的根目录,我们就在/data下面吧
mkdir /data chmod -R 1777 /data |
8、随便找一个后端存储节点,202也好,203也罢,随便你,然后两条命令,边可以创建volume
gluster volume create zhou replica 2 transport tcp server202:/data server203:/data force gluster volume start zhou |
注意:8.1只需要一台创建即可,不能两台都创建,否则会提示volume zhou 已经存在
volume create: zhou: failed: Volume zhou already exists |
8.2"replica 2",他的意思,是指我要把创建冗余数据,也就是说,前端写入的数据,会同时写到202和203,如果不加这个参数,前端挂载,只会写入其中一台,不会同步
8.3在后面,必须加上 force,否则它会提示你,必须加,同样道理,移除的时候,也得加force
9、假如,我们刚刚8的步骤,是在202上面创建的,那么,我们来203看一下情况
[root@server203 ~]# gluster volume status Status of volume: zhou Gluster process Port Online Pid ------------------------------------------------------------------------------ Brick server202:/data 49153 Y 45883 Brick server203:/data 49153 Y 45012 NFS Server on localhost 2049 Y 45026 Self-heal Daemon on localhost N/A Y 45030 NFS Server on server202 2049 Y 45897 Self-heal Daemon on server202 N/A Y 45901
Task Status of Volume zhou ------------------------------------------------------------------------------ There are no active volume tasks |
很明显,已经开始集群了。
-----------------------------下面是前端挂载的配置(服务器是192.168.0.204)-----------------
10、同样道理,要加载yum 源,这里不多说
11、开始安装 glusterfs-client
yum -y install glusterfs-client
12、yum完之后,就可以使用这条命令来挂载了
mount -t glusterfs server202:/zhou /data/
注意:挂载之前,先要编辑host对应ip,否则怎么知道你这个server202是什么飞机来的,而且还要先创建/data文件,这样才能挂载,完全命令如下:
mkdir /data chmod -R 1777 /data mount -t glusterfs server202:/zhou /data/ |
----------------------------下面是前端测试效果----------------
13、在204,创建文件到/data,为了保障起见,连续创建两个
14、在202,ll /data,正常情况下会看到 13 步骤所创建的文件,看不到就是你的问题了
15、在203,ll /data,正常情况下会看到 13 步骤所创建的文件,看不到就是你的问题了
16、把202关机,在204,创建文件,此时你会发现创建会有点缓慢,但是没关系,一样会创建成功
17、到203,ll /data,正常情况下会看到 16 步骤所创建的文件,看不到就是你的问题了
18、在17步骤,当202死机,在204创建文件有点慢,不急,再创建几个文件试试,你会发现,这下子会很快,这是正常情况的,因为202挂了,你在204创建的文件,它会自动创建到203当中
19、把202开机,你会发现,202挂掉的这一个期间,203所创建的文件,202已经同步过来了
20、同样道理,你把203关机试一下,效果一样的
21、高可用性集群搭建成功
--------------------------下面是前端配合hhtp测试下载-------------------------
22、yum安装httpd,这里不多说了
yum -y install httpd
23、修改httpd默认目录
vi /etc/httpd/conf/httpd.conf
修改 DocumentRoot "/data"
重启 httpd restart
24、随便在204创建一个文件
25、网页打开一下 http://192.168.1.204/good.html
你会发现,成功了,换句话说,以后apache文件,直接放在 后端存储即可,不需要两台都同时放一样的html文件,省了很多无用功。
当然,除了存放 html文件外,也可以放其他你自己想要的东西,例如mp3,电影,等等乱七八糟...
---------------------------下面是常见问题汇集--------------------------------------
[root@server203 ~]# gluster peer status
Connection failed. Please check if gluster daemon is operational.
麻烦,您把进程先开起来 /etc/init.d/glusterd start && /etc/init.d/glusterfsd start
[root@server203 ~]# gluster peer probe server202
peer probe: failed: Probe returned with unknown errno 107
帅锅,请关闭iptables防火墙,谢谢
[root@New_server ~]# gluster volume remove-brick zhou server202:/data
WARNING: running remove-brick commands without an explicit option is deprecated, and will be removed in the next version of GlusterFS.
To forcibly remove a brick in the next version of GlusterFS, you will need to use "remove-brick force".
不管是创建volume还是移除,全部在后面加一个force
---------------------------下面是常见问题汇集--------------------------------------
help一下,看看有那些管理工具
[root@New_server ~]# gluster volume help
volume info [all|<VOLNAME>] - list information of all volumes
volume create <NEW-VOLNAME> [stripe <COUNT>] [replica <COUNT>] [transport <tcp|rdma|tcp,rdma>] <NEW-BRICK>?<vg_name>... [force] - create a new volume of specified type with mentioned bricks
volume delete <VOLNAME> - delete volume specified by <VOLNAME>
volume start <VOLNAME> [force] - start volume specified by <VOLNAME>
volume stop <VOLNAME> [force] - stop volume specified by <VOLNAME>
volume add-brick <VOLNAME> [<stripe|replica> <COUNT>] <NEW-BRICK> ... [force] - add brick to volume <VOLNAME>
volume remove-brick <VOLNAME> [replica <COUNT>] <BRICK> ... [start|stop|status|commit|force] - remove brick from volume <VOLNAME>
volume rebalance <VOLNAME> [fix-layout] {start|stop|status} [force] - rebalance operations
volume replace-brick <VOLNAME> <BRICK> <NEW-BRICK> {start [force]|pause|abort|status|commit [force]} - replace-brick operations
volume set <VOLNAME> <KEY> <VALUE> - set options for volume <VOLNAME>
volume help - display help for the volume command
volume log rotate <VOLNAME> [BRICK] - rotate the log file for corresponding volume/brick
volume sync <HOSTNAME> [all|<VOLNAME>] - sync the volume information from a peer
volume reset <VOLNAME> [option] [force] - reset all the reconfigured options
volume profile <VOLNAME> {start|stop|info [nfs]} - volume profile operations
volume quota <VOLNAME> {enable|disable|list [<path> ...]|remove <path>| default-soft-limit <percent>} |
volume quota <VOLNAME> {limit-usage <path> <size> [<percent>]} |
volume quota <VOLNAME> {alert-time|soft-timeout|hard-timeout} {<time>} - quota translator specific operations
volume top <VOLNAME> {open|read|write|opendir|readdir|clear} [nfs|brick <brick>] [list-cnt <value>] |
volume top <VOLNAME> {read-perf|write-perf} [bs <size> count <count>] [brick <brick>] [list-cnt <value>] - volume top operations
volume status [all | <VOLNAME> [nfs|shd|<BRICK>|quotad]] [detail|clients|mem|inode|fd|callpool|tasks] - display status of all or specified volume(s)/brick
volume heal <VOLNAME> [{full | statistics {heal-count {replica <hostname:brickname>}} |info {healed | heal-failed | split-brain}}] - self-heal commands on volume specified by <VOLNAME>
volume statedump <VOLNAME> [nfs|quotad] [all|mem|iobuf|callpool|priv|fd|inode|history]... - perform statedump on bricks
volume list - list all volumes in cluster
volume clear-locks <VOLNAME> <path> kind {blocked|granted|all}{inode [range]|entry [basename]|posix [range]} - Clear locks held on path
各个参数的作用个,一目了然,大家不用我解释了吧