一、RHCS简介
RHCS即 RedHat Cluster Suite,中文意思即红帽集群套件。是一套综合的软件组件,可以通过在部署时采用不同的配置,以满足你的对高可用性,负载均衡,可扩展性,文件共享和节约成本的需要。
它提供有如下两种不同类型的集群:
1、高可用性:应用/服务故障切换-通过创建n个节点的服务器集群来实现关键应用和服务的故障切换
2、负载均衡:IP 负载均衡-对一群服务器上收到的 IP 网络请求进行负载均衡
什么是高可用集群:
高可用集群(High Availability Cluster,简称HA Cluster),是指以减少服务中断时间为目的的服务器集群技术。它通过保护用户的业务程序对外不间断提供的服务,把因软 件、硬件、人为造成的故障对业务的影响降低到最小程度。
简单说就是:保证服务不间断地运行,比如,在淘宝网什么时候都可以上去买东西,微信随时可以打开发消息聊天
//最上层是LVS负载均衡层,其中server1和server2的配置必须完全相同,中间一层是Real Server层,就是服务节点部分,最后一层是共享存储层,主要用于给GFS文件系统提供共享存储空间。
高可用集群实现原理:
高可用集群主要实现自动侦测(Auto-Detect)故障、自动切换/故障转移(FailOver)和自动恢复(FailBack)。
简单来说就是,用高可用集群软件实现故障检查和故障转移(故障/备份主机切换)的自动化,当然像负载均衡、DNS分发也可提供高可性
二、实验步骤
实验环境:
1.操作系统:rhel6.5
2.主机:
物理主机:172.25.2.250 用作fence
server1 : 172.25.2.1 作主节点,为了提供Cong配置用户界下载ricci,luci
Server2: 172.25.2.2 下载ricci,作副节点
2.1 配置YUM源、域名解析 |
//此操作在server1和server2上均做
[root@server1 ~]# vim /etc/yum.repos.d/rhel-source.repo //配置yum源
配置解析
Server1:
[root@server1 ~]# yum install ricci luci -y //安装ricci与luci
[root@server1~]# chkconfig luci on //设置开机自启
[root@server1 ~]# chkconfig ricci on
[root@server1 ~]# passwd ricci //修改密码
Changing password for user ricci.
New password:
BAD PASSWORD: it is based on a dictionary word
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.
[root@server1 ~]# /etc/init.d/ricci start //开启服务
Starting system message bus: [ OK ]
Starting oddjobd: [ OK ]
generating SSL certificates... done
Generating NSS database... done
Starting ricci: [ OK ]
[root@server1 ~]# /etc/init.d/luci start //开启服务
Adding following auto-detected host IDs (IP addresses/domain names), corresponding to `server2' address, to the configuration of self-managed certificate `/var/lib/luci/etc/cacert.config' (you can change them by editing `/var/lib/luci/etc/cacert.config', removing the generated certificate `/var/lib/luci/certs/host.pem' and restarting luci):
(none suitable found, you can still do it manually as mentioned above)
Generating a 2048 bit RSA private key
writing new private key to '/var/lib/luci/certs/host.pem'
Start luci... [ OK ]
Point your web browser to https://server2:8084 (or equivalent) to access luci
Server2:
[root@server1 ~]# yum install ricci -y //安装ricci
[root@server1 ~]# chkconfig ricci on //设置开机自启
[root@server1 ~]# passwd ricci //修改密码
Changing password for user ricci.
New password:
BAD PASSWORD: it is based on a dictionary word
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.
[root@server1 ~]# /etc/init.d/ricci start
Starting system message bus: [ OK ]
Starting oddjobd: [ OK ]
generating SSL certificates... done
Generating NSS database... done
Starting ricci: [ OK ]
2.2 创建集群 |
1、浏览器输入 https://172.25.2.1:8084
在网页浏览器的地址栏中输入 cman 服务器的 URL
luci服务器的URL语法为https://172.25.32.1:luci_server_port。luci_server_port 的默认值为 8084 。
//Server1上的系统用户,超级用户的账户密码
//Add添加已经创建好的集群,create创建集群
//集群的两台HA时间必须同步。
//最下面两个是加入节点自动重启和支持共享存储
注意:
1、在「集群名称」 文本框中输入集群名称。集群名称不能超过 15 个字符。
如果集群中的每个节点都有同样的 ricci 密码,您可以选择「在所有 节 点中使用相同的密 码 」 ,这样就可在添加的节点中自动填写「密 码 」 字段。
2、在「 节 点名称」 栏中输入集群中节点的名称,并在「密 码 」 栏中为该节点输入 ricci 密码。
3、如果要在 ricci 代理中使用不同的端口,而不是默认的 11111 端口,可以更改那个参数。
4、如果不想要在创建集群时升级已经在节点中安装的集群软件软件包,请选择「使用本地安装的软 件包」 选项。如果要升级所有集群软件软件包,请选择「下 载软 件包」 选项
5、添加完成后会发现一直在等待状态,这时查看服务器,会发现server1已经重启,这时只需要启动后再开启服务就成功添加节点了。
如果缺少任意基本集群组件(cman集群管理器、rgmanager集群组资源器,控制集群的调度、modcluster集群的状态监控,及其所有相依性软件包),无论是选择(使用本地安装的软件包) ,还是(下载软件包)选项,都会安装它 们。如果没有安装它们,则创建节点会失败。
开始组建:
//此时server1和server2会重启,集群的配置文件在/etc/cluster/cluster.conf
//创建成功!
//此时,在两个主机中的任一个上执行clustat,或者cat /etc/cluster/cluster.conf ,都可以查看到集群的信息。
[root@server1 ~]# clustat //查看集群状态信息
Cluster Status for body1 @ Wed Aug 1 10:55:22 2018
Member Status: Quorate
Member Name ID Status
------ ---- ---- ------
server1 1 Online, Local
server2 2 Online
2.3 添加HA服务 |
HA 服务是一组在统一实体中配置的集群资源,可为客户端提供指定的服务。HA 服务在集群配置文件/etc/cluster/cluster.conf(在每个集群节点中)中以资源树的形式出现。在集群配置文件中,每个 资源树都使用一个 XML 代表,它指定每个资源及其属性,以及在资源树中与其他资源的关系(上级、下级和平级关系)。
在资源树的上/下级关系中采用以下规则:
1.上级资源在下级资源之前启动。
2.在停止上级资源前必须停止全部下级资源。
3.对于正常工作的资源,其下级资源必须全部正常工作。
1.进入luci的集群,点击Faliover Domains,点击Add,输入Name,例如webfile,选中Prioritized、Restricted(只在指定节点跑)、No Failback(资源故障回切),选中下方的server1和server2的Member并输入优先级,这里server1输入2,server2输入1,就是以server2为主节点,数字越小优先级越高;
2.添加nginx,脚本路径/etc/init.d/nginx,这里系统没有自带,我们需要自己书写添加。
[root@server1 ~]# cat /etc/init.d/nginx //脚本
#!/bin/bash
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
pidfile=/application/nginx/logs/nginx.pid
Start_Nginx(){
if [ -f $pidfile ];then
echo "Nginx is running"
else
/usr/local/nginx/sbin/nginx &>/dev/null
action "Nginx is Started" /bin/true
fi
}
Stop_Nginx(){
if [ -f $pidfile ];then
/usr/local/nginx/sbin/nginx -s stop &>/dev/null
action "Nginx is Stopped" /bin/true
else
echo "Nginx is already Stopped"
fi
}
Reload_Nginx(){
if [ -f $pidfile ];then
/usr/local/nginx/sbin/nginx -s reload &>/dev/null
action "Nginx is Reloaded" /bin/true
else
echo "Can't open $pidfile ,no such file or directory"
fi
}
case $1 in
start)
Start_Nginx
RETVAL=$?
;;
stop)
Stop_Nginx
RETVAL=$?
;;
restart)
Stop_Nginx
sleep 3
Start_Nginx
RETVAL=$?
;;
reload)
Reload_Nginx
RETVAL=$?
;;
*)
echo "USAGE: $0 {start|stop|reload|restart}"
exit 1
esac
exit $RETVAL
3.集群设置,将Ip Address 与ngnix集群
//添加顺序决定启动顺序!
//创建成功
集群相关命令:
clustat //查看状态
clusvcadm -r nginx -m server2 //将nginx组转移到server2上
clusvcadm -e nginx // 重新激活nginx组
clusvcadm -d nginx //停止nginx组
2.4 测试 |
2.5.1负载均衡测试
1. Server1与server2分别配置nginx配置文件,设置负载均衡;
Nginx配置文件如下所示,我们用
Server3:(RIP)172.25.2.3/24
Server4 : (RIP)172.25.2.4/24
2.server3与server4 配置http,发布网页内容分别为server3,server4
3.此时浏览器不断刷新测试
//会在server1与server2之间来回切换
//负载均衡测试成功
2.5.2 高可用测试
1.查看集群信息,此时使用的LVS为server2
[root@server1 ~]# clustat
Cluster Status for body_1 @ Thu Aug 2 11:26:01 2018
Member Status: Quorate
Member Name ID Status
------ ---- ---- ------
server1 1 Online, Local, rgmanager
server2 2 Online, rgmanager
Service Name Owner (Last) State
------- ---- ----- ------ -----
service:ngnix server2 started
2.在server2上关闭ngnix
[root@server2 ~]# nginx -s stop
此时浏览器不断刷新测试
//仍会在server1与server2之间来回切换
3.查看集群信息,此时使用的LVS为server1
[root@server1 ~]# clustat
Cluster Status for body_1 @ Thu Aug 2 11:41:40 2018
Member Status: Quorate
Member Name ID Status
------ ---- ---- ------
server1 1 Online, Local, rgmanager
server2 2 Online, rgmanager
Service Name Owner (Last) State
------- ---- ----- ------ -----
service:ngnix server1 starting
//高可用测试成功
但这只是巧合,在实际的应用中,这里会存在脑裂现象
脑裂 在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢“共享资源”、争起“应用服务”,就会发生严重后果——或者共享资源被瓜分、2边“服务”都起不来了;或者2边“服务”都起来了,但同时读写“共享存储”,导致数据损坏(常见如数据库轮询着的联机日志出错)。
2.5 配置故障切换 |
RHCS的一个很重要概念:Failover Domain故障转移域,更准确地说应该是服务故障转移域(一个服务包括多个资源如VIP FileSystem…)key当i定义一个节点故障后,此节点上的资源能够转移的目标节点,进而限制了资源转移的范围.
FENCE设备是RHCS集群中必不可少的一个组成部分,通过FENCE设备可以避免因出现不可预知的情况而造成的“脑裂”现象,FENCE设备的出现,就是为了解决类似这些问题,Fence设备主要就是通过服务器或存储本身的硬件管理接口,或者外部电源管理设备,来对服务器或存储直接发出硬件管理指令, 将服务器重启或关机,或者与网络断开连接。
FENCE的工作原理:
当意外原因导致主机异常或者宕机时,备机会首先调用FENCE设备,然后通过FENCE设备将异常主机重启或者从网络隔离,当FENCE操作成功执行后,返回信息给备机,备机在接到FENCE成功的信息后,开始接管主机的服务和资源。这样通过FENCE设备,将异常节点占据的资源进行了释放,保证了资源和服务始终运行在一个节点上。
物理主机:
[root@foundation2 ~]# yum install fence-virtd-multicast fence-virtd fence-virtd-libvirt -y //安装软件
fence-virtd-multicast-0.3.2-2.el7.x86_64 (实现广播同系机制)
fence-virtd-libvirt-0.3.2-2.el7.x86_64 (将libvirt变为fence)
fence-virtd-0.3.2-2.el7.x86_64 (模拟fence)
[root@foundation2 ~]# systemctl enable fence_virtd //设置开机自启
[root@foundation2 ~]# fence_virtd -c //配置参数
//创建/etc/cluster/fence_xvm.key密钥
[root@foundation2 ~]# mkdir /etc/cluster/
[root@foundation2 ~]# cd /etc/cluster/
[root@foundation2 cluster]# dd if=/dev/urandom of=/etc/cluster/fence_xvm.key bs=128 count=1
1+0 records in
1+0 records out
128 bytes (128 B) copied, 0.000213055 s, 601 kB/s
[root@foundation2 cluster]# file fence_xvm.key //查看类型,数据类型
fence_xvm.key: data
//分别传文件给两台HA
[root@foundation2 cluster]# scp fence_xvm.key root@172.25.2.1:/etc/cluster
root@172.25.2.1's password:
fence_xvm.key 100% 128 0.1KB/s 00:00
[root@foundation2 cluster]# scp fence_xvm.key [email protected]:/etc/cluster
[email protected]'s password:
fence_xvm.key 100% 128 0.1KB/s 00:0
[root@foundation2 cluster]# systemctl start fence_virtd //启动服务
[root@server1 ~]# cat /etc/cluster/cluster.conf //查看文件
<?xml version="1.0"?>
<cluster config_version="6" name="body1">
<clusternodes>
<clusternode name="server1" nodeid="1">
<fence>
<method name="fence1">
<device domain="52d753c2-80dd-46a5-8abf-2c1b87f379b6" TYPE="ext4" name="vmfence"/>
</method>
</fence>
</clusternode>
<clusternode name="server2" nodeid="2">
<fence>
<method name="fence2">
<device domain="52d753c2-80dd-46a5-8abf-2c1b87f379b6" TYPE="ext4" name="vmfence"/>
</method>
</fence>
</clusternode>
</clusternodes>
<cman expected_votes="1" two_node="1"/>
<fencedevices>
<fencedevice agent="fence_xvm" name="vmfence"/>
</fencedevices>
2.6 在luci上配置Fence |
//在luci(https://172.25.2.1:8084)上的配置:以下操作server1和server2均要做!
1.登陆luci选择集群,点击Fence Devices
//此时可以在server1上看到
2.点击Nodes,选择server1,点击界面下的”Add Fence Method”,输入一个自定义的server1的Fence名称,例如fence1。
3.点击Add Fence Instance,选择之前设置好的vmfence,输入Domain(虚拟服务器的UUID)
2.7 Fence测试 |
//关掉server2,此时server2会重启,服务自动转到server1上
[root@server1 ~]# fence_node server2 //关掉server2
fence server2 success
[root@server1 ~]# clus
clustat clusvcadm
[root@server1 ~]# clustat
Cluster Status for body_1 @ Thu Aug 2 14:04:47 2018
Member Status: Quorate
Member Name ID Status
------ ---- ---- ------
server1 1 Online, Local, rgmanager
server2 2 Online
Service Name Owner (Last) State
------- ---- ----- ------ -----
service:nginx server1 started //server1
//server1网络切断,此时server1会重启,服务自动调到server2上
[root@server1 ~]# /etc/init.d/network stop
Shutting down interface eth0:
[root@server1 ~]# fence_node server2
fence server2 success
[root@server1 ~]# clus
clustat clusvcadm
[root@server1 ~]# clustat
Cluster Status for body_1 @ Thu Aug 2 14:04:47 2018
Member Status: Quorate
Member Name ID Status
------ ---- ---- ------
server1 1 Online, Local, rgmanager
server2 2 Online
Service Name Owner (Last) State
------- ---- ----- ------ -----
service:nginx server2 started //servsr2
//Fence测试成功