mysql高可用----双主复制+keepalived
·双主+keepalived架构
两个MYSQL Server互相将对方作为自己的Master
·方案描述:
本方案中keepalived实现故障转移,服务器单点写入,当网络、mysql服务、keepalived服务、服务器出现故障后,会自动切换到backup机器,当master服务器启动起来后会自动切换回来。
·适用场景:
适用于对数据库可用性比较高,backup可做备份容灾或读操作(如果读压力比较大,后端可添加一个或多个slave服务器,实现读写分离,让lvs/haproxy实现读的负载均衡)。在正常情况下,我们都只会将其中一端开启写服务,另外一端仅仅只是提供读服务,或者完全不提供任何服务,仅仅只是作为一个备用的机器存在。主要还是为了避免数据的冲突,防止造成数据的不一致性。因为即使在两边执行的修改有先后顺序,但由于Replication 是异步的实现机制,同样会导致即使晚做的修改也可能会被早做的修改所覆盖,又如:后面两个用于在 双主(多主循环)互相备份。 因为每台数据库服务器都可能在同一个表中插入数据,如果表有一个自动增长的主键,那么就会在多服务器上出现主键冲突。
·优点:
通过Dual Master 复制架构,不仅能够避免因为正常的常规维护操作需要的停机所带来的重新搭建Replication 环境的操作,因为我们任何一端都记录了自己当前复制到对方的什么位置了,当系统起来之后,就会自动开始从之前的位置重新开始复制,而不需要人为去进行任何干预,大大节省了维护成本。
·缺点:
主备机器切换需要1s左右时间
master机器宕机时间过长,起来后立马切换回来,master服务器更新复制数据需要一定的时间,导致数据不是最新的(keepalived 可配置主master不自动切换,等master更新完成再手动切换)
一、mysql备份工作原理
将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
1、整体上来说,复制有3个步骤:
(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
(2) slave I/O线程读取master的binary log events,写入到它的中继日志(relay log);
(3) slave SQL线程重做中继日志中的事件,将改变反映它自己的数据。
下图描述了复制的过程:
上图中有两个服务器, 演示了从一个主服务器(master) 把数据同步到从服务器(slave)的过程。
这是一个主-从复制的例子。 主-主互相复制只是把上面的例子反过来再做一遍,就可以互相备份了。
环境描述
服务器A 192.168.1.65
服务器B 192.168.1.68
漂移IP 192.168.1.200
mysql版本 5.5.27
keepalived版本 1.2.19
操作系统 CentOS release 6.7
二、mysql双主配置
1、修改主服务器A配置文件
·主服务器A:
# vi /etc/my.cnf
设置从服务器 B 需要复制的数据库
·从服务器 B
# vi /etc/my.cnf
server-id :主服务器id号 必须保证每个服务器不一样。 这可能和循环同步有关。 防止进入死循环。
log-bin:开启二进制日志 ,binlog日志的名字
binlog_format:Binlog二进制日志的格式(statement,row,mixed (默认)三种格式,大部分情况下都会选择灵活的mixed格式)
replicate-ignore-db :复制时需要排除的数据库, 除开系统的几个数据库之外,所有的数据库都复制。
log-slave-updates:当设置log_slave_updates时,你可以让slave扮演其它slave的master。此时,slave把SQL线程执行的事件写进行自己的二进制日志(binary log),然后,它的slave可以获取这些事件并执行它
#service mysqld restart(重启数据库)
2、A服务器授权及定义主从服务器操作
主服务器A:
在master上为slave添加一个同步账号,授权从服务器repdb帐号密码复制主服务器数据
①mysql> grant replication slave on *.* to 'repdb'@'192.168.1.68 identified by 'pass123';
②mysql> show master status\G //查看主服务器状态
记住这个文件名和 位置, 等会在从服务器上会用到。
3、B从服务器开启同步
CHANGE MASTER TO
MASTER_HOST='192.168.1.65',
MASTER_USER='repdb',
MASTER_PASSWORD='pass123',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000011',
MASTER_LOG_POS=107;
然后查看slave线程是否启动了
注意:
图中的红框, 两个都是Yes, 说明开启成功。
如果其中一个是No, 那就说明不成功。需要查看mysql的错误日志。密码、IP地址等问题都会导致此问题
此时A服务器主从复制至B服务器已经打开了。
测试A服务器插入修改数据,B服务器也同步更新了
所有A中的修改都能自动同步到B, 但是对B的修改却不能同步到A。 因为是单向的。 如果需要双向同步的话,需要再做一次从B到A的复制。
1、设置主服务器 A需要复制的数据库
# vi /etc/my.cnf
·主服务器A:
2、B服务器创建备份的用户
从服务器B:
在master上为slave添加一个同步账号,授权从服务器repdb帐号密码复制主服务器数据
①mysql> grant replication slave on *.* to 'repdb'@'192.168.1.65 identified by 'pass123';
②mysql> show master status\G //查看主服务器状态
记住这两个数值,等会在A上面要用。
3、A服务器启动同步
CHANGE MASTER TO
MASTER_HOST='192.168.1.68',
MASTER_USER='repdb',
MASTER_PASSWORD='pass123',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000011',
MASTER_LOG_POS=367;
上面的ip地址是B的ip地址, 因为A把B当做master了。
然后查看,slave状态是否正常:
此时双主配置成功了。
三、配置keepalived实现故障切换
1、安装keepalived(A、B服务器都需要安装)
# yum -y install gcc openssl-devel popt-devel libnl libnl-devel kernel-devel
#cd keepalived-1.2.19
# ./configure
Keepalived configuration
------------------------
Keepalived version : 1.2.19
Compiler : gcc
Compiler flags : -g -O2 -DFALLBACK_LIBNL1
Extra Lib : -lssl -lcrypto -lcrypt -lnl
Use IPVS Framework : Yes
IPVS sync daemon support : Yes
IPVS use libnl : Yes
Use VRRP Framework : Yes
Use VRRP VMAC : Yes
SNMP support : No
SHA1 support : No
Use Debug flags : No
# make
# make install
#cp /usr/local/sbin/keepalived /usr/sbin/
#cp keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
#cp keepalived/etc/init.d/keepalived.init /etc/init.d/keepalived
#cp keepalived/etc/init.d/keepalived.sysconfig /etc/sysconfig/keepalived
A服务器配置(master):
# vi /etc/keepalived/keepalived.conf
漂移IP为192.168.1.200
脚本检测mysql健康状态脚本,如果mysql不能连接,则关闭keepalived
刷新网关arp缓存脚本
#/etc/init.d/keepalived start
B服务器配置(backup):
# vi /etc/keepalived/keepalived.conf
脚本检测mysql健康状态脚本,如果mysql不能连接,则关闭keepalived
刷新网关arp缓存脚本
启动keepalived
#/etc/init.d/keepalived start
此时显示主服务器在提供服务
关闭主服务器上的mysql
[root@huiye ~]# /etc/init.d/mysqld stop
然后由keepalived配置文件可以知道,mysql关闭的话,将会执行keepalived_check_mysql.sh这一脚本。这个脚本在执行的时候,会判断mysql的状态,如果mysql关闭了,将会关闭主服务器上的keepalived。主服务器上的keepalived一旦关闭,那么从服务器马上变为主服务器,为用户提供服务,如下图所示:
主服务器:
从服务器:
此时,一旦主服务器上的mysql重新启动,然后再启动keepalived之后,主服务器又会切换成向用户提供服务的服务器。
主服务器:
mysql+keepalived自动切换完成。
参考文档
http://www.cnblogs.com/kristain/articles/4142970.html
http://blog.itpub.net/26355921/viewspace-1248096/
http://m.blog.csdn.net/blog/ssdbbg_11109/8205509