Corosync简介:
Corosync在传递信息的时候可以通过一个简单的配置文件来定义信息传递的方式和协议等。它是一个新兴的软件,2008年推出,但其实它并不是一个真正意义上的新软件,在2002年的时候有一个项目Openais , 它由于过大,分裂为两个子项目,其中可以实现HA心跳信息传输的功能就是Corosync,它的代码60%左右来源于Openais。Corosync可以提供一个完整的HA功能,但是要实现更多,更复杂的功能,那就需要将两者结合起来。二者主要提供心跳探测,但是没有资源管理能力。pacemaker 可以提供资源管理能力,是从heartbeat的v3版本中分离出来的一个项目。Corosync是未来的发展方向,在以后的新项目里,一般采用Corosync,而heartbeat_gui可以提供很好的HA管理功能,可以实现图形化的管理。另外相关的图形化有RHCS的套件luci+ricci。
高可用群集要求:
1、硬件一致性
2、软件(系统)一致性
3、时间一致性
拓扑图:
设定172.16.11.11的节点名称为node1,172.16.11.12的节点名称为node2;
修改172.16.11.11和172.16.11.12的主机名称,使其节点名称与主机名称保持一致;
# hostname node1
# hostname node2
将主机名称写进node1和node2的配置文件中:
# sed -i s@HOSTNAME=.*@HOSTNAME=node1@g /etc/sysconfig/network
# sed -i s@HOSTNAME=.*@HOSTNAME=node2@g /etc/sysconfig/network
编辑node1和node2的/etc/hosts文件添加如下内容:
172.16.11.12 node2
172.16.11.11 node1
配置node1和node2的ssh互联互通;
在node1配置如下:
# ssh-keyken -t rsa #生成一对密钥;
# ssh-copy-id -i ./.ssh/id_rsa.pub root@node2 #将密钥放到node2节点上;
在node2配置如下:
# ssh-keygen -t rsa #生成一对密钥;
# ssh-copy-id -i ./.ssh/id_rsa.pub root@node1 #将密钥放到node1节点上;
修改node1和node2的时间保持一致
# hwclock -s 将系统时间设置与硬件时间一致;
如果时间同步不了可以直接使用date命令修改即可;
date命令格式:
# date 月日时分年.秒
# fdisk /dev/sda
创建两个大小为20G,类型为8e的分区,分区文件分别为/dev/sda5和/dev/sda6
# partprobe /dev/sda
# pvcreate /dev/sda{5,6}
# vgcreate myvg /dev/sda{5,6}
# lvcreate -L 20G -n mydata myvg
# mke2fs -j -L MYDATA /dev/myvg/mydata
创建共享目录
# mkdir /sharedata
将lvs开机自动挂载至/sharedata目录下
# vim /etc/fstab
添加如下行
LABEL=MYDATA /sharedata ext3 defaults 0 0
# mount -a
添加mysql用户
# useradd -r -u 150 mysql
修改/sharedata目录的属主和属组为mysql用户,让mysql用户对/sharedata目录具有读写权限;
# chown -R mysql:mysql /sharedata/
通过nfs共享/sharedata/目录
# vim /etc/exports
添加如下行
/sharedata 172.16.11.11(rw,no_root_squash) 172.16.11.12(rw,no_root_squash)
# service nfs start
让nfs开机自动启动
# chkconfig nfs on
# showmount -e localhost
Export list for localhost:
/sharedata 172.16.11.12,172.16.11.11
为node1和node2添加mysql用户并挂载nfs的共享目录
# useradd -r -u 150 mysql
创建/data/mydata目录,让nfs服务器上的共享目录挂载在该目录下
# mkdir -pv /data/mydata
# mount -t nfs 172.16.11.21:/sharedata /data/mydata
# ls /data/mydata/
lost+found
验证一下mysql用户对/data/mydata目录的读写权限
# su - mysql
su: warning: cannot change directory to /home/mysql: No such file or directory
-bash-3.2$ cd /data/mydata/
-bash-3.2$ ls
lost+found
-bash-3.2$ touch test.txt
-bash-3.2$ ls
lost+found test.txt
-bash-3.2$ rm test.txt
-bash-3.2$ ls
lost+found
-bash-3.2$
以上操作验证mysql用户对/data/mydata目录的读写权限正常
node1安装mysql-5.5.24-linux2.6-i686.tar.gz
#tar xf mysql-5.5.24-linux2.6-i686.tar.gz -C /usr/local/
#cd /usr/local/
#ln -sv mysql-5.5.24-linux2.6-i686 mysql
#cd mysql
#chown -R mysql:mysql .
#scripts/mysql_install_db --datadir=/data/mydata/ --user=mysql
#chown -R root .
提供配置文件并进行相应修改
#cp support-files/my-large.cnf /etc/my.cnf
#vim /etc/my.cnf
datadir = /data/mydata
thread_concurrency = 2
为mysql提供sysv服务脚本
#cp support-files/mysql.server /etc/rc.d/init.d/mysqld
添加至服务列表
#chkconfig --add mysqld
# service mysqld start
修改PATH环境变量,让系统可以直接使用mysql的相关命令;
#vim /etc/profile
PATH=/usr/local/mysql/bin:$PATH
#export PATH=/usr/local/mysql/bin:$PATH
#mysql 连上mysql成功
停掉mysql服务并使其不开机自动启动
# service mysqld stop
# chkconfig mysqld off
# chkconfig --list mysqld 一定要确保开机不自动启动
mysqld 0:off 1:off 2:off 3:off 4:off 5:off 6:off
卸载nfs
# umount /data/mydata/
node2安装mysql-5.5.24-linux2.6-i686.tar.gz
#tar xf mysql-5.5.24-linux2.6-i686.tar.gz -C /usr/local/
#cd /usr/local/
#ln -sv mysql-5.5.24-linux2.6-i686 mysql
#cd mysql
#chown -R root:mysql .
提供配置文件并进行相应修改
#cp support-files/my-large.cnf /etc/my.cnf
#vim /etc/my.cnf
datadir = /data/mydata
thread_concurrency = 2
为mysql提供sysv服务脚本
#cp support-files/mysql.server /etc/rc.d/init.d/mysqld
添加至服务列表
#chkconfig --add mysqld
# service mysqld start
修改PATH环境变量,让系统可以直接使用mysql的相关命令;
#vim /etc/profile
PATH=/usr/local/mysql/bin:$PATH
#export PATH=/usr/local/mysql/bin:$PATH
#mysql 连上mysql成功
停掉mysql服务并使其不开机自动启动
# service mysqld stop
# chkconfig mysqld off
# chkconfig --list mysqld 一定要确保开机不自动启动
mysqld 0:off 1:off 2:off 3:off 4:off 5:off 6:off
卸载nfs
# umount /data/mydata/
下载上述rpm包至node1和node2的/root目录下,然后分别在node1和node2上安装上述rpm包;
安装corosync
# yum -y --nogpgcheck localinstall *.rpm
node1和node2提供配置文件
# cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf
# vim /etc/corosync/corosync.conf
corosync.conf配置文件解析:
totem { // HA多个节点之间实现心跳信息传递的相关协议简称;
version: 2; //版本号secauth: on //是否打开安全认证threads: 0 //启用的线程数,一般和CPU数保持一致,0表示无限制interface {ringnumber: 0bindnetaddr: 10.15.62.0 //通过哪个网络地址进行通讯,可以给个网络地址,该地址掩码会自动计算;mcastaddr: 226.94.1.1 //广播地址mcastport: 5405 //广播地址端口}}logging {fileline: offto_stderr: no //是否发送标准出错to_logfile: yes //记录到日志文件;to_syslog: no //记录到系统日志;logfile: /var/log/cluster/corosync.log //需要手动创建集群日志目录debug: offtimestamp: on //日志中记录时间戳;logger_subsys { //子系统相关设置;subsys: AMFdebug: off}}
修改如下选项:
secauth: on
bindnetaddr: 172.16.11.1
mcastaddr: 226.100.7.1
to_syslog: no //关掉记录到系统日志功能,减轻系统I/O资源;
添加如下选项:
service { //定义一个服务来使用pacemaker;
ver: 0 //版本号;
name: pacemaker //使用到了pacemaker
}
aisexec { //定义corosync的工作用户,需要用root用户;使用到openais的一些子选项
user: root
group: root
}
生成节点间通信认证密钥:
# corosync-keygen //会自动的在/etc/corosync目录下生成一个二进制格式的key文件,权限为400
复制/etc/corosync/下的authkey、corosync.conf至node2的/etc/corosync/目录下
# scp authkey corosync.conf node2:/etc/corosync/
node1和node2节点创建日志文件目录:
# mkdir -p /var/log/cluster/
# ssh node2 'mkdir -p /var/log/cluster/'
启动corosync服务:
# service corosync start
# ssh node2 '/etc/rc.d/init.d/corosync start'
查看corosync引擎是否正常启动:
# grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log
查看初始化成员节点通知是否正常发出:
# grep TOTEM /var/log/cluster/corosync.log
检查启动过程中是否有错误产生:
# grep ERROR: /var/log/cluster/corosync.log | grep -v unpack_resources
查看pacemaker是否正常启动:
# grep pcmk_startup /var/log/cluster/corosync.log
使用如下命令查看集群节点的启动状态:
# crm status
============
Last updated: Tue Aug 7 12:43:40 2012
Stack: openais
Current DC: node1 - partition with quorum
Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2 Nodes configured, 2 expected votes
1 Resources configured.
============
Online: [ node1 node2 ]
禁用stonith:
# crm configure property stonith-enabled=false
corosync默认启用了stonith,而当前集群并没有相应的stonith设备,因此此默认配置目前尚不可用,这可以通过如下命令验正:
# crm_verify -Lcrm_verify[5202]: 2012/04/16_18:10:38 ERROR: unpack_resources: Resource start-up disabled since no STONITH resources have been definedcrm_verify[5202]: 2012/04/16_18:10:38 ERROR: unpack_resources: Either configure some or disable STONITH with the stonith-enabled optioncrm_verify[5202]: 2012/04/16_18:10:38 ERROR: unpack_resources: NOTE: Clusters with shared data need STONITH to ensure data integrityErrors found during check: config not valid-V may provide more detail
修改忽略quorum不能满足的集群状态检查:
# crm configure property no-quorum-policy=ignore
对于只有两节点的集群来讲,此时的集群状态为"WITHOUT quorum",即已经失去了quorum,此时集群服务本身已经不满足正常运行的条件,因此,我们修改忽略quorum不能满足的集群状态检查:
为资源指定默认黏性值:
# crm configure rsc_defaults resource-stickiness=100
资源黏性值解析:
在实际应用中,如果两台主机的性能差不多,当主节点当机后,次节点接受web资源,而当主节点恢复的时候,次节点又需要将WEB资源还给主节点,这就造成了一段时间内服务不可访问,降低了高可用性,这时候,我们就需要定义资源的粘性值,资源根据粘性值在决定当主节点恢复后,是否离开当前节点。
资源黏性值范围及其作用:0:这是默认选项。资源放置在系统中的最适合位置。这意味着当负载能力较好或较差的节点变得可用时才转移资源。此选项的作用基本等同于自动故障回复,只是资源可能会转移到非之前活动的节点上;大于0:资源更愿意留在当前位置,但是如果有更合适的节点可用时会移动。值越高表示资源越愿意留在当前位置;小于0:资源更愿意移离当前位置。绝对值越高表示资源越愿意离开当前位置;INFINITY:如果不是因节点不适合运行资源(节点关机、节点待机、达到migration-threshold 或配置更改)而强制资源转移,资源总是留在当前位置。此选项的作用几乎等同于完全禁用自动故障回复;-INFINITY:资源总是移离当前位置
添加访问mysql的ip
# crm configure primitive vip ocf:heartbeat:IPaddr params ip=172.16.11.1
添加nfs文件系统
# crm configure primitive mynfs ocf:heartbeat:Filesystem params device="172.16.11.21:/sharedata" directory="/data/mydata" fstype="nfs" op start timeout=60s op stop timeout=60s
# crm configure commit
查看定义的资源
# crm configure show
node node1 \
attributes standby="off"
node node2 \
attributes standby="off"
primitive mynfs ocf:heartbeat:Filesystem \
params device="172.16.11.21:/sharedata" directory="/data/mydata" fstype="nfs" \
op start interval="0" timeout="60s" \
op stop interval="0" timeout="60s"
primitive vip ocf:heartbeat:IPaddr \
params ip="172.16.11.1"
property $id="cib-bootstrap-options" \
dc-version="1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f" \
cluster-infrastructure="openais" \
expected-quorum-votes="2" \
stonith-enabled="false" \
last-lrm-refresh="1344248837" \
no-quorum-policy="ignore"
查看资源工作状态
# crm status
============
Last updated: Tue Aug 7 14:14:06 2012
Stack: openais
Current DC: node2 - partition with quorum
Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2 Nodes configured, 2 expected votes
2 Resources configured.
============
Online: [ node1 node2 ]
vip (ocf::heartbeat:IPaddr): Started node1
mynfs (ocf::heartbeat:Filesystem): Started node2
此时mynfs资源在node2上启动,去node2节点查看/data/mydata目录
# ls /data/mydata/
ibdata1 ib_logfile0 ib_logfile1 lost+found mysql mysql-bin.000001 mysql-bin.000002 mysql-bin.index node1.err node2.err performance_schema test testdb
node2上有数据文件,而node1没有数据文件
让node2变为被动节点
# crm node standby
此时查看资源工作状态
# crm status
============
Last updated: Tue Aug 7 14:21:08 2012
Stack: openais
Current DC: node2 - partition with quorum
Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2 Nodes configured, 2 expected votes
2 Resources configured.
============
Node node2: standby
Online: [ node1 ]
vip (ocf::heartbeat:IPaddr): Started node1
mynfs (ocf::heartbeat:Filesystem): Started node1
此时mynfs工作在node1节点上
去node1节点的/data/mydata目录验证一下
# ls /data/mydata/
ibdata1 ib_logfile0 ib_logfile1 lost+found mysql mysql-bin.000001 mysql-bin.000002 mysql-bin.index node1.err node2.err performance_schema test testdb
此是node1的/data/mydata/目录已经有数据文件,而node2的/data/mydata/目录中没有任何数据文件
添加mysqld服务
# crm configure primitive mysqld lsb:mysqld
# crm configure commit
资源约束解析:
从上面的信息中可以看出vip和mynfs有可能会分别运行于两个节点上,这对于通过此IP提供mysql服务的应用来说是不成立的,即此两者资源必须同时运行在某节点上。由此可见,即便集群拥有所有必需资源,但它可能还无法进行正确处理。资源约束则用以指定在哪些群集节点上运行资源,以何种顺序装载资源,以及特定资源依赖于哪些其它资源。pacemaker共给我们提供了三种资源约束方法:
1)Resource Location(资源位置):定义资源可以、不可以或尽可能在哪些节点上运行;2)Resource Collocation(资源排列):排列约束用以定义集群资源可以或不可以在某个节点上同时运行;3)Resource Order(资源顺序):顺序约束定义集群资源在节点上启动的顺序;定义约束时,还需要指定分数。各种分数是集群工作方式的重要组成部分。其实,从迁移资源到决定在已降级集群中停止哪些资源的整个过程是通过以某种方式修改分数来实现的。分数按每个资源来计算,资源分数为负的任何节点都无法运行该资源。在计算出资源分数后,集群选择分数最高的节点。 INFINITY(无穷大)目前定义为 1,000,000。加减无穷大遵循以下3个基本规则:1)任何值 + 无穷大 = 无穷大2)任何值 - 无穷大 = -无穷大3)无穷大 - 无穷大 = -无穷大定义资源约束时,也可以指定每个约束的分数。分数表示指派给此资源约束的值。分数较高的约束先应用,分数较低的约束后应用。通过使用不同的分数为既定资源创建更多位置约束,可以指定资源要故障转移至的目标节点的顺序。
定义排列约束
# crm configure collocation mysqld_with_mynfs_vip inf: vip mynfs mysqld
定义顺序约束,
# crm configure order mysqld_after_mynfs_after_vip mandatory: vip mynfs mysqld
# crm configure commit
查看集群信息库中定义的collocation和order约束
# crm configure show xml
//collocation约束配置信息//
<rsc_colocation id="mysqld_with_mynfs_vip" score="INFINITY">
<resource_set id="mysqld_with_mynfs_vip-0">
<resource_ref id="vip"/>
<resource_ref id="mynfs"/>
<resource_ref id="mysqld"/>
//order约束配置信息//
<rsc_order id="mysqld_after_mynfs_after_vip" score="INFINITY">
<resource_set id="mysqld_after_mynfs_after_vip-0">
<resource_ref id="vip"/>
<resource_ref id="mynfs"/>
<resource_ref id="mysqld"/>
查看资源工作状态
# crm status
============
Last updated: Tue Aug 7 14:59:46 2012
Stack: openais
Current DC: node2 - partition with quorum
Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2 Nodes configured, 2 expected votes
3 Resources configured.
============
Online: [ node1 node2 ]
vip (ocf::heartbeat:IPaddr): Started node1
mynfs (ocf::heartbeat:Filesystem): Started node1
mysqld (lsb:mysqld): Started node1
让node1节点切换为备用状态
# crm node1 standby
查看资源工作状态
# crm status
============
Last updated: Tue Aug 7 15:03:26 2012
Stack: openais
Current DC: node2 - partition with quorum
Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2 Nodes configured, 2 expected votes
3 Resources configured.
============
Node node1: standby
Online: [ node2 ]
vip (ocf::heartbeat:IPaddr): Started node2
mynfs (ocf::heartbeat:Filesystem): Started node2
mysqld (lsb:mysqld): Started node2
此时mysqld工作在node2节点上,去node2节点验证一下
# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.24-log MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h'for help. Type '\c' to clear the current input statement.
mysql> show databases;
+---------------------+
| Database |
+---------------------+
| information_schema |
| #mysql50#lost+found |
| mysql |
| performance_schema |
| test |
| testdb |
+---------------------+
6 rows in set (0.06 sec)
mysql>
由此资源已经成功生效;