基于NFS和corosync实现mysql高可用

实验基于redhat 5.8,nfs为系统自带,corosync-1.2.7-1.1.el5.i386.rpm 。mysql-5.5.25a.tar.gz。实验拓扑图:

基于NFS和corosync实现mysql高可用

NFS共享目录给两台mysql,也就是图中的node1,node2,这个目录在同一时刻只能是其中一台挂载。node1,node2的数据存储在NFS提供的共享目录中。这样做的目的是当其中一个节点坏了,而另外一个节点能够替代他,并继续提供服务。当然此次实现没有对NFS做高可用,如果在生产环境中,NFS也要做高可用。vip是也就提供服务的虚拟IP,在node1,node2只能同时配置在其中一台服务器上。

一,先配置好NFS, 建立一个lvm的分区来存储msqyl 数据,对三台虚拟的时间调整到相同状态。
(1)对nfs服务器先配置好:


  1. [root@server30 ~]# partprobe /dev/sda 
  2. [root@server30 ~]# pvcreate  /dev/sda5 
  3.   Writing physical volume data to disk "/dev/sda5" 
  4.   Physical volume "/dev/sda5" successfully created 
  5. [root@server30 ~]# vgcreate  myvg /dev/sda5 
  6.   Volume group "myvg" successfully created 
  7. [root@server30 ~]# lvcreate -L 5G -n mydata myvg 
  8. [root@server30 ~]# mke2fs -j -L MYDATA /dev/myvg/mydata  
  9. [root@server30 ~]# mke2fs -j -L MYDATA /dev/myvg/mydata  
  10. vim /etc/fstab 
  11. LABEL=MYDATA            /mydata                 ext3    defaults        0 0 
  12. [root@server30 ~]# mount -a 
  13. [root@server30 ~]# mount 
  14. [root@server30 ~]# useradd -u 300 -r mysql 
  15. [root@server30 ~]# useradd -u 300 -r mysql 
  16. [root@server30 ~]# chown -R mysql:mysql /mydata/ 
  17. [root@server30 ~]# vim /etc/exports  (no_root_squash表示不将root用户映射为noboby)
  18. /mydata                 172.16.150.30(rw,no_root_squash) 172.16.150.31(rw,no_root_squash) 
  19. [root@server30 ~]# service nfs start 
  20. [root@server30 ~]# chkconfig nfs on 
  21. [root@server30 ~]# exportfs -arv 

(2)在node1上配置mysql


  1. [root@node1 ~]# mkdir /mydata 
  2. [root@node1 ~]# mount -t nfs 172.16.150.22:/mydata  /mydata
  3. [root@node1 ~]# useradd -u 300 -r mysql 
  4. [root@node1 ~]# su - mysql 
  5. -bash-3.2$ cd /mydata 
  6. -bash-3.2$ touch test.txt 
  7. -bash-3.2$ ls 
  8. lost+found  test.txt 
  9. -bash-3.2$ rm -f test.txt 
  10. [root@node1 ~]# mkdir /mydata/data 
  11. [root@node1 ~]# chown -R mysql:mysql /mydata/data 
  12. [root@node1 mysql]#  chown -R :mysql /usr/local/mysql/
  13. 安装mysql请参照此篇博客 http://bingodeng.blog.51cto.com/1038075/935635
  14. [root@node1 support-files]# cp my-large.cnf /etc/my.cnf 
  15. [root@node1 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld 
  16. [root@node1 mysql]# chmod +x /etc/rc.d/init.d/mysqld 
  17. [root@node1 ~]# vim /etc/my.cnf   
  18. 修改thread_concurrency = 4 跟自己的cpu核心有关 
  19. 添加一行datadir=/mydata/data 
  20. [root@node1 mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data
  21. 对mysql进行初始化。 
  22. [root@node1 ~]# service mysqld start 
  23. [root@node1 ~]# /usr/local/mysql/bin/mysql 测试能否连接成功 
  24. [root@node2 ~]# service mysqld stop 
  25. [root@node1 ~]# scp /etc/my.cnf /etc/rc.d/init.d/mysqld node2:/root 
  26. [root@node2 ~]# umount /mydata 这是因为需要将NFS定义成资源

(3)在node2上


  1. [root@node2 ~]# chown -R :mysql /usr/local/mysql/ 
  2. [root@node2 ~]# service mysqld start 
  3. Starting MySQL.......                                      [  OK  ] 
  4. [root@node2 ~]# /usr/local/mysql/bin/mysql 
  5. [root@node2 ~]# service mysqld stop 
  6. [root@node2 ~]# umount /mydata  

二,先准备好三台虚拟机,并对node1,node2做好双机互信。

(1)修改在node1上修改/etc/hosts。


  1.  vim /etc/hosts 
  2. 172.16.150.30   node1 
  3. 172.16.150.31   node2 

并将些文件复制到node2上,scp /etc/hosts node2:/etc/

(2)对node1与node2的主机名先做修改,并配置好IP。


  1. node1:   
  2. sed -i 's@\(HOSTNAME=\).*@\1node1@g'  /etc/sysconfig/network   
  3. hostname node1  或者hostname -F /etc/sysconfig/network
  4.    
  5. node2:  
  6. sed -i 's@\(HOSTNAME=\).*@\1node2g' /etc/sysconfig/network  
  7. hostname node2  

(3)设定两个节点可以基于密钥进行ssh通信。


  1. node1: 
  2. ssh-keygen -t rsa 
  3. ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2 
  4.  
  5. node2: 
  6. ssh-keygen -t rsa 
  7. ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1 

三,在node1,node2上安装corosync。需要安装以下rpm包。


  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. heartbeat-3.0.3-2.3.el5.i386.rpm                                               
  5. heartbeat-libs-3.0.3-2.3.el5.i386.rpm                                         
  6. libesmtp-1.0.4-5.el5.i386.rpm                                                  
  7. pacemaker-1.1.5-1.1.el5.i386.rpm                                                 
  8. pacemaker-libs-1.1.5-1.1.el5.i386.rpm                                         
  9. perl-TimeDate-1.16-5.el5.noarch.rpm                                         
  10. resource-agents-1.0.4-1.1.el5.i386.rpm   
  11. 可以使用yum -y --nogpgcheck localinstall *.rpm

四,在node1上做以下修改


  1. [root@node1 corosync]# cd /etc/corosync/  
  2. [root@node1 corosync]# cp corosync.conf.example corosync.conf  
  3. [root@node1 corosync]# vim corosync.conf  
  4. totem {  
  5.         version: 2  
  6.         secauth: on 启用节点之间通信需要认证  
  7.         threads: 0  
  8.         interface {  
  9.                 ringnumber: 0  
  10.                 bindnetaddr: 172.16.0.0 自己所处的网络地址  
  11.                 mcastaddr: 226.94.150.1 组播地址  
  12.                 mcastport: 5405  组播端口  
  13.         }  
  14. logging {  
  15.         fileline: off  
  16.         to_stderr: no  
  17.         to_logfile: yes  
  18.         to_syslog: no 禁止日志记录到/var/log/messages  
  19.         logfile: /var/log/cluster/corosync.log  
  20.         debug: off  
  21.         timestamp: on  
  22.         logger_subsys {  
  23.                 subsys: AMF  
  24.                 debug: off  
  25.         }  
  26. }  
  27. service { 添加一个pacemaker的服务  
  28.         ver: 0 版本号  
  29.         name: pacemaker  
  30.         use_mgmtd: yes 是否启用图形,此次实验基于命令,可以省略,如果其中图形,还需要安装别的.rpm包  
  31. }  
  32. aixexec { 使用哪个用户来启用服务  
  33.         user: root  
  34.         group: root  
  35. }  
  36. [root@node1 corosync]# corosync-keygen  生成密钥文件authkey  
  37. [root@node1 corosync]# scp authkey  corosync.conf node2:/etc/corosync/  
  38. [root@node1 corosync]# mkdir /var/log/cluster 
  39. [root@node1 corosync]# ssh node2 'mkdir /var/log/cluster' 
  40. [root@node1 corosync]# service corosync start 
  41. Starting Corosync Cluster Engine (corosync):               [  OK  ] 
  42. [root@node1 corosync]# ssh node2 '/etc/init.d/corosync start' 
  43. Starting Corosync Cluster Engine (corosync): [  OK  ] 
  44. 在node1启动node2的corosync,不要到node2本机上启动。这是规定
 

  1. [root@node1 corosync]# crm_mon 此命令会一直监视,需要按ctrl+c退出  
  2. Last updated: Sat Aug  4 10:26:11 2012  
  3. Stack: openais  
  4. Current DC: node1 - partition with quorum  
  5. Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f  
  6. 2 Nodes configured, 2 expected votes  
  7. 0 Resources configured.  
  8. ============  
  9.   
  10. Online: [ node1 node2 ] 当前在线的节点nod1,node2  

五,进入crm的交互式命令配置,在交互式中,可以使用tab键自动对齐。比较人性化。


  1. [root@node1 corosync]# crm 
  2. crm(live)# configure  
  3. crm(live)configure# property stonith-enabled=false 禁用stonith,stonith需要硬件支持。 
  4. crm(live)configure# verify 最好验证刚才的语句有没有错误 
  5. crm(live)configure# commit 
  6. crm(live)configure# property no-quorum-policy=ignore 没有法定票数的策略,忽略不计,继续提供服务 
  7. crm(live)configure# rsc_defaults resource-stickiness=100 设定当前节点的粘性值,100大于0,表示资源更乐意留下当前节点 
  8. crm(live)configure# verify  
  9. crm(live)configure# commit 
  10. crm(live)configure# show  查看当前生效的配置
  11. node node1 node node2 property $id="cib-bootstrap-options" \ dc-version="1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f" \ cluster-infrastructure="openais" \ expected-quorum-votes="2" \ stonith-enabled="false" \ no-quorum-policy="ignore" rsc_defaults $id="rsc-options" \ resource-stickiness="100"

 六,开始定义资源:


  1. crm(live)# ra 
  2. crm(live)# classes 查看资源代理类型 
  3. crm(live)ra# list ocf heartbeat查找ocf 下的heartbeat有哪些代理 
  4. crm(live)ra# meta ocf:heartbeat:IPaddr查看IPaddr的参数 

  (1)定义第一个资源:虚拟IP


  1. crm(live)configure# primitive myip ocf:heartbeat:IPaddr params ip="172.16.150.1" 
  2. 定义资源,资源名为myip  使用是ocf下的hearbeat下IPaddr ,IPaddr的ip参数 
  3. crm(live)configure# commit  
  4. [root@node1 ~]# crm status 
  5. Last updated: Sat Aug  4 10:51:54 2012 
  6. Stack: openais 
  7. Current DC: node1 - partition with quorum 
  8. Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f 
  9. 2 Nodes configured, 2 expected votes 
  10. 1 Resources configured. 
  11. ============ 
  12.  
  13. Online: [ node1 node2 ] 
  14.  
  15.  myip   (ocf::heartbeat:IPaddr):    Started node1  表示资源已经在node1上启动了 
  16.  [root@node1 ~]# ifconfig 查看有没有真正的启动 

 (2)定义第二个资源:文件系统


  1. crm(live)ra# cd 
  2. crm(live)# configure  
  3. crm(live)configure# primitive mynfs ocf:heartbeat:Filesystem params device="172.16.100.1:/mydata" directory="/ 
  4. mydata" fstype="nfs"  由于使用是默认的20秒,小于建议的60秒,因此出现下面的警告,只需要将默认的20修改成大于60就ok 
  5. WARNING: mynfs: default timeout 20s for start is smaller than the advised 60 ( crm(live)ra# meta ocf:heartbeat:Filesystem可以查看到建议的最小值 
  6. WARNING: mynfs: default timeout 20s for stop is smaller than the advised 60 
  7.  
  8. crm(live)configure# delete mynfs 
  9. crm(live)configure# primitive mynfs ocf:heartbeat:Filesystem params device="172.16.150.22:/mydata" directory="/mydata"  
  10. fstype="nfs" op start timeout=60s op stop timeout=60s 
  11. crm(live)configure# commit 


  1. [root@node1 ~]# crm status  
  2. ============ 
  3. Last updated: Sat Aug  4 11:48:23 2012 
  4. Stack: openais 
  5. Current DC: node1 - partition with quorum 
  6. Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f 
  7. 2 Nodes configured, 2 expected votes 
  8. 2 Resources configured. 
  9. ============ 
  10.  
  11. Online: [ node1 node2 ] 
  12.  
  13.  myip   (ocf::heartbeat:IPaddr):    Started node1 
  14.  mynfs  (ocf::heartbeat:Filesystem):    Started node2表示在node2已经启动 
  15.   
  16.  [root@node2 corosync]# crm node standby 将在node2切换成备节点 
  17.  [root@node1 ~]# crm status  再次查看mynfs资源已经在node1上启动。 
  18.  [root@node2 corosync]# crm node online 让node2再次上线 
  19.  [root@node1 ~]# crm status 由于前面配置的资源的粘性,因此资源不会再回node2 

(3)配置第三个资源mysqld,并定义资源的之间的约束mysqld与mynfs在一起。原因很简单,如果不在一起mysql将无法启动,且mynfs一定比mysqld先启动。当然mysqld与myip也要在一起。


  1. crm(live)configure# primitive mysqld lsb:mysqld 使用lsb类型的资源代理 
  2. crm(live)configure# crm(live)configure# colocation mysqld_and_mynfs_myip inf: mysqld mynfs myip 
  3. 将三个资源定义在一起,三个资源要同时在一个节点上
  4. crm(live)configure# order mysqld_after_mynfs  mandatory: mynfs:start mysqld mynfs
  5. 先启动后,才启动mysqld 
  6. crm(live)configure# order mysqld_after_myip mandatory: myip mysqld  
  7. myip与mynfs谁先启动都无所谓 
  8. crm(live)configure# commit 
  9. [root@node2 ~]# crm_mon查看是否已经启动 

七,测试mysql


  1.  mysql> grant all on *.* to root@'%' identified by 'redhat'; 建立远程连接用户, 
  2. mysql> flush privileges; 
  3.  
  4. 再开一台虚拟机测试先安装mysql客户端,并启动服务mysql 
  5. [root@server30 ~]# mysql -uroot -h172.16.150.1 -predhat 
  6. mysql> create database testdb;创建一个数据库   

八,模拟node1故障是时,node2会不会自动接替


  1. [root@node1 ~]# crm node standby 
  2. [root@node1 ~]# crm_mon 令可能要等下,三个资源才会全部显示 

到此结束!










本文转自 deng304749970 51CTO博客,原文链接:http://blog.51cto.com/damondeng/954107,如需转载请自行联系原作者
上一篇:Vsphere笔记06 Vcenter 部署流程 1


下一篇:阿里本地生活EMonitor根因分析大揭秘