使用RHCS实现HA集群

   Clients
      |
     vip
  |---------------------|
  web1       web2
  |---------------------|
       |
   share storage

 

例子:实现apache高可用

   Clients
      |
     vip 1.1.1.100
  |---------------------|
  web1       web2
  |---------------------|
       |
   share storage (nfs,模拟fence设备)


备注:
 今天由于没有物理fence设备,在vmware实验环境下,只能特殊增加一个模拟fence设备,虽然一点效果都没有,但是只是为了满足一下cman集群的基本条件。

 

vip : 1.1.1.100
web1: node1.upl.com 1.1.1.128
web2: node2.upl.com 1.1.1.129
storage: node3.upl.com 1.1.1.130

 

资源:
 vip
 httpd
 挂载共享存储(今天实验可选)


fence设备:
 用于把故障节点进行重置,以保证集群里的独占资源可以被正确访问,保证集群稳定运行。

失效域:
 集群中可以有很多节点,其中的一些节点可以是放在同一个失效域,用于表明这些节点是共同够造成一个HA集群,它们之间相互竞争。

 n1,n2,n3
  n1,n2  ---> apache ha <---组成一个失效域
  n2,n3  ---> mysql ha  <---组成一个失效域

 

1、两个节点安装rhcs集群套件。

# yum groupinstall "Clustering" "Cluster Storage"


2、在其中一个节点进行配置

# system-config-cluster &

组播:224.0.0.1 - 239.255.255.254

添加节点: node1.upl.com,node2.upl.com
添加fence : node3.upl.com
 类型: global network block device
给节点连接fence
配置失效域
配置全局资源,这些资源对所有失效域都是可见,都可以被它们竞争
 ip address
 nfs mount
 script
配置服务: 把失效域和资源进行绑定。告诉失效域里的节点到底去竞争些什么资源
 绑定资源的时候,注意顺序。

 

同步配置文件到另外一个节点

 

3、准备好fence设备
在node3.upl.com上去配置
# gnbd_serv -n

4、在集群节点上启动集群
node1,node2上执行:

# service cman start  <---构建集群的基本环境,把节点成员关系建立起来。

# service rgmanager start <---进行资源管理。

查看集群的运行状态:
# system-config-cluster &

 

Cluster Status for webha5143 @ Thu Sep 22 11:26:56 2011
Member Status: Quorate

 Member Name                        ID   Status
 ------ ----                        ---- ------
 node1.upl.com                          1 Online, Local, rgmanager
 node2.upl.com                          2 Online, rgmanager

 Service Name              Owner (Last)              State        
 ------- ----              ----- ------              -----        
 service:webserv           node1.upl.com             started 


# clustat -i2

# cman_tool status

# ip addr 才能看到vip


其余管理操作:
 手工进行资源切换

# clusvcadm -r webserv -m node2.upl.com
Trying to relocate service:webserv to node2.upl.com...Success
service:webserv is now running on node2.upl.com
  验证资源已经切换过去

 服务故障,资源是否会被自动切换
  手工把当前获得资源的httpd服务关闭

 出现故障的时候,一般会发生些什么,查看日志。
# tail -f /var/log/messages
Sep 23 13:49:30 node2 clurgmgrd: [2993]: <err> script:httpd: status of /etc/rc.d/init.d/httpd failed (returned 3)
Sep 23 13:49:30 node2 clurgmgrd[2993]: <notice> status on script "httpd" returned 1 (generic error)
Sep 23 13:49:30 node2 clurgmgrd[2993]: <notice> Stopping service service:webserv
Sep 23 13:49:41 node2 clurgmgrd[2993]: <notice> Service service:webserv is recovering
 rhcs和heartbeat style 2默认都是通过调用资源的启动脚本进行简单的判断,例如:
  service httpd status ,通过返回码简单判断,如果是非0,就说明有故障,就会进行资源重启或者切换。
  这种判断方法:默认仅仅是否脚本简单的判断,而脚本默认也是简单地判断进程是否存活。不能有有效区分服务是否能够正常工作:如,僵尸进程就不能区分。
  解决方法:自己可以扩展脚本中的status处理过程。通过访问健康页面来实现。


停止集群:

# service rgmanager stop
# service cman stop


例子2:实现MySQL高可用

   Clients
      |
     vip 1.1.1.100
  |---------------------|
  mysql1       mysql2
  |---------------------|
       |
   share storage (nfs,模拟fence设备)


资源:
 vip
 共享存储:nfs
 mysqld

一些小步骤:
 建立nfs
 建立挂载目录
 找一个节点手工挂载,改权限,
 编写my.cnf
 初始化MySQL数据文件


默认情况下,mysqld的启动脚本是跟rhcs不兼容的:
 当mysql被意外停止,rhcs 就会通过 /etc/rc.d/init.d/mysqld status判断mysql状态,发现mysql已经被停止,就会尝试把所有资源让给另外的节点,但是让出去之前,必须保证资源是独占,所以它会把之前获得的所有资源都释放,对于script类型的资源,会使用 /etc/rc.d/init.d/mysqld stop的方式停止。由于mysqld原本已经意外停止,然后rhcs再去停止的时候就会返回非0的状态码,rhcs就误认为停止mysql失败,就不会把资源让出去,最后集群失效。

 解决方法:
  # service rgmanager stop
  修改脚本mysqld
# vim /etc/rc.d/init.d/mysqld
stop(){
        status mysqld
        if [ $? -ne 0 ];then
                return 0
        fi
。。。。。


  # service rgmanager start


当前集群已经启动之后,可以在线更改配置文件

# ccs_tool  update /etc/cluster/cluster.conf
或者通过图形界面 send to cluster按钮