MySQL主从复制集群添加slave节点

首先已经有了两台主从复制的节点

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开始同步数据,等于是将旧库完整的同步到新库中。

线上切换到新的数据库之后,将新库的主库断开和旧库的主从复制,然后独立运行,此时,数据将完整写入到新库中,不会出现数据遗漏的现象。

posted @ 2022-01-05 11:44  梦想俱乐部  阅读(668)  评论(0编辑  收藏  举报