实现mysql的高可用性能corosync+pacemaker+mysql+drbd

在操作之前请确保:

1、两台机器的时间同步
2、/etc/hosts文件解析和uname -n给出的主机名的一致性
3、确保双方可以通过节点名称访问。
4、双机要互信
 
说明:以下内容以“#”开头的,代表是要在命令行执行的命令。
 
一、构建节点
1、确保将要被配置成节点的主机时间同步,主机名称和IP地址解析服务能够正常工作,且节点的主机名称和“unam -n”命令的结果保持一致。所以节点上的/etc/hosts文件均要提供以下内容:
 
  
  
  
  
  1. 172.16.100.1        db1.magedu.com db1 
  2. 172.16.100.2        db2.magedu.com db2 

2、为方便使用命令scp说以建议双机互信,在两个节点上均执行以下命令
 
  
  
  
  
  1. # ssh-keygen -t rsa 
  2. # ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2 

3、在每个节点上都安装如下的软包,这里采用yum安装,可以自动解决依赖关系,并且需要安装的包比较多所以我们将这些包放到一个目录里,然后执行下面的命令
 
  
  
  
  
  1. #yum -y --nopgpcheck localinstall ./*.rpm 

4、选取一个节点配置corosycn,这里在db1.magedu.com这个节点上配置
//service定义资源管理,启用pacemaker
//定义运行corosync服务的用户
 
  
  
  
  
  1. 1)cd /etc/corosync 
  2. # cp corosync.conf.example corosync.conf 
  3.  
  4. 2)编辑corosync.conf添加以下内容 
  5.   service { 
  6.           ver:0 
  7.           name:pacemaker  
  8.  } 
  9.  
  10.   aisexec{ 
  11.          user:   root 
  12.          group:  root 
  13.  } 
3)编辑corosync.conf修改bindnetaddr为我们的网段内容为下面
 
  
  
  
  
  1. bindnetaddr: 172.16.0.0 
 
4)生成节点之间通信时用到的密钥
 
  
  
  
  
  1. #  corosync-keygen 

5、为了方便,也为了保持一致性,所以我们复制corosync.conf和auchkey到另一个节点db2.magedu.com它的别名是db2.
 
  
  
  
  
  1. #  scp -p corosync.conf authkey  db2:/etc/corosync/ 
 
6、在每个节点的命令行执行以下操作创建集群日志,否则corosync是无法启动的哦
 
  
  
  
  
  1. #  mkdir /var/log/cluster 

7、在选取一个节点尝试启动crosync并且确保其正常,我们这里先尝试启动db1。
 
  
  
  
  
  1. #  service corosync start 
 
1)在/var/log/messages找以下内容,用于确认corosync引擎已经正常启动
 
  
  
  
  
  1. [root@db1 corosync]# grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/messages 
  2. Nov 28 15:51:08 db1 corosync[7995]:   [MAIN  ] Corosync Cluster Engine ('1.2.7'): started and ready to provide service. 
  3. Nov 28 15:51:08 db1 corosync[7995]:   [MAIN  ] Successfully read main configuration file '/etc/corosync/corosync.conf'. 
  4. Nov 28 15:51:08 db1 corosync[7995]:   [MAIN  ] Corosync Cluster Engine exiting with status 8 at main.c:1397. 
  5. Nov 28 15:51:35 db1 corosync[8017]:   [MAIN  ] Corosync Cluster Engine ('1.2.7'): started and ready to provide service. 
  6. Nov 28 15:51:35 db1 corosync[8017]:   [MAIN  ] Successfully read main configuration file '/etc/corosync/corosync.conf'. 
  7. [root@db1 corosync]#  
2)确保初始化成员节点通知正常发出:
 
  
  
  
  
  1. [root@db1 corosync]# grep TOTEM /var/log/messages 
  2. Nov 28 15:51:35 db1 corosync[8017]:   [TOTEM ] Initializing transport (UDP/IP). 
  3. Nov 28 15:51:35 db1 corosync[8017]:   [TOTEM ] Initializing transmit/receive security: libtomcrypt SOBER128/SHA1HMAC (mode 0). 
  4. Nov 28 15:51:35 db1 corosync[8017]:   [TOTEM ] The network interface [172.16.16.1] is now up. 
  5. Nov 28 15:51:36 db1 corosync[8017]:   [TOTEM ] Process pause detected for 558 ms, flushing membership messages. 
  6. Nov 28 15:51:36 db1 corosync[8017]:   [TOTEM ] A processor joined or left the membership and a new membership was formed. 
  7. Nov 28 15:53:31 db1 corosync[8017]:   [TOTEM ] A processor joined or left the membership and a new membership was formed. 
  8. [root@db1 corosync]#  
 
3)检查启动过程当中是否有错误发生
 
  
  
  
  
  1. [root@db1 corosync]# grep ERROR: /var/log/messages | grep -v unpack_resources 
4)检查pacemaker是否正常启动
 
  
  
  
  
  1. [root@db1 corosync]# grep pcmk_startup /var/log/messages 
  2. Nov 28 15:51:36 db1 corosync[8017]:   [pcmk  ] info: pcmk_startup: CRM: Initialized 
  3. Nov 28 15:51:36 db1 corosync[8017]:   [pcmk  ] Logging: Initialized pcmk_startup 
  4. Nov 28 15:51:36 db1 corosync[8017]:   [pcmk  ] info: pcmk_startup: Maximum core file size is: 4294967295 
  5. Nov 28 15:51:36 db1 corosync[8017]:   [pcmk  ] info: pcmk_startup: Service: 9 
  6. Nov 28 15:51:36 db1 corosync[8017]:   [pcmk  ] info: pcmk_startup: Local hostname: db1.magedu.com 
 
8、以上判断中在节点db1上面的corosync是没有任何问题的,接下来就可以启动第二个节点上的corosync了,启动时是在已经启动的节点上,启动其他的节点,所以我们这里是在db1上面启动db2
 
  
  
  
  
  1. #  ssh db2 'service corosync start' 
9、查看此时节点的状态
 
  
  
  
  
  1. #crm status 

二、提供文件同步功能
 
1、在两个节点上,这里用yum安装drbd内核模块和管理工具,因为我们这里使用的rhel5.8的系统,并且是x86平台,(如果实验的平台内核版本高于2.6.33只需要安装drbd用户管理工具drbd83-8.3.13-2.el5.centos.i386.rpm。)
 
   
   
   
   
  1. yum -y --nogpgcheck localinstall drbd83-8.3.13-2.el5.centos.i386.rpm kmod-drbd83-8.3.13-1.el5.centos.i686.rpm  
2、提供配置文件drbd.conf
 
   
   
   
   
  1. cp /usr/share/doc/drbd83-8.3.13/drbd.conf /etc/drbd.conf 
3、在Global配置文件/etc/drbd.d/global_common.conf当中定义通用选项,编辑/etc/drbd.d/global_common.conf,进行如下操作
    //在disk中添加的一项表示的是如果这个设备出现了问题,就把它移除
    //在net中添加的一项表示的使用shal算法对密码进行加密用于数据同步过程中使用,其中这里“mysqldrbd”是密码这个可以随意设定
    //在syncer当中的定义使用带宽中的多大带宽用于数据的同步
 
   
   
   
   
  1. disk { 
  2.                 on-io-error detach; 
  3.     } 
  4.  
  5. net { 
  6.                 cram-hmac-alg "sha1"; 
  7.                 shared-secret "mysqldrbd"; 
  8.     } 
  9.  
  10. syncer { 
  11.                 rate 200M; 
  12.  
  13.     } 
4、定义一个资源/etc/drbd.d/sql.res,注意定义资源一定是以“res”结尾的.
   //device 定义的是drbd设备
   //disk   指定的是用哪块盘做为drbd的映射
   //adress 指定监听的地址和端口号,端口号是7789
   //meta-disk  指定元数据存放的位置,我们这里是存放在内部所以是internal
注意: 这里的两个节点上提供的disk名称可以不一样即一个是/dev/sa5 另一个是/dev/sda6也是没有问题的,但是大小必须一样,我们这里使用/dev/sda5
   
   
   
   
  1. resource sql { 
  2.     on db1.magedu.com { 
  3.  
  4.     device  /dev/drbd1; 
  5.     disk    /dev/sda5; 
  6.     address 172.16.16.1:7789; 
  7.     meta-disk internal; 
  8.          
  9.     } 
  10.  
  11.     on db2.magedu.com { 
  12.  
  13.     device /dev/drbd1; 
  14.     disk    /dev/sda5 
  15.     address 172.16.16.2:7789; 
  16.     meta-disk internal; 
  17.      
  18.     }    
5、复制配置文件到第二个节点db2上的相应的位置
 
   
   
   
   
  1. #  scp /etc/drbd.conf db2:/etc/ 
  2. #  scp /etc/drbd.d/* db2:/etc/drbd.d/ 
 
6、提供构建drbd的设备,上面我们已经定义用/dev/sda5作为drbd,所以我们在两个节点上的分别创建/dev/sda5,注意必须是同样大小的。这里具体的创建过程就不给出了。但是记得在分完区以后记得执行下面的命令同步下。(实在不行就重启reboot(*^__^*) 嘻嘻……)
 
   
   
   
   
  1. partprobe /dev/sda 
8、初始化资源sql,即为资源"sql"提供所需要的设备,在db2和db1上执行以下命令:
 
   
   
   
   
  1. # drbdam create-md sql 
9、此时可以查看下dev目录下。应该有了我们的drbd设备
 
   
   
   
   
  1. # ls /dev/drbd 
10、在两个节点上均启动服务
 
   
   
   
   
  1. # /etc/init.d/drbd start
11、查看启动状态有两种方式,通过下面两条任意一条命令都可以看到
 
   
   
   
   
  1. # cat /proc/drbd 
  2. # drbd-overview 

12、将一个节点,提升为主节点,这表示把drbd1提升为主的节点
 
   
   
   
   
  1. # drbdsetup /dev/drbd1 primary -o 

13、此时可以用下面的命令来查看同步的过程
 
   
   
   
   
  1. # wathc -nl 'cat /proc/drbd' 
  2. # drbd-overview 查看同步后的状态 
14、在“主”节点上对分区进行格式化,并创建挂载点,然后挂载它。我们这里刚刚把"drbd1"提升为主节点,所以在它上面对其格式化,将其挂载至/data/mydata目录下
 
   
   
   
   
  1. #    mke2fs -j L DRBD /dev/drbd1 
  2. #    mkdir  -pv /data/mydata 
  3. #    mount /dev/drbd1 /data/mydata 
【此时我们拷贝一个文件/etc/passwd到/data/mydata下,用于主被节点切换后查看效果】
 
补充:如果此时我们想要交换下主被节点,要先卸掉挂载点或者被挂载的设备,并且把当前主动节点降为被动节点,然后在把另一个节点提升为主节点。主被节点的概念是相对于资源来说的,我们这里的资源是"sql"。
在db1上执行:
 
   
   
   
   
  1. #   umount /data/mydata 
  2. #   drbdadm decondary sql 
此时用命令【drbd-overview】查看发现现在两个节点都是处于被动状态
在db2上执行:
 
   
   
   
   
  1. #   drbdadm primary sql 
  2. #   mkdir -pv /data/mydata 
  3. #   mount /dev/drbd1 /data/mydata 
【此时我们会看到/data/mydata目录下是有passwd这个文件存在的,这个文件并不是在对方的设备上,而是在自己的设备上,因为在对方存放的时候也会往我们这边的设备/dev/drbd1上面同步一份】
 
三、提供MySQL服务并且,确保 MySQL 在并未做高可用前,可以基于drbd正常运行
 
说明:我们建立的/data/mydata就是用来存放Mysql的数据的,所以它的属组和属主我们都应该改为"mysql",并且现在的
 
1、将我们的主动节点还切换到db1上。并且将/dev/drbd1挂载到/data/mydata目录下
2、在db1上操作,改变/data/mydata/目录的属组和属主
 
   
   
   
   
  1. #   chown -R mysql:mysql /data/mydata 
3、安装配置mysql这里不在做解释,只是给出步骤
 
   
   
   
   
  1. #   tar xf mysql-5.5.28-linux2.6-i686.tar.gz -C /usr/local/ 
  2. #   ln -sv mysql-5.5.28-linux2.6-i686/ mysql 
  3. #   cd mysql 
  4. #   chown -R :mysql . 
  5. #   scripts/mysql_install_db --user=mysql --datadir=/data/mytada 
  6. #   cp support-files/mysql.server /etc/rc.d/init.d/mysqld 
  7. #   cp support-files/my-large.cnf /etc/my.cnf  
   然后编辑配置文件/etc/my.cnf,添加如下行
 
   
   
   
   
  1. #   datadir = /data/mydata 
4、启动mysql服务并且,确保它在这个节点正常的工作的。
 
   
   
   
   
  1. #   service mysqld start 
5、退出mysql,停止mysql服务,并且不让其开机自动启动,卸载/data/mydata,并且降级drbd1为被动节点。
   
   
   
   
  1. chkconfig mysqld off 
6、在db2上操作,将drbd2提升为主节点,让后挂载至/data/mydata,此时在mydata目录可以看到mysql的信息。
 
   
   
   
   
  1. drbdadm primary sql 
  2. mount /dev/drbd2 /data/mydata 
7、并且确认两边的mysql用户的id号码是一样的,为db2提供mysql服务,此时记得不要再次初始化mysql了。
 
   
   
   
   
  1. #   tar xf mysql-5.5.28-linux2.6-i686.tar.gz /usr/local/ 
  2. #   ln -sv mysql-5.5.28-linux2.6-i686/ mysql 
  3. #   cd mysql 
  4. #   chown -R :mysql . 
  5. #   scp db1:/etc/rc.d/init.d/mysqld /etc/rc.d/init.d/ 
  6. #   scp db1:/etc/my.cnf /etc 
8、确保mysql服务正常能够运行,并且可以看到在db1操作时候创建的数据库即可。
9、停止drbd和mysqld并且不让它们不能开机自动启动,mysql已经准备好了为了再次db2上的Mysql也是正常工作的,最好再将主节点再切回到db1上面,具体步骤同上次切换)
   
   
   
   
  1. #   service mysqld stop 
  2. #   chkcofig mysqld off 
  3. #   service drbd stop 
  4. #   chkcofig drbd off  
四、实现Mysql的高可用性
 
1、启动corosync
 
   
   
   
   
  1. #   service corosync start 
  2. #   ssh db2 'service corosync start'  
2、查看节点状态确保有以下信息输出
 
   
   
   
   
  1. #   crm status 
Online: [ db1.magedu.com db2.magedu.com ] (输出的信息)
 
3、定义集群的属性
//property stonith-enalbed=flase 禁止使用stonith机制
//no-quorum-policy=ignore 不投票选举,即当quorum票数不小于1/2时,集群依然运行(因为我们就两个节点)
//verify 用于验证上面两条是否有错误.如果没有错误就可以提交了
//commit 提交定义的内容
   
   
   
   
  1. [root@db1 /]# crm configure 
  2. crm(live)configure# property stonith-enabled=false 
  3. crm(live)configure# property no-quorum-policy=ignore 
  4. crm(live)configure# verify  
  5. crm(live)configure# commit  
4、将drbd定义成资源
  //定义格式:资源类型 资源名字 代理资源名称 drbd资源名称 执行的操作
 //第一条语句说明用drbd_resource定义一条名为"sql"的drbd资源,因为我们是要将drbd定义为主从资源所以就得先用关键字primitive定义本地资源"my_drbd",这个名字是随便取能够分辨清楚即可
 //第二条语句定义主资源用master,主资源的名称“ms_my_drbd”meta用于是定义额外的一些属性,master-max表示一个群集上最多运行几个主资源;master-node-max表示一个节点最多运行几个主资源;clone-max定义一个群集上最多运行几个clone资源;clone-node-max表示一个节点上最多运行几个clone资源;notify用于定义 当出现故障时,是否通知对方,这个可以不定义它默认就是ture.
 
   
   
   
   
  1. crm(live)configure# primitive my_drbd ocf:linbit:drbd params drbd_resource='sql' op start timeout=240 op stop timeout=100 
  2. crm(live)configure# master ms_my_drbd my_drbd meta master-max="1" master-node-max="1" clone-max="2" clone-node-max=1 notify="ture" 
  3. crm(live)configure# commint  
5、测试当节点切换时资源drbd可以实现主从切换
//crm node standby表示将当前的节点切换成被动节点
//crm node online 为了查看效果,我们还得让这个节点上线
//drbd-overview查看节点以及资源当前的状态。看是否实现了转移.记得主动被动查看的时候前面的现实的是自己后面显示的对方的。
 
   
   
   
   
  1. [root@db1 ~]# crm node standby 
  2. [root@db1 ~]# crm node online 
  3. [root@db1 ~]# drbd-overview  

6、定义Filsystem,Filesystem直接的说就是定义了数据存储结构,所以一般的定义资源的时候她 是一定要定义的,而其在这里它一定要和drbd的主节点运行在一起。因为当drbd是主节点时候它才可以挂载数据。
//primitive定义一个名为"my_fs“的ext3文件系统资源
//colocation定义它的位置关系,inf关键字表示它和资源ms_my_drbd的主节点在其一起的意愿是百分百。order定义哪个资源先运行,my_fs这个资源运行在ms_my_drbd这个资源之后
//verify 检验
//commit 提交
   
   
   
   
  1. crm(live)configure# primitive my_fs ocf:heartbeat:Filesystem params device="/dev/drbd1" directory="/data/mydata" fstype="ext3" op start timeout=60 op stop timeout=60 
  2. crm(live)configure# colocation my_fs_on_ms_my_drbd inf: my_fs ms_my_drbd:Master 
  3. crm(live)configure# order my_fs_after_ms_my_drbd mandatory: ms_my_drbd my_fs:start 
  4. crm(live)configure#verify 
  5. crm(live)configure#commit 
 7、将MySQL服务定义成资源
 //定义一个名字为my_sql的资源
 //colocation定义它一定要和文件系统的资源my_fs运行在同一个节点上
 //order定义它和文件系统资源启动的先后顺序,这里文件系统资源my_fs先于my_sql资源。
   
   
   
   
  1. crm(live)configure# primitive my_sql lsb:mysqld 
  2. crm(live)configure# colocation my_sql_with_my_fs inf:my_sql my_fs 
  3. crm(live)configure# order my_sql_after_my_fs mandatory:my_fs my_sql 
 8、将IP定义成资源.
 //这个名为my_ip的资源和ms_mydrbd的主资源运行在一起
 //检验
 //提交
   
   
   
   
  1. crm(live)configure# primitive my_ip ocf:heartbeat:IPaddr2 params ip="172.16.16.100" 
  2. crm(live)configure# colocation my_ip_with_ms_my_drbd_master inf:my_ip ms_my_drbd:Master 
  3. crm(live)configure#verify 
  4. crm(live)configure#commit 
 总结:记得在drbd中的disk名字要定义成一样的,否则在下面定义资源的时候没法定义啦(看粉色)     即 primitive my_fs ocf:heartbeat:Filesystem params  device="/dev/drbd1"   directory = "/data/mydata"   fstype = "ext3"  op start  timeout = 60  op stop  timeout = 60  

 

你可能感兴趣的:(drbd,pacemaker,集群服务,高可用性能HA)