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 事件。

详解可以参考 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 ***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自动开启服务。

 
评论 (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
     

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

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

  1. Mysql之配置双主热备+keeepalived.md

    准备 1 1. 双主 master1 192.168.199.49 2 master2 192.168.199.50 3 VIP 192.168.199.52 //虚拟IP 4 2.环境 master ...

  2. 11 Mysql之配置双主热备+keeepalived.md

    准备 1. 双主 master1 192.168.199.49 master2 192.168.199.50 VIP 192.168.199.52 //虚拟IP 2.环境 master:nginx + ...

  3. Mysql主从复制,双主热备

    Mysql主从复制: 主从复制: 主机准备工作: 开启bin.Log 注意:server-id  是唯一的值 重启mysql:service mysql restart 查看是否开启成功: 查看当前状 ...

  4. MySQL集群系列2:通过keepalived实现双主集群读写分离

    在上一节基础上,通过添加keepalived实现读写分离. 首先关闭防火墙 安装keepalived keepalived 2台机器都要安装 rpm .el6.x86_64/ 注意上面要替换成你的内核 ...

  5. 使用Keepalived实现Nginx的自动重启及双主热备高可用

    1.概述 之前我们使用Keepalived实现了Nginx服务的双机主备高可用,但是有几个问题没有解决,今天一起探讨一下. 1)在双机主备机制中,Keepalived服务如果宕了,会自动启用备机进行服 ...

  6. Mysql双主热备+LVS+Keepalived高可用部署实施手册

    MySQL复制能够保证数据的冗余的同时可以做读写分离来分担系统压力,如果是主主复制还可以很好的避免主节点的单点故障.然而MySQL主主复制存在一些问题无法满足我们的实际需要:未提供统一访问入口来实现负 ...

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

    MySQL复制能够保证数据的冗余的同时可以做读写分离来分担系统压力,如果是主主复制还可以很好的避免主节点的单点故障.然而MySQL主主复制存在一些问题无法满足我们的实际需要:未提供统一访问入口来实现负 ...

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

    我们通常说的双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务.当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短.MySQL双主复制,即互为Mast ...

  9. 高可用Mysql架构_Mysql主从复制、Mysql双主热备、Mysql双主双从、Mysql读写分离(Mycat中间件)、Mysql分库分表架构(Mycat中间件)的演变

    [Mysql主从复制]解决的问题数据分布:比如一共150台机器,分别往电信.网通.移动各放50台,这样无论在哪个网络访问都很快.其次按照地域,比如国内国外,北方南方,这样地域性访问解决了.负载均衡:M ...

随机推荐

  1. WPF概述

    一.概述 WPF(Windows Presentation Foundation,视窗展示[呈现.展现.显示.表示]基础)是Windows的新一代图形子系统,他为开发人员提供了统一的编程模型,可用于构 ...

  2. iOS视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear的区别及用途

    init-初始化程序 viewDidLoad-加载视图 viewWillAppear-UIViewController对象的视图即将加入窗口时调用: viewDidApper-UIViewContro ...

  3. Swift - 02 - 常量和变量

    //: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...

  4. 动态插入图片到 svg 中

    动态插入图片到 svg 中使用 createElementNS 来创建svg标签,通过setAttributeNS 来设置属性, 要注意两点,创建的时候要有'http://www.w3.org/200 ...

  5. 在win8.1 64位环境下有关Oracle的安装和卸载

    1,Oracle安装 3 注意:在win8.1环境下安装64位的oracle客户端,注意配置是1g的 2.Oracle的卸载:http://jingyan.baidu.com/article/f7ff ...

  6. 转:So Easy!让开发人员更轻松的工具和资源

    Cascade Framework 很独特的 CSS 框架,进行了模块化划分,分类排版.表格.颜色.图标和打印样式等等. Mueller Grid System 一个模块化的网格系统,用于响应式或者固 ...

  7. Node.js 入门(2)

    1.http 请求 //调用Node.js自带的http模块 var http = require("http"); //调用http模块提供的函数createServer htt ...

  8. 关于Java中重载的若干问题

    一.问题引入 今天看视频时偶然间看到了,说父类和子类间也可以重载,貌似和以前的观念有些冲突,就验证了下…… 二.问题解决 看如下代码: public class Son extends Father ...

  9. Windows平台下主要的内存管理途径

    new / delete   malloc / free    CoTaskMemAlloc / CoTaskMemFree    IMalloc::alloc / IMalloc/free    G ...

  10. poj1797 - Heavy Transportation(最大边,最短路变形spfa)

    题目大意: 给你以T, 代表T组测试数据,一个n代表有n个点, 一个m代表有m条边, 每条边有三个参数,a,b,c表示从a到b的这条路上最大的承受重量是c, 让你找出一条线路,要求出在这条线路上的最小 ...