一,概述
Cluster manager 简称CMAN,是一个分布式集群管理工具,运行在集群的各个节点上,为RHCS提供集群管理任务。它用于管理集群成员、消息和通知。它通过监控每个节点的运行状态来了解节点成员之间的有关系。当集群中某个节点出现故障时,节点成员关系将发生改变,CMAN及时将这种改变通知底层,进而做出相应的调整。
CMAN根据每个节点的运行状态,统计出一个法定节点数,作为集群是否存活的依据。当整个集群中有多于一半的节点处于激活状态时,表示达到了法定节点数,此集群可以正常运行,当集群中有一半或少于一半的节点处于激活状态时,表示没有达到法定的节点数,此时整个集群系统将变得不可用。CMAN依赖于CCS,并且CMAN通过CCS读取cluster.conf文件。
rgmanager主要用来监督、启动、停止集群的应用、服务和资源。当一个节点的服务失败时,高可用集群服务管理进程可以将服务从这个失败节点转移至其点健康节点上,这种服务转移能力是自动动,透明的。RHCS通过rgmanager来管理集群服务,rgmanager运行在每个集群节点上,在服务器上对应的进程为clurgmgrd。
在RHCS集群中,高可用生服务包括集群服务和集群资源两个方面。集群服务其实就是应用,如APACHE,MYSQL等。集群资源有IP地址,脚本,EXT3/GFS文件系统等。
在RHCS集群中,高可用性服务是和一个失败转移域结合在一起的。由几个节点负责一个特定的服务的集合叫失败转移域,在失败迁移域中可以设置节点的优先级,主节点失效,服务会迁移至次节点,如果没有设置优先,集群高可用服务将在任意节点间转移。
RHCS包括的组件:
下面说一下CMAN在 RHEL4到RHEL6的各组件工作模式的变化:
RHEL 4系列:
RHEL 5系列:
RHEL 6系列:
发现CMAN在RHEL6中各组功能已经大部分被转移到用户空间实现,大大简化了工作流程。
集群配置和管理工具
RHCS提供了多种集群配置和管理工具,常用有基于GUI的system-config-cluster,conga等,还提供了基于命令行的管理工具。
System-config-cluster由集群节点配置和集群管理两个部分组成,分别用于创建集群节点配置文件和维护节点运行状态,一般用于早期的RHCS版本中。
Conga是新的基于网络的集群配置工具。它是web界面管理的,由luci和ricci组成,luci可以安装在一台独立的计算机上,也可安装在节点上,用于配置和管理集群,ricci是一个代理,安装在每个集群节点上,luci通过ricci和集群中的每个节点通信。
二,下面我准备了一个实验环境,使用Conga配置工具来创建和管理集群:
IP:192.168.30.115 Host:admin.luojianlong.com OS:Centos6.4 x86_64 用于管理和配置集群
IP:192.168.30.116 Host:node1.luojianlong.com OS:Centos6.4 x86_64 集群节点1
IP:192.168.30.117 Host:node1.luojianlong.com OS:Centos6.4 x86_64 集群节点2
IP:192.168.30.119 Host:node1.luojianlong.com OS:Centos6.4 x86_64 集群节点3
首先配置4台server的主机名,ssh无密码互信和hosts文件:
[root@localhost ~]# hostname admin.luojianlong.com [root@localhost ~]# sed -i 's@\(HOSTNAME=\).*@\1admin.luojianlong.com@g' /etc/sysconfig/network [root@localhost ~]# bash [root@localhost ~]# hostname node1.luojianlong.com [root@localhost ~]# sed -i 's@\(HOSTNAME=\).*@\1node1.luojianlong.com@g' /etc/sysconfig/network [root@localhost ~]# bash [root@localhost ~]# hostname node2.luojianlong.com [root@localhost ~]# sed -i 's@\(HOSTNAME=\).*@\1node2.luojianlong.com@g' /etc/sysconfig/network [root@localhost ~]# bash [root@localhost ~]# hostname node3.luojianlong.com [root@localhost ~]# sed -i 's@\(HOSTNAME=\).*@\1node3.luojianlong.com@g' /etc/sysconfig/network [root@localhost ~]# bash [root@localhost ~]# vi /etc/hosts 192.168.30.115 admin.luojianlong.com admin 192.168.30.116 node1.luojianlong.com node1 192.168.30.117 node2.luojianlong.com node2 192.168.30.119 node3.luojianlong.com node3 [root@admin ~]# ssh-keygen -t rsa [root@admin ~]# ssh-copy-id -i node1 [root@admin ~]# ssh-copy-id -i node2 [root@admin ~]# ssh-copy-id -i node3 [root@admin ~]# scp /etc/hosts node1:/etc [root@admin ~]# scp /etc/hosts node2:/etc [root@admin ~]# scp /etc/hosts node3:/etc
下面在admin上面安装luci
[root@admin ~]# yum -y install luci --disablerepo=epel
启动luci服务
[root@admin ~]# service luci start Adding following auto-detected host IDs (IP addresses/domain names), corresponding to `admin.luojianlong.com' 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' Starting saslauthd: [ OK ] Start luci... [ OK ] Point your web browser to https://admin.luojianlong.com:8084 (or equivalent) to access luci
以上信息看出启动luci后会自动生成2048位ras加密的密钥,启动成功,监听在套接字的8084
注意,这里是基于https的,所有通过web访问luci管理页面,要通过https://IP来访问
[root@admin ~]# ss -antpl | grep :8084 LISTEN 0 5 *:8084 *:* users:(("python",17785,5))
打开浏览器访问:https://192.168.30.115:8084
输入服务器的账号密码登录:
在其他3个节点上分别安装ricci
[root@node1 ~]# yum -y install ricci [root@node2 ~]# yum -y install ricci [root@node3 ~]# yum -y install ricci
安装好riccic后,会在3个节点上分别自动建立用户ricci,下面分别给ricci设置密码,用来在luci里面添加集群节点
[root@node1 ~]# echo mypass | passwd --stdin ricci Changing password for user ricci. passwd: all authentication tokens updated successfully. [root@node2 ~]# echo mypass | passwd --stdin ricci Changing password for user ricci. passwd: all authentication tokens updated successfully. [root@node3 ~]# echo mypass | passwd --stdin ricci Changing password for user ricci. passwd: all authentication tokens updated successfully.
启动ricci
[root@node1 ~]# service ricci start Starting oddjobd: [ OK ] generating SSL certificates... done Generating NSS database... done Starting ricci: [ OK ] [root@node1 ~]# chkconfig ricci on [root@node2 ~]# service ricci start Starting oddjobd: [ OK ] generating SSL certificates... done Generating NSS database... done Starting ricci: [ OK ] [root@node2 ~]# chkconfig ricci on [root@node3 ~]# service ricci start Starting oddjobd: [ OK ] generating SSL certificates... done Generating NSS database... done Starting ricci: [ OK ] [root@node3 ~]# chkconfig ricci on
在luci创建集群,并添加集群节点
选择Download Packages,node1,node2,node3会自动安装rgmanager等所需要的软件包
以上信息发现,正在创建集群
创建完成
随便登录到一个节点上面,观察集群状态
[root@node1 ~]# cman_tool nodes Node Sts Inc Joined Name 1 M 4 2014-03-30 15:49:14 node1.luojianlong.com 2 M 12 2014-03-30 15:49:14 node2.luojianlong.com 3 M 12 2014-03-30 15:49:14 node3.luojianlong.com [root@node1 ~]# clustat Cluster Status for tcluster @ Sun Mar 30 15:53:40 2014 Member Status: Quorate Member Name ID Status ------ ---- ---- ------ node1.luojianlong.com 1 Online, Local node2.luojianlong.com 2 Online node3.luojianlong.com 3 Online
发现3个节点都已经在线
下来创建集群资源,首先创建集群VIP
以上信息:
IP Address:定义IP地址
Netmask Bits (optional):掩码长度
Monitor Link:是否监控资源,发生故障后可以自动重启资源
Disable Updates to Static Routes:禁止跟新静态路由
Number of Seconds to Sleep After Removing an IP Address:故障转移等待的时间
设置完成,点submit提交
发现一个IP资源已经创建好了
下面开始创建service groups
定义:
Service Name:服务名称
Automatically Start This Service:服务是否自动启动
Failover Domain:选择故障转移域
Recovery Policy:故障转移策略,包括Relocate,Restart,Restart-Disable,Disable
下面选择资源:
选择刚才创建的IP资源
选择自定义script资源,我们这里选择httpd,请确保3台node上面已经安装httpd
然后submit
下来点击start,启动资源
发现刚才定义的IP资源已经被使用
登录node1,查看集群状态
[root@node1 ~]# clustat Cluster Status for tcluster @ Sun Mar 30 16:26:40 2014 Member Status: Quorate Member Name ID Status ------ ---- ---- ------ node1.luojianlong.com 1 Online, Local, rgmanager node2.luojianlong.com 2 Online, rgmanager node3.luojianlong.com 3 Online, rgmanager Service Name Owner (Last) State ------- ---- ----- ------ ----- service:webservice node1.luojianlong.com started [root@node1 ~]# ss -anptl | grep :80 LISTEN 0 128 :::80 :::* users:(("httpd",31177,5),("httpd",31179,5),("httpd",31180,5),("httpd",31181,5),("httpd",31182,5),("httpd",31183,5),("httpd",31184,5),("httpd",31185,5),("httpd",31186,5))
发现httpd已经在node1运行了
接着,将webservice转移到node2上面
[root@node1 ~]# clusvcadm -r webservice -m node2.luojianlong.com Trying to relocate service:webservice to node2.luojianlong.com...Success service:webservice is now running on node2.luojianlong.com [root@node1 ~]# clustat Cluster Status for tcluster @ Sun Mar 30 16:29:25 2014 Member Status: Quorate Member Name ID Status ------ ---- ---- ------ node1.luojianlong.com 1 Online, Local, rgmanager node2.luojianlong.com 2 Online, rgmanager node3.luojianlong.com 3 Online, rgmanager Service Name Owner (Last) State ------- ---- ----- ------ ----- service:webservice node2.luojianlong.com started
登录node2
[root@node2 ~]# ss -anptl | grep :80 LISTEN 0 128 :::80 :::* users:(("httpd",11601,5),("httpd",11603,5),("httpd",11604,5),("httpd",11605,5),("httpd",11606,5),("httpd",11607,5),("httpd",11608,5),("httpd",11609,5),("httpd",11610,5)) [root@node2 ~]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:5b:50:f9 brd ff:ff:ff:ff:ff:ff inet 192.168.30.117/24 brd 192.168.30.255 scope global eth0 inet 192.168.30.230/24 scope global secondary eth0 inet6 fe80::20c:29ff:fe5b:50f9/64 scope link valid_lft forever preferred_lft forever
发现httpd和VIP已经在node2上面了。