原理
一、一主一从
准备工作
1.主库配置
1、修改配置文件 /etc/my.cnf
#mysql 服务ID,保证整个集群环境中唯一,取值范围:1-232-1,默认为
server-id=1
#是否只读,1 代表只读,0代表读写
read-only=0
#忽略的数据,指不需要同步的数据库
#binlog-ignore-db=mysql
#指定同步的数据库
#binlog-do-db=db01
2.重启MySQL服务器
systemctl restart mysqld
3、登录mysql,创建远程连接的账号,并授予主从复制权限hostname
服务器名Root@123 处事话密码 8位数 需要特殊字符和大小写
CREATE USER 'hostname'@'%' IDENTIFIED WITH mysql_native_password By 'Root@123';
4、为’hostname’@‘%’ 用户分配主从复制权限
GRANT REPLICATION SLAVE ON *.* TO 'hostname'@'%';
5、通过指令,查看二进制日志坐标
show master status
字段含义说明:
file:从哪个日志文件开始推送日志文件
position:从哪个位置开始推送日志
binlog ignore db:指定不需要同步的数据库
2.从库配置
1.修改配置文件 /etc/my.cnf
#mysql服务ID,保证整个集群环境中唯一,取值范围:1-2^32-1,和主库不一样即可
server-id-2
是否只读,1代表只读,0代表读写
read-only-1
2.重启服务器
systemctl restart mysqld
3.登录mysql 设置主库配置
# 8.0.23版本以下执行
CHANGE MASTER TOMASTER_HOST = '主库的IP地址',MASTER_USER = '用于复制的用户名',MASTER_PASSWORD = '该用户对应的密码',MASTER_LOG_FILE = '主库二进制日志文件名',MASTER_LOG_POS = 主库二进制日志位置;
# 8.0.23版本以上
CHANGE REPLICATION SOURCE TOSOURCE_HOST = '主库的IP地址',SOURCE_USER = '用于复制的用户名',SOURCE_PASSWORD = '该用户对应的密码',SOURCE_LOG_FILE = '主库二进制日志文件名',SOURCE_LOG_POS = 主库二进制日志位置;
SOURCE_LOG_FILE ,SOURCE_LOG_POS 通过主库查询show master status
见主库配置5
4.开启同步
show replica status ;
#8.0.22之后
show slave status ;
#8.0.22之前
5.查看主从同步状态
3.遇到的问题
如果Replica_IO_Running是NO
1.检查防火墙配置
2.从机ping主机是否连通
ping 自己的主机域名
3.如果是通过虚拟机centos
克隆的mysql
由于虚拟机克隆,克隆完之后所有的文件都是一样的,包括IP地址、mac地址、uuid等。导致mysql的uuid一样,在搭建主从复制的时候,如果uuid是一样的,那么就不能搭建成功。出现了Slave_IO_Running:
No的情况。
解决:
1.先查看MySQL的安装位置
show variables like 'datadir';
2.通过mysql生成一个uuid用于修改
select uuid();
3.复制生成的uuid
进入查询的配置文件
,修改uuid
vim /var/lib/mysql/auto.cnf
4.重启Mysql服务
systemctl restart mysqld
二、双主双从
原理:
1、 m1、m2主机配置
1.m1
修改配置文件 /etc/my.cnf
#mysql服务ID,保证整个集群环境中唯一,取值范围:1-2^32-1,默认为1
server-id=1
#指定同步的数据库
binlog-do-db=db01
binlog-do-db=db02
binlog-do-db=db03
#在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
2.m2
修改配置文件 /etc/my.cnf
#mysql服务ID,保证整个集群环境中唯一,取值范围:1-2^32-1,默认为1
server-id=3
#指定同步的数据库
binlog-do-db=db01
binlog-do-db=db02
binlog-do-db=db03
#在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
3.重启MySQL服务器
systemctl restart mysqld
2、主机搭建
1.两台主库创建账户并授权
#创建hostname用户,并设置密码,该用户可在任意主机连接该MySQL服务
CREATE USER 'hostname'@'%' IDENTIFIED WITH mysql_native_password By 'Root@123';
2.为’hostname’@‘%’ 用户分配主从复制权限
GRANT REPLICATION SLAVE ON *.* TO 'hostname'@'%';
3.通过指令,查看两台主库的二进制日志坐标
show master status ;
3.s1、s2从库配置
1.s1 从库
server-id=2
2.s2从库
server-id=4
3.重启MySQL服务器
systemctl restart mysqld
4.链接主库
需要注意s1
对应的是m1
,s2
对应的是m2
具体方式 参照一主一从的从库设置主库
# 8.0.23版本以下执行
CHANGE MASTER TOMASTER_HOST = '主库的IP地址',MASTER_USER = '用于复制的用户名',MASTER_PASSWORD = '该用户对应的密码',MASTER_LOG_FILE = '主库二进制日志文件名',MASTER_LOG_POS = 主库二进制日志位置;
# 8.0.23版本以上
CHANGE REPLICATION SOURCE TOSOURCE_HOST = '主库的IP地址',SOURCE_USER = '用于复制的用户名',SOURCE_PASSWORD = '该用户对应的密码',SOURCE_LOG_FILE = '主库二进制日志文件名',SOURCE_LOG_POS = 主库二进制日志位置;
3.启动两台从库主从复制,查看从库状态
start slave;
show slave status \G;
3、两台主机相互复制 m1复制m2 m2复制m1 参照从链接主库
的方式
CHANGE MASTER TOMASTER_HOST = '主库的IP地址',MASTER_USER = '用于复制的用户名',MASTER_PASSWORD = '该用户对应的密码',MASTER_LOG_FILE = '主库二进制日志文件名',MASTER_LOG_POS = 主库二进制日志位置;
# 8.0.23版本以上
CHANGE REPLICATION SOURCE TOSOURCE_HOST = '主库的IP地址',SOURCE_USER = '用于复制的用户名',SOURCE_PASSWORD = '该用户对应的密码',SOURCE_LOG_FILE = '主库二进制日志文件名',SOURCE_LOG_POS = 主库二进制日志位置;
3.启动,查看状态
start slave;
show slave status \G;
三、测试
分别在两台主库m1、m2上执行DDL、DML语句,查看涉及到的数据库服务器的数据同步情况。
create database test;create table u2_table(
id int not null primary key,
name varchar(50) not null,
sex varchar(1)
)engine=innodb default charset=utf8mb4;insert into u2_table(id,name,sex) values(1,'Tom','1');
insert into u2_table(id,name,sex) values(2,'Trigger','0');
insert into u2_table(id,name,sex) values(3,'Dawn','1');
insert into u2_table(id,name,sex) values(4,'ack Ma','1');
insert into u2_table(id,name,sex) values(5,'Coco','0');
insert into u2_table(id,name,sex) values(6, 'jerry','1');