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


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

架构图

系统: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 事件。

详解可以参考 http://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
***8@qq.com

   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
***8@qq.com

   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自动开启服务。

时间: 2025-01-31 05:17:19

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

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

之前写过一篇 mysql Master Slave主从同步(复制)配置,属于数据库备份级别的.现在的需求是,两台服务器上都装有数据库,为了防止某一服务器出现问题而影响业务的运行,需要准备两台服务器分别运行mysql,且需要两台服务器的数据是保持同步的.也就是现在要说的mysql双向同步,实现数据库主备模式. 基础环境 操作服务器系统:Ubuntu 12.04 64-Bit 数据库版本:MySql 5.1 + 两台服务器IP: 192.168.1.2 192.168.1.3 同步账号设置 首先要在

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

业务要求 两台服务器上都装有数据库,为了防止某一服务器出现问题而影响业务的运行,需要准备两台服务器分别运行mysql,且需要两台服务器的数据是保持同步的.也就是现在要说的mysql双向同步,实现数据库主备模式. 基础环境 操作服务器系统:Ubuntu 12.04 64-Bit 数据库版本:MySql 5.1 + 两台服务器IP: 192.168.1.2 192.168.1.3 同步账号设置 首先要在两台服务器上各新增加一个可登陆的账号. grant all privileges on db_na

MySQL双机高可用的负载均衡(读写分离、主从自动切换)架构设计

架构简介   前几天网友来信说帮忙实现这样一个架构:只有两台机器,需要实现其中一台死机之后另一台能接管这台机器的服务,并且在两台机器正常服务时,两台机器都能用上.于是设计了如下的架构.ps://www.centos.bz/wp-content/uploads/2014/12/%E5%8F%8C%E6%9C%BAha%E6%9E%B6%E6%9E%84%E5%9B%BE.png" /> 此架构主要是由keepalived实现双机高可用,维护了一个外网VIP,一个内网VIP.正常情况时,外网V

MySQL数据库如何实现双机热备的配置

  1.mysql数据库没有增量备份的机制,当数据量太大的时候备份是一个很大的问题.还好mysql数据库提供了一种主从备份的机制,其实就是把主数据库的所有的数据同时写到备份数据库中.实现mysql数据库的热备份. 2.要想实现双机的热备首先要了解主从数据库服务器的版本的需求.要实现热备mysql的版本都要高于3.2,还有一个基本的原则就是作为从数据库的数据库版本可以高于主服务器数据库的版本,但是不可以低于主服务器的数据库版本. 3.设置主数据库服务器 a.首先查看主服务器的版本是否是支持热备的版

CENTOS中如何利用Keepalived构建双主MySQL+双机热备

系统环境:CentOS 6.3 x64 MySQL版本:mysql-5.6.10 Keepalived版本:keepalived-1.2.7 MySQL-VIP:192.168.7.253 MySQL-master1:192.168.7.201 MySQL-master2:192.168.7.249 首先关闭iptables和SELINUX # service iptables stop # setenforce 0 # vi /etc/sysconfig/selinux -----------

Linux双机热备解决方案之Heartbeat

拓扑图: 环境描述: 操作系统:CentOS6.3_x64 主:eth0 192.168.10.10 心跳:eth1 192.168.1.10 备:eth0 192.168.10.20 心跳:eth1 192.168.1.20 VTP:192.168.128.5 heartbeat(Linux-HA)的工作原理:heartbeat最核心的包括两个部分,心跳监测部分和资源接管部分,心跳监测可以通过网络链路和串口进行,而且支持冗余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内

配置MySQL数据库主从服务器实现双机热备

网站:bbs.osyunwei.com程序在:Web 服务器192.168.21.129 上面数据库在:MySQL 服务器192.168.21.169 上面实现目的:增加一台MySQL 备份服务器(192.168.21.168),做为MySQL 服务器(192.168.21.169)的从服务器,这两台MySQL 服务器之间实现双机热备.即:从服务器(192.168.21.168)上面指定的数据库永远与主服务器(192.168.21.169)上面指定的数据库保持同步,并且随着主服务器(192.16

LVS+Keepalived实现负载均衡和双机热备

 1. 说明          在<keepalived实现Tomcat服务双机热备>中主要讲述如何安装及配置Keepalived来实现双机热备,主要功能是:MASTER和BACKUP两台服务器处于热备状态,对用户虚拟一个IP,屏蔽底层的真实IP地址,用户通过虚拟IP访问当前的MASTER服务器:当MASTER服务器宕机或者发生其他故障时,BACKUP自动切换为MASTER,这个过程对用户时透明的.          本文主要讲述如何安装ipvsadm.如何配置LVS+Keepalived实现

云数据库Redis版主从热备高可用方案

引言 高可用(High Available)是线上生产环境所必不可少的重要条件,阿里云数据库Redis版作为一款成熟稳定的数据库产品,针对Redis的特性也支持高可用,本文将介绍云Redis是如何实现这一方案. 架构 目前云Redis有主从版和集群版两种架构,本次主要针对主从版做HA的解析. 下图为主从版架构: 由图可知,云Redis实例有主备两个节点,平时只有Master提供服务,Slave只做热备不提供访问,Slave通过slaveof命令挂载到Master上,不断从Master接收数据,保