corosync+pacemaker实现高可用集群mysql服务共享存储

说明:VIP地址为:172.16.22.1

一共有三台服务器:

MySQL1 node1.lihuan.com   172.16.22.10   node1

MySQL2 node2.lihuan.com   172.16.22.11   node2

NFS Server:172.16.22.2   nfs

如图:

备注:配置成高可用集群,服务是绝对不能开机启动,也不能启动此服务的,而是由高可用集群控制服务的启动与关闭的

 

一、创建逻辑卷以及安装mysql

创建逻辑卷用来做mysql数据共享存储的,并挂载逻辑卷,开机自动挂载

1.nfs上:

# vim /etc/sysconfig/network-scripts/ifcfg-eth0  #更改nfsIP地址

更改IPADDRNETMASK:

IPADDR=172.16.22.2

NETMASK=255.255.0.0

# service network restart

# setenforce 0

  1. # fdisk /dev/sda 
  2.   
  3.  
  4.   
  5. +20G 
  6. 8e 
  7. # partprobe /dev/sda 
  8. # pvcreate /dev/sda5 
  9. # vgcreate myvg /dev/sda5 
  10. # lvcreate -L 10G -n mydata myvg 
  11. # mke2fs -j -L MYDATA /dev/myvg/mydata 
  12. # mkdir /mydata 
  13. # vim /etc/fstab  #在最后加上下面一行 
  14. LABEL=MYDATA       /mydata           ext3 defaults   0 0 
  15. # mount -a 
  16. # mount 
  17. # groupadd -g 306 -r mysql 
  18. # useradd -g mysql -r -u 306 -s /sbin/nologin mysql 
  19. # id mysql 
  20. # chown -R mysql:mysql /mydata/ 
  21. # vim /etc/exports   #写上下面一行 
  22. /mydata            172.16.0.0/16(rw,no_root_squash) 
  23. # service nfs start 
  24. # rpcinfo -p localhost 
  25. # chkconfig nfs on 
  26. # showmount -e 172.16.22.2 
  27.  
  28.   

2.准备mysql服务

node1上:

  1. # groupadd -g 306 -r mysql 
  2. # useradd -g mysql -r -u 306  mysql 
  3. # mkdir /mydata 
  4. # mount -t nfs 172.16.22.2:/mydata /mydata/ 
  5. # ls /mydata/ 
  6. # cd /mydata 
  7. # touch 1.txt 
  8. # tar xvf mysql-5.5.22-linux2.6-i686.tar.gz -C /usr/local 
  9. # cd /usr/local/ 
  10. # ln -sv mysql-5.5.22-linux2.6-i686  mysql   
  11. # cd mysql 
  12. # chown -R mysql:mysql  . 
  13. # scripts/mysql_install_db --user=mysql --datadir=/mydata/data   #初始化mysql 
  14. # chown -R root  . 

mysql提供主配置文件:

# cd /usr/local/mysql

# cp support-files/my-large.cnf  /etc/my.cnf

# vim /etc/my.cnf

修改thread_concurrency = 8为:

thread_concurrency = 2

并增加如下一行:

datadir = /mydata/data

mysql提供sysv服务脚本:

# cd /usr/local/mysql

# cp support-files/mysql.server  /etc/rc.d/init.d/mysqld

备注:提供此脚本的好处就是可以使用诸如service mysqld start的命令了。

  1. # chkconfig --add mysqld 
  2. # service mysqld start 
  3. # /usr/local/mysql/bin/mysql 
  4. # service mysqld stop 
  5. # chkconfig mysqld off 
  6. # chkconfig --list mysqld 

node2上:(由于node1上已经初始化过mysql,并且通过挂在NFS/mydata作为mysql数据库存储路径了)

  1. # groupadd -g 306 -r mysql 
  2. # useradd -g mysql -r -u 306  mysql 
  3. # mkdir /mydata 
  4. # mount -t nfs 172.16.22.2:/mydata /mydata/ 
  5. # tar xvf mysql-5.5.22-linux2.6-i686.tar.gz -C /usr/local 
  6. # cd /usr/local/ 
  7. # ln -sv mysql-5.5.22-linux2.6-i686  mysql  创建链接 
  8. # cd mysql 
  9. # chown -R root:mysql  .  
  10. # cd /usr/local/mysql 

# cp support-files/my-large.cnf  /etc/my.cnf  mysql提供主配置文件:

修改thread_concurrency = 8为:

thread_concurrency = 2

并增加如下一行:

datadir = /mydata/data

mysql提供sysv服务脚本:

# cd /usr/local/mysql

# cp support-files/mysql.server  /etc/rc.d/init.d/mysqld

备注:提供此脚本的好处就是可以使用诸如service mysqld start的命令了。

  1. # chkconfig --add mysqld 
  2. # chkconfig mysqld off 
  3. # chkconfig --list mysqld 
  4. # service mysqld start 
  5. # /usr/local/mysql/bin/mysql 

mysql> create database ad;  node1查看是否也有数据库?

# service mysqld stop

 

二、安装集群软件

1.前提条件:

(1).node1上:

更改系统时间(保证node1node2的时间都正确,并保持二者时间一致)

# date

# hwclock -s

# hostname node1.lihuan.com

# vim /etc/sysconfig/network  #把主机名改为node1.lihuan.com

HOSTNAME=node1.lihuan.com

# vim /etc/sysconfig/network-scripts/ifcfg-eth0  #更改网卡地址为

 

172.16.22.10,子网掩码为255.255.0.0

IPADDR=172.16.22.10

NETMASK=255.255.0.0

# service network restart

# vim /etc/hosts  #增加如下两项:

172.16.22.10   node1.lihuan.com node1

172.16.22.11   node2.lihuan.com node2

 

(2).node2上:

更改系统时间(保证node1node2的时间都正确,并保持二者时间一致)

# date

# hwclock -s

# hostname node2.lihuan.com

# vim /etc/sysconfig/network  #把主机名改为node2.lihuan.com

HOSTNAME=node2.lihuan.com

# vim /etc/sysconfig/network-scripts/ifcfg-eth0  #更改网卡地址为

 

172.16.22.11,子网掩码为255.255.0.0

IPADDR=172.16.22.11

NETMASK=255.255.0.0

# service network restart

# vim /etc/hosts  #增加如下两项:

172.16.22.10   node1.lihuan.com node1

172.16.22.11   node2.lihuan.com node2

(3).实现双机互信:

node1上:

  1. # ssh-keygen -t rsa 
  2. # ssh-copy-id -i ~/.ssh/id_rsa.pub   root@172.16.22.11 

node2上:

  1. # ssh-keygen -t rsa 
  2. # ssh-copy-id -i ~/.ssh/id_rsa.pub   root@172.16.22.10 

2.安装所需软件:

所需软件如下:

cluster-glue-1.0.6-1.6.el5.i386.rpm

cluster-glue-libs-1.0.6-1.6.el5.i386.rpm

corosync-1.2.7-1.1.el5.i386.rpm    

corosynclib-1.2.7-1.1.el5.i386.rpm

heartbeat-3.0.3-2.3.el5.i386.rpm  

heartbeat-libs-3.0.3-2.3.el5.i386.rpm   

libesmtp-1.0.4-5.el5.i386.rpm

pacemaker-1.1.5-1.1.el5.i386.rpm

pacemaker-cts-1.1.5-1.1.el5.i386.rpm

pacemaker-libs-1.1.5-1.1.el5.i386.rpm

perl-TimeDate-1.16-5.el5.noarch.rpm   

resource-agents-1.0.4-1.1.el5.i386.rpm

软件包放在/root(node1node2都需要下载)

(1).node1上:

  1. # yum --nogpgcheck localinstall *.rpm -y 
  2. # cd /etc/corosync 
  3. # cp corosync.conf.example corosync.conf 
  4. # vim corosync   #添加如下内容: 
  5. service { 
  6.         ver:  0 
  7.          name: pacemaker 
  8.          use_mgmtd: yes 
  9.          } 
  10.   
  11. aisexec { 
  12.          user:      root 
  13.          group:     root 

并设定此配置文件中 bindnetaddr后面的IP地址为你的网卡所在网络的网络地址,我们这里的两个节点在172.16.0.0网络,因此这里将其设定为172.16.0.0;如下:

bindnetaddr: 192.168.0.0

生成节点间通信时用到的认证密钥文件:

# corosync-keygen

corosyncauthkey复制至node2:

  1. # scp -p corosync.conf authkey  node2:/etc/corosync/ 
  2. # cd 
  3. # mkdir /var/log/cluster 
  4. # ssh node2 ‘# mkdir /var/log/cluster’ 
  5. # service corosync start 
  6. # ssh node2 '/etc/init.d/corosync start' 
  7. # crm_mon 

配置stonishquorum以及stickiness

  1. # crm 
  2. crm(live)#configure 
  3. crm(live)configure# property stonith-enabled=false 
  4. crm(live)configure# verify 
  5. crm(live)configure# commit 
  6. crm(live)configure# property  no-quorum-policy=ignore 
  7. crm(live)configure# verify 
  8. crm(live)configure# commit 
  9. crm(live)configure# rsc_defaults resource-stickiness=100   #(粘性值只要大于0,表示更乐意留在当前节点) 
  10. crm(live)configure# verify 
  11. crm(live)configure# commit 
  12. crm(live)configure# show 
  13. crm(live)configure# primitive myip ocf:heartbeat:IPaddr params ip='172.16.22.1' 
  14. crm(live)configure# commit 
  15. crm(live)configure# exit 
  16. # ifconfig 

(2).node2上:

# umount /mydata

# yum --nogpgcheck localinstall *.rpm -y

(3).node1上:

# umount /mydata

配置资源:mynfs(文件系统)

  1. # crm 
  2. crm(live)# ra 
  3. crm(live)ra# list ocf heartbeat 
  4. crm(live)ra# meta ocf:heartbeat:Filesystem 
  5. crm(live)ra# cd 
  6. crm(live)# configure 
  7. crm(live)configure# primitive mynfs ocf:heartbeat:Filesystem params 
  8. device="172.16.22.2:/mydata" directory="/mydata" fstype="nfs" op 
  9. start timeout=60s op stop timeout=60s 
  10. crm(live)configure# commit 

配置资源:mysqldmysqld一定要跟mynfs在一起,mynfs要先于mysqld启动)

  1. crm(live)configure# primitive mysqld lsb:mysqld 
  2. crm(live)configure#  show 

配置绑定关系(摆列约束)

crm(live)configure# colocation mysqld_and_mynfs inf: mysqld mynfs

crm(live)configure# show

说明:inf表明mysqld mynfs永远在一起

再定义次序(order

  1. crm(live)configure# order mysqld_after_mynfs mandatory: mynfs mysqld:start 
  2. crm(live)configure# show 
  3. crm(live)configure# order mysqld_after_myip mandatory: myip mysqld:start 
  4. crm(live)configure# commit 
  5. crm(live)configure# show 
  6. node node1.lihuan.com \ 
  7.          attributes standby="on" 
  8. node node2.lihuan.com \ 
  9.          attributes standby="off" 
  10. primitive myip ocf:heartbeat:IPaddr \ 
  11.          params ip="172.16.22.1" 
  12. primitive mynfs ocf:heartbeat:Filesystem \ 
  13.          params device="172.16.22.2:/mydata" directory="/mydata" fstype="nfs" \ 
  14.          op start interval="0" timeout="60s" \ 
  15.          op stop interval="0" timeout="60s" 
  16. primitive mysqld lsb:mysqld 
  17. colocation mysqld_and_mynfs inf: mysqld mynfs myip 
  18. order mysqld_after_myip inf: myip mysqld:start 
  19. order mysqld_after_mynfs inf: mynfs mysqld:start 
  20. property $id="cib-bootstrap-options" \ 
  21.          dc-version="1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f" \ 
  22.          cluster-infrastructure="openais" \ 
  23.          expected-quorum-votes="2" \ 
  24.          stonith-enabled="false" \ 
  25.          no-quorum-policy="ignore" 
  26. rsc_defaults $id="rsc-options" \ 
  27.          resource-stickiness="100" 
  28. crm(live)configure# exit 
  29. # ls /mydata/data 
  30. # /usr/local/mysql/bin/mysql 
  31. mysql> SHOW DATABASES; 
  32. mysql> GRANT ALL ON *.* TO root@'%' IDENTIFIED BY '123456'; 
  33. mysql> flush privileges; 
  34. # crm status 
  35. # ls /mydata 
  36. # ls /mydata/data 
  37. # crm node standby 

说明:mandatory为强制性的

(4).node2

# crm node online

# crm status

(5).windows上连接:mysql -uroot -h172.16.22.1 -p123456

mysql> create database a;

mysql> show databases;

如下图:

此时可以正常操作mysql

node2故障,在node2上:

# crm node standby

# crm status

node1上:

# crm node online

windows上连接:mysql -uroot -h172.16.22.1 -p123456

mysql> show databases;

如下图:

此时可以看到mysql数据库中有database a,说明数据库一切正常,这就是高可用集群所实现的功能。