1、三台服务器为相同版本cent7.9,相同版本的Mysql8.0。IP分别为10.0.0.140(master)10.0.0.141(slave)、10.0.0.142(slave)。
2、三台服务器均关闭Selinux和firewall。
临时关闭selinux
setenforce 0
永久关闭
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
关闭防火墙
systemctl stop firewalld
永久关闭
systemctl disable firewalld
3、主节点创建同步账号
create user 'repl'@'%' identified BY '12345678Dd.';
alter user 'repl'@'%' identified with mysql_native_password by '12345678Dd.';
grant all privileges on *.* to 'replicate_user'@'%' with grant option;
flush privileges;
这里创建的名为repl同步账号,并且支持mysql_native_password的验证方式
4、10.0.0.140(master)
停止mysqld
systemctl stop mysqld
编辑/etc/my.cn文件,添加
log-bin=mysql-bin(仅仅只是在master节点添加,从节点不添加)
server-id=100(这个值可以自己定义)
10.0.0.141
停止mysqld
编辑/etc/my.cn文件,添加
server-id=200(这个值跟master和别的slave不相同)
10.0.0.142
编辑/etc/my.cn文件,添加
server-id=300(这个值跟master和别的slave不相同)
三台服务器启动mysqld
5、master节点
use mysql
reset master; #重置偏移量,如果不重置,从节点也会创建replicate_user同步用户
mysql> show master status; #查看master信息
获取信息如下,从节点配置会用到:
bin-log文件:mysql-bin.000001
Position:157
6、从节点配置
use mysql
stop slave;
reset slave;
change master to master_host='10.0.0.140',master_user='repl',master_port=3306,master_password='Aa11111111@',master_log_file='mysql-bin.000001',master_log_pos=157;
参数解释:
master_host : 主节点IP
master_user : 主从同步账户
master_port : 主节点mysql服务的端口号
master_password : 主从同步账户的密码
master_log_file : master节点获取的二进制文件名字
master_log_pos : master节点获取的Position值
之后启动slave
start slave;
show slave status \G
如果看到
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
说明复制成功,但是我的Slave_IO_Running显示 connect,不是Yes,查看日志发现
Fatal error: The replica I/O thread stops because source and replica have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
原因为:我使用Vm部署的系统,并且采用了克隆的形式得到另外两台服务器,所有三台服务器的mysql UUID一致了。
解决:编辑auto.cnf文件,vi /home/mysql/auto.cnf(根据实际的配置),将UUID修改成别的,之后重启mysql,重新查看show slave status \G 发现
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
7、修改从节点为只读;
默认数据库实例是可读写,为保持数据一致性,建议从库配置为只读。
set global super_read_only=1; #super_read_only=1,超级用户只读
show global variables like '%read_only%'; #查询只读状态
8、测试
主库新建数据库,从库可以看到,从库新建表,报错1290 - The MySQL server is running with the --super-read-only option so it cannot execute this statement。说明主从复制成功,且从库只有读的权限。