wtuyss 发表于 2018-10-2 14:48:55

DRBD+Heartbeat+Mysql 高可用实战

  实验环境:Centos 6.7_64位
  服务器:
  Master节点:dm1 IP地址:10.0.0.61(eth0) 192.168.3.150(eth1,心跳)
  Slave节点:dm2Ip地址:10.0.0.62(eth0) 192.168.3.160(eth1,心跳)
  VIP地址:192.168.0.180
  一、DRBD环境搭建
  DRBD(DistributedReplicatedBlockDevice)是一个基于块设备级别在远程服务器直接同步和镜像数据的软件,用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。它可以实现在网络中两台服务器之间基于块设备级别的实时镜像或同步复制(两台服务器都写入成功)/异步复制(本地服务器写入成功),相当于网络的RAID1,由于是基于块设备(磁盘,LVM逻辑卷),在文件系统的底层,所以数据复制要比cp命令更快,DRBD已经被MySQL官方写入文档手册作为推荐的高可用的方案之一。
  DRBD工作原理:
  提供两个大小相同的分区,在数据流的层次上构建一个磁盘镜像,就如同raid1,所以又被称为分布式raid
  主从架构:primary/secondary
  默认结构,两节点的所有存储属性,内容皆相同;
  同一时刻只能有一个节点上线(即从节点,读写皆不可),主节点接到数据后,将数据备份到磁盘,同时传递给从节点,并存放到磁盘中.此时文件系统可以使用本地文件系统:ext2 ext3 xfs等
  双主模型:
  同一时刻可以有两个节点同时工作,即组内节点皆上线;
  节点必须为集群文件系统,如:GFS2;OCFS2(本身提供高可用功能)
  必须支持分布式文件锁(内核支持),主节点写入的时候,从节点就从文件锁得知对方在写入;
  高可用集群的底层文件信息通道(必须将DRBD做成集群资源).
  简言之:
  Master/Master模式:
  1、文件系统必须为集群文件系统如:GFS2;OCFS2(本身提供高可用功能)
  2、使用高可用环境
  3、使用分布式锁DLM
  Master/Slave模式:
  1、可以使用普通文件系统
  2、可以切换主从角色
  3、如果需要为高可用提供存储空间,需要将DRBD作为HA的一个资源
  4、从节点不可读、不可写、不可挂载
  因为drbd工作在内核,故需要用户空间工具提供规则,所以它由用户空间工具和内核模块组成,就如同iptables和LVS一样.drbd共有两 部分组成:内核模块和用户空间的管理工具。其中drbd内核模块代码已经整合进Linux内核2.6.33以后的版本中,因此,如果您的内核版本高于此版 本的话,你只需要安装管理工具即可;否则,您需要同时安装内核模块和管理工具两个软件包,并且此两者的版本号一定要保持对应。
  不支持多个从,至少当前不支持
  用户空间工具:
  告知内核哪个分区是drbd设备
  drbdadm   /usr/local/drbd/etc/drbd.d/
  |__drbdadm primary resource_name      升级为主节点
  |__drbdadm secondary resource_name    降级为备节点
  drbdsetup
  drbdmeta
  查看drbd状态,有两种方法:
  servicedrbdstatus
  cat/proc/drbd
工作模式:
  DRBD有三种工作模式告知上层进程写入完成:A异步(异步的传输),B半同步(同步到内存),C同步(同步到对方的磁盘上)
  A模式:主节点接到数据,只保证发送到本地网卡的数据缓冲区(性能最好),即数据一旦写入磁盘并发送到网络中就认为完成了写入操作。
  B模式:主节点接到数据,保证数据发送到从节点缓冲区,且存到了从节点的内核区,但是是否数据存储到从节点的硬盘,则不清楚。即收到接收确认就认为完成了写入操作。
  C模式:主节点接到数据,保证数据发送到从节点缓冲区,同时接到从节点存到从节点硬盘的信息(安全最高)。即收到写入确认就认为完成了写入操作。
  简言之:
  ProtocolA:异步,数据被送到TCP/IP协议缓冲区就宣布复制完成
  ProtocolB:半同步,也称内存同步,数据发送到从节点的内存接收缓冲区
  ProtocolC:同步,数据写到对方的磁盘
  如何解决故障后自动切换
  利用高可用的底层信息通道(如HA的heartbeat或者corosync)+pacemaker进行资源监控,将drbd定义为资源,且drbd资源有主从之分.
  1. 添加附加库:
  官方网站:http://elrepo.org/tiki/tiki-index.php
  以下测试针对Centos 6.7 版本:
  a)import public key:
  #rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
  b)安装库:
  #rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
  2. 安装DRBD:
  DRBD官方网站:http://drbd.linbit.com/docs/install/
  # yum install drbd84 kmod-drbd84-y
  3. 两台服务器上的分区/dev/sdb1作为drbd的网络mirror分区:
  格式化分区
  # fdisk /dev/sdb
  # fdisk -l /dev/sdb
  Disk/dev/sdb: 10.7 GB, 10737418240 bytes
  255heads, 63 sectors/track, 1305 cylinders
  Units= cylinders of 16065 * 512 = 8225280 bytes
  Sectorsize (logical/physical): 512 bytes / 512 bytes
  I/Osize (minimum/optimal): 512 bytes / 512 bytes
  Diskidentifier: 0xbe3466e3
  Device Boot      Start         End      BlocksIdSystem
  /dev/sdb1               1         650    5221093+83Linux #存放数据
  /dev/sdb2             651      1305    5261287+   5Extended
  /dev/sdb5             651      1305    5261256   83Linux#meta分区,存放drbd同步的状态信息
  注意:
  1>、meta分区一定不能格式化建立文件系统(sdb5存放drbd同步的状态信息)
  2>、分好的分区不要进行挂载
  3>、生产环境DRBD meta分区一般可设置为1-2G,数据分区看需求给最大
  4>、在生产环境中两块硬盘一样大
  # mkfs.ext4 /dev/sdb1#只在主机上做
  4.开始配置drbd:
  # modprobe drbd
  注意:不要设置echo'modprobe drbd' >>/etc/rc.loca开机自动加载drbd模块,如果drbd服务是开机自启动的,会先启动drbd服务在加载drbd的顺序,导致drbd启动不了出现的问题.
  主备节点两端配置文件完全一致
  # vi /etc/d
  dbus-1/      depmod.d/      dracut.conf    drbd.conf
  default/       dhcp/          dracut.conf.d/ drbd.d/
  # cat /etc/drbd.conf
  # Youcan find an example in /usr/share/doc/drbd.../drbd.conf.example
  include"drbd.d/global_common.conf";
  include"drbd.d/*.res";
  # vi /etc/drbd.d/mysql.res
  #设定资源名称为: mysql_data
  resourcemysql_data {
  protocol C;
  net {
  cram-hmac-alg sha1;
  shared-secret "abc";
  }
  on dm1 {
  device    /dev/drbd1;
  disk      /dev/sdb1;   #挂载drbd对应的系统分区
  address   10.0.0.61:7788;
  meta-disk /dev/sdb5 ;
  }
  on dm2 {
  device    /dev/drbd1;
  disk      /dev/sdb1;
  address   10.0.0.62:7788;
  meta-disk /dev/sdb5 ;
  }
  }
  5.初始化meta分区:
# drbdadm create-md mysql_data
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.
Success
6. 启动drbd:
# /etc/init.d/drbd start
# chkconfig drbd off
7.初始化设备同步(覆盖备节点,保持数据一致):
# drbdadm -- --overwrite-data-of-peer primary mysql_data#只在主服务器上操作
8. 挂载drbd分区到data数据目录:
# df -h
Filesystem   >/dev/sda3      14G1.5G12G12% /
tmpfs         238M   0 238M   0% /dev/shm
/dev/sda1       190M   52M 129M29% /boot
# mkdir /data
# drbdadm primary all
# mount /dev/drbd1 /data
# df -h
Filesystem   >/dev/sda3      14G1.5G12G12% /
tmpfs         238M   0 238M   0% /dev/shm
/dev/sda1       190M   52M 129M29% /boot
/dev/drbd1      4.8G   10M 4.6G   1% /data
  说明:/data目录为数据库的数据目录
9. 测试DRBD:
正常状态
# cat /proc/drbd
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build bymockbuild@Build64R6, 2016-01-12 13:27:11
1: cs:SyncSourcero:Primary/Secondary ds:UpToDate/Inconsistent C r-----
    ns:4701184 nr:0 dw:0 dr:4701843al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:519912
      [=================>..]sync'ed: 90.2% (504/5096)M
      finish: 0:00:12 speed:42,268 (32,872) K/sec
# cat /proc/drbd
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build bymockbuild@Build64R6, 2016-01-12 13:27:11
1: cs:SyncTargetro:Secondary/Primary ds:Inconsistent/UpToDate C r-----
    ns:0 nr:309640 dw:309640 dr:0al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:4911456
      [>...................]sync'ed:93.20% (4796/5096)M
      finish: 0:05:37 speed:14,552 (11,056) want: 21,240 K/sec
说明:dm1为主节点,dm2为备节点
模拟dm1宕机:
# umount /dev/drbd1
# drbdadm down all
# cat /proc/drbd   
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build bymockbuild@Build64R6, 2016-01-12 13:27:11
1: cs:WFConnectionro:Secondary/Unknown ds:UpToDate/DUnknown C r-----
   ns:0 nr:5221101 dw:5221101 dr:0al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
  # mkdir /data
  # drbdadmprimary all
  # mount/dev/drbd1 /data
  # df -h
  Filesystem   SizeUsed Avail Use% Mounted on
  /dev/sda3       14G1.5G   12G 12% /
  tmpfs          238M   0238M0% /dev/shm
  /dev/sda1      190M   52M129M 29% /boot
  /dev/drbd1   4.8G   10M4.6G1% /data
  说明:dm1宕机后,dm2可以升级为主节点,可挂载drbd分区继续使用
  二、Heartbeat环境搭建
  官方站点:http://linux-ha.org/wiki/Main_Page
  heartbeat可以资源(VIP地址及程序服务)从一台有故障的服务器快速的转移到另一台正常的服务器提供服务,heartbeat和keepalived相似,heartbeat可以实现failover功能,但不能实现对后端的健康检查
  heartbeat和keepalived应用场景及区别:
  很多网友说为什么不使用keepalived而使用长期不更新的heartbeat,下面说一下它们之间的应用场景及区别
  1、对于web,db,负载均衡(lvs,haproxy,nginx)等,heartbeat和keepalived都可以实现
  2、lvs最好和keepalived结合,因为keepalived最初就是为lvs产生的,(heartbeat没有对RS的健康检查功能,heartbeat可以通过ldircetord来进行健康检查的功能)
  3、mysql双主多从,NFS/MFS存储,他们的特点是需要数据同步,这样的业务最好使用heartbeat,因为heartbeat有自带的drbd脚本
  总结:无数据同步的应用程序高可用可选择keepalived,有数据同步的应用程序高可用可选择heartbeat
  # rpm-ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
  Heartbeat具体的安装配置:http://linuxzkq.blog.51cto.com/9379412/1771152
  以下仅提供配置文件供参考:
  vi authkeys #打开下面两项:一共有三种认证方式供选择,第一种是CRC循环冗余校验,第二种是SHA1哈希算法,第三种是MD3哈希算法,其中他们的密码可以任意设置,但是两边密码必须保持一致。
  auth 3
  3 md5 Hello!
  chmod 600 authkeys#给认证文件授权为600
  # cat ha.cf
  debugfile/var/log/ha-debug
  logfile/var/log/ha-log
  logfacility   local0
  keepalive 2
  deadtime 30
  warntime 10
  initdead 120
  udpport 694
  ucast eth1 192.168.3.160
  auto_failbackoff
  node    dm1
  node    dm2
  ping 10.0.0.254
  respawn hacluster/usr/lib64/heartbeat/ipfail
  # cat ha.cf
  debugfile/var/log/ha-debug
  logfile/var/log/ha-log
  logfacility   local0
  keepalive 2
  deadtime 30
  warntime 10
  initdead 120
  udpport 694
  ucast eth1 192.168.3.150
  auto_failbackoff
  node    dm1
  node    dm2
  ping 10.0.0.254
  respawnhacluster/usr/lib64/heartbeat/ipfail
  # vi haresources
  #dm1IPaddr::192.168.0.180/32/eth0 drbddisk::mysql_dataFilesystem::/dev/drbd1::/data::ext4 mysqld
  dm1 IPaddr::192.168.0.180/32/eth0drbd_primary
  说明:
  drbddisk::data
页: [1]
查看完整版本: DRBD+Heartbeat+Mysql 高可用实战