基于Corosync/openais和NFS服务器实现MySQL的高可用
1、操作系统redhat5.8
2、实验准备三台服务器:
node1:172.16.0.22 (Corosync+mysql)---->/mydata
node2:172.16.0.23 (Corosync+mysql)---->/mydata
NFS:172.16.0.24 (nfs)---->/mydata

实验拓扑图如下:
 

 目录:
一、安装与配置NFS服务
二、安装与配置mysql
三、安装与配置node1和node2关系
四、安装与配置Corosync/openais
五、进入命令行模式,添加集群资源
六、测试

 


一、安装与配置NFS服务
 

 
  
  1. 一、安装与配置NFS服务  
  2. 1、创建逻辑卷  
  3. #fdisk /dev/sda   
  4. #partprobe /dev/sda  
  5. #fdisk -l   
  6. #pvcreate /dev/sda4  
  7. #vgcreate myvg /dev/sda4  
  8. #lvcreate -L 10G -n lvmy  myvg  
  9. #mke2fs -j -L MYDATA /dev/myvg/lvmy   
  10.  
  11. 2、建立目录/mydata,设置开机自动挂载  
  12. #mkdir /mydata  
  13. #vim /etc/fstab  
  14. 添加以下内容  
  15. LABEL=MYDATA            /mydata                 ext3    defaults        0 0   
  16. #mount -a  
  17. #mount   
  18.  
  19. 3、添加mysql账号,让mysql有读写权限  
  20. #groupadd -r -g 306 mysql  
  21. #useradd  -g mysql -r -u 306  mysql  
  22. #chown -R mysql.mysql /mydata  
  23.  
  24. 4、配置nfs  
  25. #vim /etc/exports  
  26. 添加以下内容  
  27. /mydata     172.16.0.22(rw,no_root_squash)  172.16.0.23(rw,no_root_squash)  
  28. #/etc/init.d/nfs start  
  29. #chkconfig --add nfs  
  30. #chkconfig nfs on 

二、安装mysql
 

 
  
  1. 新建用户  
  2. #groupadd -r -g 306 mysql  
  3. #useradd  -g mysql -r -u 306  mysql  
  4.  
  5. 解压mysql并创建软链接  
  6. tar xf mysql-5.5.24-linux2.6-i686.tar.gz -C /usr/local   
  7. cd /usr/local  
  8. ln -sv mysql-5.5.24-linux2.6-i686  mysql  
  9.  
  10. 修改属主和组并初始化mysql-5.5.24  
  11. cd /usr/local/mysql  
  12. chown -R mysql:mysql  .  
  13. /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/mydata/data  
  14. chown -R root .   
  15.  
  16. 为mysql提供主配置文件:  
  17. cd /usr/local/mysql  
  18. cp support-files/my-large.cnf  /etc/my.cnf  
  19.  
  20. 并修改此文件中thread_concurrency的值为你的CPU个数乘以2,比如这里使用如下行:  
  21. thread_concurrency = 2 
  22.  
  23. 并添加数据存放路径  
  24. datadir = /mydata/data  
  25.  
  26. 为mysql提供sysv服务脚本:  
  27. cd /usr/local/mysql  
  28. cp support-files/mysql.server  /etc/rc.d/init.d/mysqld  
  29.  
  30. #chkconfig mysqld off  
  31. #service mysqld stop 

三、配置node1和node2的关系

 
  
  1. 1、修改主机名  
  2. #vim /etc/sysconfig/network  
  3. HOSTNAME=node1 
  4.  
  5. #hostname node1  
  6. 注意:确保与uname -n结果一样  
  7.  
  8. 2、修改/etc/hosts文件,使node1和node2能解析成不同IP  
  9. #vim /etc/hosts  
  10. 172.16.0.22     node1  
  11. 172.16.0.23     node2   
  12.  
  13. 3、配置双方的ssh信任  
  14. #ssh-keygen -t rsa    
  15. #ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.0.23      #把公钥复制到远程主机上去  
  16.  
  17. 提示:node2操作也是一样,最后配置完成进行测试一下:  
  18. 在node1上测试:  
  19. #ssh node1 'ifconfig' #命令可以执行并返回结果,表示配置成功    
  20.  
  21. 4、调整双方主机的时间  
  22. #date 0807132912  
  23. #hwclock -w 

四、安装与配置Corosync

 
  
  1. 列出所需要的软件包  
  2. cluster-glue-1.0.6-1.6.el5.i386.rpm       heartbeat-3.0.3-2.3.el5.i386.rpm       pacemaker-cts-1.1.5-1.1.el5.i386.rpm  
  3. cluster-glue-libs-1.0.6-1.6.el5.i386.rpm  heartbeat-libs-3.0.3-2.3.el5.i386.rpm  pacemaker-libs-1.1.5-1.1.el5.i386.rpm  
  4. corosync-1.2.7-1.1.el5.i386.rpm           libesmtp-1.0.4-5.el5.i386.rpm          perl-TimeDate-1.16-5.el5.noarch.rpm  
  5. corosynclib-1.2.7-1.1.el5.i386.rpm        pacemaker-1.1.5-1.1.el5.i386.rpm       resource-agents-1.0.4-1.1.el5.i386.rpm  
  6.  
  7. #cd /etc/corosync/  
  8. #mv corosync.conf.example corosync.conf  
  9. vim corosync.conf  
  10. 添加和修改以下内容  
  11. compatibility: whitetank    #打开兼容corosync-0.8之前的版本  
  12. totem {                     #定义节点之间心跳信息如何传递  
  13.         version: 2          #协议版本  
  14.         secauth: on         #是否开启节点之间安全认证  
  15.         threads: 0          #启动的线程,与CPU个数相等,0为自动管理  
  16.         interface {         #定义传递心跳的接口信息  
  17.                 ringnumber: 0               #如果有多个接口,ringunmber不能相同  
  18.                 bindnetaddr: 172.16.0.0   #指定接口所在的网络或者接口的IP地址  
  19.                 mcastaddr: 226.94.1.1       #指定多播地址  
  20.                 mcastport: 5405             #多播的端口  
  21.         }  
  22. }  
  23. logging {       #定义日志相关信息  
  24.         fileline: off  
  25.         to_stderr: no       #是否把错误信息发送到标准输出  
  26.         to_logfile: yes     #是否存储到logfile中指定的日志文件  
  27.         to_syslog: no       #是否存储到系统日志文件也就是messages  
  28.         logfile: /var/log/cluster/corosync.log      #日志文件存放路径  
  29.         debug: off          #是否开启调试  
  30.         timestamp: on       #日志信息是否记录时间戳  
  31.         logger_subsys {     #定义日志子系统  
  32.                 subsys: AMF  
  33.                 debug: off  
  34.         }  
  35. }  
  36. amf {                       #定义amf相关信息,如果要启用需安装openais和openais-lib  
  37.         mode: disabled  
  38. }  
  39. service {                   #自定义的服务  
  40.         ver: 0              #版本  
  41.         name: pacemaker     #整合pacemaker,当corosync启动时也启动pacemaker  
  42. }  
  43.  
  44. service {  
  45.         ver:  0  
  46.         name: pacemaker     #定义pacemaker资源管理器  
  47.         # use_mgmtd: yes    #使用mgmtd进程  
  48. }  
  49.  
  50. aisexec {                   #定义执行者的身份  
  51.         user:   root  
  52.         group:  root  
  53. }  
  54.  
  55.  
  56. # corosync-keygen               #生成节点间通信时用到的认证密钥文件  
  57. #mkdir -pv /var/log/cluster     #建立日志目录  
  58. #/etc/init.d/corosync start     #启动服务  
  59. #netstat -unlp | grep 5404      #查看是否有corosync进程监听udp的5404端口 

五、进入命令行模式,添加集群资源

 
  
  1. [root@localhost corosync]# crm  #使用crm命令进入命令行模式  
  2. crm(live)# configure            #使用configure进入configure模式  
  3. crm(live)configure# property stonith-enabled=false   #禁用stonith  
  4. crm(live)configure# property no-quorum-policy=ignore #关闭票数策略    
  5. crm(live)configure# verify                           #使用verify验证是否有语法错误   
  6. crm(live)configure# commit                           #提交前面的操作,使用其生效   
  7. crm(live)configure# primitive myvip ocf:heartbeat:IPaddr params ip=172.16.0.100 #定义vip资源  
  8. crm(live)configure# primitive mynfs ocf:heartbeat:Filesystem \                  #定义nfs资源高可用,使用其自动挂载  
  9. > params device="172.16.0.23:/mydata"  directory="/mydata" \  
  10. > fstype="nfs" op start timeout=60s op stop timeout=60s   
  11. crm(live)configure# primitive mysql lsb:mysqld                                  #定义mysql服务资源  
  12. crm(live)configure# colocation mysql_and_mynfs_myvip inf: mysql mynfs myvip     #定义排列约束,使用mysql,mynfs,myvip三个在一起  
  13. crm(live)configure# order mysql_after_mynfs mandatory: mynfs mysql:start        #定义顺序,先启动mynfs再启动mysql  
  14. crm(live)configure# order mysql_after_myvip mandatory: myvip mysql:start        #定义顺序,先启动vip再启动mysql  
  15. crm(live)configure# verify   
  16. crm(live)configure# commit   
  17. crm(live)configure# show    #使用show命令查看定义的资源              
  18. crm(live)configure# cd      #回到上一级  
  19. crm(live)# status           #查看状态  
  20. ============  
  21. Last updated: Tue Aug  7 16:27:11 2012  
  22. Stack: openais  
  23. Current DC: node1 - partition with quorum  
  24. Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f  
  25. 2 Nodes configured, 2 expected votes  
  26. 3 Resources configured. 
  27. ============  
  28.  
  29. Online: [ node1 node2 ]  
  30.  
  31.  myvip  (ocf::heartbeat:IPaddr):    Started node2  
  32.  mynfs  (ocf::heartbeat:Filesystem):    Started node2  
  33.  mysql  (lsb:mysqld):   Started node2  
  34.    
  35. 测试:此时可以停止node2节点,然后查看是否能切换到node1节点上,并查看vip,mysql和nfs是否正常 

六、测试
建立一个账号
mysql> grant all on *.* to root@'%' identified by '123456';
 

测试成功

提示:此时可以crm node standby node2命令,使用node2节点停止,测试是否切换,并连接数据库,写入数据,然后使用crm node online node2让node2重新上线,再次查看测试。

 

总结:

1、mysql初始化以后,安装第二台服务器请不要初始化了,不然数据会覆盖,会有错误

2、安装好mysql以后,只能有一台mysql服务器能启动,如果启动两个会报错误

3、装好两台mysql服务后,建立/mydata目录, 不要忘记改属主和属组了,不然定义nfs资源的时候,无法自动挂载

4、安装好mysql服务后,不要开机启动,把mysqld服务停止