通常,为了简化逻辑,其中一个Master会设置为只读,正常只通过另外一个Master进行读写。 若要两边都写,为了避免自增id冲突,一般会设置奇偶错开,即一台的自增ID均为奇数,另一台均为偶数。
保持两个数据库的状态自动同步。对任何一个数据库的操作都自动应用到另外一个数据库,始终保持两个数据库数据一致。 这样做的好处是: 1. 可以做灾备,其中一个坏了可以切换到另一个。 2. 可以做负载均衡,可以将请求分摊到其中任何一台上,提高网站吞吐量。 对于异地热备,尤其适合灾备。
一.主-主复制
Master1 ip:192.168.44.137
Master2 ip:192.168.44.139
Virtual ip:192.168.44.188
原理:简单的说就是把 一个服务器上执行过的sql语句在别的服务器上也重复执行一遍, 这样只要两个数据库的初态是一样的,那么它们就能一直同步。其实只要做互为主从备份
1.Master1
vim /etc/my.cnf
|
|
|
|
2.Master2
vim /etc/my.cnf
|
|
|
|
二.Keepalive安装部署(实现MySQL双主高可用,故障转移)
yum install -y gcc make openssl openssl-devel ipvsadm perl-DBI perl-DBD-MySQL
wget http://www.keepalived.org/software/keepalived-1.2.12.tar.gz
tar -xzvf keepalived-1.2.12.tar.gz
cd keepalived-1.2.12
./configure –prefix=/usr/local/keepalived
make && make install
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp -rf /usr/local/keepalived/etc/keepalived/ /etc/
Slave1
vim /etc/keepalived/keepalived.conf
|
|
在slave2中
修改priority为90,并去掉nopreempt使之抢占
检查的pl脚本(也可为shell脚本)
vim check_slave.pl
|
|
service keepalived start
三.测试
1,以vip连接mysql
mysql -uamoeba -p1234 -h192.168.44.188
|
|
2,在master1
ip addr
|
|
故障模拟,上关闭slave,停止MySQL复制线程
3,以vip连接mysql
会发现当停掉复制线程后,执行查询时连接中断了一次,马上再次连接上完成查询,显示的server_id已经变成2了,表示服务器已经切换了。
Tips:在 双主(多主循环)互相备份。 因为每台数据库服务器都可能在同一个表中插入数据,如果表有一个自动增长的主键,那么就会在多服务器上出现主键冲突。 解决这个问题的办法就是让每个数据库的自增主键不连续。 上图说是, 我假设需要将来可能需要10台服务器做备份, 所以auto-increment-increment 设为10. 而 auto-increment-offset=1 表示这台服务器的序号。 从1开始, 不超过auto-increment-increment。这样做之后, 我在这台服务器上插入的第一个id就是 1, 第二行的id就是 11了, 而不是2,同理,在第二台服务器上插入的第一个id就是2, 第二行就是12。