概念:
1. 在主库上把数据更改(DDL DML DCL)记录到二进制日志(Binary Log)中。
2. 备库I/O线程将主库上的日志复制到自己的中继日志(Relay Log)中。
3. 备库SQL线程读取中继日志中的事件,将其重放到备库数据库之上。
1.全新机器安装mysql57-分别安装
2.能够互相通信
master1(主节点):192.168.88.133
master2(从节点):192.168.88.134
3.配置域名解析(所有的机器都需要做)
[root@master1 ~]# vim /etc/hosts 192.168.88.133 master1 192.168.88.134 master2
1.准备数据1(验证主从同步使用)
mysql> create database master1db; mysql> create table master1db.master1tab(name char(50)); mysql> insert into master1db.master1tab values (1111); mysql> insert into master1db.master1tab values (2222); mysql> select * from master1db.master1tab; +------+ | name | +------+ | 111 | | 222 | +------+ 2 rows in set (0.01 sec)
2.开启二进制日志
[root@master1 ~]# vim /etc/my.cnf [mysqld] log_bin server-id=1
3.创建复制用户
mysql> grant replication slave, replication client on *.* to 'rep'@'10.18.41.%' identified by 'Yuanwei@123';
4.备份master数据库的数据
[root@master1 ~] mysqldump -p'Yuanwei@123' --all-databases --single-transaction --master-data=2 --flush-logs > `date +%F`-mysql-allyw.sql
5.准备数据2(验证主从同步使用)
mysql> insert into master1db.master1tab values (333); mysql> insert into master1db.master1tab values (444); mysql> select * from master1db.master1tab; +------+ | name | +------+ | 111 | | 222 | | 333 | | 444 | +------+ 4 rows in set (0.01 sec)
1.部署数据库应用,做域名解析
2.测试rep用户是否可用,预防账户问题。
[root@master2 ~]# mysql -h master1 -urep -p'Yuanwei@123' 能进入数据库即可
3.启动服务器序号(不用在从设备上开启二进制日志,没有人向master2请求日志。)
[root@master2 ~]# vim /etc/my.cnf server-id=2 [root@master2 ~]# systemctl restart mysqld
4.手动同步数据
mysql> set sql_log_bin=0; mysql> source /tmp/2021-06-19-mysql-allyw.sql mysql> select * from master1db.master1tab; +------+ | name | +------+ | 111 | | 222 | +------+ 2 rows in set (0.01 sec)
5.设置主服务器(重点命令)
mysql> change master to -> master_host='master1', //设置同步的主服务器 -> master_user='rep', //同步的主服务器的用户名 -> master_password='QianFeng@123', 同步的主服务器的用户密码 -> master_log_file='localhost-bin.000002', //设置数据同步的文件 -> master_log_pos=154; //设置从什么地方开始同步数据
6.启动从设备
mysql> start slave;
7.查看启动状态(IO-YES/SQL-YES)
mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: master1 Master_User: rep Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master1-bin.000002 Read_Master_Log_Pos: 1210 Relay_Log_File: master2-relay-bin.000002 Relay_Log_Pos: 1378 Relay_Master_Log_File: master1-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes 后面还有一些相关的信息,此处省略。
8.进入数据库查看是否实现数据同步
master2: mysql> select * from master1db.master1tab; +------+ | name | +------+ | 111 | | 222 | | 333 | | 444 | +------+ 4 rows in set (0.00 sec) ************************************************************************************************ master1: mysql> insert into master1db.master1tab values (555); mysql> insert into master1db.master1tab values (666); master2: mysql> select * from master1db.master1tab; +------+ | name | +------+ | 111 | | 222 | | 333 | | 444 | | 555 | | 666 | +------+ 6 rows in set (0.00 sec)
MySQL集群主从复制(一主一从)搭建完成。
与上一个实验需求基同。master1 作为主mysql,master2 作为从mysql。
不同之处,使用了
“gtid_mode=ON
enforce_gtid_consiste=1”
该属性自动记录posion位置,不需要手动指定。
1、请重置master2数据库
[root@master2 ~]# systemctl stop mysqld [root@master2 ~]# rm -rf /var/lib/mysql/* [root@master2 ~]# systemctl start mysqld [root@master2 ~]# grep password /var/log/mysqld.log [root@master2 ~]# mysqladmin -p'VsudOt+g%5Nw' password 'Yuanwei@123'
2、master1启动二进制日志,服务器ID,GTID
[root@master2 ~]# vim /etc/my.cnf log_bin server-id=1 gtid_mode=ON enforce_gtid_consistency=1 [root@master2 ~]# systemctl restart mysqld
3、master2
mysql> set sql_log_bin=0; mysql> source /tmp/2021-06-19-mysql-allyw.sql mysql> select * from master1db.master1tab;
4、设置主服务器
mysql> change master to master_host='master1', master_user='rep', master_password='Yuanwei@123', master_auto_position=1; //开启自动记录position位置的功能
5、验证方法跟前面的方式一样
前面的实验,主服务器单节点设置。假如主服务器故障会影响全局的写入事件,故要设置双主。
目前已经设置master1为master2的主服务器,只需设置master2为master1的主服务器即可。
环境准备,做好域名解析。
192.168.88.133 master1 192.168.88.134 master2 192.168.88.135 slave1 192.168.88.136 slave2
1.在master2 上进行授权
mysql> grant replication slave, replication client on *.* to 'rep'@'192.168.88.%' identified by 'Yuanwei@123'; mysql> flush privileges;
2.master1
mysql> change master to master_host='master2',master_user='rep',master_password='Yuanwei@123',master_auto_position=1; mysql> start slave; mysql> show slave status\G;
3.测试
master1上插入数据,在master2上观察。
master2上插入数据,在master1上观察。
双方同步成功,双主设置完成。
master1
[root@master1 ~]# mysqldump -p'Yuanwei@123' --all-databases --single-transaction --master-data=2 --flush-logs > `date +%F`-mmss-all.sql [root@master1 ~]# scp -r 2020-1-1-mmss-all.sql slave1:/tmp [root@master1 ~]# scp -r 2020-1-1-mmss-all.sql slave2:/tmp
slave1
[root@slave1 ~]# mysql -p'Yuanwei@123' < /tmp/2020-1-1-mmss-all.sql
slave2
[root@slave2 ~]# mysql -p'Yuanwei@123' < /tmp/2020-1-1-mmss-all.sql
slave1
[root@slave1 ~]# vim /etc/my.cnf server-id=3 gtid_mode=ON enforce_gtid_consistency=1 master-info-repository=TABLE relay-log-info-repository=TABLE [root@slave1 ~]# systemctl restart mysqld
slave2
[root@slave1 ~]# vim /etc/my.cnf server-id=4 gtid_mode=ON enforce_gtid_consistency=1 master-info-repository=TABLE relay-log-info-repository=TABLE [root@slave1 ~]# systemctl restart mysqld
4、设置主服务器
slave1:将master1和master2设置为主服务器(slave2操作如同slave1)
mysql> change master to -> master_host='master1', -> master_user='rep', -> master_password='Yuanwei@123', -> master_auto_position=1 for channel 'master1'; mysql> change master to -> master_host='master2', -> master_user='rep', -> master_password='Yuanwei@123', -> master_auto_position=1 for channel 'master2'; mysql> start slave; mysql> show slave status\G;
5、测试
master1 插入数据
master2插入数据
slave1查看
slave2查看
6、做到这里,MySQL集群的主从复制就完成了。