Loading... <p style="text-indent: 2em"><span style="font-size: 18px"><strong>前言</strong></span><br style="text-indent: 2em" /></p> <p style="text-indent: 2em">在众多的高可用集群解决方案中,除了Heartbeat之外,Corosync也能提供类似于Heartbeat一样的功能,而且目前RedHat官方提供的高可用集群解决方案的程序包都以Corosync为主,所以今后Corosync会逐渐取代Heartbeat。本文带来的是基于Corosync + Pacemaker+DRBD的MySQL高可用集群解决方案。</p> <p style="text-indent: 2em"><span style="font-size: 18px"><strong>相关介绍</strong></span><br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><strong>Corosync</strong></p> <p style="text-indent: 2em">Corosync是从OpenAIS中分支出来的一个项目,它在传递信息的时候可以通过一个简单的配置文件来定义信息传递的方式和协议等。Corosync识别节点是通过authkey来实现的,不同于heartbeat v1 v2,Corosync的authkey是通过corosync-keygen命令生成的,具有更高的安全性。</p> <p style="text-indent: 2em">Corosync目前有两个主流的版本:v1和v2,两个版本差别较大,v1没有有投票功能,需要借助cman实现,v2支持投票功能。</p> <p style="text-indent: 2em"><strong>Pacemaker</strong></p> <p style="text-indent: 2em">Pacemaker是从heartbeat v3版本中分裂出来专门用于管理高可用集群的组件,功能十分强大。它利用集群基础构件(OpenAIS 或heartbeat)提供的消息和成员管理能力来探测并从节点或资源级别的故障中恢复,以实现群集服务(亦称资源)的最大可用性。</p> <p style="text-indent: 2em"><strong>DRBD</strong></p> </p> <p style="text-indent: 2em">DRBD是由内核模块和相关脚本而构成,用以构建高可用性的集群。其实现方式是通过网络来镜像整个设备。可以把它看作是一种网络RAID。</p> <p style="text-indent: 2em">DRBD负责接收数据,把数据写到本地磁盘,然后发送给另一个主机,另一个主机再将数据存到自己的磁盘中。</p> <p style="text-indent: 2em">下面是DRBD的系统结构图<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160518-68.gif" title="1434035308717432.jpg" alt="drbd.jpg" /></p> <p style="text-indent: 2em"><span style="font-size: 18px"><strong>高可用解决方案</strong></span><br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><strong>实验拓扑</strong></p> <p style="text-indent: 2em"><strong><img src="//cto.wang/usr/uploads/2016/07/20160703160518-43.jpg" title="1434035325789984.jpg" alt="基于Corosync + Pacemaker+DRBD实现MySQL高可用集群.jpg" /></strong></p> <p style="text-indent: 2em"><strong>实验环境</strong></p> <p style="text-indent: 2em">node1:172.16.10.123 MariaDB DRBD CentOS6.6<br style="text-indent: 2em" /></p> <p style="text-indent: 2em">node2:172.16.10.124 MariaDB DRBD CentOS6.6</p> <p style="text-indent: 2em">VIP:192.168.1.121</p> <p style="text-indent: 2em"><strong>配置过程</strong><br style="text-indent: 2em" /></p> </p> <p style="text-indent: 2em">配置HA的前提:</p> <p style="text-indent: 2em">时间同步、基于主机名互相通信、SSH互信</p> <p style="text-indent: 2em">请确保两个节点时间同步,可用ntpdate向时间服务器同步</p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# ntpdate cn.pool.ntp.org</pre> <p style="text-indent: 2em">基于主机名互相通信<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# vim /etc/hosts 172.16.10.123 node1.scholar.com node1 172.16.10.124 node2.scholar.com node2 [root@node1 ~]# vim /etc/sysconfig/network HOSTNAME=node1.scholar.com [root@node1 ~]# uname -n node1.scholar.com #两个节点都需如上操作</pre> <p style="text-indent: 2em">SSH互信</p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# ssh-keygen -t rsa -P '' [root@node1 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node2 [root@node2 ~]# ssh-keygen -t rsa -P '' [root@node2 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node1 [root@node1 ~]# date; ssh node2 'date' #测试 Wed Jun 10 16:27:47 CST 2015 Wed Jun 10 16:27:47 CST 2015</pre> <p style="text-indent: 2em">安装所需程序包<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">#安装corosync + pacemaker,pacemaker依赖于corosync,会一并安装 [root@node1 ~]# yum install pacemaker -y #安装pacemaker配置接口,crmsh依赖于pssh,单独安装需解决依赖关系,需suse官方源 [root@node1 ~]# yum install crmsh -y #安装drbd [root@node1 ~]# yum install gcc gcc-c++ glibc flex kernel-devel kernel-headers -y [root@node1 ~]# tar xf drbd-8.4.3.tar.gz [root@node1 ~]# cd drbd-8.4.3 [root@node1 drbd-8.4.3]# ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --with-km [root@node1 drbd-8.4.3]# make && make install [root@node1 drbd-8.4.3]# modprobe drbd #两个节点都执行以上操作</pre> <p style="text-indent: 2em">Corosync配置</p> <p style="text-indent: 2em">修改配置文件<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# cd /etc/corosync/ [root@node1 corosync]# mv corosync.conf.example corosync.conf [root@node1 corosync]# vim corosync.conf # Please read the corosync.conf.5 manual page compatibility: whitetank totem { #心跳信息传递层 version: 2 #版本 secauth: on #认证信息 threads: 0 #线程 interface { #定义心跳信息传递的接口 ringnumber: 0 bindnetaddr: 172.16.0.0 #绑定的网络地址,写网络地址 mcastaddr: 226.94.1.1 #多播地址 mcastport: 5405 #多播的端口 ttl: 1 #生存周期 } } logging { #日志 fileline: off to_stderr: no #是否输出在屏幕上 to_logfile: yes #定义自己的日志 to_syslog: no #是否由syslog记录日志 logfile: /var/log/cluster/corosync.log #日志文件的存放路径 debug: off timestamp: on #是否开启时间戳 logger_subsys { subsys: AMF debug: off } } amf { mode: disabled } service { ver: 0 name: pacemaker #pacemaker作为corosync的插件进行工作 } aisexec { user: root group: root }</pre> <p style="text-indent: 2em">生成认证文件</p> <pre class="brush:bash;toolbar:false">[root@node1 corosync]# corosync-keygen Corosync Cluster Engine Authentication key generator. Gathering 1024 bits for key from /dev/random. Press keys on your keyboard to generate entropy. Press keys on your keyboard to generate entropy (bits = 736). ########此时拼命敲键盘产生随机数###########</pre> <p style="text-indent: 2em">将配置文件及认证文件同步给另一个节点</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160518-74.jpg" title="1434035368848792.jpg" alt="0.jpg" /></p> <p style="text-indent: 2em">安装mysql</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160518-33.jpg" title="1434035426251811.jpg" alt="1.jpg" /></p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# vim /etc/mysql/my.cnf datadir = /mydata/data log-bin=/mydata/binlogs/ #两个节点都执行以上操作</pre> <p style="text-indent: 2em">DRBD配置<br style="text-indent: 2em" /></p> <p style="text-indent: 2em">准备DRBD分区<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# fdisk sdb Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-2610, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +10G Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. [root@node1 ~]# partx -a /dev/sdb #另一个节点也执行此操作</pre> <p style="text-indent: 2em">修改配置文件<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# vim /etc/drbd.d/global_common.conf global { usage-count no; # minor-count dialog-refresh disable-ip-verification } common { protocol C; handlers { pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f"; # fence-peer "/usr/lib/drbd/crm-fence-peer.sh"; # split-brain "/usr/lib/drbd/notify-split-brain.sh root"; # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root"; # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k"; # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh; } startup { #wfc-timeout 120; #degr-wfc-timeout 120; } disk { on-io-error detach; #fencing resource-only; } net { cram-hmac-alg "sha1"; shared-secret "mydrbdlab"; } syncer { rate 1000M; } } [root@node1 ~]# vim /etc/drbd.d/mydata.res #定义一个资源/etc/drbd.d/mydata.res,内容如下 resource mydata { on node1 { device /dev/drbd0; disk /dev/sdb1; address 172.16.10.123:7789; meta-disk internal; } on node2 { device /dev/drbd0; disk /dev/sdb1; address 172.16.10.124:7789; meta-disk internal; } }</pre> <p style="text-indent: 2em">将配置文件同步给另一个节点<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160518-32.jpg" title="1434035446208487.jpg" alt="2.jpg" /></p> <p style="text-indent: 2em">初始化资源并启动服务<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# drbdadm create-md mydata [root@node1 ~]# service drbd start #两个节点都要执行以上操作</pre> <p style="text-indent: 2em">同步资源<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160518-78.jpg" title="1434035470862624.jpg" alt="3.jpg" /></p> <pre class="brush:bash;toolbar:false">#以上操作只在一个节点进行</pre> <p style="text-indent: 2em">格式化DRBD分区<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160519-18.jpg" title="1434035619181807.jpg" alt="4.jpg" /></p> <pre class="brush:bash;toolbar:false">#以上操作只在一个节点执行</pre> <p style="text-indent: 2em">挂载DRBD分区初始化数据库<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160519-1.jpg" title="1434035673143449.jpg" alt="5.jpg" /></p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/mydat a/data/ --basedir=/usr/local/mysql #初始化操作只执行一次即可</pre> <p style="text-indent: 2em">测试数据是否同步<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160519-41.jpg" title="1434035691132626.jpg" alt="6.jpg" /></p> <p style="text-indent: 2em">在另一个节点上测试</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160519-68.jpg" title="1434035710727499.jpg" alt="7.jpg" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160519-50.jpg" title="1434035733988118.jpg" alt="8.jpg" /></p> <p style="text-indent: 2em">数据同步成功,接下来关闭所有服务<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160519-100.jpg" title="1434035763991514.jpg" alt="9.jpg" /></p> <pre class="brush:bash;toolbar:false">#另一个节点也关闭服务,确保开机不会自启</pre> </p> <p style="text-indent: 2em">配置corosync资源,实现高可用</p> <p style="text-indent: 2em">定义DRBD资源<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160519-66.jpg" title="1434035797671596.jpg" alt="10.jpg" /></p> <p style="text-indent: 2em">定义DRBD主从资源</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160519-39.jpg" title="1434035832116491.jpg" alt="11.jpg" /></p> <p style="text-indent: 2em">定义mysql所需资源<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160519-7.jpg" title="1434035882945670.jpg" alt="12..jpg" /></p> <p style="text-indent: 2em">定义组及各资源约束关系<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160519-54.jpg" title="1434035951589044.jpg" alt="13..jpg" /></p> <p style="text-indent: 2em"><span style="font-family:微软雅黑, Microsoft YaHei">查看所有资源信息</span></p> <pre class="brush:bash;toolbar:false">crm(live)configure# show node node1.scholar.com node node2.scholar.com primitive mydrbd ocf:linbit:drbd \ params drbd_resource=mydata \ op monitor role=Master interval=10s timeout=20s \ op monitor role=Slave interval=20s timeout=20s \ op start timeout=240s interval=0 \ op stop timeout=100s interval=0 primitive myfs Filesystem \ params device="/dev/drbd0" directory="/mydata" fstype=ext4 \ op monitor interval=20s timeout=60s \ op start timeout=60s interval=0 \ op stop timeout=60s interval=0 primitive myserver lsb:mysqld \ op monitor interval=30s timeout=20s primitive myvip IPaddr \ params ip=192.168.1.121 \ op monitor interval=30s timeout=20s group myservice myvip myfs myserver ms ms_mydrbd mydrbd \ meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true colocation myfs_with_ms_mydrbd_master inf: myfs ms_mydrbd:Master colocation myserver_with_myfs inf: myserver myfs order myfs_after_ms_mydrbd_master Mandatory: ms_mydrbd:promote myfs:start property cib-bootstrap-options: \ dc-version=1.1.11-97629de \ cluster-infrastructure="classic openais (with plugin)" \ expected-quorum-votes=2 \ stonith-enabled=false \ no-quorum-policy=ignore \ last-lrm-refresh=1434014581</pre> <p style="text-indent: 2em"><span style="font-family:微软雅黑, Microsoft YaHei"></span>查看集群运行状态</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160519-47.jpg" title="1434035982713233.jpg" alt="14.jpg" /></p> <p style="text-indent: 2em">授权一个远程用户做测试<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160519-24.jpg" title="1434036000112610.jpg" alt="15.jpg" /></p> <p style="text-indent: 2em">在其他主机登陆测试<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160519-16.jpg" title="1434036049156800.jpg" alt="16.jpg" /></p> <p style="text-indent: 2em">此时模拟主节点故障<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160519-21.jpg" title="1434036078246511.jpg" alt="17.jpg" /></p> <p style="text-indent: 2em">此时,资源被转移到了node2上,继续用远程主机登陆测试</p> <p style="text-indent: 2em"><img src="/upload/j2my2kdim4z.jpg" title="1434036104118418.jpg" alt="18.jpg" /></p> <p style="text-indent: 2em">数据没有受到任何影响,高可用目的实现,至此,基于Corosync + Pacemaker+DRBD的MySQL高可用集群实验完成</p> <p style="text-indent: 2em"><span style="font-size: 18px"><strong>The end</strong></span></p> <p style="text-indent: 2em">本次实验就进行到这里了,实验过程出现了一个奇葩问题,至今不知何故,朋友们如果配置过程中遇到问题欢迎留言交流。以上仅为个人学习整理,如有错漏,大神勿喷~~~</p> <p></p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信