设为首页 收藏本站
查看: 612|回复: 0

[经验分享] corosync+pacemaker and drbd实现mysql高可用集群

[复制链接]

尚未签到

发表于 2018-9-27 13:47:23 | 显示全部楼层 |阅读模式
  DRBD:Distributed Replicated Block Device 分布式复制块设备,原理图如下
DSC0000.png

  DRBD有主双架构和双主架构的,当处于主从架构时,这个设备一定只有一个节点是可以读写的,另外的节点是不可读的,连挂载都不可能,只有一个节点是主的,其它节点都是从的。当做为主主架构时,需要达到几个条件,1.在高可用集群中启用DRBD;  2. 启用分布式文件锁功能,即需要把磁盘格式化为集群文件系统(如GFS2,OCFS2等);3. 把DRBD做成资源。
  数据的存储过程:当某个进程存储数据时在内核中通过DRBD模块复制一分通过TCP/IP套接字发送到从节点上去,从节点的DRBD在套接字上接收数据并通过DRBD模块存储到磁盘,并把结果返回给主节点 。但是内核传输的速度很快,而TCP报文的传输速度相对来说要慢得多,于是会把数据存入TCP协议栈的发送缓冲区,然后从缓冲区慢慢传递到从节点上。这个数据传输过程有三个模型:
  A : 异步模型,当内核把DRBD模块中复制的数据已经以报文方式发送到本地的TCP协议栈的缓冲区,至是从节点的数据是否已经传送到,保存是否完整,无法保证;
  B : 半同步模型,报文已经发送到从节点的套接字上,已经接收,并发往内核,但从节点的存储过程没有回应过程。
  C:同步模型,报文发往从节点,从节点已经接收,并发往内核,内核已经把数据报文存储到磁盘,并把结果返回给主节点,这个是默认的数据传输模型,可以保证数据的完整性。
  安装环境:
  centos6.5,安装corosync和pacemaker过程请参见上一篇博客,上一个环境安装的配置接口是crmsh,这里安装的是pcs,安装pcs比较简单,#yum install pcs –y  即可
  安装完成后集群状态如下:
DSC0001.png

  现在看到两个集群节点mysql1 mysql2在线,pacemaker是做为插件在使用的,没有stonith设备,只有两个节点,所以quorum也要忽略
  #pcs property set stonith-enabled=false
  # pcs property set no-quorum-policy=ignore
  #pcs config show                                               查看配置文件
DSC0002.png

  显示错误还没有集群配置文件,stonith已经禁用,quorum已经忽略
  安装drbd:
  根据官方文档,drbd在内核2.6.33版本以后就已经装载进了内核,不需要再额外安装drbd,只需要安装drbdadm管理软件就行,我这里用的是centos6.5,内核版本是2.6.32,所以还需要安装
DSC0003.png

  drbd版本有8.1 8.2 8.3 8.4,我这里用的是已经做好的rpm包进行安装,下载目录:ftp://rpmfind.net/linux/atrpms/
  把drbd的两个rpm包放在/root目录下,然后执行# yum --nogpgcheck localinstall *.rpm
  --nogpgcheck 不执行gpg检测,因为在centos里面没有认证文件
DSC0004.png

  在两个节点上安装完成。加载DRBD模块
[root@mysql1 ~]# modprobe drbd  
[root@mysql1 ~]# lsmod | grep drbd
  
drbd                  325978  0
  
libcrc32c               1246  1 drbd
  

  

创建一个新的磁盘分区做为DRBD的共享磁盘,我这里是xen虚拟机添加的一个磁盘/dev/xvdb,创建的磁盘为/dev/xvdb1  

  

[root@mysql1 drbd.d]# fdisk /dev/xvdb  
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel

  
Building a new DOS disklabel with disk>  
Changes will remain in memory only, until you decide to write them.
  
After that, of course, the previous content won't be recoverable.
  

  
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
  

  
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
  switch off the mode (command 'c') and change display units to
  sectors (command 'u').
  

  
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):
  
Using default value 2610
  

  
Command (m for help): p
  

  
Disk /dev/xvdb: 21.5 GB, 21474836480 bytes
  
255 heads, 63 sectors/track, 2610 cylinders
  
Units = cylinders of 16065 * 512 = 8225280 bytes

  
Sector>
  
I/O>
  
Disk>  


  Device Boot      Start         End      Blocks  >  
/dev/xvdb1               1        2610    20964793+  83  Linux
  

  
Command (m for help): w

  
The partition table has been>  

  
Calling ioctl() to re-read partition table.
  
Syncing disks.
  

  

  在mysql2节点上执行同样的操作。
  配置drbd:
  在/etc目录下有一个文件drbd.conf 主配置文件,里面主要调用了/etc/drbd.d/目录下的配置文件
DSC0005.png

  配置/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 degr-wfc-timeout outdated-wfc-timeout wait-after-sb
  wfc-timeout 120;
  degr-wfc-timeout 120;
  
}
  

  options {
  # cpu-mask on-no-data-accessible
  }
  

  disk {
  on-io-error detach;
  #fencing resource-only;
  }
  

  net {
  cram-hmac-alg "sha1";
  shared-secret "drbd1";
  }
  syncer {
  rate 1000M;
  }
  
}
  

  

  在/etc/drbd.d/目录下再创建一个磁盘的资源
  #vim /etc/drbd.d/stone.res
  

  

resource mysql{  on mysql1 {
  device    /dev/drbd0;
  disk      /dev/xvdb1;
  address   10.204.80.86:7789;
  meta-disk internal;
  }
  on mysql2 {
  device    /dev/drbd0;
  disk      /dev/xvdb1;
  address   10.204.80.85:7789;
  meta-disk internal;
  }
  
}
  

  

  把这两个文件复制到mysql2节点上
  然后在两个节点上初始化资源,分别执行
  #drbdadm create-md mysql                                                           --这个资源是在stone.res文件中定义的资源
DSC0006.png

  显示初始化成功
  启动drbd服务
  #service drbd start
  查看drbd状态
  #cat /proc/drbd
DSC0007.png

  上面的信息两个节点都处于Secondary 状态,将mysql1节点设置为Primary
  #drbdadm  primary  --force mysql
DSC0008.png

  如上所示,数据同步过程已经开始,过一段时间后查看drbd状态
DSC0009.png

  显示资源已经是主从状态
  创建文件系统:
  #mke2fs –t ext4 –L drbd /dev/drbd0                  #格式化为ext4文件系统,并指定label名为drbd
DSC00010.png

  创建/data目录,并挂载分区
  #mkdir /data
  #mount /dev/drbd0 /data
DSC00011.png

  挂载成功
  在/data目录中创建 a,b,c,d四个文件,然后再手动切换Primary/Secondary节点
  在节点mysql1上执行
  

  

#cd /data && touch {a,b,c,d}  

  
#umount /data
  

  
#drbdadm secondary mysql
  

  

DSC00012.png

  可以看到drbd的状态又重新变为secondary /secondary状态
  在mysql2节点上把drbd节点设置为Primary 状态,创建/data 目录 ,并挂载
  

  

#drbdadm primary mysql  

  
#cat /proc/drbd
  

  
#mkdir /data
  

  
#mount /dev/drbd0 /data
  

  
#ls /data
  

  

DSC00013.png

  可以看到在mysql1节点上创建的a,b,c,d四个文件在mysql2节点上依然存在,drbd共享存储已经Ok
  安装mysql,创建集群资源,安装mysql过程略
  配置资源资源
  pcs创建资源可以用 #pcs ? 可以查看帮助信息
  # pcs resource create mysqlip ipaddr ip=10.204.80.89 cidr_netmask=24 nic=eth0
  添加DRBD资源,提供drbd的RA目前由OCF归类为linbit,其路径为/usr/lib/ocf/resource.d/linbit/drbd。drbd 需要同时运行在两个节点上,但只能有一个节点(primary/secondary模型)是Master,而另一个节点为Slave;因此,它是一种比较特殊的集群资源,其资源类型为多状态(Multi-state)clone类型,即主机节点有Master和Slave之分,且要求服务刚启动时两个节点都处于slave状态。
  #pcs resource create  primitive mysqldrbd ocf:linbit:drbd params drbd_resource=mysql op monitor role=Master interval=50s timeout=30s op monitor role=Slave interval=60s timeout=30s  op start timeout=240 op stop timeout=100
  或者#crm configure primitive mysqldrbd ocf:linbit:drbd params drbd_resource=mysql op monitor role=Master interval=10s timeout=20s op monitor role=Slave interval=20s timeout=20s op start timeout=240 op stop timeout=100
  #pcs resource master ms_mysqldrbd mysqldrbd meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
  或者#crm configure ms ms_myqldrbd mysqldrbd  meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
  把drbd定义为clone资源,查看资源状态#pcs resource show
DSC00014.png

  但做为文件系统还需要挂载,把drbd挂载到/data目录
  # pcs resource create drbdfs ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/data" fstype="ext4"
  查看资源状态
DSC00015.png

  文件系统挂载drbdfs必须和Master mysqldrbd在同一节点上,必须先启动mysqldrbd然后才能挂载drbdfs文件系统,所以必须定义资源约束
  # pcs constraint colocation add  drbdfs with master MS_mysqldrbd
  # pcs constraint order promote MS_mysqldrbd then drbdfs                    ###drbd的资源添加完成
  # pcs resource create MySQLD lsb:mysqld op monitor interval=20 timeout=20 on-fail=restart ###添加MySQLD 服务资源完成,定义MySQLD的资源约束,必须drbdfs文件系统先挂载然后才能启动MySQLD服务
  # pcs constraint order drbdfs then MySQLD
DSC00016.png

  把mysqlip ,drbdfs 和MySQLD服务定义到同一个资源组
  # pcs resource group add myservice mysqlip drbdfs MySQLD
  查看资源状态
DSC00017.png

  定义资源组的约束
  #pcs constraint order mysqlip then promote MS_mysqldrbd then drbdfs then MySQLD
  查看集群的配置信息
  #pcs config show
  

  

root@mysql1 /]# pcs config show  
Cluster Name:
  
Corosync Nodes:
  
Pacemaker Nodes:
  mysql1 mysql2
  

  
Resources:
  Master: ms_mysqldrbd
  Meta Attrs: master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
  Resource: mysqldrbd (class=ocf provider=linbit type=drbd)
  Attributes: drbd_resource=mysql
  Operations: monitor interval=50s role=Master timeout=30s (mysqldrbd-monitor-interval-50s-role-Master)
  monitor interval=60s role=Slave timeout=30s (mysqldrbd-monitor-interval-60s-role-Slave)
  Group: myservice
  Resource: mysqlip (class=ocf provider=heartbeat type=IPaddr)
  Attributes: ip=10.204.80.89
  Operations: monitor interval=60s (mysqlip-monitor-interval-60s)
  Resource: drbdfs (class=ocf provider=heartbeat type=Filesystem)
  Attributes: device=/dev/drbd0 directory=/data fstype=ext4
  Operations: monitor interval=60s (drbdfs-monitor-interval-60s)
  Resource: MySQLD (class=lsb type=mysqld)
  Operations: monitor on-fail=restart interval=20 timeout=20 (MySQLD-monitor-interval-20)
  

  
Stonith Devices:
  
Fencing Levels:
  

  
Location Constraints:
  
Ordering Constraints:
  promote ms_mysqldrbd then start drbdfs (Mandatory) (id:order-ms_mysqldrbd-drbdfs-mandatory)
  start drbdfs then start MySQLD (Mandatory) (id:order-drbdfs-MySQLD-mandatory)
  
Colocation Constraints:
  drbdfs with ms_mysqldrbd (INFINITY) (rsc-role:Started) (with-rsc-role:Master) (id:colocation-drbdfs-ms_mysqldrbd-INFINITY-1)
  

  
Cluster Properties:

  cluster-infrastructure:>  dc-version: 1.1.10-14.el6_5.3-368c726
  expected-quorum-votes: 2
  no-quorum-policy: ignore
  stonith-enabled: false
  

  

资源状态情况查看  

  

DSC00018.png   

  

用其他机器连到10.204.80.89的mysql  

  

DSC00019.png   

  

已经可以正常连接,把mysql1设置为standby   

  

DSC00020.png   

  

发现mysql的集群已经正常转移,高可用集群正常


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-602878-1-1.html 上篇帖子: MySQL主从的一致性校验及修复 下篇帖子: NAS之mysql高可用解决方案
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表