Mysql + keepalived 实现双主热备读写分离【转】

Mysql + keepalived 实现双主热备读写分离

2013年6月16日frankwong发表评论阅读评论

架构图

系统:CentOS6.4_X86_64
软件版本:Mysql-5.6.12,Keepalived-1.2.7
环境简介:
1.Master-A 192.168.1.168 (Mysql+Keepalived)
2.Master-B 192.168.1.169 (Mysql+Keepalived)
3.写入VIP 192.168.100 (168主,169从)
4.读取VIP 192.168.200 (169主,168从)
此处略过Mysql和Keepalived的安装过程,请读者自行查找相关的安装指导资料.

工作流程图

复制实现原理(适用于Mysql 5.5及之前的版本):

MySQL支持单向,异步复制,复制过程中一个服务器充当主服务器,而另外一个或多个其它服务器充当从服务器。

MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(插入、更新、删除等等),必须在主服务器上启用二进制日志。

MySQL使用3个线程来执行复制同步功能,其中两个线程(Sql线程和IO线程)在从服务器,另外一个线程(IO线程)在主服务器。

当从服务器发出start slave服务时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。

主服务器创建Binlog Dump线程将二进制日志中的内容发送到从服务器。

从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中(中继日志),接收到的日志内容依次写入到 Slave 端的Relay Log文件(mysql-relay-bin.xxxxxx)的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master- info文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”。SQL线程读取中继日志并执行日志中包含的更新。在从服务器上,读取和执行更新语句被分成两个独立的任务。

当从服务器启动时,其I/O线程可以很快地从主服务器索取所有二进制日志内容,然后执行sql线程。

Mysql 5.6 特性

由于Mysql 5.6 引入了 GTID(Global Transaction ID),保证 Slave 在复制的时候不会重复执行相同的事务操作;其次,是用全局事务 IDs 代替由文件名和物理偏移量组成的复制位点,定位 Slave 需要复制的 binlog 内容,在旧的 binlog 事件基础上新增两类事件

1.Previous_gtids_log_event 该事件之前的全局事务 ID 集合
2.Gtid_log_event 标记之后的事务对应的全局事务 ID

MySQL 5.6 的 binlog 文件中,每个事务的开始不是 “BEGIN” ,而是 Gtid_log_event 事件。

详解可以参考 https://gitsea.com/wp-content/uploads/2013/06/MySQL_Innovation_Day_Replication_HA.pdf

优点:
1.使用 GTIDs 作为主备复制的位点,在写 binlog 时用 Gtid_log_event 标记事务

2.主从复制不再基于master的binary logfile和logfile postition,从服务器连接到主服务器之后,把自己曾经获取到的GTID(Retrieved_Gtid_Set)发给主服务器,主服务器把从服务器缺少的GTID及对应的transactions发过去即可.

3.采用多个sql线程,每个sql线程处理不同的database,提高了并发性能,即使某database的某条语句暂时卡住,也不会影响到后续对其它的database进行操作.

配置Master-Master

一.创建同步用户

分别在两台mysql上执行


1

2

mysql> grant replication slave on *.* to ‘replicate‘@‘%‘ identified by ‘123456‘;

mysql> flush privileges;

二.修改my.cnf

修改 /etc/my.cnf 前最好做个备份

Master-A 的my.cnf配置


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

binlog-format=ROW //二进制日志的格式,有row、statement和mixed几种类型,

log-slave-updates=true

gtid-mode=on //启用GTID

enforce-gtid-consistency=true //启用GTID

master-info-repository=TABLE//默认是file,选择table方式保存

relay-log-info-repository=TABLE//默认是file,选择table方式保存

sync-master-info=1 //实时同步

slave-parallel-workers=2 //设定从服务器的SQL线程数;0表示关闭多线程复制功能

binlog-checksum=CRC32 //日志校验

master-verify-checksum=1//启用校验

slave-sql-verify-checksum=1//启用校验

binlog-rows-query-log-events=1//只对row-based binlog有效

server-id=1

report-port=3307

port=3306

log-bin=master-a-bin.log

report-host=192.168.1.168

innodb_flush_log_at_trx_commit=1 //)每N次事务提交或事务外的指令都需要把日志写入(flush)硬盘

sync_binlog=1 //This makes MySQL synchronize the binary log’s contents to disk each time it commits a transaction 

auto_increment_offset = 1// 设置AUTO_INCREMENT起点

auto_increment_increment = 2//设置AUTO_INCREMENT增量

replicate-do-db = test//需要同步的数据库

replicate-ignore-db = mysql,information_schema,performance_schema//不需要同步的数据库

Master-B 的my.cnf配置


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

binlog-format=ROW

log-slave-updates=true

gtid-mode=on

enforce-gtid-consistency=true

master-info-repository=TABLE

relay-log-info-repository=TABLE

sync-master-info=1

slave-parallel-workers=2

binlog-checksum=CRC32

master-verify-checksum=1

slave-sql-verify-checksum=1

binlog-rows-query-log-events=1

server-id=2

report-port=3307

port=3306

log-bin=master-a-bin.log

report-host=192.168.1.169

innodb_flush_log_at_trx_commit=1

sync_binlog=1

auto_increment_offset = 1

auto_increment_increment = 2

replicate-do-db = test

replicate-ignore-db = mysql,information_schema,performance_schema

三.重启Mysql,启动Slave服务

首先重启两台mysql服务,

在Master-A 执行如下操作


1

2

change master to master_host=‘192.168.1.169‘, master_user=‘replicate‘,master_password=‘123456‘,master_auto_position=1;

start slave;

在Master-B 执行如下操作


1

2

change master to master_host=‘192.168.1.168‘, master_user=‘replicate‘,master_password=‘123456‘,master_auto_position=1;

start slave;

接下来就可以测试了,两边的test数据库增加不同的数据,都会同步到另外一台服务器上
同时还可以通过 show slave status G;查看相关服务状态

配置Keepalived

修改keepalived.cnf 文件,默认放置/etc/keepalived/
Master-A 的keepalived.conf配置如下


1

2

3

4

5

6

7

8

9

10

11

12

13

14

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

! Configuration File for keepalived

bal_defs {

   notification_email {

     ****@163.com

   }

   notification_email_from ***[email protected]

   smtp_server smtp.qq.com

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

vrrp_instance VI_1 {

    state MASTER

    interface eth0 //网卡

    virtual_router_id 51 //同一实例下virtual_router_id必须相同 

    priority 100 //定义优先级,数字越大,优先级越高 BACKUP 优先级要低于MASTER

    advert_int 1 //MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒 

    authentication { //验证类型和密码

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress { //VIP

        192.168.1.100

    }

}

vrrp_instance VI_2 {

    state BACKUP

    interface eth0

    virtual_router_id 52

    priority 50

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.200

    }

}

Master-B keepalived.conf 配置如下


1

2

3

4

5

6

7

8

9

10

11

12

13

14

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

! Configuration File for keepalived

bal_defs {

   notification_email {

     ***@163.com

   }

   notification_email_from ***@qq.com

   smtp_server smtp.qq.com

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    virtual_router_id 51

    priority 50

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.100

    }

}

vrrp_instance VI_2 {

    state MASTER

    interface eth0

    virtual_router_id 52

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.200

    }

}

在开启keepalived服务之前先关闭防火墙,keepalived服务会占用112和255端口
然后通过sudo service keepalived start 开启服务,读者可以随意开启和停止keepalived测试看看IP有没有自动切换。
在遇到问题的时候可以通过ip add show eth0 和tail -f /var/log/messages进行问题定位。

锦上添花
添加mysql监控功能,当一台服务器的mysql进程挂掉之后,自动重启mysql服务,如果重启失效,则停止运行keepalived,进行容灾切换
首先安装nmap,运行yum -y install nmap
分别在两台服务器上的/opt目录下新增chk_mysql.sh脚本,内容如下


1

2

3

4

5

6

7

8

9

10

11

12

13

#!/bin/sh

# check mysql server status

PORT=3306

nmap localhost -p $PORT | grep "$PORT/tcp open"

#echo $?

if [ $? -ne 0 ];then

    service mysql stop

    service mysql start

    sleep 5

    nmap localhost -p $PORT | grep "$PORT/tcp open"

    [ $? -ne 0 ] && service keepalived stop

fi

增加可执行权限 chmod +x /opt/chk_mysql.sh

把Master-A的keepalived.conf 修改成如下内容


1

2

3

4

5

6

7

8

9

10

11

12

13

14

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

49

50

! Configuration File for keepalived

bal_defs {

   notification_email {

     ****@163.com

   }

   notification_email_from ***[email protected]

   smtp_server smtp.qq.com

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

vrrp_script chk_mysql_port {

    script "/opt/chk_mysql.sh"

    interval 2

    weight 2

}

vrrp_instance VI_1 {

    state BACKUP

    interface eth0 //网卡

    virtual_router_id 51 //同一实例下virtual_router_id必须相同 

    priority 50 //定义优先级,数字越大,优先级越高 BACKUP 优先级要低于MASTER

    advert_int 1 //MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒 

    authentication { //验证类型和密码

        auth_type PASS

        auth_pass 1111

    }

    track_script {

        chk_mysql_port

    }

    virtual_ipaddress { //VIP

        192.168.1.100

    }

}

vrrp_instance VI_2 {

    state MASTER

    interface eth0

    virtual_router_id 52

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    track_script {

        chk_mysql_port

    }

    virtual_ipaddress {

        192.168.1.200

    }

}

同理,相应的修改Master-B的配置文件。
重启服务生效之后,你会发现,手动关闭mysql服务之后,会被keepalived自动开启服务。

分类:Mysql标签:centosKeepalivedMysql双主热备读写分离

评论 (3)Trackbacks (1)发表评论Trackback

  1. 艺搜天下站长

    2014年3月9日11:22 | #1

    回复 | 引用

    搜”mysql 双主 读写分离”,此文排第一!

  2. 新手

    2014年4月12日21:53 | #2

    回复 | 引用

    你好,今天拜读了您的文章,其中有两个问题跟您探讨下,
    三.重启Mysql,启动Slave服务,两台机器应该是一台A和一台B,而不是两台A吧,
    第二,您在配置keepalived时候,同一个vrrp_instance 中,两机器的priority是相等的,不知道是笔误还是怎么回事,看不懂,以上两点,让指教。

  3. frankwong

    2014年4月12日22:53 | #3

    回复 | 引用

    你好,谢谢你这么细致的阅读,两处确实都是我的笔误。已修正。再次感激。@新手

时间: 10-07

Mysql + keepalived 实现双主热备读写分离【转】的相关文章

Mysql双主热备+LVS+Keepalived高可用操作记录

MySQL复制能够保证数据的冗余的同时可以做读写分离来分担系统压力,如果是主主复制还可以很好的避免主节点的单点故障.然而MySQL主主复制存在一些问题无法满足我们的实际需要:未提供统一访问入口来实现负载均衡,如果其中master宕掉的话需要手动切换到另外一个master,而不能自动进行切换.前面介绍了Mysql+Keepalived双主热备高可用方案记录,那篇文档里没有使用到LVS(实现负载均衡),而下面要介绍的就是如何通过Keepalived+LVS方式来是实现MySQL的高可用性,利用LVS

Mysql+Keepalived双主热备高可用操作步骤详细解析

mysql+keepalived双主热备高可用的介绍: 我们通常说的双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务.当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短.MySQL双主复制,即互为Master-Slave(只有一个Master提供写操作),可以实现数据库服务器的热备,但是一个Master宕机后不能实现动态切换.使用Keepalived,可以通过虚拟IP,实现双主对外的统一接口以及自动检查.失败切换机制,从而实现MySQL数据库的

Mysql+Keepalived双主热备高可用操作记录

环境: ubuntu18.04.2 mysql5.7.21 1 #1)安装keepalived并将其配置成系统服务.master1和master2两台机器上同样进行如下操作: 2 apt-get install libssl-dev 3 apt-get install openssl 4 apt-get install libpopt-dev 5 [[email protected] ~]# cd /usr/local/src/ 6 [[email protected] src]# wget h

​Keepalive实现mysql双主热备

Keepalive实现mysql双主热备 环境描述: OS: CentoOS6.6_X64 Node1:172.16.10.1 Node2:172.16.10.2 VIP:172.16.10.10 1.配置主机互信 Node1: [[email protected]~]# ifconfig eth0 eth0      Link encap:Ethernet  HWaddr 00:0C:29:11:21:56            inet addr:172.16.100.1  Bcast:17

Mysql+keeoalived双主热备高可用操作记录

我们通常说的双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务.当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短.之前梳理了Mysql主从同步,下面说下Mysql+keeoalived双主热备高可用方案的实施. 1)Keepalived的工作原理是VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议.在VRRP中有两组重要的概念:VRRP路由器和虚拟路由器,主控路由器和备份路由器. 2)VRRP路由器

Linux 下mysql的双主热备

Linux 下mysql的双主热备                             作者:浩浩哥来了 1.数据库同步设置   主机操作系统:RedHatEnterprise Linux 6 数据库版本 前提:MYSQL数据库正常启动 假设两台主机地址分别为:   ServA:192.168.18.112 ServB:192.168.18.114   注意:操作前,全文查找替换,将server A.B替换成实际IP   2.配置同步账号   在ServA上增加一个ServB可以登录的帐号:

MySql数据库双主(双向)同步实现数据库双主热备

MySql数据库双主(双向)同步实现数据库双主热备配置步骤有一点复杂,大家一定要看清楚每一步小细节哦,希望文章对各位会带来帮助呀. 之前写过一篇 mysql Master Slave主从同步(复制)配置,属于数据库备份级别的.现在的需求是,两台服务器上都装有数据库,为了防止某一服务器出现问题而影响业务的运行,需要准备两台服务器分别运行mysql,且需要两台服务器的数据是保持同步的.也就是现在要说的mysql双向同步,实现数据库主备模式. 基础环境 操作服务器系统:Ubuntu 12.04 64-

[Mysql高可用]——双主互备+keepalived

实验架构图    实验环境 主机名 操作系统 Mysql版本 keepalived版本 主机IP VIP lyj1(Master/Slave) Red Hat release 6.5 Mysql5.6.31 keepalived-1.2.12 10.0.100.201 10.0.100.220 lyj2(Slave/Master) Red Hat release 6.5 Mysql5.6.31 keepalived-1.2.12 10.0.100.202 构建双主互备 1. 分别修改DB1和DB

Keepalived+nginx双主互备模型实现

Keepalived双主互备模型实现 实验拓扑概述 本次实验所涉及的系统发行版本为:CentOS6.6-64bit:内核版本:2.6.32-504.el6.x86_64 (nod1)Nginx代理1:配置有nginx服务,向外部宣称一个公网ip接收外部客户端请求,网卡eth0桥接模式,配置有内网ip172.16.13.11:eth1(1.1.1.2/24)仅主机模式,模拟与出口路由器通信接口,nod1为VIP1的MASTER时,VIP(1.1.1.100/32)配置于eth1的别名eth1:1上