说到高可用,我们可能会用heartbeat和keepalived,也可能会用corosync+pacemaker,但他们之间有什么区别呢?我们在此主要谈下heartbeat和corosync+pacemaker之间的渊源。
Heartbeat到了v3版本后,拆分为多个子项目,其中pacemaker就是拆分出来的资源管理器。Heartbeat 3.0拆分之后的组成部分:为:
1.Heartbeat:将原来的消息通信层独立为heartbeat项目,新的heartbeat只负责维护集群各节点的信息以及它们之前通信,被称为基础组件;(注意与corosync区别)
2.cluster-glue相当于一个中间层,可以将heartbeat和crm(pacemaker)联系起来,主要包含2个部分,LRM和STONITH;
3.Resource Agent:用来控制服务启停,监控服务状态的脚本集合,这些脚本将被LRM调用从而实现各种资源启动、停止、监控等等。
4.Pacemaker也就是Cluster Resource Manager (简称CRM),用来管理整个HA的控制中心,客户端通过pacemaker来配置管理监控整个集群。它不能提供底层心跳信息传递的功能,它要想与对方节点通信需要借助底层(新拆分的heartbeat或corosync)的心跳传递服务,将信息通告给对方。
另,pacemaker管理资源的工具由命令行界面的crmsh、pcs和图形化界面pygui、hawk等进行管理,我们使用pcs链进行资源管理。
通过以上,我们了解了pacemaker的由来,下面我们再来看下集群底层新拆分的heartbeat和corosync之间的区别:
1.配置文件的版本管理:Heartbeat只能为所有的资源配置一个主服务,而corosync则允许为不同的资源组配置不同的主服务
2.管理资源的灵活性:在corosync中,其会自行处理配置文件的同步问题,heartbeat则无此功能
3.分组管理:Heartbeat只支持2个节点,而corosync则支持多个节点的集群,支持把资源进行分组,按照组进行资源的管理,设置主服务,自行进行启停
4.配置复杂度:Heartbeat非常容易进行配置,第一次配置可能只需要几分钟,而Corosync由于有一定的复杂度则需要一点耐心
因此,一般来说都是选择corosync来进行心跳的检测,搭配pacemaker的资源管理系统来构建高可用的系统,下面我们就来介绍下corosync+pacemaker构建高可用系统。
IP | hostname | 系统 | VIP |
---|---|---|---|
10.10.10.60 | pcmk-1 | Centos7.2 | 10.10.10.62 |
10.10.10.61 | pcmk-2 | Centos7.2 | 10.10.10.62 |
注:为方便测试,两台服务器上都关闭防火墙及selinux
1.配置双机信任
#配置双机信任
#pcmk-1
ssh-keygen -t rsa
scp /root/.ssh/id_rsa.pub root@10.10.10.61:/root/.ssh/authorized_keys
#pcmk-2
ssh-keygen -t rsa
scp /root/.ssh/id_rsa.pub root@10.10.10.60:/root/.ssh/authorized_keys
2.安装集群组件
#pcmk-1,pcmk-2
yum install -y pacemaker pcs psmisc policycoreutils-python
安装完毕后,会生成一个hacluster用户,供集群使用。
3.启动pcs并设为开机启动
pcs是pacemaker的命令行管理工具,用来管理同步各个节点的corosync的配置文件
#pcmk-1,pcmk-2
systemctl start pcsd.service
systemctl enable pcsd.service
ln -s '/usr/lib/systemd/system/pcsd.service' '/etc/systemd/system/multi-user.target.wants/pcsd.service'
4.为hacluster设置密码
安装组件生成的hacluster用户,用来本地启动pcs进程,因此我们需要设定密码,每个节点的密码相同。
#pcmk-1,pcmk-2
passwd hacluster
Changing password for user hacluster.
New password:
Retype new password:
Sorry, passwords do not match.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
5.验证节点(在其中一个节点即可)
#pcmk-1或pcmk-2
[root@pcmk-1 ~]# pcs cluster auth pcmk-1 pcmk-2
Username: hacluster
Password:
pcmk-2: Authorized
pcmk-1: Authorized
6.生成corosync配置文件(在其中一个节点即可)
#pcmk-1或pcmk-2
[root@pcmk-1 ~]# pcs cluster setup --name mycluster pcmk-1 pcmk-2
Shutting down pacemaker/corosync services...
Redirecting to /bin/systemctl stop pacemaker.service
Redirecting to /bin/systemctl stop corosync.service
Killing any remaining services...
Removing all cluster configuration files...
pcmk-1: Succeeded
pcmk-2: Succeeded
Synchronizing pcsd certificates on nodes pcmk-1, pcmk-2...
pcmk-2: Success
pcmk-1: Success
Restaring pcsd on the nodes in order to reload the certificates...
pcmk-2: Success
pcmk-1: Success
以上建立一个名为mycluster集群,生成并同步corosync配置文件,生成的文件为/etc/corosync/corosync.conf
注意:若在另一个节点生成需要重新验证节点。
7.启动集群并设为自启动(在其中一个节点即可)
#all参数会使每个节点都启动,若没有all则只在本地生效
[root@pcmk-1 ~]# pcs cluster start --all
pcmk-1: Starting Cluster...
pcmk-2: Starting Cluster...
[root@pcmk-1 ~]# pcs cluster enable --all
pcmk-1: Cluster Enabled
pcmk-2: Cluster Enabled
8.查看集群状态
[root@pcmk-1 ~]# pcs cluster status
Cluster Status:
Last updated: Fri Jan 15 10:05:43 2016 Last change: Fri Jan 15 09:56:15 2016 by hacluster via crmd on pcmk-2
Stack: corosync
Current DC: pcmk-2 (version 1.1.13-10.el7-44eb2dd) - partition with quorum
2 nodes and 0 resources configured
Online: [ pcmk-1 pcmk-2 ]
PCSD Status:
pcmk-1: Online
pcmk-2: Online
其中Online表示pcmk-1,pcmk-2节点的两个主机存活,pcsd status表示两个节点上的pcsd进程存活。
9.查看corosync相关状态
[root@pcmk-1 ~]# corosync-cfgtool -s
Printing ring status.
Local node ID 1
RING ID 0
id = 10.10.10.60
status = ring 0 active with no faults
#检验corosync成员
[root@pcmk-1 ~]# corosync-cmapctl | grep members
runtime.totem.pg.mrp.srp.members.1.config_version (u64) = 0
runtime.totem.pg.mrp.srp.members.1.ip (str) = r(0) ip(10.10.10.60)
runtime.totem.pg.mrp.srp.members.1.join_count (u32) = 1
runtime.totem.pg.mrp.srp.members.1.status (str) = joined
runtime.totem.pg.mrp.srp.members.2.config_version (u64) = 0
runtime.totem.pg.mrp.srp.members.2.ip (str) = r(0) ip(10.10.10.61)
runtime.totem.pg.mrp.srp.members.2.join_count (u32) = 1
runtime.totem.pg.mrp.srp.members.2.status (str) = joined
#检查corosync状态
[root@pcmk-1 ~]# pcs status corosync
Membership information
----------------------
Nodeid Votes Name
1 1 pcmk-1 (local)
2 1 pcmk-2
10.查看pacemaker进程
[root@pcmk-1 ~]# ps axf |grep pacemaker
22445 pts/0 S+ 0:00 \_ grep --color=auto pacemaker
22105 ? Ss 0:00 /usr/sbin/pacemakerd -f
22106 ? Ss 0:00 \_ /usr/libexec/pacemaker/cib
22107 ? Ss 0:00 \_ /usr/libexec/pacemaker/stonithd
22108 ? Ss 0:00 \_ /usr/libexec/pacemaker/lrmd
22109 ? Ss 0:00 \_ /usr/libexec/pacemaker/attrd
22110 ? Ss 0:00 \_ /usr/libexec/pacemaker/pengine
22111 ? Ss 0:00 \_ /usr/libexec/pacemaker/crmd
11.查看整个集群所有组件的状态
[root@pcmk-1 ~]# pcs status
Cluster name: mycluster
WARNING: no stonith devices and stonith-enabled is not false
Last updated: Fri Jan 15 10:10:59 2016 Last change: Fri Jan 15 09:56:15 2016 by hacluster via crmd on pcmk-2
Stack: corosync
Current DC: pcmk-2 (version 1.1.13-10.el7-44eb2dd) - partition with quorum
2 nodes and 0 resources configured
Online: [ pcmk-1 pcmk-2 ]
Full list of resources:
PCSD Status:
pcmk-1: Online
pcmk-2: Online
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
12.检查配置文件是否正确
[root@pcmk-1 ~]# crm_verify -L -V
error: unpack_resources: Resource start-up disabled since no STONITH resources have been defined
error: unpack_resources: Either configure some or disable STONITH with the stonith-enabled option
error: unpack_resources: NOTE: Clusters with shared data need STONITH to ensure data integrity
Errors found during check: config not valid
为保证数据安全性,pacemaker默认启动stonith,但是我们没有配置stonith,因此报错。我们先暂时禁用stonith,等会再配置stonith
#禁用stonith,再次检查配置文件正常
[root@pcmk-1 ~]# pcs property set stonith-enabled=false
[root@pcmk-1 ~]# crm_verify -L
13.添加虚拟ip资源–vip(漂移ip)
[root@pcmk-1 heartbeat]# pcs resource create ClusterIP ocf:heartbeat:IPaddr2 ip=10.10.10.62 cidr_netmask=32 op monitor interval=30s
在这里我们以10.10.10.62作为浮动IP,名字为ClusterIP 并且告诉集群每30秒检查它一次。
其中ocf: heartbeat:IPaddr2。这告诉Pacemaker三件事情,第一个部分ocf,指明了这个资源采用的标准(类型)以及在哪能找到它。第二个部分标明这个资源脚本的在ocf中的名字空间,在这个例子中是heartbeat。最后一个部分指明了资源脚本的名称。
#运行下面的命令来获得可用的资源
[root@pcmk-1 resource.d]# pcs resource standards
ocf
lsb
service
systemd
stonith
#运行下面的命令来获得可用的ocf资源提供者
[root@pcmk-1 ~]# pcs resource providers
heartbeat
openstack
pacemaker
#如果你想看特定一个ocf资源提供者的所有可用资源代理
[root@pcmk-1 resource.d]# pcs resource agents ocf:heartbeat
CTDB
Delay
Dummy
Filesystem
IPaddr
IPaddr2
IPsrcaddr
LVM
MailTo
........
14.查看IP资源状态
[root@pcmk-1 heartbeat]# pcs status
Cluster name: mycluster
Last updated: Fri Jan 15 10:38:04 2016 Last change: Fri Jan 15 10:37:58 2016 by root via cibadmin on pcmk-1
Stack: corosync
Current DC: pcmk-2 (version 1.1.13-10.el7-44eb2dd) - partition with quorum
2 nodes and 1 resource configured
Online: [ pcmk-1 pcmk-2 ]
Full list of resources:
ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-1
PCSD Status:
pcmk-1: Online
pcmk-2: Online
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
ok,我们的IP资源已经可用,我们可以通过VIP进行访问某些应用了。
下面我们来模拟下故障迁移。
1.停掉pcmk-1节点
[root@pcmk-1 heartbeat]# pcs cluster stop pcmk-1
pcmk-1: Stopping Cluster (pacemaker)...
pcmk-1: Stopping Cluster (corosync)...
[root@pcmk-1 heartbeat]# pcs status
Error: cluster is not currently running on this node
2.查看VIP是否漂移到pcmk-2节点
[root@pcmk-2 ~]# pcs status
Cluster name: mycluster
Last updated: Fri Jan 15 10:42:41 2016 Last change: Fri Jan 15 10:37:59 2016 by root via cibadmin on pcmk-1
Stack: corosync
Current DC: pcmk-2 (version 1.1.13-10.el7-44eb2dd) - partition with quorum
2 nodes and 1 resource configured
Online: [ pcmk-2 ]
OFFLINE: [ pcmk-1 ]
Full list of resources:
ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-2
PCSD Status:
pcmk-1: Online
pcmk-2: Online
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
其中pcmk-1节点已经offline,但是pcmk-1的pcsd进程还活着,因此为online,此时VIP已经漂移到pcmk-2
注意:当pcmk-1重新启动后,会自动加入集群中,但是vip不会再次漂移到pcmk-1;但是pacemaker老版本中,vip会重新漂移到恢复后的节点。
3.防止资源在节点恢复后迁移
资源在节点恢复后再迁移到原节点往往需要一点时间,此时会无法对外提供服务;当在数据库间迁移时,会需要更长的时间。但是我们可以通过stickiness来解决,pacemaker默认所有节点的stickiness都为0,我们最通常更改默认情况下的stickiness就足够了
[root@pcmk-1 ~]# pcs resource defaults resource-stickiness=100
[root@pcmk-1 ~]# pcs resource defaults
resource-stickiness: 100
从cososync+pacemaker与未拆分heartbeat比,配置的确比较麻烦,但是从管理、扩展、应用等方面来说,前者还是非常方便的,没有那么多局限性;从长远来看cososync+pacemaker是趋势。