天天看点

MySQL主主互备模式(Keepalived)

                          MySQL双主-高可用

单台数据库实例安装

资源规划

主机名

os 版本

MySQL 版本

主机 IP

MySQL VIP

db01.lyk.com

centos 6.4

mysql-5.6.21-linux-glibc2.5-x86_64 

172.31.30.12

172.31.30.222

db02.lyk.com

mysql-5.6.21-linux-glibc2.5-x86_64

172.31.30.11

  3.修改MySQL配置文件

修改DB01的配置文件:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<code>vi</code> <code>/etc/my</code><code>.cnf</code>

<code>#在[mysqld]添加如下内容#</code>

<code>server-</code><code>id</code> <code>= 100</code>

<code>log-bin = </code><code>/usr/local/mysql/data/ttpai-bin</code>

<code>binlog_format = MIXED </code><code>#非必需</code>

<code>relay-log = </code><code>/usr/local/mysql/data/ttpai-relay-bin</code>

<code>binlog-ignore-db = mysql</code>

<code>binlog-ignore-db = </code><code>test</code>

<code>binlog-ignore-db = information_schema</code>

<code>binlog-ignore-db = performance_schema</code>

<code>replicate-wild-ignore-table = mysql.%</code>

<code>replicate-wild-ignore-table = </code><code>test</code><code>.%</code>

<code>replicate-wild-ignore-table = information_schema.%</code>

<code>replicate-wild-ignore-table = performance_schema.%</code>

修改DB02的配置文件:

<code>server-</code><code>id</code> <code>= 110</code>

  4.手动同步数据库

如果DB01上已经有MySQL数据,那么执行主主互备之前,需要将DB01和DB02上的两个MySQL的数据保持同步,首先在DB01上备份MySQL数据,执行如下SQL:

<code>mysql&gt; FLUSH TABLES </code><code>WITH</code> <code>READ</code> <code>LOCK;</code>

在不退出终端的情况下(推出锁失效),再开启一个session,直接打包MySQL的数据文件或者mysqldump工具导出:

<code>cd</code> <code>/usr/local/mysql/</code>

<code>tar</code> <code>zcvf data.</code><code>tar</code><code>.gz data/</code>

将data.tar.gz 传输到DB02,依次重启DB01和DB02。

其实,可以在不执行READ LOCK语句,直接使用mysqldump语句备份,最起码个人测试是数据不会丢失或者说出现同步异常。使用如下命令:

<code> </code><code>mysqldump  --default-character-</code><code>set</code><code>=gbk --opt  --triggers -R -E --hex-blob --single-transaction --master-data=2  ttpai &gt; ttpai.sql</code>

其中--master-data=2可以锁定binlog的文件名及坐标。

  5.创建授权复制用户

DB01执行:

<code>mysql&gt; grant REPLICATION SLAVE ON *.* TO lyk@</code><code>'172.31.30.11'</code> <code>IDENTIFIED BY </code><code>'lyk123'</code><code>;</code>

DB02执行:

<code>mysql&gt; grant REPLICATION SLAVE ON *.* TO lyk@</code><code>'172.31.30.12'</code> <code>IDENTIFIED BY </code><code>'lyk123'</code><code>;</code>

其中关于坐标的值,可以执行如下SQL得到:

<code>mysql&gt; show master status;</code>

<code>+------------------+-----------+--------------+--------------------------------------------------+-------------------+</code>

<code>| File             | Position  | Binlog_Do_DB | Binlog_Ignore_DB                                 | Executed_Gtid_Set |</code>

<code>| ttpai-bin.000093 | 502389306 |              | mysql,</code><code>test</code><code>,information_schema,performance_schema |                   |</code>

如果使用mysqldump 可以使用如下命令:

<code>head</code> <code>-n50 ttpai.sql</code>

   6.启动互为主从的模式

在DB02上执行:

<code>mysql&gt;CHANGE MASTER TO </code>

<code>MASTER_LOG_FILE=</code><code>'ttpai-bin.000050'</code><code>,</code>

<code>MASTER_LOG_POS=754861035,</code>

<code>MASTER_HOST=</code><code>'172.31.30.12'</code><code>,</code>

<code>MASTER_USER=</code><code>'lyk'</code><code>,</code>

<code>MASTER_PASSWORD=</code><code>'lyk123'</code><code>;</code>

<code>mysql&gt;start slave;</code>

在DB01上执行:

验证同步结果:

<code>mysql&gt;show slave status\G;</code>

自此Mysql互为主从已完毕。

  7.安装lvs+keepalived

<code> </code><code>yum instal keepalived ipvsadm</code>

  8.编辑keepalived配置文件

DB01的配置文件:

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

<code>vi</code> <code>/etc/keepalived/keepalived</code><code>.conf </code>

<code>global_defs {</code>

<code>   </code><code>notification_email {</code>

<code>     </code><code>[email protected]</code>

<code>   </code><code>}</code>

<code>   </code><code>notification_email_from [email protected]</code>

<code>   </code><code>smtp_server 127.0.0.1</code>

<code>   </code><code>smtp_connect_timeout 30</code>

<code>   </code><code>router_id LVS_Mysql</code>

<code>}</code>

<code>vrrp_instance HA_1 {</code>

<code>    </code><code>state BACKUP</code>

<code>    </code><code>interface bond0</code>

<code>    </code><code>virtual_router_id 80</code>

<code>    </code><code>priority 100</code>

<code>    </code><code>advert_int 2</code>

<code>    </code><code>nopreempt</code>

<code>    </code> 

<code>    </code><code>authentication {</code>

<code>        </code><code>auth_type PASS</code>

<code>        </code><code>auth_pass 1111</code>

<code>    </code><code>}</code>

<code>    </code><code>virtual_ipaddress {</code>

<code>      </code><code>172.31.30.222</code>

<code>virtual_server 172.31.30.222 3306 {</code>

<code>    </code><code>delay_loop 2</code>

<code>    </code><code>lb_algo wlc</code>

<code>    </code><code>lb_kind DR</code>

<code>    </code><code>nat_mask 255.255.255.0</code>

<code>    </code><code>protocol TCP</code>

<code>    </code><code>persistence_timeout 60</code>

<code>    </code><code>real_server 172.31.30.12 3306 {</code>

<code>        </code><code>weight 1</code>

<code>        </code><code>notify_down </code><code>/etc/keepalived/mysqlcheck/mysql</code><code>.sh</code>

<code>        </code><code>TCP_CHECK {</code>

<code>            </code><code>connect_port 3306</code>

<code>            </code><code>connect_timeout 3</code>

<code>            </code><code>nb_get_retry 2</code>

<code>            </code><code>delay_before_retry 1</code>

<code>        </code><code>}</code>

其中需要注意的是:

state BACKUP  #DB01和DB02均配置为BACKUP状态

nopreempt     #为不强占模式,DB02(slave)不用设置

notify_down   #定义监测realserver失败下一步的动作

priority      #DB02要比DB01低

interface bond0 #没什么特别,却是我的整个搭建最耗时的痛点,稍后解释

创建notify_down的脚本(DB01和DB02都需创建):

<code>mkdir</code> <code>-p  </code><code>/etc/keepalived/mysqlcheck/</code>

<code>cd</code> <code>/etc/keepalived/mysqlcheck/</code>

<code>vi</code> <code>mysql.sh</code>

<code>#!/bin/sh</code>

<code>pkill keepalived</code>

<code>chmod</code> <code>u+x mysql.sh</code>

其实就是干掉keepalived进程,释放VIP。

DB02的配置文件:

<code>    </code><code>priority 90</code>

<code>    </code><code>real_server 172.31.30.11 3306 {</code>

DB01和DB02的启动keepalived:

<code>/etc/init</code><code>.d</code><code>/keepalived</code> <code>start</code>

9.测试

测试主从同步,通过VIP连接:

<code>mysql -h172.31.30.222 -utest -ptest ttpai</code>

<code>mysql&gt; show vaiables like </code><code>'server_id'</code><code>; </code><code>#可以确认那台为master状态</code>

<code>mysql&gt; create table ....  </code><code>#到slave状态的数据库看都是否正常</code>

<code>.....</code>

测试keepalived实现MySQL故障转移:

可以在DB01执行

<code>/etc/init</code><code>.d</code><code>/mysqld</code> <code>stop</code>

远程一直执行

<code>show vaiables like </code><code>'server_id'</code><code>;</code>

发现会卡1~3s,server_id变为110,即master变为DB02。

即使重启DB01,VIP也不会转移,因为采用的是不抢占模式,直到DB02的服务挂,才会转移VIP。

10:总结

来说下interface bond0的事儿:

一切配置都很顺,但是在测试的时候,发现VIP连接数据库,执行SQL时卡时不卡,在windows下ping VIP或者VIP所在的DB的主机IP,丢包;有没有蛋碎的感觉。开始一头雾水,后来仔细又看了一边lvs DR模式的原理,原来都和MAC地址相关联,而自己的环境网卡做了bond0(mode=0),却在交换机上没做端口聚合,可以认为网卡MAC发生紊乱。

解决:

配置交换机(H3C)

<code>#创建端口聚合组(不同型号,命令不同,叫法不一样)</code>

<code>interface Bridge-Aggregation2</code>

<code>description bonding</code>

<code>port access vlan 30</code>

<code>interface Bridge-Aggregation3</code>

<code>#将做bonding的网卡加入对应的聚合组</code>

<code>interface GigabitEthernet1</code><code>/0/3</code>

<code>port link-aggregation group 3</code>

<code>......</code>

一切恢复正常,发生这个事件,不知是自己太低端,还是大家都没遇到,搜资料真没收到,呵呵。

注意:

LVS DR原理

bonding 模式的注意点

本文转自 kuchuli 51CTO博客,原文链接:http://blog.51cto.com/lgdvsehome/1591525,如需转载请自行联系原作者