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

[经验分享] Mysql+DRBD+Heartbeat 实现mysql高可用的双击热备(DRBD篇)

[复制链接]

尚未签到

发表于 2019-1-7 11:27:15 | 显示全部楼层 |阅读模式
  DRBD官方tar包下载地址:   http://oss.linbit.com/drbd/
  

  环境介绍:
  

  系统版本:CentOS 6.4 (64位)
  内核版本  2.6.32-358.el6.x86_64
  

  软件版本:drbd-8.4.3.tar.gz
  

  主:10.0.0.1   从:10.0.0.2
  

  两台机器上的hosts都需要修改:
  [root@localhost ~]# vim /etc/hosts
  10.0.0.1    node1
  10.0.0.2    node2
  

  两台服务器双网卡,其中10.0.0.x的网卡用于传输drbd数据,两台服务器网线直连,用做传输心跳线。
  

  

  ****为了方便实验,两台机器都各自加一块15G的硬盘,用过来做DRBD存储盘 (两台机器都需要此操作)
  

  对新添加的硬盘进行分区:
  #fdisk /dev/sdb                                                  //准备为 sdb 建立分区
  

  The number of cylinders for this disk is set to 20805.
  There is nothing wrong with that, but this is larger than 1024,
  and could in certain setups cause problems with:
  1) software that runs at boot time (e.g., old versions of LILO)
  2) booting and partitioning software from other OSs
  (e.g., DOS FDISK, OS/2 FDISK)
  Command (m for help): n                                              //键入 n 表示要建立分区
  Command action
  e   extended
  p   primary partition (1-4)
  p                                                                    //键入 p 表示建立主要分区
  Partition number (1-4): 1                                            //键入 1 为此主要分区代号
  First cylinder (1-20805, default 1):                                 //开始磁柱值,按下 enter 即可
  Using default value 1
  Last cylinder or +size or +sizeM or +sizeK (1-20805, default 20805): //结束磁柱值,按下 enter 即可
  Using default value 20805
  Command (m for help): w                                              //键入 w 表示确定执行刚才设定
  The partition table has been altered!
  Calling ioctl() to re-read partition table.
  Syncing disks.
  

  [root@node1 ~]# partprobe                                  //使刚才的 partition table 变更生效
  ######不需要进行分区格式化!
  

  

  编译安装drbd-8.4.3  :
  

  [root@node1 soft]# tar zxf drbd-8.4.3.tar.gz
  [root@node1 soft]# cd drbd-8.4.3
  [root@node1 soft]# mkdir /usr/local/drbd/
  [root@node1 drbd-8.4.3]# ./configure --prefix=/usr/local/drbd --with-km 注意:--with-km是启用内核模块
  [root@node1 ~]# make KDIR=/usr/src/kernels/2.6.32-358.el6.x86_64/      注意KDIR的路径 (这个内核源码路径需要根据自己的系统修改)
  [root@node1 drbd-8.4.3]# make install
  [root@node1 ~]# mkdir -p /usr/local/drbd/var/run/drbd
  

  配置启动脚本以及开机自启动
  [root@node1 ~]# cp /usr/local/drbd/etc/rc.d/init.d/drbd  /etc/rc.d/init.d/
  [root@node1 ~]# chkconfig --add drbd
  [root@node1 ~]# chkconfig drbd on
  

  拷贝DRBD模块到内核,并加载DRBD模块。
  [root@node1 drbd]# cp drbd.ko /lib/modules/2.6.32-358.el6.x86_64/kernel/lib/
  [root@node1 drbd]# modprobe drbd
  

  查看模块是否加载成功
  [root@node1 drbd]#lsmod |grep drbd
  drbd                  325626  3
  libcrc32c               1246  1 drbd
  

  添加开机自动加载drbd模块
  [root@node1 drbd]#echo "modprobe drbd " >> /etc/rc.local
  

  *********别忘了同样在node2上也进行以上步骤操作****************
  

  ********************************配置DRBD************************************
  [root@node1 ~]# cd /usr/local/drbd/etc/
  [root@node1 etc]# cat drbd.conf
  

  # You can find an example in  /usr/share/doc/drbd.../drbd.conf.example
  

  include "drbd.d/global_common.conf";
  include "drbd.d/*.res";
  

  由此可见:主配置文件里面已经包含了全局配置文件和drbd目录下以.res结尾的文件
  

  修改全局配置文件:                    *****下面是笔者所用配置,为了高效配制成功,请务必保证文件各项配置一致********
  

  [root@node1 etc]# cd drbd.d/
  [root@node1 drbd.d]# cat global_common.conf
  global {
  usage-count no;    #是否参加DRBD使用者统计,默认为yes
  }
  

  common {
  syncer { rate 200M; }   #设置主、备节点同步时的网络速率最大值,单位是字节
  protocol        C;  #使用DRBD的第三种同步协议,表示收到远程主机的写入确认后,认为写入完成
  handlers {
  pri-on-incon-degr "echo o > /proc/sysrq-trigger ; halt -f";
  pri-lost-after-sb "echo o > /proc/sysrq-trigger ; halt -f";
  local-io-error "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";
  }
  

  net {
  cram-hmac-alg   "sha1";
  shared-secret   "MySQL-HA";   #DRBD 同步时使用的验证方式和密码信息
  }
  

  disk {
  on-io-error     detach;       #配置I/O错误处理策略为分离
  #       fencing resource-only;
  }
  

  startup {
  #       wfc-timeout     120;
  #       degr-wfc-timeout    120;
  }
  }
  

  

  修改资源配置文件,默认没有此文件,需要手动创建:    *****下面是笔者所用配置,为了高效配制成功,请务必保证文件各项配置一致********
  [root@node1 ~]# vim /usr/local/drbd/etc/drbd.d/drbd.res
  resource r0 {     #这个r0是定义资源的名字
  on node1 { #每个主机的说明以on开头,后面的名称需要与hostname、uname -n一致,其后的{}中的配置是此主机的配置
  device /dev/drbd0;         #drbd设备名称
  disk    /dev/sdb1;#/dev/drbd0使用的磁盘分区为sdb1
  address         10.0.0.1:7788;      #设置drbd监听地址与端口
  meta-disk       internal;    #DRBD的元数据存放方式
  }
  

  on node2 {
  device  /dev/drbd0;
  disk    /dev/sdb1;
  address         10.0.0.2:7788;
  meta-disk       internal;
  }
  }
  

  ****************************此时,DRBD的配置文件完成!***************************
  

  为了保证配置项一致,将两个配置文件拷贝到node2上:
  

  [root@node1 drbd]#scp etc/drbd.d/global_common.conf etc/drbd.d/drbd.res root@10.0.0.2:/root/
  

  切换到node2 将配置文件放到drbd目录:
  

  [root@node2 ~]#mv drbd.res global_common.conf /usr/local/drbd/etc/drbd.d/
  

  在node1上初始化资源
  [root@node1 ~]# drbdadm create-md r0
  You want me to create a v08 style flexible-size internal meta data block.
  There appears to be a v08 flexible-size internal meta data block
  already in place on /dev/sdb1 at byte offset 16105058304
  Do you really want to overwrite the existing v08 meta-data?
  [need to type 'yes' to confirm] yes
  

  Writing meta data...
  initializing activity log
  NOT initializing bitmap
  New drbd meta data block successfully created.
  

  同样,在node2上初始化资源
  [root@node2 ~]# drbdadm create-md r0
  

  ***注意:如果初始化资源报错:
  

  Command 'drbdmeta 0 v08 /dev/sdb1 internal create-md' terminated with exit code 40
  这是因为sdb1已经有文件系统了,已经有数据存在了(进行下面的操作前,请保证/dev/sdb1里的数据是否备份)
  解决方法:
  [root@node1 ~]# dd if=/dev/zero bs=1M count=1 of=/dev/sdb1  ***注意,此处就是/dev/sdb1此硬盘,而不是他的挂载目录
  

  请务必在两台服务器上同时启动服务:
  

  [root@node1 ~]# service drbd start
  Starting DRBD resources: [
  create res: r0
  prepare disk: r0
  adjust disk: r0
  adjust net: r0
  ]
  ......
  [root@node2 ~]# service drbd start
  

  查看drbd监听端口:
  [root@node2 ~]# netstat -anptul |grep 7788
  tcp        0      0 10.0.0.2:50569              10.0.0.1:7788               ESTABLISHED -
  tcp        0      0 10.0.0.2:7788               10.0.0.1:39663              ESTABLISHED -
  

  ********************************设置DRBD主、备节点***************************************
  

  注意:第一次启动drbd时,两个drbd节点默认都处于Secondary状态:
  

  [root@node1 ~]# drbdadm role r0         #查看r0主、备节点的命令
  Secondary/Secondary
  

  由于默认没有主备节点之分,因而需要设置两个主机的主备节点,选择需要设置为主节点的主机,然后执行如下命令:
  

  [root@node1 ~]# drbdadm -- --overwrite-data-of-peer primary all
  

  第一次执行完此命令后,在后面如果需要设置哪个是主节点时,就可以使用另外一个命令:
  

  drbdadm primary all
  

  查看资源的连接状态:
  

  [root@node1 ~]# drbdadm cstate r0
  SyncSource
  

  资源连接状态可能有以下状态中的一种:
  

  StandAlone 独立的:网络配置不可用;资源还没有被连接或是被管理断开(使用 drbdadm disconnect 命令),或是由于出现认证失败或是脑裂的情况
  Disconnecting 断开:断开只是临时状态,下一个状态是StandAlone独立的
  Unconnected 悬空:是尝试连接前的临时状态,可能下一个状态为WFconnection和WFReportParams
  Timeout 超时:与对等节点连接超时,也是临时状态,下一个状态为Unconected悬空
  BrokerPipe:与对等节点连接丢失,也是临时状态,下一个状态为Unconected悬空
  NetworkFailure:与对等节点推动连接后的临时状态,下一个状态为Unconected悬空
  ProtocolError:与对等节点推动连接后的临时状态,下一个状态为Unconected悬空
  TearDown 拆解:临时状态,对等节点关闭,下一个状态为Unconected悬空
  WFConnection:等待和对等节点建立网络连接
  WFReportParams:已经建立TCP连接,本节点等待从对等节点传来的第一个网络包
  Connected 连接:DRBD已经建立连接,数据镜像现在可用,节点处于正常状态
  StartingSyncS:完全同步,有管理员发起的刚刚开始同步,未来可能的状态为SyncSource或PausedSyncS
  StartingSyncT:完全同步,有管理员发起的刚刚开始同步,下一状态为WFSyncUUID
  WFBitMapS:部分同步刚刚开始,下一步可能的状态为SyncSource或PausedSyncS
  WFBitMapT:部分同步刚刚开始,下一步可能的状态为WFSyncUUID
  WFSyncUUID:同步即将开始,下一步可能的状态为SyncTarget或PausedSyncT
  SyncSource:以本节点为同步源的同步正在进行
  SyncTarget:以本节点为同步目标的同步正在进行
  PausedSyncS:以本地节点是一个持续同步的源,但是目前同步已经暂停,可能是因为另外一个同步正在进行或是使用命令(drbdadm pause-sync)暂停了同步
  PausedSyncT:以本地节点为持续同步的目标,但是目前同步已经暂停,这可以是因为另外一个同步正在进行或是使用命令(drbdadm pause-sync)暂停了同步
  VerifyS:以本地节点为验证源的线上设备验证正在执行
  VerifyT:以本地节点为验证目标的线上设备验证正在执行
  

  查看资源角色的命令:
  

  [root@node1 ~]# drbdadm role r0
  

  Primary/Secondary (在前面为当前节点)
  

  Parimary 主:资源目前为主,并且可能正在被读取或写入,如果不是双主只会出现在两个节点中的其中一个节点上
  Secondary 备:资源目前为备,正常接收对等节点的更新
  Unknown 未知:资源角色目前未知,本地的资源不会出现这种状态
  

  

  查看硬盘状态:
  

  [root@node1 ~]# drbdadm dstate r0
  

  UpToDate/UpToDate
  

  本地和对等节点的硬盘有可能为下列状态之一:
  Diskless 无盘:本地没有块设备分配给DRBD使用,这表示没有可用的设备,或者使用drbdadm命令手工分离或是底层的I/O错误导致自动分离
  Attaching:读取无数据时候的瞬间状态
  Failed 失败:本地块设备报告I/O错误的下一个状态,其下一个状态为Diskless无盘
  Negotiating:在已经连接的DRBD设置进行Attach读取无数据前的瞬间状态
  Inconsistent:数据是不一致的,在两个节点上(初始的完全同步前)这种状态出现后立即创建一个新的资源。此外,在同步期间(同步目标)在一个节点上出现这种状态
  Outdated:数据资源是一致的,但是已经过时
  DUnknown:当对等节点网络连接不可用时出现这种状态
  Consistent:一个没有连接的节点数据一致,当建立连接时,它决定数据是UpToDate或是Outdated
  UpToDate:一致的最新的数据状态,这个状态为正常状态
  

  

  查看同步进度:
  

  [root@node1 ~]# cat /proc/drbd
  version: 8.4.3 (api:1/proto:86-101)
  GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@node2, 2014-06-09 15:12:58
  0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
  ns:24 nr:16108076 dw:16108100 dr:1017 al:2 bm:960 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
  
  【注】:
  从输出的”ds“ 信息得知,磁盘状态都是“UpToDate”,表示数据同步已经完成了
  ro是角色信息,Primary/Secondary 说明了当前主机是primary主节点,另一台是secondary备节点
  ds是磁盘状态,显示数据是否一致,(如果显示UpToDate/UpToDate 表明同步没有延时)
  ns是网络发送的数据包,以K字节计算
  dw是磁盘写信息
  dr是磁盘读信息
  

  **************************最后一步,挂载drbd0设备**************************
  

  注意:
  *****挂载DRBD分区之前,首先需要确认当前主机的DRBD分区是Primary状态,可以从"/cat/proc/drbd" 命令中查询到
  

  [root@node1 ~]# cat /proc/drbd |grep ro
  version: 8.4.3 (api:1/proto:86-101)
  GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@node2, 2014-06-09 15:12:58
  0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
  *****处于主状态的主机,才能进行挂载*****
  

  格式化文件系统(文件格式根据自己的系统环境选择)
  

  !!!!!!注意:只格式化主节点的/dev/drbd0!!!!
  

  [root@node1 ~]# mkfs.ext4 /dev/drbd0
  

  挂载此文件系统
  [root@node1 ~]# mkdir /data
  [root@node1 ~]# mount /dev/drbd0  /data/
  [root@node1 ~]# df -Th
  文件系统    类型      容量  已用  可用 已用%% 挂载点
  /dev/sda3     ext4     11G  3.5G  6.9G  34% /
  tmpfs        tmpfs    499M     0  499M   0% /dev/shm
  /dev/sda1     ext4    2.0G   68M  1.9G   4% /tmp
  /dev/drbd0    ext4     15G  166M   14G   2% /data
  

  **************************此时,DRBD的配置已经完成!***************************
  

  

  **************************测试验证***********************************************
  

  命题:在挂载的data目录中创建一个测试文件,然后卸载挂载目录,然后切换主备节点,在备用节点上查看刚刚建立的测试文件还是否存在
  

  [root@node1 ~]# touch /data/test
  [root@node1 ~]# umount /data/
  

  然后将node1变为备用节点:
  

  [root@node1 ~]# drbdadm secondary r0
  

  [root@node1 ~]# drbdadm role r0
  Secondary/Secondary
  

  DRBD执行角色切换前,需要在主节点执行 umount 命令, 去掉对DRBD设备的挂载,然后在另一台主机上将DRBD的角色修改为”Primary“,最后再进行挂载
  

  接着在node2上进行操作:
  

  [root@node2 ~]# drbdadm primary all
  [root@node2 ~]# mount /dev/drbd0  /data
  

  查看文件是否存在:
  [root@node2 ~]# ls /data/
  lost+found  test
  

  ******************************此时表明DRBD配置已成功!!!**************************
  

  





运维网声明 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-660309-1-1.html 上篇帖子: 搭建heartbeat运行后发现nginx及VIP不能正常启动 下篇帖子: 利用心跳heartbeat实现三台主机自动切换网络参数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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