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

[经验分享] Centos5.6 x86下部署安装DRBD+Heartbeat+MySQL

[复制链接]
发表于 2015-9-5 13:05:19 | 显示全部楼层 |阅读模式
服务器平台是Dell R410,系统采用的Centos5.6 x86_64,系统盘采用的是Raid1,然后单独拿了一块SAS 500G的硬盘出来准备给DRBD系统用, 这里没有采用单独分区的做法,这是因为在测试中我们发现,单独分区做为DRBD系统使用时,经常有如下报错(以下数据采集来自于实验环境)。特与大家分享。
AD:


  
  【51CTO独家特稿】报错信息如下所示:

  • Operation refused.
  • Command 'drbdmeta 0 v08 /dev/sda2 internal create-md' terminated with exit code 40
  • drbdadm create-md r0: exited with code 40
  这个时候我们需要使用dd命令覆盖文件系统中的设备块信息,如下所示:

  • dd if=/dev/zero of=/dev/sda2 bs=1M count=128
  这个时候请一定要注意dd命令要清除的分区信息,不要搞错了,不然很容易将系统损坏,我第一次实验时就遇到了这个问题;如果部署DRBD时的分区信息是不需要写进/etc/fstab表的,即不需要在安装系统时就挂载,不然重启系统时很容易发生Emergency信息,签于以上情况,所以我这里建议大家还是用独立硬盘作为DRBD的设备。
  两台机器的基本情况如下所示:
  centos1.cn7788.com 192.168.11.32
  centos2.cn7788.com 192.168.11.33
  Heartbeat的vip为 192.168.11.30
  两台机器的hosts文件内容如下所示:
  192.168.11.32 centos1.cn7788.com centos1
  192.168.11.33 centos2.cn7788.com centos2
  实验中暂时先用千M交换机的网络作为心跳线线路,等实验搭建成功后再考虑加双绞线作为心跳线,两台机器的hostname及ntp对时这些在实验前就应该配置好,iptables和SElinux关闭,具体情况略过。
  一、DRBD的部署安装
  两台机器分别用如下命令来安装drbd软件,如下所示:

  • yum -y install drbd83 kmod-drbd83
  • modprobe drbd
  • lsmod | grep drbd
  正确显示如下类似信息,表示DRBD已成功安装:

  • drbd                  300440  4
  两台机器的drbd.conf配置文件内容如下所示(两台机器的配置是一样的):

  • cat  /etc/drbd.conf                  
  • global {
  • # minor-count dialog-refresh disable-ip-verification
  • usage-count no;         #统计drbd的使用
  • }
  • common {
  • syncer  { rate 30M; }    #同步速率,视带宽而定
  • }
  • resource r0 {           #创建一个资源,名字叫”r0”
  • protocol C;             #选择的是drbd的C 协议(数据同步协议,C为收到数据并写入后返回,确认成功)
  • handlers {              #默认drbd的库文件
  • 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;      
  • }
  • disk {
  • # on-io-error fencing use-bmbv no-disk-barrier no-disk-flushes
  • # no-disk-drain no-md-flushes max-bio-bvecs
  • on-io-error detach;
  • }
  • net {
  • # sndbuf-size rcvbuf-size timeout connect-int ping-int ping-timeout max-buffers
  • # max-epoch-size ko-count allow-two-primaries cram-hmac-alg shared-secret
  • # after-sb-0pri after-sb-1pri after-sb-2pri data-integrity-alg no-tcp-cork
  • max-buffers 2048;
  • cram-hmac-alg "sha1";
  • shared-secret "123456";
  • #DRBD同步时使用的验证方式和密码信息
  • #allow-two-primaries;
  • }
  • syncer {
  • rate 100M;
  • # rate after al-extents use-rle cpu-mask verify-alg csums-alg
  • }
  • on centos1.cn7788.com {  #设定一个节点,分别以各自的主机名命名
  • device  /dev/drbd0;     #设定资源设备/dev/drbd0 指向实际的物理分区 /dev/sdb
  • disk    /dev/sdb;
  • address 192.168.11.32:7788;  #设定监听地址以及端口
  • meta-disk       internal;
  • }
  • on centos2.cn7788.com {          #设定一个节点,分别以各自的主机名命名
  • device  /dev/drbd0; #设定资源设备/dev/drbd0 指向实际的物理分区 /dev/sdb
  • disk    /dev/sdb;
  • address 192.168.11.33:7788;       #设定监听地址以及端口
  • meta-disk       internal;         #internal表示是在同一个局域网内
  • }
  • }
  1.创建DRBD元数据信息,执行命令如下所示(两台机器都需要执行此步):

  • [iyunv@centos1 ~]# drbdadm create-md r0
  • md_offset 8589930496
  • al_offset 8589897728
  • bm_offset 8589635584
  • Found some data
  • ==> This might destroy existing data! <==
  • Do you want to proceed?
  • [need to type 'yes' to confirm] yes
  • Writing meta data...
  • initializing activity log
  • NOT initialized bitmap
  • New drbd meta data block successfully created.
  • [iyunv@centos2 ~]# drbdadm create-md r0
  • md_offset 8589930496
  • al_offset 8589897728
  • bm_offset 8589635584
  • Found some data
  • ==> This might destroy existing data! <==
  • Do you want to proceed?
  • [need to type 'yes' to confirm] yes
  • Writing meta data...
  • initializing activity log
  • NOT initialized bitmap
  • New drbd meta data block successfully created.
  2.启动DRBD设备,两台机器上分别执行如下命令:

  • service drbd start  
  3.在centos1的机器上我们查看DRBD状态,命令如下所示:

  • [iyunv@centos1 ~]# service drbd status
  • drbd driver loaded OK; device status:
  • version: 8.3.13 (api:88/proto:86-96)
  • GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by mockbuild@builder10.centos.org, 2012-05-07 11:56:36
  • m:res  cs         ro                   ds                         p  mounted  fstype
  • 0:r0   Connected  Secondary/Secondary  Inconsistent/Inconsistent  C
  4.将centos1的机器作为DRBD的Primary机器,命令如下所示:

  • [iyunv@centos1 ~]# drbdsetup /dev/drbd0 primary -o  
  • [iyunv@centos1 ~]# drbdadm primary r0
  然后我们再查看其状态,命令如下所示:

  • [iyunv@centos1 ~]# service drbd status
  • drbd driver loaded OK; device status:
  • version: 8.3.13 (api:88/proto:86-96)
  • GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by mockbuild@builder10.centos.org, 2012-05-07 11:56:36
  • m:res  cs          ro                 ds                     p  mounted  fstype
  • ...    sync'ed:    3.9%               (7876/8188)M
  • 0:r0   SyncSource  Primary/Secondary  UpToDate/Inconsistent  C
  我们发现,Primary/Secondary关系已形成,而且数据在进行同步,已同步了3.9%,我们稍为等待段时间,再查看Primary机器的DRBD状态,如下所示:

  • [iyunv@centos1 ~]# service drbd status
  • drbd driver loaded OK; device status:
  • version: 8.3.13 (api:88/proto:86-96)
  • GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by mockbuild@builder10.centos.org, 2012-05-07 11:56:36
  • m:res  cs         ro                 ds                 p  mounted  fstype
  • 0:r0   Connected  Primary/Secondary  UpToDate/UpToDate  C
  UpToDate/UpToDate表示数据已经同步完成了。
  5.在两台机器上都建立/drbd分区,准备将其作为MySQL的挂载目录,命令如下所示:

  • mkdir /drbd
  6.格式化Primary机器的DRBD分区并挂载使用。

  • mkfs.ext3 /dev/drbd0  
  • mount /dev/drbd0 /drbd/
  注:Secondary节点上是不允许对DRBD设备进行任何操作,包括只读,所以的读写操作都只能在Primary节点上进行,只有当Primary节点挂掉时,Secondary代替主节点作为Primary节点时才能进行读写操作。
  7.两台机器都将DRBD设为自启动服务,命令如下:
  chkconfig drbd on
  二、Heartbeat的安装和部署
  1.两台机器上分别用yum来安装heartbeat,如下命令操作二次:

  • yum -y install heartbeat
  如果你只操作一次,你会惊奇的发现,heartbeat第一次时并没有安装成功。
  2.两个节点的heartbeat配置文件,分别如下所示:
  centos1.cn7788.com的配置文件:

  • logfile /var/log/ha-log
  • #定义Heartbeat的日志名字及位置
  • logfacility local0
  • keepalive 2
  • #设定心跳(监测)时间为2秒
  • deadtime 15
  • #设定死亡时间为15秒
  • ucast eth0 192.168.11.33
  • #采用单播的方式,IP地址指定为对方IP
  • auto_failback off
  • #当Primary机器发生故障切换到Secondary机器后不再进行切回操作
  • node centos1.cn7788.com centos2.cn7788.com
  centos2.cn7788.com的配置文件:

  • logfile /var/log/ha-log
  • logfacility local0
  • keepalive 2
  • deadtime 15
  • ucast eth0 192.168.11.32
  • auto_failback off
  • node centos1.cn7788.com centos2.cn7788.com
  3.编辑双机互连验证文件authkeys,如下所示:

  • cat /etc/ha.d/authkeys
  • auth 1
  • 1 crc  
  需要将此文件设定为600权限,不然启动heartbeat服务时会报错,命令如下所示:

  • chmod 600 /etc/ha.d/authkeys
  4.编辑集群资源文件/etc/ha.d/haresource

  • centos1.rogrand.com IPaddr::192.168.11.30/24/eth0 drbddisk::r0 Filesystem::/dev/drbd0::/drbd::ext3  mysqld
  这个文件在两台机器上都是一样的,这个就不要轻易改动了。
  mysqld为mysql服务器启动、重启及关闭脚本,这个是安装MySQL自带的,我们等会会在安装MySQL提到此步。
  
  三、源码编译安装mysql5.1.47并部署haresource
  1.在MySQL官方网站上下载mysql5.1.47的源码包,在两台机器上分别安装,具体步骤如下所示:
  安装gcc等基础库文件

  • yum install gcc gcc-c++ zlib-devel libtool ncurses-devel libxml2-devel
  生成mysql用户及用户组

  • groupadd mysql
  • useradd -g mysql mysql
  源码编译安装mysql5.1.47

  • tar zxvf mysql-5.1.47.tar.gz
  • cd mysql-5.1.47
  • ./configure --prefix=/usr/local/mysql --with-charset=utf8 --with-extra-charsets=all --enable-thread-safe-client --enable-assembler --with-readline --with-big-tables --with-plugins=all  --with-mysqld-ldflags=-all-static --with-client-ldflags=-all-static
  • make
  • make install
  2.对mysql进行权限配置,使其能顺利启动。

  • cd /usr/local/mysql
  • cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf
  • cp /usr/local/mysql/share/mysql/mysql.server /etc/init.d/mysqld
  • cp /usr/local/mysql/share/mysql/mysql.server /etc/ha.d/resource.d/mysqld
  • chmod +x /etc/init.d/mysqld  
  • chmod +x /etc/ha.d/resource.d/mysqld
  • chown -R mysql:mysql /usr/local/mysql  
  3.两台机器上的/etc/my.cnf的[mysqld]项下面重新配置下mysql运行时的数据存放路径

  • datadir=/drbd/data
  4.在Primary机器上运行如下命令,使其数据库目录生成数据,Secondary机器不需要运行此步。

  • /usr/local/mysql/bin/mysql_install_db --user=mysql --datadir=/drbd/data
  注意:这里是整个实验环境的一个重要环节,我起初在搭建此步时出过几次问题,我们运行MySQL是在启动DRBD设备之后,即正确将/dev/drbd0目录正确挂载到/drbd目录,而并非没挂载就去启动MySQL,这会导致整个实验完全失败,大家做到此步时请注意。做完这步以后,我们不需要启动MySQL,它可以靠脚本来启动,如果已经启动了MySQL请手动关闭。
  四、在两台机器上将DRBD和Heartbeat都设成自启动方式
  service drbd start
  chkcfonig drbd on
  service heartbeat start
  chkconfig heartbeat on
  通过观察Primary机器上的信息,我们得知,Primary机器已经正确启动了MySQL和Heartbaet了,信息如下所示:

  • [iyunv@centos1 data]# ip addr  
  • 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue  
  •     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  •     inet 127.0.0.1/8 scope host lo
  • 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
  •     link/ether 00:0c:29:48:2e:9f brd ff:ff:ff:ff:ff:ff
  •     inet 192.168.11.32/24 brd 192.168.11.255 scope global eth0
  •     inet 192.168.11.30/24 brd 192.168.11.255 scope global secondary eth0:0
  通过查看到3306端口被占用情况,我们得知mysql服务已被正常开启。

  • [iyunv@centos1 data]# lsof -i:3306
  • COMMAND  PID  USER   FD   TYPE DEVICE SIZE NODE NAME
  • mysqld  4341 mysql   18u  IPv4   9807       TCP *:mysql (LISTEN)
  五、其余的工作其实就比较好测试了,我们主要是模拟Primary机器重启或死机时,看Secondary机器能不能自动接管过来并启动MySQL,我们重启Primary机器后在Secondary机器上观察,命令如下所示:

  • IPaddr[3050]:   2012/09/04_09:51:24 INFO:  Resource is stopped
  • ResourceManager[3023]:  2012/09/04_09:51:24 info: Running /etc/ha.d/resource.d/IPaddr 192.168.11.30/24/eth0 start
  • IPaddr[3149]:   2012/09/04_09:51:25 INFO: Using calculated netmask for 192.168.11.30: 255.255.255.0
  • IPaddr[3149]:   2012/09/04_09:51:26 INFO: eval ifconfig eth0:0 192.168.11.30 netmask 255.255.255.0 broadcast 192.168.11.255
  • IPaddr[3119]:   2012/09/04_09:51:26 INFO:  Success
  • heartbeat[2842]: 2012/09/04_09:51:26 WARN: Late heartbeat: Node centos1.rogrand.com: interval 3510 ms
  • ResourceManager[3023]:  2012/09/04_09:51:26 info: Running /etc/ha.d/resource.d/drbddisk r0 start
  • Filesystem[3300]:   2012/09/04_09:51:27 INFO:  Resource is stopped
  • ResourceManager[3023]:  2012/09/04_09:51:27 info: Running /etc/ha.d/resource.d/Filesystem /dev/drbd0 /drbd ext3 start
  • Filesystem[3382]:   2012/09/04_09:51:28 INFO: Running start for /dev/drbd0 on /drbd
  • Filesystem[3370]:   2012/09/04_09:51:28 INFO:  Success
  • ResourceManager[3023]:  2012/09/04_09:51:29 info: Running /etc/ha.d/resource.d/mysqld  start
  • mach_down[2997]:    2012/09/04_09:51:31 info: /usr/share/heartbeat/mach_down: nice_failback: foreign resources acquired
  • mach_down[2997]:    2012/09/04_09:51:31 info: mach_down takeover complete for node centos1.rogrand.com.
  • heartbeat[2842]: 2012/09/04_09:51:31 info: mach_down takeover complete.
  • heartbeat[2842]: 2012/09/04_09:51:32 WARN: node centos1.rogrand.com: is dead
  • heartbeat[2842]: 2012/09/04_09:51:32 info: Dead node centos1.rogrand.com gave up resources.
  • heartbeat[2842]: 2012/09/04_09:51:35 info: Link centos1.rogrand.com:eth0 dead.
  稍等片刻我们会发现,Secondary机器会自动接管VIP,并启动MySQL服务,如下所示:

  • [iyunv@centos2 data]# ip addr  
  • 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue  
  •     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  •     inet 127.0.0.1/8 scope host lo
  • 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
  •     link/ether 00:0c:29:34:ee:af brd ff:ff:ff:ff:ff:ff
  •     inet 192.168.11.33/24 brd 192.168.11.255 scope global eth0
  • inet 192.168.11.30/24 brd 192.168.11.255 scope global secondary eth0:0
  实施整个过程需要注意有以下几点:
  一、Secondary主机用来做DRBD的硬盘可以跟Primar主机的不一样大小,但请不要小于Primary主机,以免发生数据丢失的现象;
  二、服务器网卡及交换机我都推荐千M系列的,在测试中发现其同步速率介于100M-200M之间,这里采用官方的建议,以最小值的30%带宽来设置rate速率,即100M*30%,大家也可根据自己的实际网络环境来设定此值;
  三、DRBD对网络环境要求很高,建议用单独的双绞线来作为二台主机之间的心跳线,如果条件允许,可以考虑用二根以上的心跳线;如果这个环节做得好,基本上脑裂的问题是不存在的。其实整个实验初期都可以在同一网络下实现,后期再加心跳线也是可行的。
  四、安装Heartbeat时需要安装二遍,即yum -y install heartbeat要执行二次;
  五、建议不要用根分区作为MySQL的datadir,不然你show database时会发现会出现名为#mysql50#lost+found的数据库,这也是我将MySQL的数据库目录设置成/drbd/data的原因。
  六、就算发生脑裂的问题,DRBD也不会丢失数据的,手动解决就是;正因为DRBD可靠,MySQL也推荐将其作为MySQL实现高可用方案之一。
  七、MySQL的DRBD此方案不能达到毫秒级的切换速度,MyISAM引擎的表在系统宕机后需要很长的修复时间,而且也有可能发生表损坏的情况,建议大家将所有除了系统表之外的所有表引擎改为InnoDB引擎。
  作者微博:weibo.com/yuhongchun027
  作者博客:andrewyu.blog.iyunv.com
  【编辑推荐】

  • MySQL源码学习:MDL字典锁
  • MySQL Cluster开发环境简明部署
  • MySQL的四种不同查询的分析
  • MySQL的四种不同查询的分析
  • 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-109755-1-1.html 上篇帖子: Heartbeat+DRBD实现MySQL高可用性 下篇帖子: Linux Enterprise Cluster NOtes
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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