原理:server1做h1,server9为h2,两个调度器作为高可用节点,集群主机必须所有的配置相同
新开server9主机:172.25.92.9
server1上:作为h1,并作为集群管理节点
[root@server1 ~]# scp /etc/yum.repos.d/rhel-source.repo 172.25.92.9:/etc/yum.repos.d
[root@server1 ~]# scp -r /usr/local/nginx/ 172.25.92.9:/usr/local/
yum install -y luci ricci
[root@server1 ~]# chkconfig luci on
[root@server1 ~]# chkconfig ricci on
[root@server1 ~]# passwd ricci
[root@server1 ~]# /etc/init.d/ricci start
netstat -antlp | grep ricci
tcp 0 0 :::11111 :::* LISTEN 11789/ricci
server9上,仅作为h2:
[root@server9 ~]# yum clean all
[root@server9 ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@server9 ~]# useradd -u 800 nginx #必须同server1上
[root@server9~]# nginx
[root@server9 ~]# netstat -antlp | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1054/nginx
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 1054/nginx
可以看见80和443端口
yum install -y ricci
[root@server9 ~]# chkconfig ricci on
[root@server9 ~]# passwd ricci
[root@server9 ~]# /etc/init.d/ricci start
netstat -antlp | grep ricci #ricci的开启端口为11111
tcp 0 0 :::11111 :::* LISTEN 11789/ricci
查看RHCS管理界面:
需要做解析:测试机(本地物理机),server1,server9都做同样的dns解析
vim /etc/hosts
172.25.92.1 server1
172.25.92.9 server9
在浏览器访问:https://server1:8084,luci自动开启8084端口接受集群节点的11111端口的数据包
使用server1的root密码登陆
创建集群并添加集群节点:
注意;1)Use the Same Password for All Nodes的前面如果有对号,则表示集群节点的密码相同,集群节点的密码为刚才为 ricci 的设定的密码
2) Download Packages:表示自动下载需要的安装包
3)Use Locally Installed Packages:表示根据本地已下载的安装包来下载
4)Reboot Nodes Before Joining Cluster:创建集群后会重启动集群节点,所以之前要将集群管理工具(luci和ricci设置为开机自启动)
5)Enable Shared Storage Support:开启集群共享存储功能
可以通过查看进程知道,两个集群节点开始安装集群套件,之后重启后加入集群中
使用keepalived配置高可用的话,不同的keepalived之间通过vrrp协议通信,若果因为网络等问题导致某一个keepalived挂掉的话,
可能会造成数据丢失,也可能产生脑裂问题。
为什么使用fence’设备?
如果集群中一个节点通信失效,那么集群中的其他节点必须能够保证将已经失效的节点与其正在访问的共享资源(比如共享存储)隔离开,出问题的集群节点 本身无法做到这一点,因为该集群节点在此时可能已经失去响应(例如发生hung机),因此需要通过外部机制来实现这一点。这种方法被称为带有fence代 理的隔离。
不配置隔离设备,我们没有办法知道之前断开连接的集群节点使用的资源是否已经被释放掉。如果我们没有配置隔离代理(或者设备),系统可能错误的认为 集群节点已经释放了它的资源,这将会造成数据损坏和丢失。 没有配置隔离设备,数据的完整性就不能够被保证,集群配置将不被支持。
当隔离动作正在进行中时,不允许执行其他集群操作。这包括故障转移服务和获取GFS文件系统或GFS2文件系统的新锁。 在隔离动作完成之前或在该集群节点已经重启并且重新加入集群之前,集群不能恢复正常运行。
隔离代理(或设备)是一个外部设备,这个设备可以被集群用于限制异常节点对共享存储的访问(或者硬重启此集群节点。
fence设备如何实现?
利用libvitr,构建模拟fence。libvirt可以管理虚拟机的开关。
在本地物理主机上
注意:以下步骤server1和server9都要完成。
在浏览端添加fence:
为server1和server9分别添加fence
指定主fence:
如果集群节点的名称和真实server的主机名称不对应该怎么办呢?本次实验碰巧是对应的。
虚拟机的名称是domainame,而集群是hostname,可以利用主机的UUID做映射,将集群节点的名称和相应的主机对应。
以上步骤在server9上也做
完成后在server1的shell命令行端:
root@server1 mnt]# cat /etc/cluster/cluster.conf
<?xml version="1.0"?>
<cluster config_version="10" name="westos_ha"> #集群名称
<clusternodes>
<clusternode name="server1" nodeid="1"> #server1为节点1
<fence>
<method name="fence1"> #fence1
<device domain="8d6a8938-56a7-4970-b7dd-1e1f38ca5f5c" name="vmfence"/>
</method>
</fence>
</clusternode>
<clusternode name="server9" nodeid="2">
<fence>
<method name="fence9">
<device domain="6d73a452-bc4e-4d77-bcdb-49e37573224e" name="vmfence"/>
</method>
</fence>
</clusternode>
</clusternodes>
<cman expected_votes="1" two_node="1"/>
<fencedevices>
<fencedevice agent="fence_xvm" name="vmfence"/>
</fencedevices>
<rm>
<failoverdomains>
<failoverdomain name="nginx_fail" nofailback="1" ordered="1" restricted="1">
<failoverdomainnode name="server1" priority="1"/>
<failoverdomainnode name="server9" priority="2"/>
</failoverdomain>
</failoverdomains>
<resources>
<ip address="172.25.92.100/24" sleeptime="10"/>
<script file="/etc/init.d/nginx" name="nginx"/>
</resources>
<service domain="nginx_fail" exclusive="1" name="nginx" recovery="relocate">
<ip ref="172.25.92.100/24"/>
<script ref="nginx"/>
</service>
</rm>
</cluster>
可以看出来在浏览器的操作全部记录在/etc/cluster/cluster.conf 文件中
fence_node server9 #模拟集群直接停掉server9,可以看见server9类似force off一样直接关机
- 在浏览器添加Failover Domains:用来做节点格里,或业务切换
添加共享服务:
VIIP:
nginx:
注意:nginx本身没有启动脚本的,所以要自己制作nginx脚本,可以从源码包里修改脚本
将添加的资源放在一个资源组里:
注意:添加的资源顺序就是集群启动后服务启动的顺序,所以要先添加vip,再添加nginx
在shell端:
clustat #可以看见nginx已经自动启动
ps ax #可以看见nginx进程
同时可以测试nginx的负载均衡,停掉一个server上的nginx,另一台server的nginx就自动启动