一、主从复制的原理
(mysql官网复制原理图 )
MySQL之间数据复制的基础是二进制日志文件(binary log file)。一台MySQL数据库一旦启用二进制日志后,其作为master,它的数据库中所有操作都会以“事件”的方式记录在二进制日志中,其他数据库作为slave通过一个I/O线程与主服务器保持通信,并监控master的二进制日志文件的变化,如果发现master二进制日志文件发生变化,则会把变化复制到自己的中继日志中,然后slave的一个SQL线程会把相关的“事件”执行到自己的数据库中,以此实现从数据库和主数据库的一致性,也就实现了主从复制。
二、环境准备
安装mysql服务
主节点master: 192.168.81.134:3310 (root/root)
主节点master_back: 192.168.81.134:3311 (root/root)
三、双主热备架构
master和master_back互为主从关系
1、my.cnf双主配置
(1) master节点配置
#主从复制配置
server-id =1
log-bin = mysql-bin
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog-ignore-db = performance-schema
binlog-do-db = canteen_db
#binlog_format=mixed
#主-主热备主库配置
#log-slave-updates
#sync_binlog = 1
auto-increment-offset = 1
auto-increment-increment = 2
slave-skip-errors = all
replicate-do-db = canteen_db
replicate-ignore-db = mysql,information-schema,performance-schema
(2)master_back节点配置
#主从复制从库配置
#binlog_format=mixed
server-id = 6
log-bin = mysql-bin
replicate-do-db = canteen_db
replicate-ignore-db = mysql
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
#双主热备从库配置
#sync_binlog = 1
auto-increment-increment = 2
auto-increment-offset = 1
slave-skip-errors = all
binlog-do-db = canteen_db
binlog-ignore-db = mysql,information_schema,performance_schema
2、主从节点授权
(1)master和master_back分别授权
grant replication slave,reload,super on *.* to 'root'@'192.168.81.134' identified by 'root';
flush privileges;
show master status;
(2) 设置master复制信息
change master to master_host='192.168.81.134', master_user='root',master_password='root',master_port=3311,
master_log_file='mysql-bin.000003',master_log_pos=619;
flush privileges;
start slave;
show slave STATUS;
(3)设置master_back复制信息
change master to master_host='192.168.81.134', master_user='root',master_password='root',master_port=3311,
master_log_file='mysql-bin.000003',master_log_pos=619;
flush privileges;
start slave;
show slave STATUS;
3、binlog_format类型
(1)Row
Row模式下日志中会记录成每一行数据被修改的形式,日志内容会非常清楚地记录下每一行数据修改的细节。但是Row 格式有一个很大的问题,那就是日志量太大了,特别是批量 update、整表 delete、alter 表等操作,由于要记录每一行数据的变化,此时会产生大量的日志,大量的日志也会带来 IO 性能问题。
(2)Statement
Statement模式下只记录执行的 SQL,每一条会修改数据的 SQL 都会记录到 master 的 bin-log 中。slave 在复制的时候 SQL 进程会解析成和原来 master 端执行过的相同的 SQL 再次执行。
优点:首先就是解决了 row 模式的缺点,不需要记录每一行数据的变化,减少了 bin-log 日志量,节省 I/O 以及存储资源,提高性能。因为他只需要记录在 master 上所执行的语句的细节,以及执行语句时候的上下文的信息。
缺点:在 statement 模式下,由于他是记录的执行语句,在修改改数据的时候使用了某些特定的函数或者功能的时候会出现,比如:sleep() 函数在有些版本中就不能被正确复制,在存储过程中使用了 last_insert_id() 函数,可能会使 slave 和 master 上得到不一致的 id 等等。由于 row 是基于每一行来记录的变化,所以不会出现类似的问题。
(3)Mixed
Mixed 模式下系统会自动判断该用 Statement 还是 Row,一般的语句修改使用 Statement 格式保存 binlog,对于一些 Statement 无法准确完成主从复制的操作,则采用 Row保存binlog。Mixed 模式中,MySQL 会根据执行的每一条具体的 SQL 语句来区别对待记录的日志格式,也就是在 Statement 和 Row 之间选择一种。
四、故障转移
双主热备的目的是为了实现故障转移,一旦master节点挂了,master_back还能继续充当主节点工作,保证集群的高可用。在msyql集群中接入keepalived,实现主节点自动切换。
1、数据库安装
准备92.168.81.81.134、192.168.81.135两个主机,分别安装好数据库服务。依据上述步骤配置双主复制。
2、安装 keepalived
在192.168.81.81.134、192.168.81.135主机分别安装keepalived服务,以192.168.81.81.134为主机,192.168.81.135为备机:
yum install -y curl gcc openssl-devel libnl3-devel net-snmp-devel
yum install -y keepalived
3、keepalived配置
切换至 /etc/keepalived/目录下,编辑keepalived.conf文件。
(1)主机配置
global_defs {
default_interface eth0
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
#网卡配置要与所在物理机一直有eth0 或者ens33
interface eth0
#主机MASTER 从机BACKUP
state MASTER
#keepalive集群id
virtual_router_id 51
advert_int 1
#优先级
priority 150
#不抢占
nopreempt
#本机实际ip
mcast_src_ip 192.168.81.134
#虚拟化ip,可以有多个
virtual_ipaddress {
192.168.81.205
}
#集群节点通信授权
authentication {
auth_type PASS
auth_pass 11111
}
notify "/home/master/shell/notify.sh"
}
其中notify.sh用来检测134机器上的mysql,一旦134的mysql挂了,134的keepalived调用次脚本停止服务,这时外部访问自动切换到135的keepalived上,这样就可以实现故障转移。
(2)唤起脚本
#notify.sh
#!/bin/bash
cname=master1-mysql
upStatus=Up
echo "keepalived开始执行$cname健康检查"
while(true)
do
conStatus=`docker ps -a| grep $cname | awk '{print $7}'`
if [[ "$upStatus" == "$conStatus" ]]; then
echo "$cname容器状态$conStatus健康运行"
sleep 5
else
echo "$cname容器状态$conStatus异常运行,停止本机keepalived运行切换至BACKUP"
systemctl stop keepalived.service
if [ $? -eq 0 ]; then
echo "关闭keepalived成功"
else
cho "关闭keepalived失败"
fi
break
fi
done
(3)备机配置
global_defs {
default_interface eth0
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
#网卡配置要与所在物理机一直有eth0 或者ens33
interface eth0
#主机MASTER 从机BACKUP
state BACKUP
#keepalive集群id
virtual_router_id 51
advert_int 1
#优先级
priority 150
#不抢占
nopreempt
#本机实际ip
mcast_src_ip 192.168.81.135
#虚拟化ip,可以有多个
virtual_ipaddress {
192.168.81.205
}
#集群节点通信授权
authentication {
auth_type PASS
auth_pass 11111
}
}
(4)keepalived启停操作
#启动keepalived
systemctl start keepalived
#加入开机启动keepalive
systemctl enable keepalived
#关闭keepalived
systemctl stop keepalived
#查看keepalived状态
systemctl status keepalived