MySQL+DRBD+hearbeat

回复 收藏
本帖最后由 starry 于 2016-3-5 21:59 编辑

DRBD安装

概念:

DRBD安装配置、工作原理及故障恢复 http://www.linuxidc.com/Linux/2013-09/90321.htm

DRBD分布式复制块设备(Distributed Replicated Block Device) ,类型网络RAID-1,是由内核模块和相关脚本构成,它允许用户在远程机器上建立一个本地磁盘的实时镜像,其原理是以网络的方式将本地设备上的内容同步到另一个节点设备上。

DRBD 9 beta 发布,支持多节点高可用性。

DRBD的三个同步协议:


  • A:异步复制协议,一旦本地磁盘写入已经完成,数据包已在发送队列中,则写被认为是完成的。
  • B:内存同步(半同步)复制协议,一旦本地磁盘写入已完成,且复制数据包达到了对等节点,则认为写在主节点上被认为是完成的。
  • C:同步复制协议,只有在本地和远程节点的磁盘已经确认了写操作完成,则写才被认为完成。

DRBD的三个进程:


  • drbd0--worker: 主进程
  • drbd0--asender: primary上drbd0的数据发送进程
  • drbd0--receiver: secondary上drbd0的数据接受进程

工作原理图
clipboard.png


实验环境:

CentOS-1:192.168.1.111(eth1)

CentOS-2:192.168.1.112
(eth1)

安装:

添加一块新硬盘分区,2个节点的分区大小应该一致

# fdisk /dev/sdb
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-261, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-261, default 261):
Using default value 261
Command (m for help): w
The partition table has been altered!
# partx /dev/sda
让内核重新读取分区
查看内核有没有识别分区,如果没有需要重新启动


# cat /proc/partitions
major minor  #blocks  name

   8        0   20971520 sda
   8        1     102400 sda1
   8        2    2048000 sda2
   8        3   18820096 sda3
   8       16    2097152 sdb
   8       17    2096451 sdb1



更改hosts文件

# cat>>/etc/hosts< 192.168.1.111 CentOS-1

> 192.168.1.112 CentOS-2

> EOF


首先需要升级内核版本

# yum install -y kernel kernel-devel kernel-headers gcc flex libxslt

# reboot    重启

去官网下载源码包http://oss.linbit.com/drbd/

# cd /usr/local/src/

# wget http://oss.linbit.com/drbd/8.4/drbd-8.4.3.tar.gz

# tar -zxvf drbd-8.4.6.tar.gz

# cd drbd-8.4.3

# ./configure --prefix=/usr/local/drbd --with-km      # --prefix是制定安装路径,--with-km是启用内核模块;

# make KDIR=/usr/src/kernels/2.6.32-573.el6.i686/     # KDIR指的是自己的内核路径;

# make install

# mkdir -p /usr/local/drbd/var/run/drbd     # 这里必须创建则这个目录, 不然启动会报错;

# cp /usr/local/drbd/etc/rc.d/init.d/drbd  /etc/rc.d/init.d/ #将drbd拷贝到/etc/init.d/目录下;

# chkconfig --add drbd
# chkconfig drbd on
# cd drbd
# make clean
# make KDIR=/usr/src/kernels/2.6.32-573.el6.i686/ #安装drbd模块;
# cp drbd.ko /lib/modules/2.6.32-573.el6.i686/kernel/lib/

# modprobe drbd    #加载内核模块

# lsmod | grep drbd
drbd                  325389  0
libcrc32c                841  1 drbd
配置




[
root@CentOS-1
drbd.d]
# cd /usr/local/drbd/etc/drbd.d/


[
root@CentOS-1
drbd.d]
# vim global_common.conf

global {
    usage-count no;    #是否参加DRBD使用统计,默认为yes
    # minor-count dialog-refresh disable-ip-verification
}

common {
    protocol C;    #使用DRBD的同步协议
    handlers {
        # These are EXAMPLE handlers only.
        # They may have severe implications,
        # like hard resetting the node under certain circumstances.
        # Be careful when chosing your poison.

        # 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
    }

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

    disk {
        on-io-error detach;    配置io出错后的处理策略
        # size max-bio-bvecs on-io-error fencing disk-barrier disk-flushes
        # disk-drain md-flushes resync-rate resync-after al-extents
                # c-plan-ahead c-delay-target c-fill-target c-max-rate
                # c-min-rate disk-timeout
    }

    net {
        cram-hmac-alg "sha1";    #设置加密算法
        shared-secret "123456";    #设置验证口令
        # protocol timeout max-epoch-size max-buffers unplug-watermark
        # connect-int ping-int sndbuf-size rcvbuf-size ko-count
        # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri
        # after-sb-1pri after-sb-2pri always-asbp rr-conflict
        # ping-timeout data-integrity-alg tcp-cork on-congestion
        # congestion-fill congestion-extents csums-alg verify-alg
        # use-rle
    }
    syncer {
            rate 40M;    #设置主备节点同步时的网络速率
    }
}
注释: on-io-error 策略可能为以下选项之一

detach 分离:这是默认和推荐的选项,如果在节点上发生底层的硬盘I/O错误,它会将设备运行在Diskless无盘模式下

pass_on:DRBD会将I/O错误报告到上层,在主节点上,它会将其报告给挂载的文件系统,但是在此节点上就往往忽略(因此此节点上没有可以报告的上层)

local-in-error:调用本地磁盘I/O处理程序定义的命令;这需要有相应的local-io-error调用的资源处理程序处理错误的命令;这就给管理员有足够自由的权力命令命令或是脚本调用local-io-error处理I/O错误


添加资源文件

[
root@CentOS-1
drbd.d]
# vim mysql.res

resource mysql {
  on CentOS-1 {    #DRBD节点主机名
    device    /dev/drbd1;    #DRBD设备名称
    disk      /dev/sdb1;    映射的分区
    address  192.168.1.111:7789; #设置DRBD监听地址与端口
    meta-disk internal;
  }
  on CentOS-2 {
    device    /dev/drbd1;
    disk      /dev/sdb1;
    address  192.168.1.112:7789;
    meta-disk internal;
  }
}
拷贝配置文件

[root@CentOS-1 drbd.d]# scp mysql.res global_common.conf 192.168.1.112:/usr/local/drbd/etc/drbd.d/
root@192.168.1.112's password:
mysql.res                                                               100%  330     0.3KB/s   00:00   
global_common.conf                                                      100% 1953     1.9KB/s   00:00   


初始化资源并启动服务

[
root@CentOS-1
drbd.d]
# drbdadm create-md mysql

Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
[
root@CentOS-1
drbd.d]
# /etc/init.d/drbd start

Starting DRBD resources: [
     create res: mysql
   prepare disk: mysql
    adjust disk: mysql
     adjust net: mysql
]
[
root@CentOS-1
drbd.d]
# netstat -an|grep 7789   # 查看监听的地址和端口

tcp        0      0 192.168.1.112:53739         192.168.1.111:7789          ESTABLISHED
tcp        0      0 192.168.1.112:7789          192.168.1.111:57520         ESTABLISHED

[
root@CentOS-1
drbd.d]
# cat /proc/drbd    #查看服务状态

version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@CentOS-1, 2016-03-05 17:01:40
1: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:2096348
cs:资源连接状态    ro:资源角色(自己/对方)    ds:银盘状态
(自己/对方)



手动启用和禁用资源
drbdadm up  
drbdadm down  
注释:
resource:为资源名称;当然也可以使用all表示[停用|启用]所有资源
升级和降级资源角色
drbdadm primary  
drbdadm secondary

[
root@CentOS-1
drbd.d]
# drbdadm -- --overwrite-data-of-peer primary mysql    #
初始化设备同步


[
root@CentOS-1
drbd.d]
# cat /proc/drbd    #查看同步进度

version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@CentOS-1, 2016-03-05 17:01:40
1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
    ns:435428 nr:0 dw:0 dr:436092 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:1660920
    [===>................] sync'ed: 20.9% (1660920/2096348)K
    finish: 0:01:08 speed: 24,188 (24,188) K/sec

[
root@CentOS-1
drbd.d]
# cat /proc/drbd

version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@CentOS-1, 2016-03-05 17:01:40
1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:2096348 nr:0 dw:0 dr:2097012 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
创建文件系统


文件系统只能挂载在主(Primary)节点上,因此在设置好主节点后才可以对DRBD设备进行格式化操作

[
root@CentOS-1
drbd.d]
# mkfs.ext4 /dev/drbd1


[
root@CentOS-1
drbd.d]
# mkdir -p /data/mysql

[
root@CentOS-1
drbd.d]
# mount /dev/drbd1 /data/mysql/

测试

[
root@CentOS-1
drbd.d]
# dd if=/dev/zero of=/data/mysql/tt bs=1024K count=100


切换主备节点

[
root@CentOS-1
drbd.d]
# umount /dev/drbd1


[
root@CentOS-1
drbd.d]
# drbdadm secondary mysql


[root@CentOS-2 ~]# drbdadm primary mysql

[root@CentOS-2 ~]# mkdir -p /data/mysql

[root@CentOS-2 ~]# mount /dev/drbd1 /data/mysql/

[root@CentOS-2 ~]# ll /data/mysql/

总用量 102416

drwx------ 2 root root     16384 3月   5 18:20 lost+found

-rw-r--r-- 1 root root 104857600 3月   5 18:28 tt

=================================================

DRBD脑裂故障解决方式:

当DRBD出现脑裂后,会导致drbd两边的磁盘不一致,处理方法如下:

如果在确定要将CentOS-2作为从节点,切换成secondary,并放弃该资源的数据时,执行一下操作:

卸载从节点上的设备,资源角色降级,重新连接资源,主节点上重新建立连接资源

[root@CentOS-2 ~]
# umount /mnt/

[root@CentOS-2 ~]
# drbdadm secondary mysql

[root@CentOS-2 ~]
# drbdadm connect --discard-my-data mysql

[root@CentOS-1 ~]
# drbdadm connect drbd

=================================================



MySQL安装

首先使用命令uname –i查看系统位数,然后选择相应mysql免编译安装包进行下载。
# cd /usr/local/src
# wget http://mirrors.sohu.com/mysql/MySQL-5.1/mysql-5.1.73-linux-i686-glibc23.tar.gz
# tar -xzvf mysql-5.1.73-linux-i686-glibc23.tar.gz
# mv mysql-5.1.73-linux-i686-glibc23 /usr/local/mysql
# 移动mysql包到/usr/local/目录下
# cd /usr/local/mysql
# useradd -M -s /sbin/nologin mysql
# 创建运行mysql服务的账户
# mkdir -p /data/mysq
# 创建mysql数据文件存放目录
# chown -R mysql:mysql /data/mysql
# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql    #如果你是安装这片文章之前的操作做的,那么这一步这需要在CentOS-2上做
# 初始化mysql服务,--user指定运行mysql服务的账户,--datadir指定数据文件存放目录。这一步骤很关键,如果你看到两个“OK”说明执行正确,否则,请仔细查看错误信息。
下面是两个常见的错误,如果你正好遇到了,那就照着下面的解决办法解决一下。
(1)遇到错误: ./bin/mysqld: error while loading shared libraries: libstdc++.so.5: cannot open shared object file:
解决办法:
# yum install -y compat-libstdc++-33
(2)遇到错误: ./scripts/mysql_install_db: ./bin/my_print_defaults: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
这是因为,你的系统版本和 mysql 版本不一致。比如,你的系统是 32 位,结果你下载了一个 64 位的包。所以,解决办法是,下载合适的包。
# cp support-files/my-large.cnf /etc/my.cnf
cp:是否覆盖"/etc/my.cnf"? y
# 使用安装包中提供的配置模版文件到替代系统自带/etc/my.cnf文件(my.cnf只能存放在/etc/或者是dasedir目录下)
# cp support-files/mysql.server /etc/init.d/mysqld
# chmod 755 /etc/init.d/mysqld
# chkconfig --add mysqld
# chkconfig mysqld off    #mysql服务由heartbeat启动所以这里将它关闭
# 使用安装包中提供的启动脚本文件,将mysql加入到系统服务列表里。
# service mysqld start
Starting MySQL.Manager of pid-file quit without updating fi[失败]
# 启动失败,提示pid文件没有更新。解决方法:编辑启动配置文件/etc/init.d/mysqld,设置basedir=/usr/local/mysql、datadir=/data/mysql
# service mysqld start
Starting MySQL.                                            [确定]
# ps aux|grep mysql
# netstat -lnp|grep mysql
# 查看服务是否启动成功。
放了能够方便使用mysql的命令,我们应该将路径/usr/local/mysql/bin加入PATH变量中
# vi /etc/profile.d/path.sh
PATH=$PATH:/usr/local/mysql/bin/
# source /etc/profile.d/path.sh
heartbeat安装配置

现将mysql停止
# service mysqld stop

# yum -y install epel-release

# yum install -y heartbeat* libnet

# chkconfig heartbeat off

# echo "/etc/init.d/heartbeat start">>/etc/rc.d/rc.local

主节点上(CentOS-1)的配置

[root@CentOS-1 ha.d]# cd /usr/share/doc/heartbeat-3.0.4/

[root@CentOS-1 ha.d]# cp authkeys ha.cf haresources /etc/ha.d/

[root@CentOS-1 ha.d]# cd /etc/ha.d

[
root@CentOS-1
ha.d]
# vim authkeys


auth 3
3 md5 Hello!

[
root@CentOS-1
ha.d]
# chmod 600 authkeys


[
root@CentOS-1
ha.d]
# vim haresources


添加

CentOS-1 IPaddr::192.168.1.120/24/eth1:1 mysql_umount mysqld

[
root@CentOS-1
ha.d]
# vim ha.cf

debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 60
udpport 694
ucast eth1 192.168.1.112    #这里我偷懒,没有添加新的网卡做心跳线
auto_failback on
node CentOS-1
node CentOS-2
ping 192.168.1.1
respawn hacluster /usr/lib/heartbeat/ipfail

[
root@CentOS-1
ha.d]
# scp ha.cf authkeys haresources 192.168.1.112:/etc/ha.d/

root@192.168.1.112's password:
ha.cf                                                                   100%  263     0.3KB/s   00:00   
authkeys                                                                100%  644     0.6KB/s   00:00   
haresources                                                             100% 6011     5.9KB/s   00:00  

[root@CentOS-2 ha.d]# cat ha.cf
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 60
udpport 694
ucast eth1 192.168.1.111
auto_failback on
node CentOS-1
node CentOS-2
ping 192.168.1.1
respawn hacluster /usr/lib/heartbeat/ipfail

[root@CentOS-1 ha.d]# vim resource.d/mysql_umount

#!/bin/bash
unset LC_ALL; export LC_ALL
unset LANGUAGE; export LANGUAGE
prefix=/usr
exec_prefix=/usr
. /etc/ha.d/shellfuncs


case "$1" in
'start')
    #/sbin/drbdadm -- --do-what-I-say primary all
    /sbin/drbdadm primary all
    #drbdsetup /dev/drbd1 primary -o
    /bin/mount /dev/drbd1 /data/mysql
    ;;
'pre-start')
    ;;
'post-start')
    ;;
'stop')
    /bin/umount /data/mysql
    /sbin/drbdadm secondary all
    ;;
'pre-stop')
    ;;
'post-stop')
    ;;
    *)
    echo "Usage: $0 { start | pre-start | post-start | stop | pre-stop | post-stop }"
    ;;
esac


exit 0

[root@CentOS-1 ha.d]
# chmod +x resource.d/mysql_umount


[root@CentOS-1 ha.d]
# scp resource.d/mysql_umount 192.168.1.112:/etc/ha.d/resource.d/


测试:

# /etc/init.d/heartbeat start

[root@CentOS-2 ~]# cat /proc/drbd

version: 8.4.6 (api:1/proto:86-101)

GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@CentOS-2, 2016-03-05 17:06:34

1: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----

    ns:400 nr:728 dw:1128 dr:3785 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

[root@CentOS-1 ~]# /etc/init.d/heartbeat stop

[root@CentOS-2 ~]# cat /proc/drbd

version: 8.4.6 (api:1/proto:86-101)

GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@CentOS-2, 2016-03-05 17:06:34

1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----

    ns:708 nr:964 dw:1672 dr:7582 al:9 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

[root@CentOS-2 ~]# mysqladmin password "123456"

[root@CentOS-2 ~]# mysql -uroot -p123456 -e "grant all on *.* to 'root'@'192.168.1.%' identified by '123456';"

[root@CentOS-1 ~]# mysql -uroot -h192.168.1.120 -p123456

mysql> quit
Bye
[root@CentOS-1 ~]# /etc/init.d/heartbeat start
[root@CentOS-1 ~]# cat /proc/drbd

version: 8.4.6 (api:1/proto:86-101)

GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@CentOS-1, 2016-03-05 17:24:47

1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----

    ns:1220 nr:984 dw:2204 dr:11367 al:10 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0


服务启动的顺序:

DRBD-->heartbeat-->MySql

将DRBD添加到系统启动服务列表中,开机启动,将MySQL添加系统服务列表中但是不开机启动,由heartbeat启动。为了确保heartbeat在DRBD之后启动,所以将heartbeat在chkconfig中设置为off,将启动语句"/etc/init.d/heartbeat start"添加到rc.local文件中即可

2016-03-05 21:58 举报
已邀请:
0

starry

赞同来自:

粘贴的时候格式 有点问题 不影响
0

balich

赞同来自:

谢谢分享
0

starry

赞同来自:

本帖最后由 starry 于 2016-3-11 23:30 编辑

注意:如果DRBD服务启动时,没有发现另一个DRBD节点,那么本节点默认就会一直处于等待状态(不启动DRBD服务),等到另一个节点出现。有时脑裂也会出现这个现象。
QQ截图20160311152600.png


回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: