1. Dual Master 复制架构(Master-Master)
说明:
1) 相比Master-Slave架构,可以避免因为正常的常规维护操作的停机所带来重新搭建replication的麻烦(因为任何一端都记录了自己当前复制到对方的什么位置了,系统重启之后,自动复制,不需人工干预,节省维护成本)
2) 结合keepalived等第三方HA软件,在故障时自动转移,自动切换服务,不影响应用且不需人工干预。
3) 正常情况下,其中一端提供写,另一端只提供读,避免复制冲突。
说明:
1) VIP1提供读写服务,定向到master1
2) VIP2只提供读服务,定向到master2
3) 任意一台数据库服务器宕机,自动切换到另外一台服务器,VIP1、VIP2不访问不受影响,故障期间读写都定位到同一台服务,当数据库恢复时,自动复制变更,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 (){
MYSQL−h MYSQL_HOST -u
MYSQLUSER−p MYSQL_PASSWORD -e “show status;” >/dev/null 2>&1
if [
?=0];thenMYSQLOK=1elseMYSQLOK=0fireturn MYSQL_OK
}
while [
CHECKTIME−ne0]dolet“CHECKTIME−=1”checkmysqlhelthif[ 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