集群系列七(基于corosync+pacemaker+drbd的Mysql高可用集群)

实验环境:

  1)基于vmwere虚拟机实现

  2)本配置共有两个测试节点,分别node1.a.com和node2.a.com,相的IP地址分别为172.16.4.11172.16.4.22
  3模拟实现的集群服务是mysql服务
  4)提供mysql服务的地址为172.16.4.1

 

1,基础环境设置
首先配置一台HA主机需要做的准备工作:
1)因为集群节点的工作的重要性,而且需要提供稳定的网络环境,这里我们需要给节点配置固定的IP地址,编辑/etc/sysconfig/network-scripts/ifcfg-eth0,配置IP如下:
  
  
  
  
  1. DEVICE=eth0 
  2. BOOTPROTO=static 
  3. IPADDR=172.16.4.11 
  4. NETMASK=255.255.0.0 
  5. ONBOOT=yes 
  6. HWADDR=00:0c:29:92:c3:da 
2)保证节点主机的名称和“ uname
-n
”命令的结果保持一致,我们需要编辑/etc/sysconfig/network,配置如下:
 
  
  
  
  
  1. NETWORKING=yes 
  2. NETWORKING_IPV6=no 
  3. HOSTNAME=node1.a.com 
而且要做以下操作,使主机名本次生效:
#source   /etc/sysconfig/network
#hostname node1.a.com

3)所有节点的主机名称和对应的IP地址解析服务可以正常工作,我们不需要DNS服务,只需要保证两个节点上的/etc/hosts文件均为下面的内容(两个节点均要配置):

  
  
  
  
  1. 172.16.4.11 node1.a.com   node1 

  2. 172.16.4.22 node2.a.com   node2 



4)
配置节点信任关系:
节点 1:
# ssh-keygen  -t   rsa
# ssh-copy-id -i  ~/.ssh/id_rsa.pub  root@node2

节点 2:
# ssh-keygen -t rsa
# ssh-copy-id -i ~/.ssh/id_rsa.pub  root@node1
2,安装环境需要的相应的软件包(l):

#yum install   -y libibverbs librdmacm lm_sensors libtool-ltdl openhpi-libs openhpi perl-TimeDate

3,安装corosync和pacemaker,我们这里将软件包放在/root/corosync目录下(两个节点都要做):
 
  
  
  
  
  1. cluster-glue-1.0.6-1.6.el5.i386.rpm 
  2. cluster-glue-libs-1.0.6-1.6.el5.i386.rpm 
  3. corosync-1.2.7-1.1.el5.i386.rpm 
  4. corosynclib-1.2.7-1.1.el5.i386.rpm 
  5. heartbeat-3.0.3-2.3.el5.i386.rpm<-----用于传递心跳信息,此包必须安装 
  6. heartbeat-libs-3.0.3-2.3.el5.i386.rpm 
  7. libesmtp-1.0.4-5.el5.i386.rpm 
  8. openais-1.1.3-1.6.el5.i386.rpm 
  9. openaislib-1.1.3-1.6.el5.i386.rpm 
  10. pacemaker-1.0.11-1.2.el5.i386.rpm 
  11. pacemaker-libs-1.0.11-1.2.el5.i386.rpm 
  12. perl-TimeDate-1.16-5.el5.noarch.rpm 
  13. resource-agents-1.0.4-1.1.el5.i386.rpm 
 
这里您安装的软件版本可能和笔者的不一致,只要符合您的实验平台就行。
开始安装:
# cd /root/corosync/
# yum -y --nogpgcheck  localinstall  *.rpm
这里我们使用本地yum安装,并忽略包的检查。
4,corosync的相关配置(在节点1上执行):

# cd   /etc/corosync
# cp   corosync.conf.example  corosync.conf

这里corosync.conf.example是配置样本,我们只需拷贝一份,并进行修改即可

# vim /etc/corosync/corosync.conf

 
  
  
  
  
  1.  # Please read the corosync.conf.5 manual page 
  2. compatibility: whitetank 
  3. totem { 
  4.         version: 2 
  5.         secauth: on《-----传递心跳信息时,进行相互认证 
  6.         threads: 0 
  7.         interface { 
  8.                 ringnumber: 0 
  9.                 bindnetaddr: 172.16.0.0《------此处是您需要修改的地方,为网卡的网络地址 
  10.                 mcastaddr: 226.94.1.1《-----发送组播信息,默认配置即可 
  11.                 mcastport: 5405《---发送组播消息的端口,默认即可 
  12.         } 
  13. logging {《-------配置记录日志的选项 
  14.         fileline: off 
  15.         to_stderr: no 
  16.         to_logfile: yes 
  17.         to_syslog: yes 
  18.         logfile: /var/log/cluster/corosync.log《-----此处日志存放的地方 
  19.         debug: off《------关闭调试日志功能 
  20.         timestamp: on《-----打开时间戳 
  21.         logger_subsys { 
  22.                 subsys: AMF 
  23.                 debug: off 
  24.         } 
  25. amf { 
  26.         mode: disabled 
  27. service {《-----------------此处以下是您需要添加的内容 
  28.  ver: 0 
  29.  name: pacemaker《-----添加pacemaker 
  30. aisexec { 
  31.  user: root《------运行openais的用户 
  32.  group: root 
 
 
生成节点间通信时用到的认证密钥文件:
# corosync-keygen
《---此处会在当前目录下生成一个认证密钥文件
 
然后拷贝相关的文件到节点2上:
# scp -p  corosync.conf  authkey node2:/etc/corosync/

为两个节点创建corosync生成的日志所在的目录:
# mkdir /var/log/cluster
# ssh node2 -- mkdir /var/log/cluster

5,开始启动corosync(在节点1上执行):
# /etc/init.d/corosync start

 Starting Corosync Cluster Engine (corosync):               [ OK ] 《------出现此,说明您的corosync已经启动

 
开始验证是否有其他错误:
查看corosync引擎是否正常启动

# grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/messages

  
  
  
  
  1. Sep 15 11:20:41 localhost smartd[2350]: Opened configuration file /etc/smartd.conf 
  2. Sep 15 11:24:24 localhost smartd[2416]: Opened configuration file /etc/smartd.conf 
  3. Sep 22 10:38:39 localhost smartd[2671]: Opened configuration file /etc/smartd.conf 
  4. Sep 22 11:23:01 localhost corosync[3530]:   [MAIN ] Corosync Cluster Engine ('1.2.7'): started and ready to provide service. 
  5. Sep 22 11:23:01 localhost corosync[3530]:   [MAIN ] Successfully read main configuration file '/etc/corosync/corosync.conf'. 
查看初始化成员节点通知是否正常发出
# grep TOTEM /var/log/messages
  
  
  
  
  1. Sep 22 11:23:01 localhost corosync[3530]:   [TOTEM ] Initializing transport (UDP/IP). 
  2. Sep 22 11:23:01 localhost corosync[3530]:   [TOTEM ] Initializing transmit/receive security: libtomcrypt SOBER128/SHA1HMAC (mode 0). 
  3. Sep 22 11:23:01 localhost corosync[3530]:   [TOTEM ] The network interface [172.16.4.11] is now up. 
  4. Sep 22 11:23:02 localhost corosync[3530]:   [TOTEM ] A processor joined or left the membership and a new membership was formed. 
检查启动过程中是否有错误产生
# grep ERROR: /var/log/messages | grep -v unpack_resources
如果没有出现错误,此处则不会出现任何信息
查看pacemaker是否正常启动
# grep pcmk_startup /var/log/messages
  
  
  
  
  1. Sep 22 11:23:02 localhost corosync[3530]:   [pcmk ] info: pcmk_startup: CRM: Initialized 
  2. Sep 22 11:23:02 localhost corosync[3530]:   [pcmk ] Logging: Initialized pcmk_startup 
  3. Sep 22 11:23:02 localhost corosync[3530]:   [pcmk ] info: pcmk_startup: Maximum core file size is: 4294967295 
  4. Sep 22 11:23:02 localhost corosync[3530]:   [pcmk ] info: pcmk_startup: Service: 9 
  5. Sep 22 11:23:02 localhost corosync[3530]:   [pcmk ] info: pcmk_startup: Local hostname: node1.a.com 
上述验证错误的操作没有出现问题的话,您就可以启动节点2了
# ssh node2 -- /etc/init.d/corosync    start 《-----此步您需要在节点1上进行

Starting Corosync Cluster Engine (corosync): [ OK ]《----出现此,说明您的节点2corosync已经启动,您需要在节点2上继续验证是否出现异常错误,执行验证错误的步骤即可。

查看节点的运行状态:
# crm status
 
  
  
  
  
  1. ============ 
  2. Last updated: Thu Sep 22 11:24:46 2011 
  3. Stack: openais 
  4. Current DC: node1.a.com - partition with quorum 
  5. Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87 
  6. 2 Nodes configured, 2 expected votes 
  7. 0 Resources configured. 
  8. ============ 
  9. Online: [ node1.a.com node2.a.com ]《----此处说明您的两个集群节点均已运行正常。 
 
6,配置集群的工作属性:
因为corosync默认已经启用了stonith,而当前又没有添加stonith设备,会出现默认配置不可用的状态:
# crm_verify -L
  
  
  
  
  1. crm_verify[3590]: 2011/09/22_11:25:33 ERROR: unpack_resources: Resource start-up disabled since no STONITH resources have been defined 
  2. crm_verify[3590]: 2011/09/22_11:25:33 ERROR: unpack_resources: Either configure some or disable STONITH with the stonith-enabled option 
  3. crm_verify[3590]: 2011/09/22_11:25:33 ERROR: unpack_resources: NOTE: Clusters with shared data need STONITH to ensure data integrity 
  4. Errors found during check: config not valid 
  5.  -V may provide more details 
为防止以后出现错误,影响操作,我们这里可以禁用stonith

# crm configure property stonith-enabled=false《----这样执行的命令会提交而且会立即生效

INFO: building help index
 
使用一下命令可以查看当前corosync的配置信息:
# crm configure show
 
  
  
  
  
  1. node node1.a.com 
  2. node node2.a.com 
  3. property $id="cib-bootstrap-options" \ 
  4.        dc-version="1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87" \ 
  5.        cluster-infrastructure="openais" \ 
  6.        expected-quorum-votes="2" \ 
  7.        stonith-enabled="false"《----stonith已经被禁用 
 
crm,crm_verify相关的命令是1.0后的版本的pacemaker提供的基于命令行的集群管理工具;可以在集群中的任何一个节点上执行,查看相应的信息。
7,安装drbd软件
下载drbd软件如下:
 
  
  
  
  
  1. drbd83-8.3.8-1.el5.centos.i386.rpm  
  2. kmod-drbd83-8.3.8-1.el5.centos.i686.rpm 
 
将软件放在/root/drbd目录下,然后安装:
# cd /root/drbd/
# yum -y --nogpgcheck localinstall *.rpm
8,配置文件drbd.conf
拷贝模版配置文件到指定目录下:

# cp -f /usr/share/doc/drbd83-8.3.8/drbd.conf   /etc/

我们来看一下drbd.conf:
# cat /etc/drbd.conf
  
  
  
  
  1. # You can find an example in /usr/share/doc/drbd.../drbd.conf.example   《----注释信息 
  2. include "drbd.d/global_common.conf";《-------主要定义global段和common段 
  3. include "drbd.d/*.res";    《-----包含定义资源的文件 

编辑/etc/drbd.d/global_common.conf

# cp /etc/drbd.d/global_common.conf{,.bak} 《-----养成个好习惯,每次配置这样的配置文件都备份一份
# vim /etc/drbd.d/global_common.conf
 
  
  
  
  
  1. global { 
  2.         usage-count no; 
  3.         # minor-count dialog-refresh disable-ip-verification 
  4. common { 
  5.         protocol C; 
  6.         handlers { 
  7.                 pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; 
  8.                 pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; 
  9.                 local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f"; 
  10.                  fence-peer "/usr/lib/drbd/crm-fence-peer.sh"; 《---开启fence功能
  11.                  split-brain "/usr/lib/drbd/notify-split-brain.sh root"; 《--防止脑裂
  12.                  out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root"; 《----同步写入
  13.                  before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k"; 
  14.                  after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh; 
  15.         } 
  16.         startup { 
  17.                 wfc-timeout 120; 
  18.                 degr-wfc-timeout 120; 
  19.         } 
  20.         disk { 
  21.                 on-io-error detach; 
  22.                 fencing resource-only; 
  23.         } 
  24.         net { 
  25.                cram-hmac-alg "sha1"; 
  26.                 shared-secret "mydrbdlab"; 
  27.         } 
  28.         syncer { 
  29.                 rate 100M; 《---同步时传输的速率
  30.         } 
 
每个资源通常定义在一个单独的位于/etc/drbd.d目录中的以.res结尾的文件中。资源在定义时必须为其命名,名字可以由非空白的ASCII字符组成。每一个资源段的定义中至少要包含两个host子段,以定义此资源关联至的节点,其它参数均可以从common段或drbd的默认中进行继承而无须定义。
定义一个资源/etc/drbd.d/mysql.res,内容如下
#vim /etc/drbd.d/mysql.res
 
  
  
  
  
  1. resource mysql { 
  2.     on node1.a.com { 
  3.     device    /dev/drbd0; 
  4.     disk      /dev/sdb5; 
  5.     address   172.16.4.11:7789; 
  6.     meta-disk internal; 
  7.  } 
  8.  on node2.a.com { 
  9.     device    /dev/drbd0; 
  10.     disk      /dev/sdb5; 
  11.     address   172.16.4.22:7789; 
  12.     meta-disk internal; 
  13.  } 
 
拷贝配置文件到另一个节点:
#scp -r /etc/drbd.conf /etc/drbd.d/     node2:/etc/
9,在两个节点上初始化已定义的资源并启动服务:
1)初始化资源,在Node1和Node2上分别执行:
# drbdadm create-md mysql
 
  
  
  
  
  1. Writing meta data... 
  2. initializing activity log 
  3. NOT initialized bitmap 
  4. New drbd meta data block successfully created.《-------此处显示您已经成功创建 
2)启动服务,在Node1和Node2上分别执行:
#/etc/init.d/drbd start《-----在两个节点同时都执行时,服务才会启动
3)查看启动的状态:
# cat /proc/drbd
 
  
  
  
  
  1. version: 8.3.8 (api:88/proto:86-94) 
  2. GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by [email protected], 2010-06-04 08:04:16 
  3.  0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r---- 
  4. ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:4891540 
也可以使用:
# drbd-overview
 
  
  
  
  
  1. 0:mysql Connected Secondary/Secondary Inconsistent/Inconsistent C r---- 
 
从上面的信息中可以看出此时两个节点均处于Secondary状态。于是,我们接下来需要将其中一个节点设置为Primary。在要设置为Primary的节点上执行如下命令:
# drbdsetup /dev/drbd0 primary    -o
# cat /proc/drbd
 
  
  
  
  
  1. version: 8.3.8 (api:88/proto:86-94) 
  2. GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by [email protected], 2010-06-04 08:04:16 
  3.  0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r---- 
  4.     ns:918728 nr:0 dw:0 dr:925856 al:0 bm:55 lo:1 pe:42 ua:223 ap:0 ep:1 wo:b oos:3974132 
  5.        [==>.................] sync'ed: 18.9% (3880/4776)M delay_probe: 55《-----此时已经在同步消息 
  6.        finish: 0:00:43 speed: 91,176 (70,568) K/sec 
此时再查看时:
# drbd-overview
 
  
  
  
  
  1. 0:mysql Connected Primary/Secondary UpToDate/UpToDate C r---- 
此节点1已经变为主节点了。
 
查看是主节点还是从节点:
# drbdadm role mysql 《-----node1上执行的结果
 
  
  
  
  
  1. Primary/Secondary 
# drbdadm role mysql 《------node2上执行的结果
 
  
  
  
  
  1. Secondary/Primary 
 
10,创建文件系统:
文件系统的挂载只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化:
# mke2fs -j -L DRBD /dev/drbd0
# mkdir /data
 
11,停止drbd,并将drbd加入集群服务(两个节点均要执行):
#/etc/init.d/drbd    stop

#chkconfig   drbd off

12,设置基于drbd的mysql服务资源
安装mysql:
# yum -y install mysql mysql-server
# vim /etc/my.cnf
 
  
  
  
  
  1. 添加:datadir=/data 

#chkconfig   mysqld off

定义服务资源:
  
  
  
  
  1. # crm configure property stonith-enabled=flase《----因为没有stonish设备,所以这里设置为不启用 
  2.  
  3. # crm configure property no-quorum-policy=ignore《-----忽略没有quorum的决策 
  4. #crm 
  5. #configure 
  6.  
  7. # primitive MysqlIP ocf:heartbeat:IPaddr params ip="172.16.4.1"《----定义IP资源 
  8.  
  9. # primitive Mysql lsb:mysqld op start timeout="120" op stop tomeout="120" op monitor interval="20"   timeout="30"《-------定义mysql服务资源 
  10.  
  11. #primitive MysqlDrbd ocf:linbit:drbd params drbd_resource="mysql" op monitor interval="15" role="Master" op monitor interval="30" role="Slave" op start timeout="240" op stop timeout="120"《------定义Drbd的集群服务资源,因为drbd有主从机制,这里需要定义“master”和“salve” 
  12.  
  13. # primitive MysqlFS ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/data" fstype="ext3" op start timeout="60" op stop timeout="60"《-----定义文件系统资源,为mysql准备存放数据的地方。 
  14.  
  15. # ms MS_MysqlDrbd MysqlDrbd meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true" 《-----主从的clone资源 
  16.   
  17. # colocation Mysql_on_MysqlDrbd inf: Mysql MS_MysqlDrbd:Master 《---Mysql运行在主节点上(位置约束) 
  18.  
  19. # colocation MysqlFS_on_MS_MysqlDrbd inf: MysqlFS MS_MysqlDrbd:Master《----文件系统资源也运行在主节点上(位置约束) 
  20.  
  21. # order Drbd_before_MysqlFS inf: MS_MysqlDrbd:promote MysqlFS:start 《---inf是一种永久的约束,定义启动顺序,启动MysqlDrbd后再启动MysqlFS 
  22. # order Mysql_after_MysqlFS inf: MysqlFS:promote Mysql:start《-----同上   
  23. # group Gmysql MysqlFS MysqlIP Mysql 《----规定资源均在一个节点上 
  24. # commit 《-----提交配置
 
[root@node2 ~]# crm status 《----查看资源状态
 
  
  
  
  
  1. ============ 
  2. Last updated: Thu Sep 22 12:34:47 2011 
  3. Stack: openais 
  4. Current DC: node1.a.com - partition with quorum 
  5. Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87 
  6. 2 Nodes configured, 2 expected votes 
  7. 2 Resources configured. 
  8. ============ 
  9. Online: [ node1.a.com node2.a.com ]  
  10.  Master/Slave Set: MS_MysqlDrbd 
  11.      Masters: [ node2.a.com ] 
  12.      Slaves: [ node1.a.com ] 
  13.  Resource Group: Gmysql 
  14.      MysqlFS       (ocf::heartbeat:Filesystem):    Started node2.a.com 
  15.      MysqlIP       (ocf::heartbeat:IPaddr):   Started node2.a.com 
  16.      Mysql    (lsb:mysqld):   Started node2.a.com  

[root@node2 ~]# mysql《-----此时mysql服务已经启用

  
  
  
  
  1. Welcome to the MySQL monitor. Commands end with ; or \g. 
  2. Your MySQL connection id is 3 
  3. Server version: 5.0.77 Source distribution 
  4. Type 'help;' or '\h' for help. Type '\c' to clear the buffer. 
  5. mysql> show databases; 
  6. +--------------------+ 
  7. | Database           | 
  8. +--------------------+ 
  9. | information_schema | 
  10. | lost+found         | 
  11. | mysql              | 
  12. | test               | 
  13. +--------------------+ 
  14. 4 rows in set (0.00 sec) 
  15. mysql> create database mydb;《-----------创建一个数据库mydb 
  16. Query OK, 1 row affected (0.02 sec) 
  17. mysql> show databases; 
  18. +--------------------+ 
  19. | Database           | 
  20. +--------------------+ 
  21. | information_schema | 
  22. | lost+found         | 
  23. | mydb               | 
  24. | mysql              | 
  25. | test               | 
  26. +--------------------+ 
  27. 5 rows in set (0.01 sec) 
  28. mysql> 
[root@node2 ~]# cd /data/
[root@node2 data]# ls 《-------------data目录下已经有数据库数据了
ibdata1 ib_logfile0 ib_logfile1 lost+found mydb mysql test
 
测试模拟节点2失效:

#crm   node   standby

#crm status 查看资源扭转情况
[root@node2 ~]# crm status
 
  
  
  
  
  1. ============ 
  2. Last updated: Thu Sep 22 12:49:19 2011 
  3. Stack: openais 
  4. Current DC: node1.a.com - partition with quorum 
  5. Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87 
  6. 2 Nodes configured, 2 expected votes 
  7. 2 Resources configured. 
  8. ============ 
  9. Node node2.a.com: standby 
  10. Online: [ node1.a.com ] 
  11.  Master/Slave Set: MS_MysqlDrbd 
  12.      Slaves: [ node2.a.com node1.a.com ] 
此时我们发现节点2已经失效,但数据同步需要一定的时间:
#crm node online《-----节点1上执行
[root@node1 ~]# crm status
 
  
  
  
  
  1. ============ 
  2. Last updated: Thu Sep 22 12:44:10 2011 
  3. Stack: openais 
  4. Current DC: node1.a.com - partition with quorum 
  5. Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87 
  6. 2 Nodes configured, 2 expected votes 
  7. 2 Resources configured. 
  8. ============ 
  9. Online: [ node1.a.com node2.a.com ] 
  10.  Master/Slave Set: MS_MysqlDrbd 
  11.      Masters: [ node1.a.com ] 
  12.      Slaves: [ node2.a.com ] 
  13.  Resource Group: Gmysql 
  14.      MysqlFS       (ocf::heartbeat:Filesystem):    Started node1.a.com 
  15.      MysqlIP       (ocf::heartbeat:IPaddr):   Started node1.a.com 
  16.      Mysql    (lsb:mysqld):   Started node1.a.com 
资源已经扭转,测试成功!
 

Ps:笔者在实验时,第一次资源扭转成功,又模拟节点1失效时,节点2却无法获得资源,最后老师指点,手动删除:location drbd-fence-by-handler-MS_MysqlDrbd MS_MysqlDrbd \

        rule $id="drbd-fence-by-handler-rule-MS_MysqlDrbd" $role="Master" -inf: #uname ne node1.a.com即可。因为此时drbd默认不会将资源转来转去,只想留在本机上。

你可能感兴趣的:(mysql,数据库,drbd,corosync,资源扭转)