赞
踩
上一章介绍了如何安装MySQL数据库,本章将介绍MySQL的主从复制。
操作系统:CentOS 7
MySQL:5.7.40
准备3台CentOS 7服务器,并且已安装MySQL5.7.40数据库:
hostname | ip |
---|---|
db01 | 192.168.51.131 |
db02 | 192.168.51.132 |
db03 | 192.168.51.133 |
bin log:
relay log:
查看binlog日志模式
show variables like 'binlog_format';
调整binlog日志模式
set binlog_format=STATEMENT;
binlog的三种格式: STATEMENT 、 ROW 、 MIXED 。
show master logs;
or
show binary logs;
查看所有二进制日志列表
flush logs;
会生成一个新的日志文件。
reset master;
清空日志
因为binlog和relaylog日志文件是二进制文件,需要mysql的自带的mysqlbinlog工具进行解码转为可阅读的sql语句。
mysqlbinlog --base64-output=decode-rows -v -v mysql-bin.000001 > binlog
1、查看binlog是否开启可以使用命令:
show variables like 'log_bin%';
log_bin如果是 OFF 代表是未开启状态。
2、开启binlog
修改my.cnf文件
vim /ect/my.cnf
[mysqld] 添加内容
#binlog刷盘策略
sync_binlog=1
#需要备份的数据库
binlog-do-db=hello
#不需要备份的数据库
binlog-ignore-db=mysql
#启动二进制文件
log-bin=mysql-bin
#服务器ID
server-id=132
sync_binlog参数:
注:sync_binlog=0或sync_binlog大于1,事务被提交,而尚未同步到磁盘。因此,在电源故障或操作系统崩溃时有可能服务器已承诺尚未同步一些事务到二进制日志。因此它是不可能执行例行程序恢复这些事务,他们将会丢失二进制日志。
3、重启MySQL服务
systemctl restart mysqld
4、主机给从机授备份权限
GRANT REPLICATION SLAVE ON *.* TO '从机MySQL用户名'@'从机IP' identified
by '从机MySQL密码';
注:一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全。
5、刷新权限
FLUSH PRIVILEGES;
6、查询master的状态
1、修改my.conf文件
[mysqld]
server-id=133
2、删除uuid
uuid 是mysql唯一标识,克隆的系统uuid是一样的,所以需要修改。
find / -iname "auto.cnf"
rm -rf /usr/local/mysql/data/auto.cnf
3、重启
systemctl restart mysqld
4、配置从服务器
change master to
master_host='192.168.51.131',
master_port=3306,
master_user='root',
master_password='123456',
master_log_file='mysql-bin.000003',
master_log_pos=1189,
MASTER_AUTO_POSITION=0;
5、启动从服务器复制功能
start slave;
6、检查从服务器复制功能状态
show slave status \G;
注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。
7、测试
搭建成功之后,往主机中插入数据,看看从机中是否有数据;
slave:
master:
slave:
GTID就是全局事务标识符(Global Transaction Identifiers),基于事务的复制。使用 GTID 时,可以识别和跟踪每个事务,因为它在原始服务器上提交并由任何从属服务器应用;这意味着在启动新从站或故障到新主服务器时,使用 GTID 引用日志文件或这些文件中的位置时,不需要引用日志文件或位置,这大大简化了这些任务。由于基于 GTID 的复制完全基于事务,因此只需确定主复制和从级复制是否一致;只要在主主机上提交的所有事务也都提交到从站上,就保证两者之间的一致性。
GTID = server_uuid:transaction_id
server_uuid 来源于 auto.cnf
1、配置GTID主从复制
1)修改master、slave服务器的my.cnf文件
#开启GTID模式(必选)
gtid_mode=ON
#强制gtid一致性(必选)
enforce-gtid-consistency=true
2)重启数据库
systemctl restart mysqld
3)从服务器中执行change master
change master to
master_host='192.168.51.131',
master_port=3306,
master_user='root',
master_password='123456',
master_auto_position = 1;
4)开启同步
START SLAVE;
测试同上。
开始配置一个基于GTID的双主集群
修改 /etc/my.cnf 文件
# 服务器id,一般是ip的最后一段
server-id=131
# 开启binlog
log-bin=mysql-bin
# 表示自增长字段每次递增的量,其默认值是1,取值范围是1 .. 65535
auto_increment_increment=2
# 表示自增长字段从那个数开始,他的取值范围是1 .. 65535,另外一台服务器的offset为2,防止
生成的主键冲突
auto_increment_offset=1
# 开启基于GTID的复制
gtid_mode = on
# 只记录对基于gtid的复制安全的语句
enforce-gtid-consistency=true
# 服务器id,一般是ip的最后一段
server-id=132
# 开启binlog
log-bin=mysql-bin
auto_increment_increment=2
# 生成主键从2开始
auto_increment_offset=2
gtid_mode = on
enforce-gtid-consistency=true
如果之前已经开启的主从复制,建议使用 stop slave 关闭。在每个节点上切换binlog,执行如下语句:
# 使用新的binlog
mysql> flush logs;
# 清空binlog
mysql> reset master;
然后使用 change master 语句建立主从关系:
#master1执行
change master to
master_host='192.168.51.132',
master_port=3306,
master_user='root',
master_password='123456',
master_auto_position = 1;
#master2执行
change master to
master_host='192.168.51.131',
master_port=3306,
master_user='root',
master_password='123456',
master_auto_position = 1;
master1和master2节点上开启同步
START SLAVE;
查看状态
show slave status \G
master1
master2
Keepalived高可用服务对之间的故障切换转移,是通过 VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)来实现的。VRRP ,全 称 Virtual Router Redundancy Protocol ,中文名为虚拟路由冗余协议 ,VRRP的出现就是为了解决静态踣甶的单点故障问题,VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的。
安装keepalived简单方式,使用yum方式在线安装:
yum install keepalived -y
备份keepalived.conf
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
重新配置
# 配置通知的email
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.51.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
# 注释掉vrrp_strict,开启会导致其他机器无法访问虚拟IP
# vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
# 检查mysql脚本,定时执行
vrrp_script check_run {
script "/usr/check_run.sh"
interval 3
}
# 设置虚拟ip
vrrp_instance VI_1 {
# 当前节点的状态MASTER、BACKUP
state MASTER
# 当前服务器使用的网卡名称,使用ifconfig查看
interface ens33
#VRRP组名,两个节点的设置必须一样
virtual_router_id 51
#主节点的优先级(1-254之间)
priority 100
#组播信息发送间隔,两个节点设置必须一样
advert_int 1
#设置验证信息,两个节点必须一致
authentication {
auth_type PASS
auth_pass 1111
}
#虚拟IP,对外提供MySQL服务的IP地址
virtual_ipaddress {
192.168.51.130
}
}
# master2
# 配置通知的email
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.51.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
# 注释掉vrrp_strict,开启会导致其他机器无法访问虚拟IP
# vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
# 检查mysql脚本,定时执行
vrrp_script check_run {
script "/usr/check_run.sh"
interval 3
}
# 设置虚拟ip
vrrp_instance VI_1 {
# 当前节点的状态MASTER、BACKUP
state BACKUP
# 当前服务器使用的网卡名称,使用ifconfig查看
interface ens33
#VRRP组名,两个节点的设置必须一样
virtual_router_id 51
#主节点的优先级(1-254之间)
priority 100
#组播信息发送间隔,两个节点设置必须一样
advert_int 1
#设置验证信息,两个节点必须一致
authentication {
auth_type PASS
auth_pass 1111
}
#虚拟IP,对外提供MySQL服务的IP地址
virtual_ipaddress {
192.168.51.130
}
}
master1和mster2分别创建脚本
vim /usr/check_run.sh
添加一下内容
#!/bin/bash
./root/.bashrc
count=1
while true
do
mysql -uroot -proot -S /tmp/mysql.sock -e "select now();" > /dev/null 2>&1
i=$?
ps aux | grep mysqld | grep -v grep > /dev/null 2>&1
j=$?
if [ $i = 0 ] && [ $j = 0 ]
then
exit 0
else
if [ $i = 1 ] && [ $j = 0 ]
then
exit 0
else
if [ $count -gt 5 ]
then
break
fi
let count++
continue
fi
fi
done
授与执行权限
chmod 755 /usr/check_run.sh
systemctl start keepalived.service #启动
systemctl stop keepalived.service #停止
systemctl status keepalived.service #状态
systemctl restart keepalived.service #重启
查看状态
master1查看vip
1)远程连接数据库
2)插入数据测试:
用vip远程连接数据库(IP:192.168.51.130):
master1故障前,插入数据id是奇数(131服务器IP:192.168.51.131)
master1故障后:
1)vip漂移到132服务器
2)插入数据id是偶数(132服务器IP:192.168.51.132)
MySQL 5.7前只能实现一主一从、一主多从或者多主多从的复制,如果想实现多主一从的复制,只好使用MariaDB,但是MariaDB又与官方的MySQL版本不兼容的,在MySQL 5.7版本可以实现多主一从的复制了
配置步骤:
可以用navicat手动将表从任一master主机同步过来
server-id=133
gtid_mode=ON
enforce-gtid-consistency=ON
master_info_repository=table
relay_log_info_repository=table
# 复制master1
mysql> change master to
master_host='192.168.51.131',
master_port=3306,
master_user='root',
master_password='123456',
master_auto_position=1
FOR CHANNEL 'm-131';
# 复制master2
mysql> change master to
master_host='192.168.51.132',
master_port=3306,
master_user='root',
master_password='123456',
master_auto_position=1
FOR CHANNEL 'm-132';
和普通复制不同的是需要增加 FOR CHANNEL ‘xxx’ 语句指定不同的频道复制。由于是多源复制必须指定参数 master_info_repository=table
#master节点 :
mysql> flush logs;
mysql> show global variables like 'gtid_executed' \G
#slave节点:
mysql> reset master;
Query OK, 0 rows affected (0.00 sec)
mysql> set global gtid_purged='2b095e9d-5d7a-11ed-9a6a-000c296534b2:1-13,e1186686-5e58-11ed-855c-000c29920730:1-4';
Query OK, 0 rows affected (0.00 sec)
#启动节点
mysql> start slave for channel 'm-131';
#查看某一频道的复制状态
mysql> show slave status for channel 'm-131' \G
#启动节点
mysql> start slave for channel 'm-132';
mysql> show slave status for channel 'm-132' \G
配置完成,数据成功同步过来:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。