实验目的:

用两台mysql服务器基于drbd构建高可用主从服务器,当node1为主服务器时,node2用DRBD实现数据的实时备份,当node1故障时,node2取代node1工作。

 
  
  1. 主机规划: 
  2. node1:node1.magedu.com  ip 172.16.14.10 
  3. node2:node2.magedu.com  ip 172.16.14.11 
 

一:准备工作:

 
  
  1. 1、DNS域名解析 
  2. 用uname -n的结果来识别node1,node2 
  3.  
  4. Node1: 
  5. # sed -i 's@\(HOSTNAME=\).*@\1node1.magedu.com@g'  /etc/sysconfig/network 
  6. # hostname node1.magedu.com 
  7. Node2: 
  8. # sed -i 's@\(HOSTNAME=\).*@\1node2.magedu.com@g' /etc/sysconfig/network 
  9. # hostname node2.magedu.com 
  10.  
  11. 修改node1,node2的/etc/hosts添加: 
  12. 172.16.14.10 node1.magedu.com node1 
  13. 172.16.14.11 node2.magedu.com node2 
  14.  
  15. 2、设定两个节点可以基于密钥进行ssh通信 
  16. node1: 
  17. # ssh-keygen -t rsa 
  18. # ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2 
  19.  
  20. node2: 
  21. # ssh-keygen -t rsa 
  22. # ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1 
  23.  
  24. 3、两个节点时间同步 
  25. [root@node2 ~]# date 112811022012;ssh node1 'date 112811022012' 
  26. Fri Nov 28 11:02:00 CST 2012 
  27. Fri Nov 28 11:02:00 CST 2012 
  28.  
  29. 4、是selinux处于关闭状态 
  30. #setenforce 0 

二:在node1和node2上配置Primary/Secondary模型的drbd

1、node1和node2两个节点上各提供了一个大小相同的分区作为drbd设备;两个节点上均      为/dev/sda5,大小为1G。

 
  
  1. # fdisk /dev/sda 
  2. 分区后结果: 
  3.   Device Boot      Start         End      Blocks   Id  System 
  4. /dev/sda1   *           1          13      104391   83  Linux 
  5. /dev/sda2              14        5235    41945715   8e  Linux LVM 
  6. /dev/sda3            5236        5366     1052257+  82  Linux swap / Solaris 
  7. /dev/sda4            5367       13054    61753860    5  Extended 
  8. /dev/sda5            5367        5489      987966   83  Linux 
  9.  
  10. # partprobe /dev/sda 

2、安装软件包:

 
  
  1. 这里使用最新的8.3的版本 
  2. drbd83-8.3.8-1.el5.centos.i386.rpm 
  3. kmod-drbd83-8.3.8-1.el5.centos.i686.rpm 
  4. 下载地址为:http://mirrors.sohu.com/centos/5.8/extras/i386/RPMS/ 
  5.  
  6. 下载完成后直接安装: 
  7. # yum -y --nogpgcheck localinstall drbd83-8.3.8-1.el5.centos.i386.rpm  
  8.   kmod-drbd83-8.3.8-1.el5.centos.i686.rpm 

3、配置drbd:

 
  
  1.    
  2. 下面的操作在node1.magedu.com上完成。 
  3.  
  4. 1)复制样例配置文件为即将使用的配置文件: 
  5. # cp /usr/share/doc/drbd83-8.3.8/drbd.conf  /etc 
  6. # vim /etc/drbd.d/global-common.conf     ##修改如下 
  7.   usage-count no; 
  8.           startup { 
  9.                 #wfc-timeout 120; 
  10.                 #degr-wfc-timeout 120; 
  11.         } 
  12.  
  13.         disk { 
  14.                 on-io-error detach; 
  15.                 #fencing resource-only; 
  16.         } 
  17.  
  18.         net { 
  19.                 cram-hmac-alg "sha1";        ##校验算法 
  20.                 shared-secret "mydrbdlab";   ##校验密码 
  21.         } 
  22.  
  23.         syncer { 
  24.                 rate 1000M;   ##同步时的速率 
  25.         } 
  26.    
  27. 3)、定义一个资源/etc/drbd.d/web.res,添加如下内容: 
  28. resource web { 
  29.   on node1.magedu.com { 
  30.     device    /dev/drbd0; 
  31.     disk      /dev/sda5; 
  32.     address   172.16.14.10:7789
  33.     meta-disk internal; 
  34.   } 
  35.   on node2.magedu.com { 
  36.     device    /dev/drbd0; 
  37.     disk      /dev/sda5; 
  38.     address   172.16.14.11:7789
  39.     meta-disk internal; 
  40.   } 
  41. }   

将上面两个文件的内容复制到node2上,保证node1,node2内容相同:

 
  
  1. # scp  -r /etc/drbd.*  node2:/etc 

4、在两个节点上对资源进行初始化并启动服务:

 
  
 
  
  1. 1)初始化资源,在node1和node2上分别执行: 
  2. # drbdadm create-md web 
  3.  
  4. 2)启动服务,在node1和node2上分别执行: 
  5. /etc/init.d/drbd start 
  6.  
  7. 3)查看启动状态: 
  8. # cat /proc/drbd 
  9. [root@node1 ~]# cat /proc/drbd 
  10. version: 8.3.8 (api:88/proto:86-94
  11. GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by  
  12. mockbuild@builder10.centos.org, 2010-06-04 08:04:16 
  13.  0: cs:Connected ro:Secondary/Secondary  
  14.  ds:Inconsistent/Inconsistent C r---- 
  15.     ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1  
  16.     wo:b oos:987896 
  17.  
  18. //此时链接状态是Secondary/Secondary 

下面将node1设置为Primary;使用命令为:

 
  
  1. # drbdsetup /dev/drbd0 primary –o 
  2.   注:也可使用如下命令  
  3.      # drbdadm -- --overwrite-data-of-peer primary web 

查看数据同步过程的状态:

 
  
  1. [root@node1 ~]# drbd-overview 
  2.   0:web  SyncSource Primary/Secondary UpToDate/Inconsistent  
  3.   C r----  
  4.     [==>.................] sync'ed: 18.6% (810392/987896)K  
  5.     delay_probe: 16 

数据同步完后两个节点的状态为:

 
  
  1. [root@node1 ~]# drbd-overview 
  2.   0:web  Connected Primary/Secondary UpToDate/UpToDate C r----  
  3.  
  4. 节点node2上: 
  5. [root@node2 ~]# drbd-overview 
  6.   0:web  Connected Secondary/Primary UpToDate/UpToDate C r----  

//可以发现节点已经有了主从了

5、创建文件系统:

文件系统的挂载只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化:

 
  
  1. # mke2fs -j -L DRBD /dev/drbd0 
  2. # mkdir /data/mydata  
  3. # mount /dev/drbd0 /data/mydata 

6、测试是否可以同步

 
  
  1. # cd /data/mydata 
  2. # umount /data/mydata   ##卸载 
  3. # drbdadm secondary mysql   ##将node1切换为secondary 
  4.  
  5. 在node2上: 
  6. # drbdadm primary mysql    ##dr2切换为Primary 
  7. # mount /dev/drbd0 /data/mydata  ##挂载,并查看是否有数据 
  8. # ls /data/mydata 

为了把drbd成为集群的资源,需将drbd开机时不能自动启动

 
  
  1. # chkconfig drbd off 

 

三:安装Mysql:

1、在node1,node2上建立mysql用户:

 
  
  1. # groupadd -r -g 306 mysql  ##mysql组为系统组
  2. # useradd -r -g mysql -u 306 mysql  ##mysql用户为系统用户
  3. # id mysql 

2、编译安装mysql-5.5.28

 
  
  1. 编译安装mysql: 
  2. tar  xf mysql-5.5.28-linux2.6-i686.tar.gz -C /usr/local 
  3. cd /usr/local 
  4. ln -sv mysql-5.5.28-linux2.6-i686/ mysql 
  5.  
  6. cd   mysql 
  7. chown -R root:mysql  . 
  8.  
  9. 初始化mysql: 
  10.  
  11. scripts/mysql_install_db --user=mysql --datadir=/data/mydata 
  12.  
  13. cp support-files/my-large.cnf  /etc/my.cnf 
  14. vim /etc/my.cnf  
  15. thread_concurrency = 2  ##根据需要修改后面参数 
  16. datadir = /data/mydata  ##指定路径 
  17.  
  18. 添加服务脚本: 
  19. cp support-files/mysql.server /etc/rc.d/init.d/mysqld   
  20.  
  21. 启动服务: 
  22. service mysqld start 
  23.  
  24. /usr/local/mysql/bin/mysql ## 全路径启动mysql 
  25. 创建一个库teatdb 
  26. >create database testdb; 

3、drbd主从切换;为在node2上安装Mysql做准备:

 
  
  1. node1上: 
  2.  
  3. servcie mysqld stop  ##停止mysqld 
  4. umount /data/mydata  ##卸载数据目录 
  5. drbdadm secondary web ##将node1设为备用 
  6. drbd-overview  
  7.  
  8. 切换到node2: 
  9.  
  10. drbdadm primary web  ##节点2为primary 
  11. chown mysql:mysql /data/mydata    
  12. //将/data/mydata的属主属组改为mysql:mysql 
  13. mount /dev/drbd0 /data/mydata 
  14.  
  15. [root@node2 mysql]# drbd-overview  
  16.  
  17. [root@node2 mysql]# mount |grep /data/mydata 
  18. /dev/drbd0 on /data/mydata type ext3 (rw) 

 4、在node2上,mysql不用再初始化,只需将配置文件从node1复制过来就行:

 
  
  1. scp node1:/etc/my.cnf /etc    ##复制配置文件 
  2.  
  3. cd mysql 
  4. chown -R mysql.mysql . 
  5.  
  6. cp support-files/mysql.server /etc/rc.d/init.d/mysqld   
  7.  
  8. service mysqld start 
  9.  
  10. #/usr/local/mysql/bin/mysql 
  11.  
  12. mysql> show databases;   ##查看库信息 
  13. +--------------------+ 
  14. | Database           | 
  15. +--------------------+ 
  16. | information_schema | 
  17. #mysql50#drbd.d    | 
  18. | mysql              | 
  19. | performance_schema | 
  20. | test               | 
  21. | testdb             |          ##在node1上创建的testdb库 
  22. +--------------------+ 
  23. 6 rows in set (0.08 sec) 

5、至此两个节点上的mysql配置完成,下面将node1,node2上的mysqld和drbd服务停止,并开机不能自动启动;因为需将mysqld和drbd成为下面集群的资源

 
  
  1. # service mysqld stop 
  2. # chkconfig mysqld off 
  3.  
  4. # umount /data/mydata 
  5. # drbdadm secondary web 
  6. # service drbd stop 
  7. # chkconfig drbd off 

 

四:安装配置corosync和pacemaker

1、首先安装以下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. 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. pacemaker-1.1.5-1.1.el5.i386.rpm 
  9. pacemaker-cts-1.1.5-1.1.el5.i386.rpm 
  10. pacemaker-libs-1.1.5-1.1.el5.i386.rpm 
  11. perl-TimeDate-1.16-5.el5.noarch.rpm 
  12. resource-agents-1.0.4-1.1.el5.i386.rpm 

    # yum -y --nogpgcheck localinstall *.rpm   ##放在一个目录下一起安装

2、配置corosync和pacemaker

 
  
  1. cd /etc/corosync/ 
  2. ls 
  3. cp corosync.conf.example corosync.conf 
  4. vim corosync.conf 
  5. 作如下修改:  
  6. version: 2 
  7.  secauth: on 
  8.  threads: 1 
  9.  
  10. bindnetaddr: 172.16.0.0 
  11.  mcastaddr: 226.94.14.14 
  12. to_syslog: no 
  13.  
  14. 添加一个服务: 
  15. service { 
  16.         ver:    0 
  17.         name:   pacemaker 
  18.  
  19. 定义aisexec的执行身份: 
  20. aisexec { 
  21.         name:   root 
  22.         group:  root 
  23.  
  24. # mkdir /var/log/cluster 
  25. # corosync-keygen 
  26. 复制到node2: 
  27. scp -p corosync.conf authkey node2:/etc/corosync/ 
  28.  
  29. 在第二个节点上创建目录: 
  30. mkdir /var/log/cluster 
  31.  
  32. 在节点一上启动corosync 
  33. service corosync start 
  34. ssh rs2 'service corosync start' 
  35.  
  36. 查看日志: 
  37. tail -30 /var/log/cluster/corosync.log  

 
  
  1.  
  2.  
  3. 查看状态: 
  4. # crm status    
  5. Starting Corosync Cluster Engine (corosync):               [  OK  ] 
  6. [root@node1 corosync]# setenforce 0 
  7. [root@node1 corosync]# crm status 
  8. ============ 
  9. Last updated: Wed Nov 28 16:19:42 2012 
  10. Stack: openais 
  11. Current DC: node1.magedu.com - partition WITHOUT quorum 
  12. Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f 
  13. 2 Nodes configured, 2 expected votes 
  14. 0 Resources configured. 
  15. ============ 
  16.  
  17. Node node1.magedu.com: UNCLEAN (offline) 
  18. Node node2.magedu.com: UNCLEAN (offline) 
  19. Online: [ node1.magedu.com ] 
  20.  
  21. 配置corosync: 
  22. crm 
  23. configure 
  24. 配置两个全局属性: 
  25. property no-quorum-policy=ignore  ##不具备法定票数时忽略 
  26. property stonith-enabled=false       ##是否启用stonish设备 
  27. verify  ##检查语法 
  28. commit   ##提交 
  29.  
  30. cd 
  31. status 
  32. crm(live)# ra           ##查看资源代理 
  33. crm(live)ra# list ocf heartbeat 
  34. //可以看到有drbd;说明heartbeat提供的有drbd代理 
  35.  
  36. crm(live)ra# classes 
  37. heartbeat 
  38. lsb 
  39. ocf / heartbeat linbit pacemaker 
  40. stonith 
  41. crm(live)ra# list ocf linbit       
  42. drbd     //同样提供的有drbd;这两种都可使用  

五:定义资源:

 1、定义primitive资源:

 
  
  1. crm(live)configure# primitive Mydrbd ocf:linbit:drbd params  
  2. drbd_resource='web' op start timeout=240 op stop timeout=100 
  3. 信息点说明: 
  4. // primitive   ##用于定义primitive类的资源,后跟名字    
  5. //ocf:linbit:drbd     
  6. ##使用linbit类型的drbd(另一个由heartbeat提供) 
  7. //  drbd_resource='web'  ##web是上面自定义的资源名称 
  8. // op    ##后面跟指定的操作 
  9. // timeout   ##超时时间 
  10.  
  11. crm(live)configure# show   xml   ##查看资源信息 

 2、定义为主从类资源

 
  
  1. crm(live)configure# master ms_Mydrbd Mydrbd meta  
  2. master-max='1' master-node-max='1' clone-max='2'  
  3. clone-node-max='1' notify='true' 
  4. // master    ##定义主从的关键字 
  5.  //ms_Mydrbd    ##主从资源的名字,一定是某一个主资源的主从 
  6. // Mydrbd      ##原有primitive的资源名字 
  7. // meta     ##为主从定义额外的属性 
  8. // master-max   ##最多有几个主资源 
  9. // master-node-max      ##每个节点运行几个主的 
  10. // clone-max  ##最多有几个从的 
  11. // clone-node-max   ##每个节点运行几个从的 
  12. // notify    ##是否通知 
  13. 然后检查语法,提交 
  14.  
  15. crm(live)# status  
  16. Online: [ node1.magedu.com node2.magedu.com ] 
  17.  
  18. Master/Slave Set: ms_Mydrbd [Mydrbd] 
  19.      Masters: [ node1.magedu.com ] 
  20.      Slaves: [ node2.magedu.com ] 
  21. //显示主从节点 
  22.  
  23. 此时node1上: 
  24. [root@node1 corosync]# drbd-overview 
  25.   0:web  Connected Primary/Secondary UpToDate/UpToDate C r----  
  26. //说明nide1为primary 
  27.  
  28. crm node standby    ##让node1为standby 
  29. crm node online    ##重新上线 
  30. crm status    ##查看状态 
  31.  Master/Slave Set: ms_Mydrbd [Mydrbd] 
  32.      Masters: [ node2.magedu.com ] 
  33.      Slaves: [ node1.magedu.com ] 
  34. [root@node1 corosync]# drbd-overview 
  35.   0:web  Connected Secondary/Primary UpToDate/UpToDate C r----  
  36. //有上面信息可以知道,node2为primary;主从已转换 

 3、定义Filesystem资源

 
  
  1. # primitive MyFS ocf:heartbeat:Filesystem params  
  2. device="/dev/drbd0" directory="/data/mydata" fstype="ext3"  
  3. op start timeout=60 op stop timeout=60 
  4.  
  5. # colocation MyFS_on_ms_Mydrbd_master inf: MyFS  
  6. ms_Mydrbd:Master 
  7. # order MyFS_after_ms_Mydrbd_master inf: ms_Mydrbd:promote  
  8. MyFS:start  
  9.  # verify 
  10. # commit 
  11.  
  12. crm(live)# status 
  13.  Master/Slave Set: ms_Mydrbd [Mydrbd] 
  14.      Masters: [ node2.magedu.com ] 
  15.      Slaves: [ node1.magedu.com ] 
  16. MyFS     (ocf::heartbeat:Filesystem):     Started  
  17. node2.magedu.com 
  18. 到node2查看是否挂载: 
  19. [root@node2 corosync]# ls /data/mydata   
  20. drbd.conf         mysql-bin.000002  mysql-bin.index 
  21. drbd.d            mysql-bin.000003  node1.magedu.com.err 
  22. //显示部分 
  23.  
  24. [root@node2 corosync]# crm node standby 
  25. [root@node2 corosync]# crm node online 
  26. [root@node2 corosync]# crm status 
  27.  Master/Slave Set: ms_Mydrbd [Mydrbd] 
  28.      Masters: [ node1.magedu.com ] 
  29.      Slaves: [ node2.magedu.com ] 
  30. MyFS     (ocf::heartbeat:Filesystem):     Started  
  31. node1.magedu.com 
  32. //让node2为standby;发现MyFS在node1上启动 

4、定义mysql资源

 
  
  1. # primitive Mysql lsb:mysqld 
  2. #  colocation Mysql_with_MyFS inf: Mysql MyFS 
  3. # order Mysql_after_MyFS mandatory: MyFS Mysql 
  4. 然后检查提交 
  5.  
  6. crm(live)# status 
  7. Master/Slave Set: ms_Mydrbd [Mydrbd] 
  8.      Masters: [ node1.magedu.com ] 
  9.      Slaves: [ node2.magedu.com ] 
  10. MyFS     (ocf::heartbeat:Filesystem):     Started  
  11. node1.magedu.com 
  12. Mysql     (lsb:mysqld):     Started node1.magedu.com 
  13. // mysql在node1启动起来 
  14.  
  15. [root@node1 ~]# /usr/local/mysql/bin/mysql 
  16. mysql> create database mydb; 
  17. Query OK, 1 row affected (0.03 sec) 
  18. //新建一个mydb库 
  19.  
  20. 切换主从: 
  21. [root@node1 ~]# crm node standby 
  22. [root@node1 ~]# crm node online 
  23. [root@node1 ~]# crm status 
  24. Master/Slave Set: ms_Mydrbd [Mydrbd] 
  25.      Masters: [ node2.magedu.com ] 
  26.      Slaves: [ node1.magedu.com ] 
  27. MyFS     (ocf::heartbeat:Filesystem):     Started  
  28. node2.magedu.com 
  29. Mysql     (lsb:mysqld):     Started node2.magedu.com 
  30.  
  31. 在node2上登陆mysql,可以看到mydb库 

5、定义Ip地址资源

 
  
  1. crm(live)configure# primitive MyIP ocf:heartbeat:IPaddr2  
  2. params ip="172.16.14.2" 
  3. crm(live)configure# colocation MyIP_with_ms_Mydrbd_master  
  4. inf: MyIP ms_Mydrbd:Master 
  5. crm(live)configure# verify 
  6. crm(live)configure# commit 
  7. crm(live)configure# cd 
  8. crm(live)# status 
  9.  Master/Slave Set: ms_Mydrbd [Mydrbd] 
  10.      Masters: [ node2.magedu.com ] 
  11.      Slaves: [ node1.magedu.com ] 
  12. MyFS     (ocf::heartbeat:Filesystem):     Started  
  13. node2.magedu.com 
  14. Mysql     (lsb:mysqld):     Started node2.magedu.com 
  15. MyIP     (ocf::heartbeat:IPaddr2):     Started node2.magedu.com 
  16.  
  17. 可以在node2上切换查看 

 

#############################最终结果#########################################

 
  
  1. node node1.magedu.com \ 
  2.      attributes standby="off" 
  3. node node2.magedu.com \ 
  4.      attributes standby="off" 
  5. primitive MyFS ocf:heartbeat:Filesystem \ 
  6.      params device="/dev/drbd0" directory="/data/mydata"  
  7.      fstype="ext3" \ 
  8.      op start interval="0" timeout="60" \ 
  9.      op stop interval="0" timeout="60" 
  10. primitive MyIP ocf:heartbeat:IPaddr2 \ 
  11.      params ip="172.16.14.2" 
  12. primitive Mydrbd ocf:linbit:drbd \ 
  13.      params drbd_resource="web" \ 
  14.      op start interval="0" timeout="240" \ 
  15.      op stop interval="0" timeout="100" 
  16. primitive Mysql lsb:mysqld 
  17. ms ms_Mydrbd Mydrbd \ 
  18.      meta master-max="1" master-node-max="1" clone-max="2"  
  19.      clone-node-max="1" notify="true" 
  20. colocation MyFS_on_ms_Mydrbd_master inf: MyFS ms_Mydrbd:Master 
  21. colocation MyIP_with_ms_Mydrbd_master inf: MyIP  
  22. ms_Mydrbd:Master 
  23. colocation Mysql_with_MyFS inf: Mysql MyFS 
  24. order MyFS_after_ms_Mydrbd_master inf: ms_Mydrbd:promote  
  25. MyFS:start 
  26. order Mysql_after_MyFS inf: MyFS Mysql 
  27. property $id="cib-bootstrap-options" \ 
  28.       
  29.      dc-version="1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80abab 
  30.      d6ca3902f" \ 
  31.      cluster-infrastructure="openais" \ 
  32.      expected-quorum-votes="2" \ 
  33.      no-quorum-policy="ignore" \ 
  34.      stonith-enabled="false"