Mysql测试二:DRBD+Mysql 高可用方案设置测试

作者:sky | 分类: 大话技术 | 标签: | 日期:2008-03-04

测试环境:rhel3.5,drbd 8.0.7,mysql5.0.51-rc-log

1、首先从www.drbd.org下载了源代码包(我下载的8.0.7版本的包)

2、检查主机上面有没有linux的内核源代码,如果没有,需要找到相对应版本的源代码包安装上去。

3、开始安装drbd:

    1) 解压:tar -zxvf drbd-8.0.7.tar.gz

    2) 进入drbd源码目录,根据kernel源码位置来编译drbd:

    make KDIR=/usr/src/kernel/    (如果没有更改过内核,可以直接运行make,编译程序会到/lib/module里面去自己根据相关配置寻找到kernel源码)

    make install

    如果没有报错,应该基本install好了,检查是否生成了相应的文件:/etc/drbd.conf ; /etc/init.d/drbd ; 以及./drbd/drbd.ko

    同时系统应该至少多了以下两个命令:drbdadm和drbdsetup

    不要删除此源码目录,后面还会用到里面的./scripts/drbd.conf 和 ./drbd/drbd.ko

4、现在可以加载安装drbd模块了

    insmod drbd.ko 或者 modprobe drbd

    通过lsmod检查是否已经成功

    #lsmod |grep drbd

    如果有,则表示成功了

5、更改drbd配置文件:

    /etc/drbd.conf

    [root@mysql1 ha.d]# cat /etc/drbd.conf

    …

    on mysql1 {
      device     /dev/drbd0;
      disk       /dev/i2o/hda9;
      address    10.0.65.45:8888;
      flexible-meta-disk  internal;
    }

    on mysql2 {
      device    /dev/drbd0;
      disk      /dev/sde2;
      address   10.0.65.106:8888;
      meta-disk internal;
    }

    …

6、primary node设置:

    1) 创建matadata:

    #drbdadm create-md all

    2) 启动drbd:

    #/etc/init.d/drbd start

    3) 设置为主节点:

    #drbdadm — –overwrite-data-of-peer 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

    

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

8、primary和secondary节点都配置完并且都启动后,开始检查配置是否成功

    1) 检查进程:

      a) primary :
      [root@mysql1 /]# ps -auxf |grep drbd
      Warning: bad syntax, perhaps a bogus ‘-’? See /usr/share/doc/procps-3.2.3/FAQ
      root      5454  0.0  0.0  3744  672 pts/0    S+   17:36   0:00          \_ grep drbd
      root      5389  0.6  0.0     0    0 ?        S    17:16   0:07 [drbd0_worker]
      root      5403  1.1  0.0     0    0 ?        S    17:16   0:14 [drbd0_receiver]
      root      5448  0.3  0.0     0    0 ?        S    17:35   0:00 [drbd0_asender]

      b) secondary:
     
root@mysql2:/>ps -auxf |grep drbd
      Warning: bad syntax, perhaps a bogus ‘-’? See /usr/share/doc/procps-3.2.3/FAQ
      root      5272  0.0  0.0  4752  640 pts/1    S+   16:27   0:00          \_ grep drbd
      root      5168  0.0  0.0     0    0 ?        S    16:07   0:00 [drbd0_worker]
      root      5182  2.3  0.0     0    0 ?        S    16:07   0:29 [drbd0_receiver]
      root      5270  1.9  0.0     0    0 ?        S    16:25   0:03 [drbd0_asender]

      可以看到两个节点的进程都起来了,每个drbd设备会有三个进程:drbd0_worker是drbd0的主要进城,drbd0_asender是primary上drbd0的数据发送进程,drbd0_receiver是secondary上drbd0的数据接收进程。

    2) 查看/dev/drbd文件的输出:

      [root@mysql1 /]# cat /proc/drbd
      version: 8.0.7 (api:86/proto:86)
      GIT-hash: cf14288833afe95db396075f8530a5960d29e498 build by
root@mysql1, 2008-03-01 17:02:58
       0:
cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r—
          ns:6575584 nr:36 dw:289636 dr:6298278 al:142 bm:515 lo:1 pe:227 ua:30 ap:0
              [====>...............] sync’ed: 21.8% (9336/11932)M
              finish: 0:52:36 speed: 3,024 (4,176) K/sec
              resync: used:1/31 hits:454805 misses:514 starving:0 dirty:0 changed:514
              act_log: used:0/257 hits:72258 misses:154 starving:0 dirty:12 changed:142

      root@mysql2:/>cat /proc/drbd
      version: 8.0.7 (api:86/proto:86)
      GIT-hash: cf14288833afe95db396075f8530a5960d29e498 build by
root@mysql2, 2008-02-29 21:21:46
       0:
cs:SyncTarget st:Secondary/Primary ds:Inconsistent/UpToDate C r—
          ns:36 nr:5550548 dw:5550552 dr:89 al:2 bm:326 lo:2 pe:97 ua:1 ap:0
              [==>.................] sync’ed: 13.5% (10330/11932)M
              finish: 0:28:37 speed: 6,148 (4,248) K/sec
              resync: used:2/31 hits:391148 misses:451 starving:0 dirty:0 changed:451
              act_log: used:0/257 hits:7 misses:2 starving:0 dirty:0 changed:2

        输出文件上面最开始是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) 在mysql1上将该文件系统umount,然后执行drbdadm secondary all,改成secondary模式

        [root@mysql1 /]# umount /drbddata

        [root@mysql1 /]# drbdadm secondary all

        b) 在原mysql2 执行drbdadm primary all 改成primary模式,再mount文件系统

        root@mysql2:/>drbdadm  primary all

        root@mysql2:/>mount /dev/drbd0 /drbddata

        检查之前在mysql1下写入的文件是否已经完全同步到mysql2下面,经验证,数据已经同步好了

    4) 最后连同mysql一起手工测试一次切换:

    a) 主节点mysql1下关闭mysql,释放资源,将资源切换成secondary模式:

      [root@mysql1 ha.d]# mysqladmin -u root shutdown
      [root@mysql1 ha.d]# umount /drbddata
      [root@mysql1 ha.d]# drbdadm secondary all

    b) 次节点mysql2下获取资源,mount上,切换成primary模式,并启动mysql:

      root@mysql2:/root/mysql-5.0.51a>drbdadm primary all
      root@mysql2:/root/mysql-5.0.51a>mount /dev/drbd0 /drbddata
      root@mysql2:/usr/local/mysql/bin>./mysqld_safe –user=mysql &
      [1] 27900
      root@mysql2:/usr/local/mysql/bin>Starting mysqld daemon with databases from /drbddata/mysqldata
      root@mysql2:/usr/local/mysql/bin>
      root@mysql2:/usr/local/mysql/bin>
      root@mysql2:/usr/local/mysql/bin>tail -f /drbddata/mysqldata/mysql2.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@mysql2:/usr/local/mysql/bin>mysql -u root
      Welcome to the MySQL monitor.  Commands end with ; or \g.
      Your MySQL connection id is 1 to server version: 5.0.51a-log

      Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.

      mysql> show databases;
      +——————–+
      | Database           |
      +——————–+
      | information_schema |
      | mysql              |
      | test               |
      +——————–+
      3 rows in set (0.03 sec)

      mysql> use test;
      Reading table information for completion of table and column names
      You can turn off this feature to get a quicker startup with -A

      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)

      mysql> exit
      Bye
      root@mysql2:/usr/local/mysql/bin>

    d) 再通过之前相同的切换步骤切换回各自原来的模式,启动主节点的mysql,并检查数据:

   

    [root@mysql1 ha.d]# drbdadm primary all

    [root@mysql1 ha.d]# mount /dev/drbd0 /drbddata

      [root@mysql1 ha.d]# mysqld_safe –user=mysql &
      [1] 8451
      [root@mysql1 ha.d]# Starting mysqld daemon with databases from /drbddata/mysqldata

      [root@mysql1 ha.d]#
      [root@mysql1 ha.d]#
      [root@mysql1 ha.d]#
      [root@mysql1 ha.d]#
      [root@mysql1 ha.d]# mysql -uroot
      Welcome to the MySQL monitor.  Commands end with ; or \g.
      Your MySQL connection id is 1 to server version: 5.0.51a-log

      Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.

      mysql> use test;
      Reading table information for completion of table and column names
      You can turn off this feature to get a quicker startup with -A

      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节点的文件系统都是通过同步完成的,两边的设备大小好像并不要求完全一样的大小,在我测试的过程中,两边用于drbd设备的分区大小相差很大,但好像并没有出现错误,从drbd相关文档上看到这个并不会导致问题。但是如果主节点比备节点大,而且用的空间也超出了备节点空间大小会有问题,具体会怎样还没有测试到。

2、在mount drbd的设备之前,该节点必须已经设置为primary模式,而且如果一边没有umount,另一边是无法mount上的,直接mount会报如下错误:

      root@mysql2:/>mount /dev/drbd0 /drbddata
      mount: block device /dev/drbd0 is write-protected, mounting read-only

  也就是说,在同步的过程中,只有一个节点的数据可见,也就是不能通过我们人直接简单的查看数据文件等方式之间验证数据是否正常。不过看文档说好像可以通过手动设置一些信息来查看是否正常(You can manually set this information for a number of reasons, including when you want to check the physical status of the secondary device (since you cannot mount a DRBD device in primary mode), or when you are temporarily moving the responsibility of keeping the data in check to a different machine (for example, during an upgrade or physical move of the normal primary node). )。这里的内容等后面再详细研究一下。

11人发表了评论  ↓发表评论↓
  • 不错

    zhaolinjnu @ March 4, 2008 |

  • 要找到一个能定期验证的方式就好了,或者在线系统可以双向切换或者可以在线替换节点

    fcp @ March 4, 2008 |

  • 目前来看,在线切换肯定有一个较短时间段不能提供服务;
    在线替换节点主要就是在一个节点坏了后,必须要再部署上一个新的备节点,以解决该情况下的单点问题。这个时候就涉及到新加入的节点数据初始化的问题,这个需要再好好研究一下drbd的功能,估计drbd有在线初始化数据的功能,再研究一下;
    另外,定期验证也是个比较头疼的问题。

    sky @ March 4, 2008 |

  • 果然是 Sky 同学写的 :)

    Fenng @ March 4, 2008 |

  • drbd的性能肯定要损失很多。

    什么时候测试HA下面的mysql?

    logzgh @ March 5, 2008 |

  • 赶紧学习
    有天碰到处理这样大型的DB的机会不能错过了
    最近在为多个数据中心的数据同步问题苦恼

    diefish @ March 5, 2008 |

  • to logzgh:
    是的,drbd肯定会使写io有一定的性能下降,不过,如果能在节点之间的网络层给予较好的支持的话,影响也并不是特别的大,再说毕竟我们这些系统的写io压力其实也并不是瓶颈所在的。而由于mysql对于读写分离的支持也还是比较好的,实际使用drbd的节点一般也只会提供单纯的写服务,读基本上通过slave来提供,所以性能应该不会成为太大的问题。

    sky @ March 5, 2008 |

  • 不错,这个架构就是用来分摊读压力的,完全的做到读写分离,系统估计有的一阵子撑了,呵呵

    八神 @ March 6, 2008 |

  • 不要这么乐观,这样读写分离到底能支撑多大压力还很难说,当初社区一拖九的系统压力很大,换oracle成2台2cpu的dell 6650搞定。 也许最关键的还是要分库。

    fcp @ March 6, 2008 |

  • 写的压力其实在master和slave上都差不多的吧,逻辑日志,一样每条dml在每个库上都要跑一次,多个slave将写的压力扩大了N倍。所以要是系统中写的压力本身比较大的情况下,读写分离的效果估计就不乐观了

    NinGoo @ March 13, 2008 |

  • NiGoo说的对,写本身的压力其实并没有本质上的减少的,但是对于单台Server来说,写的压力并没有扩大,只是总体的写压力有所扩大,但是由于这些写的压力分散到了多台Server上,就像是raid1一样,并不会给我们带来很大的副作用。而slave主要是为了分担读压力,而且目前大部分应用的主要压力还是来自于读的。

    sky @ April 8, 2008 |

表情:<( ̄︶ ̄)> | (⊙ˍ⊙) | >﹏< | b( ̄▽ ̄)d | (─.─||) | (^_-)

[ Ctrl+Enter提交 ]

阿里巴巴DBA出品