首先已经有了两台主从复制的节点
192.168.8.133 主
192.168.8.134 从1
再添加一个slave节点
192.168.8.135 从2
mysql主从集群搭建方法参考:MySQL5.7.30主从复制集群搭建及互为主从集群搭建
首先要在135上安装mysql服务,方法见:centos7 MySQL5.7.30安装步骤及问题处理
使用配置文件:/etc/my.cnf
[mysqld]
port=3306
socket=/usr/local/mysql/mysql.sock
#skip-grant-tables
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
server-id=3
log_bin=mysql-bin
[mysqld_safe]
pid-file=/usr/local/mysql/mysql.pid
log-error=/usr/local/mysql/error.log
!includedir /etc/my.cnf.d
启动135上的MySQL服务并修改相关信息
新增一个slave节点,常用的方案有两种:
方案1:-复制主库
复制主库要步骤:
将内存中的数据同步到表中;
锁定表,不让出现新数据;
备份;
解锁;
将备份传送到slave02,在slave02上同步数据;
slave2上设置相应的master_log_file和master-log_pos。
方案2:复制从库
停止从库slave01:mysql> stop slave;
看当前从库的状态,mysql> show slave status;记下 Relay_Master_Log_file 和 Exec_Master_Log_Pos;
备份从库数据
将备份传送到slave02,在slave2上同步数据;
slave02上设置相应的master_log_file和master-log_pos。
注意:此方案中master_log_file和master-log_pos也和slave中一样,指向主库。
方案对比
从主库复制会造成主库Master一定时间段锁表,这段时间会影响主库的使用。直接从从库进行复制,就不会对主库产生影响了。
但是,从从库复制要保证的是复制过程中从库上的数据不会发生变化,所以要先停掉从库。
这里我们主要实验方案2
1,在主库上创建测试数据:
mysql> use test;
Database changed
mysql> create table user02(id int(5),name char(10));
Query OK, 0 rows affected (0.03 sec)
mysql> insert into user02 values (00002,'lisi');
Query OK, 1 row affected (0.01 sec)
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| user02 |
+----------------+
1 row in set (0.00 sec)
mysql> select * from user02;
+------+------+
| id | name |
+------+------+
| 2 | lisi |
+------+------+
1 row in set (0.00 sec)
授权slave2
grant replication slave on *.* to rep3@192.168.8.135 identified by '123456';
2,在slave1节点上停止主从复制查看信息
mysql> stop slave;
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| user02 |
+----------------+
1 row in set (0.00 sec)
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.8.133
Master_User: rep1
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 923
Relay_Log_File: localhost-relay-bin.000003
Relay_Log_Pos: 768
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
.........
这里主要记录下面两项:
Read_Master_Log_Pos: 923
Relay_Master_Log_File: mysql-bin.000001
2,备份slave1的数据库并传到slave2
mysqldump -u root -p123456 test > test.sql
scp -rp test.sql 192.168.8.135:/root
3,主库133继续创建测试数据
mysql> create database test4;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
| test1 |
| test2 |
| test4 |
+--------------------+
8 rows in set (0.00 sec)
目的是为了检测:slave2在恢复以前的数据后,同样会同步master的新数据
4,slave2恢复备份数据
cp -rp test.sql /tmp/
chown -R mysql.mysql /tmp/
mysql -u root -p123456
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
mysql> use test;
mysql> source /tmp/test.sql;
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
.......
5,备库slave2开启主从复制
mysql> change master to master_host='192.168.8.133',master_user='rep3',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=923;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.8.133
Master_User: rep3
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 1376
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 773
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
.....
6,开启slave1的主从复制
start slave;
7,查看slave2的同步信息
我们在备份的时候,仅仅备份了slave1的test数据,之后我们在master上新建了一个名为test4的库,如果主从开启正常,此时应该在slave2中也自动同步过来了。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
| test4 |
+--------------------+
6 rows in set (0.00 sec)
mysql> use test
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| user02 |
+----------------+
1 row in set (0.00 sec)
数据正常同步,表示slave2节点添加成功
这里有一个思考点:
在生产环境中,我们有数据库迁移的问题,由于原始数据库的数据量非常大,且不停的在更新,备份数据耗时太长且无法保证数据完整性,此时备份数据再恢复就不是最佳选择了。
可以把新库的master设置为旧库的slave,从154和mysql-bin.000001开始同步数据,等于是将旧库完整的同步到新库中。
线上切换到新的数据库之后,将新库的主库断开和旧库的主从复制,然后独立运行,此时,数据将完整写入到新库中,不会出现数据遗漏的现象。