Dual Master 复制架构(Master-Master)

1. Dual Master 复制架构(Master-Master)


说明:

1)   相比Master-Slave架构,可以避免因为正常的常规维护操作的停机所带来重新搭建replication的麻烦(因为任何一端都记录了自己当前复制到对方的什么位置了,系统重启之后,自动复制,不需人工干预,节省维护成本)

2)   结合keepalived等第三方HA软件,在故障时自动转移,自动切换服务,不影响应用且不需人工干预。

3)   正常情况下,其中一端提供写,另一端只提供读,避免复制冲突。

说明:

1)      VIP1提供读写服务,定向到master1

2)      VIP2只提供读服务,定向到master2

3)      任意一台数据库服务器宕机,自动切换到另外一台服务器,VIP1VIP2不访问不受影响,故障期间读写都定位到同一台服务,当数据库恢复时,自动复制变更,VIP自动切换回原始配置的服务器。



[root@hdytest04 keepalived]# cat keepalived.conf 

#全局配置
global_defs {
    #机器标识
    router_id MySQL-HA  

vrrp_script chk_mysql {
    script “/root/check_mysql.sh”
    interval 5
}
vrrp_sync_group VG1 {
     group {
       mysql-ha1
     }
}


vrrp_sync_group VG2 {
     group {
       mysql-ha2
     }
}


vrrp_instance mysql-ha1 {  
    state BACKUP           #state指定instance的初始状态,但这里指定的不算,还是得通过优先级竞选来确定。两台配置此处均是BACKUP。
    interface eth0         #实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的
    virtual_router_id 81   #这里设置VRID,这里非常重要,相同的VRID为一个组,他将决定多播的MAC地址
    priority 100           #设置本节点的优先级,优先级高的为master 
    advert_int 1           #检查间隔,默认为1秒
    authentication {       #这里设置认证
        auth_type PASS  
        auth_pass mysqlmm 
    }  
    track_script {
        chk_mysql
    }
    virtual_ipaddress {    #这里设置的就是VIP,也就是虚拟IP地址
        10.10.11.15
    }  
}  


vrrp_instance mysql-ha2 {
    state BACKUP           #state指定instance的初始状态,但这里指定的不算,还是得通过优先级竞选来确定。两台配置此处均是BACKUP。
    interface eth0         #实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的
    virtual_router_id 82   #这里设置VRID,这里非常重要,相同的VRID为一个组,他将决定多播的MAC地址
    priority 90           #设置本节点的优先级,优先级高的为master
    advert_int 1           #检查间隔,默认为1秒
    authentication {       #这里设置认证
        auth_type PASS
        auth_pass mysqlmm
    }
    track_script {
        chk_mysql
    }
    virtual_ipaddress {    #这里设置的就是VIP,也就是虚拟IP地址
        10.10.11.16
    }



virtual_server 10.10.11.15 3306 {  
    delay_loop 2  #每个2秒检查一次real_server状态  
    lb_algo wrr      
    lb_kind DR       
    persistence_timeout 60   #会话保持时间  
    protocol TCP  
    real_server 10.10.11.14 3306 {  
        weight 3  
        notify_down /root/mysql.sh #检测到服务down后执行的脚本  
        TCP_CHECK {  
            connect_timeout 10     #连接超时时间  
            nb_get_retry 3         #重连次数  
            delay_before_retry 3   #重连间隔时间  
            connect_port 3306      #健康检查端口  
        }  
    }
}   


virtual_server 10.10.11.16 3306 {
    delay_loop 2  #每个2秒检查一次real_server状态
    lb_algo wrr   
    lb_kind DR    
    persistence_timeout 60   #会话保持时间
    protocol TCP 
    real_server 10.10.11.14 3306 {
        weight 3 
        notify_down /root/mysql.sh #检测到服务down后执行的脚本
        TCP_CHECK {
            connect_timeout 10     #连接超时时间
            nb_get_retry 3         #重连次数
            delay_before_retry 3   #重连间隔时间
            connect_port 3306      #健康检查端口
        } 
    }
}   
[root@hdytest04 keepalived]# 




[root@hdytest03 keepalived]# cat keepalived.conf 

#全局配置
global_defs {
    #机器标识
    router_id MySQL-HA  

vrrp_script chk_mysql {
    script “/root/check_mysql.sh”
    interval 5
}
vrrp_sync_group VG1 {
     group {
       mysql-ha1
     }
}


vrrp_sync_group VG2 {
     group {
       mysql-ha2
     }
}


vrrp_instance mysql-ha1 {  
    state BACKUP           #state指定instance的初始状态,但这里指定的不算,还是得通过优先级竞选来确定。两台配置此处均是BACKUP。
    interface eth0         #实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的
    virtual_router_id 81   #这里设置VRID,这里非常重要,相同的VRID为一个组,他将决定多播的MAC地址
    priority 90           #设置本节点的优先级,优先级高的为master 
    advert_int 1           #检查间隔,默认为1秒
    authentication {       #这里设置认证
        auth_type PASS  
        auth_pass mysqlmm 
    }
    track_script {
        chk_mysql
    }  
    virtual_ipaddress {    #这里设置的就是VIP,也就是虚拟IP地址
        10.10.11.15
    }  
}


vrrp_instance mysql-ha2 {
    state BACKUP           #state指定instance的初始状态,但这里指定的不算,还是得通过优先级竞选来确定。两台配置此处均是BACKUP。
    interface eth0         #实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的
    virtual_router_id 82   #这里设置VRID,这里非常重要,相同的VRID为一个组,他将决定多播的MAC地址
    priority 100           #设置本节点的优先级,优先级高的为master
    advert_int 1           #检查间隔,默认为1秒
    authentication {       #这里设置认证
        auth_type PASS
        auth_pass mysqlmm
    }
    track_script {
        chk_mysql
    }
    virtual_ipaddress {    #这里设置的就是VIP,也就是虚拟IP地址
        10.10.11.16
    }
}
  
virtual_server 10.10.11.15 3306 {  
    delay_loop 2  #每个2秒检查一次real_server状态  
    lb_algo wrr      
    lb_kind DR       
    persistence_timeout 60   #会话保持时间  
    protocol TCP  
    real_server 10.10.11.13 3306 {  
        weight 3  
        notify_down /root/mysql.sh #检测到服务down后执行的脚本  
        TCP_CHECK {  
            connect_timeout 10     #连接超时时间  
            nb_get_retry 3         #重连次数  
            delay_before_retry 3   #重连间隔时间  
            connect_port 3306      #健康检查端口  
        }  
    }
}




virtual_server 10.10.11.16 3306 {
    delay_loop 2  #每个2秒检查一次real_server状态
    lb_algo wrr      
    lb_kind DR
    persistence_timeout 60   #会话保持时间
    protocol TCP  
    real_server 10.10.11.13 3306 {
        weight 3  
        notify_down /root/mysql.sh #检测到服务down后执行的脚本
        TCP_CHECK {  
            connect_timeout 10     #连接超时时间
            nb_get_retry 3         #重连次数
            delay_before_retry 3   #重连间隔时间
            connect_port 3306      #健康检查端口
        }  
    }
}
[root@hdytest03 keepalived]#



[root@hdytest03 keepalived]# cat /root/check_mysql.sh 

#!/bin/bash  
MYSQL=/usr/bin/mysql  
MYSQL_HOST=localhost 
MYSQL_USER=root 
MYSQL_PASSWORD=root  
CHECK_TIME=3  
#mysql  is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0  
MYSQL_OK=1 
function check_mysql_helth (){  
MYSQLh MYSQL_HOST -u MYSQLUSERp MYSQL_PASSWORD -e “show status;” >/dev/null 2>&1
if [ ?=0];thenMYSQLOK=1elseMYSQLOK=0fireturn MYSQL_OK  
}  
while [ CHECKTIMEne0]doletCHECKTIME=1checkmysqlhelthif[ MYSQL_OK = 1 ] ; then  
          CHECK_TIME=0 
          exit 0  
     fi  
 
     if [ MYSQL_OK -eq 0 ] &&  [ CHECK_TIME -eq 0 ]  
     then  
          /etc/init.d/keepalived stop  
     exit 1   
     fi  
     sleep 1  
done
[root@hdytest03 keepalived]# 




三、双主配置

1、配置文件
master my.cnf 主要参数

log_slave_updates
log-bin = mysql-bin
server-id = 1
binlog-ignore-db=mysql

#auto_increment_increment = 2
#auto_increment_offset = 2

slave my.cnf 主要参数

log_slave_updates
log-bin = mysql-bin
server-id = 2
binlog-ignore-db=mysql

#auto_increment_increment = 2

auto_increment_offset = 1

注:
log_slave_updates  同步数据时也写入日志,二进制记录id号,互为主从时时不会引起循环。建议开启方便实施日志恢复。 可选
slave-skip-errors  跳过错误,可以通过=指定特定的错误,如:slave-skip-errors=1062  可选
log-bin = mysql-bin 开启二进制日志,必须开启,主从同步主要是通过二进制日志。 必须
sync_binlog=n  设置二进制日志在写入多少此后与硬盘同步,1 为最安全的也是效率最低的,根据实际情况设定 可选
server-id  设置mysql的id号,主从不能相同。 必须
binlog-ignore-db 设置不写入日志的库,建议设置不需要的库,节省流量。如需设置多个库可加多个此参数  可选
binlog-do-db 设置写入二进制日志的库,如设置则只有设置的库才能写入二进制日志。如需设置多个库可加多个此参数。 可选
replicate-ignore-db 设置slave不同步的库,如需设置多个库可加多个此参数。 可选
replicate-do-db 设置slave同步的库,如需设置多个库可加多个此参数。 可选
auto_increment_increment  自增增长值,如:id 设置为 auto_increment,则每次插入数据自增值为2,以1,3,5…或2,4,6…方式增长。 可选
auto_increment_offset 自增初始化便宜值,如果前一个id 为2 则 下一个为3 然后在这个基础上按auto_increment_increment 设置的值进行自增。 可选
master-host = 192.168.1.2 设置master 服务器地址,也可以启动时通过change master to 设置 。 可选
master-user = repl 设置更新用的帐号,也可以启动时通过change master to 设置 。 可选
master-password = 123 设置跟新用的密码,也可以启动时通过change master to 设置 。 可选
master-port = 3306 设置master端口,也可以启动时通过change master to 设置 。 可选

binlog-do-db、binlog-ignore-db、replicate_do_db、replicate_ignore_db 在使用时应注意,若加了以上参数,则在操作数据库是要避免跨库操作(例:update test.table1 set…)
如设置 binlog-do-db=test
use mysql;
update test.table1 set ……
第二句会执行但不会写入二进制日志,即从库不能同步,主从数据库出现差异

如设置 binlog_ignore_db=mysql
use mysql;
update test.table1 set ……
第二句会执行但不会写入二进制日志,即从库不能同步,主从数据库出现差异

如设置 replicate_do_db=test
use mysql;
update test.table1 set ……
第二句将不会被执行,即从库不能同步,主从数据库出现差异

如设置 replicate_ignore_db=mysql
use mysql;
update test.table1 set ……
第二句会被忽略执行,即从库不能同步,主从数据库出现差异

原因是设置binlog-do-db、binlog-ignore-db、replicate_do_db或replicate_ignore_db后,MySQL执行sql前检查的是当前默认数据库,所以跨库更新语句被忽略。

2、安装准备

写好配置文件重启数据库
service mysqld restart

同步数据库
可通过 tcpdump 也可以直接打包拷贝,因本次mysql都是新装设置一样,无需同步,不会同步者建议google一下。


分别在master、slave上添加同步帐号
mysql>grant replication slave on *.* to zsz@’%’ identified by ‘zzzzzzz’;

3、设置主从

查看master二进制日志状态:show master status;

在slave 执行:

mysql>change master to master_host=’192.168.1.71’,master_user=’zsz’, master_password=’zzzzzzz’,master_log_file=’mysql-bin.000007’,master_log_pos=107;

:master_log_file=’mysql-bin.000007’,master_log_pos=107 为master status中对应的内容。

mysql> slave start
mysql> show slave status\G;

其中 Slave_IO_Running: Yes,Slave_SQL_Running: Yes 表示设置成功。

测试:
在slave执行:
mysql> show databases;

在master建立测试库,并插入数据:
mysql>create database zsz;
mysql>use zsz;
mysql>create table zsz
(id int(5) not null auto_increment primary key,
name char(10) not null,
qqgroup int(10)
)type=innodb;

mysql>show databases;
mysql> show databases;

在从库执行:

mysql > show databases;


第一个为master建立数据库前,第二个为建立后。从图可以看出一切ok。

4、设置双主

在slave执行:mysql> show master status;

在master执行:
mysql>change master to master_host=’192.168.1.70’,master_user=’zsz’, master_password=’zzzzzzz’,master_log_file=’mysql-bin.000005’,master_log_pos=107;

注:master_log_file=’mysql-bin.000005’,master_log_pos=107 为master status中对应的内容。

mysql> slave start
mysql> show slave status\G;

其中 Slave_IO_Running: Yes,Slave_SQL_Running: Yes 表示设置成功。


测试:
在master执行;
mysql> use zsz;
Database changed
mysql> select * from zsz;
Empty set (0.00 sec)

关闭master
service mysqld stop

在slave执行:

mysql> use zsz;
mysql> insert into zsz(name,qqgroup) values(‘秦汉唐宋元’,’31013074’);
mysql> select * from zsz;

 

在master执行:

service mysqld start

mysql -uroot -p

mysql> use zsz;
mysql> select * from zsz;

ok,一切成功。




转载自: http://blog.csdn.net/hewy0526/article/details/8754565

你可能感兴趣的:(mysql)