• ADADADADAD

    Heartbeat+DRBD如何实现MySQL高可用性[ mysql数据库 ]

    mysql数据库 时间:2024-11-26 22:15:38

    作者:文/会员上传

    简介:

    DRBD是一种块设备,可以被用于高可用(HA)之中。它类似于一个网络RAID-1功能。当你将数据写入本地文件系统时,数据还将会被发送到网络中另一台主机上。以相同的形式记录在一个文

    以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。

    DRBD是一种块设备,可以被用于高可用(HA)之中。它类似于一个网络RAID-1功能。当你将数据写入本地文件系统时,数据还将会被发送到网络中另一台主机上。以相同的形式记录在一个文件系统中。本地(主节点)与远程主机(备节点)的数据可以保证实时同步。当本地系统出现故障时,远程主机上还会保留有一份相同的数据,可以继续使用。

    1.3 环境准备

    两台主机:192.168.100.8,192.168.100.9
    需要为本地主机和远程主机,指定一个DRBD使用的硬盘分区。这两个分区的大小必须相同。我们指定两台主机的/dev/sda2分区作为DRBD的使用的分区.这两个分区大小都为37G.
    1.4 DRBD的安装配置
    1、首先从www.drbd.org下载了源代码包(我下载的drbd-8.3.6版本的包)
    2、检查主机上面有没有linux的内核源代码,如果没有,需要找到相对应版本的源代码包安装上去。
    3、开始安装drbd:
    1) 解压:tar -zxvf drbd-8.3.6.tar.gz
    2) 进入drbd源码目录,根据kernel源码位置来编译drbd:
    cd drbd-8.3.6
    ./configure --with-km
    make KDIR=/usr/src/kernels/2.6.18-92.el5-i686/
    make install
    4、现在可以加载安装drbd模块了
    insmod /lib/modules/2.6.18-92.el5/kernel/drivers/block/drbd.ko
    通过lsmod检查是否已经成功
    #lsmod |grep drbd
    如果有,则表示成功了
    5、更改drbd配置文件:
    cp ./scripts/drbd.conf /etc/drdb.conf
    vi /etc/drbd.conf
    修改resource r0下的配置
    on test9 {
    device /dev/drbd0;
    disk /dev/sda2;
    address 192.168.100.9:7788;
    flexible-meta-disk internal;
    }

    on test8 {
    device /dev/drbd0;
    disk /dev/sda2;
    address 192.168.100.8:7788;
    meta-disk internal;
    }


    6、primary node设置:
    1) 创建matadata:
    #drbdadm create-md all
    遇到错误
    Found ext3 filesystem
    38515836 kB data area apparently used
    38514624 kB left usable by current configuration
    Device size would be truncated, which would corrupt data and result in 'access beyond end of device' errors.
    You need to either
    * use external meta data (recommended)
    * shrink that filesystem first
    * zero out the device (destroy the filesystem)
    Operation refused.
    Command 'drbdmeta 0 v08 /dev/sda2 internal create-md' terminated with exit code 40
    drbdadm create-md r0: exited with code 40
    As suggested by the error, Zero out the first part of device by running following command:

    执行下面这句
    # dd if=/dev/zero of=/dev/sda2 bs=1M count=128
    再重新执行
    # drbdadm create-md all
    2) 启动drbd:
    #/etc/init.d/drbd start
    3) 设置为主节点:
    #drbdadm primary all
    4) 在新设备上面创建文件系统
    #mkfs.ext3 /dev/drbd0
    5) 将文件系统mount上
    #mkdir /drbddata
    #mount /dev/drbd0 /drbddata
    7、secondary node设置:
    1) 创建matadata:
    #drbdadm create-md all
    2) 启动drbd:
    #/etc/init.d/drbd start
    注意:在我的系统上drbd start的时候用modprobe不能自动加载drdb模块,
    所以需要将/etc/init.d/drbd中$MODPROBE -s drdb改成
    insmod /lib/modules/2.6.18-92.el5/kernel/drivers/block/drbd.ko

    注:这里不要创建文件系统(因为这些信息都会从主节点同步过来的)。

    8、primary和secondary节点都配置完并且都启动后,开始检查配置是否成功
    1) 检查进程:
    a) primary :
    [root@test9 /]# ps auxf |grep drbd
    root 4735 0.0 0.0 3912 656 pts/0 S+ 10:31 0:00 _ grep drbd
    root 3479 0.0 0.0 0 0 ? S 08:48 0:00 [drbd0_worker]
    root 3491 0.0 0.0 0 0 ? S 08:48 0:00 [drbd0_receiver]
    root 3503 0.0 0.0 0 0 ? S 08:48 0:00 [drbd0_asender]
    b) secondary:
    root@test8:/>ps auxf |grep drbd
    root 4543 0.0 0.0 3912 660 pts/0 S+ 10:31 0:00 _ grep drbd
    root 3393 0.0 0.0 0 0 ? S 08:48 0:00 [drbd0_worker]
    root 3405 0.0 0.0 0 0 ? S 08:48 0:00 [drbd0_receiver]
    root 3415 0.0 0.0 0 0 ? S 08:48 0:00 [drbd0_asender]
    可以看到两个节点的进程都起来了,每个drbd设备会有三个进程:drbd0_worker是drbd0的主要进城,drbd0_asender是primary上drbd0的数据发送进程,drbd0_receiver是secondary上drbd0的数据接收进程。
    2) 查看/dev/drbd文件的输出:
    [root@test9 /]# cat /proc/drbd
    version: 8.3.6 (api:88/proto:86-91)
    GIT-hash: f3606c47cc6fcf6b3f086e425cb34af8b7a81bbf build by root@test9, 2009-12-11 18:47:35
    0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----
    ns:8 nr:0 dw:4 dr:473 al:1 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

    root@test8:/>cat /proc/drbd
    version: 8.3.6 (api:88/proto:86-91)
    GIT-hash: f3606c47cc6fcf6b3f086e425cb34af8b7a81bbf build by root@test8, 2009-12-11 18:14:27
    0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r----
    ns:0 nr:8 dw:8 dr:0 al:0 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

    输出文件上面最开始是drbd的版本信息,然后就是数据同步的一些状态信息,从mysql的文档上介绍了每一个状态的意思如下:
    cs — connection state
    st — node state (local/remote)
    ld — local data consistency
    ds — data consistency
    ns — network send
    nr — network receive
    dw — disk write
    dr — disk read
    pe — pending (waiting for ack)
    ua — unack’d (still need to send ack)
    al — access log write count

    3) 更进一步验证数据是否同步正确了:
    a) 在test9上将该文件系统umount,然后执行drbdadm secondary all,改成secondary模式
    [root@test9 /]# umount /drbddata
    [root@test9 /]# drbdadm secondary all
    b) 在原test8 执行drbdadm primary all 改成primary模式,再mount文件系统
    root@test8:/>drbdadm primary all
    root@test8:/>mount /dev/drbd0 /drbddata
    检查之前在test9下写入的文件是否已经完全同步到test8下面,经验证,数据已经同步好了
    4) 最后连同mysql一起手工测试一次切换:
    a) 主节点test9下关闭mysql,释放资源,将资源切换成secondary模式:
    [root@test9 ha.d]# mysqladmin -u root shutdown
    [root@test9 ha.d]# umount /drbddata
    [root@test9 ha.d]# drbdadm secondary all
    b) 次节点test8下获取资源,mount上,切换成primary模式,并启动mysql:
    root@test8:/root/mysql-5.0.51a>drbdadm primary all
    root@test8:/root/mysql-5.0.51a>mount /dev/drbd0 /drbddata
    root@test8:/usr/local/mysql/bin>./mysqld_safe --user=mysql &
    [1] 27900
    root@test8:/usr/local/mysql/bin>Starting mysqld daemon with databases from /drbddata/mysqldata
    root@test8:/usr/local/mysql/bin>
    root@test8:/usr/local/mysql/bin>
    root@test8:/usr/local/mysql/bin>tail -f /drbddata/mysqldata/test8.err
    080303 13:53:25 mysqld started
    080303 13:53:26 InnoDB: Started; log sequence number 0 43656
    080303 13:53:26 [Note] /usr/local/mysql/libexec/mysqld: ready for connections.
    Version: ‘5.0.51a-log’ socket: ‘/usr/local/mysql/sock/mysql.sock’ port: 3306 Source distribution

    c) 登入数据库中检查数据,这里我同时在新的主节点上面测试了写,以便在后面切换回主节点后检查数据是否也正常:
    root@test8:/usr/local/mysql/bin>mysql -u root
    mysql> show databases;
    +——————–+
    | Database |
    +——————–+
    | information_schema |
    | mysql |
    | test |
    +——————–+
    3 rows in set (0.03 sec)
    mysql> use test;
    Database changed
    mysql> show tables;
    +—————-+
    | Tables_in_test |
    +—————-+
    | t1 |
    | t2 |
    | t3 |
    +—————-+
    3 rows in set (0.00 sec)
    mysql> create table t4(id int);
    Query OK, 0 rows affected (0.07 sec)
    d) 再通过之前相同的切换步骤切换回各自原来的模式,启动主节点的mysql,并检查数据:

    [root@test9 ha.d]# drbdadm primary all
    [root@test9 ha.d]# mount /dev/drbd0 /drbddata
    [root@test9 ha.d]# mysqld_safe --user=mysql &
    [root@test9 ha.d]# mysql -uroot
    mysql> use test;
    Database changed
    mysql> show tables;
    +—————-+
    | Tables_in_test |
    +—————-+
    | t1 |
    | t2 |
    | t3 |
    | t4 |
    +—————-+
    4 rows in set (0.00 sec)

    mysql> insert into t4 values(111);
    Query OK, 1 row affected (0.01 sec)

    mysql> commit;
    Query OK, 0 rows affected (0.00 sec)

    mysql> select * from t4;
    +——+
    | id |
    +——+
    | 111 |
    +——+
    1 row in set (0.00 sec)

    几个注意点:
    1、除了primary节点的文件系统是手工创建的之外,其他的所有secondary节点的文件系统都是通过同步完成的。
    2、在mount drbd的设备之前,该节点必须已经设置为primary模式,而且如果一边没有umount,另一边是无法mount上的,直接mount会报如下错误:
    root@test8:/>mount /dev/drbd0 /drbddata
    mount: block device /dev/drbd0 is write-protected, mounting read-only
    3、DRBD也支持Dual-primary mode,不过需要GFS等集群文件系统来支持。

    1.5 性能测试
    测试选项:sysbench --num-threads=10 --max-requests=10000 --test=oltp
    --mysql-table-engine=innodb --oltp-table-size=1000000
     直接使用本地磁盘
    OLTP test statistics:
    queries performed:
    read: 140000
    write: 50000
    other: 20000
    total: 210000
    transactions: 10000 (206.65 per sec.)
    deadlocks: 0 (0.00 per sec.)
    read/write requests: 190000 (3926.39 per sec.)
    other operations: 20000 (413.30 per sec.)

    Test execution summary:
    total time: 48.3905s
    total number of events: 10000
    total time taken by event execution: 483.6677
    per-request statistics:
    min: 9.59ms
    avg: 48.37ms
    max: 255.62ms
    approx. 95 percentile: 96.74ms

    Threads fairness:
    events (avg/stddev): 1000.0000/10.23
    execution time (avg/stddev): 48.3668/0.01
     使用DRBD
    OLTP test statistics:
    queries performed:
    read: 140000
    write: 50000
    other: 20000
    total: 210000
    transactions: 10000 (174.69 per sec.)
    deadlocks: 0 (0.00 per sec.)
    read/write requests: 190000 (3319.17 per sec.)
    other operations: 20000 (349.39 per sec.)

    Test execution summary:
    total time: 57.2433s
    total number of events: 10000
    total time taken by event execution: 572.2720
    per-request statistics:
    min: 11.87ms
    avg: 57.23ms
    max: 342.05ms
    approx. 95 percentile: 141.95ms

    Threads fairness:
    events (avg/stddev): 1000.0000/16.01
    execution time (avg/stddev): 57.2272/0.01

    由此可以看出,DRBD使MySQL性能下降15%左右。DRBD主要是对写性能有影响,对读的影响很小,所以对更新频率不高但对可用性要求很高的应用,DRBD是个很好的选择。

    1.6 使用Heartbeat实现自动故障转移
    1、假设服务器A,B的公网IP分别是:
    A 192.168.100.9
    B 192.168.100.8
    集群虚IP: 192.168.100.201

    2、设置服务器A,B的hostname为test9及test8,
    如不是请修改/etc/sysconfig/network的HOSTNAME部分,并执行
    #hostname test9 以立即生效。
    在/etc/hosts加入两行:
    192.168.100.10 test9
    192.168.100.9 test8

    4、修改服务器A,B的/etc/sysctl.conf文件,加入如下5行,并执行
    #sysctl -p 以立即生效。

    net.ipv4.ip_forward = 1
    net.ipv4.conf.all.arp_ignore = 1
    net.ipv4.conf.eth0.arp_ignore = 1
    net.ipv4.conf.all.arp_announce = 2
    net.ipv4.conf.eth0.arp_announce = 2

    5、以root进入服务器A、B,执行以下配置:
    在/etc/init.d/heartbeat中的#!/bin/sh后插入一行:
    ifconfig lo:100 192.168.100.201 netmask 255.255.255.255 up

    #chkconfig heartbeat --level 35 on
    #cd /etc/ha.d 进入集群配置文件目录
    #vi authkeys 创建集群认证文件
    auth 3
    3 md5 HA_2009

    #chmod 600 authkeys 必要的操作

    #vi ha.cf 创建集群节点文件
    logfile /var/log/ha.log
    #logfacility local0
    keepalive 2
    deadtime 30
    warntime 10
    initdead 80
    mcast eth0 231.231.231.232 694 1 0
    ##有双网卡最好做个两台机器最好做交叉线连接,eth0 改eth2
    #ucast eth0 192.168.100.8 #(test9直接指向对端ip,test8的ucast eth0 192.168.100.9)
    ping 192.168.100.2
    auto_failback on
    node test9
    node test8
    respawn hacluster /usr/lib/heartbeat/ipfail
    apiauth ipfail gid=haclient uid=hacluster

    集群中有两个节点test9及test8,通过多播IP通信(主要用于超过2个节点)
    ping 192.168.100.2 网关ping检测


    #vi /etc/ha.d/resource.d/vip.sh 创建我们自己的集群IP切换shell脚本
    #!/bin/sh
    case "$4" in
    start)
    ifconfig lo:100 down
    ifconfig $1:100 $2 netmask $3 up
    ;;
    stop)
    ifconfig $1:100 down
    ifconfig lo:100 $2 netmask 255.255.255.255 up
    ;;
    esac
    /etc/ha.d/resource.d/SendArp 192.168.100.201/eth0 start

    提供了LVS集群备用节点在回路地址监听集群虚IP以用于应用服务器。
    最后一行用于更新客户机的arp中缓存的MAC地址。

    #chmod +x resource.d/vip.sh

    #vi /etc/ha.d/resource.d/mysql.sh 创建mysql启动停止的shell脚本
    #!/bin/sh
    case "$1" in
    start)
    /drbddata/mysql-xtradb/bin/mysqld_safe --defaults-file=/drbddata/mysql-xtradb/my.cnf --user=mysql >/dev/null 2>&1 &
    ;;
    stop)
    /drbddata/mysql-xtradb/bin/mysqladmin -S/drbddata/mysql-xtradb/mysql.sock shutdown
    ;;
    esac

    #vi haresources 创建集群资源文件
    test9 drbddisk::r0
    Filesystem::/dev/drbd0::/drbddata::ext3
    vip.sh::eth0::192.168.100.201::255.255.255.0
    Delay::5::0
    mysql.sh

    在AB上分别执行service heartbeat start测试
    注意查看日志/var/log/ha.log

    启动完成后,test9上的mysql正常可用
    mysql -h292.168.100.201 -P3308 –uroot –p
    Welcome to the MySQL monitor. Commands end with ; or g.
    Your MySQL connection id is 1
    Server version: 5.1.39-xtradb-log MySQL Community Server (GPL)

    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

    mysql>

    Heartbeat+DRBD如何实现MySQL高可用性.docx

    将本文的Word文档下载到电脑

    推荐度:

    下载
    热门标签: heartbeatdrbdmysql