MySQL主从同步、主从同步结构、复制模式

MySQL主从同步

主从同步概述

  • 实现数据自动同步的服务结构
  • 主服务器:接受客户端访问连接
  • 从服务器:自动同步主服务器数据

主从同步原理

Master

  • 启用binlog日志

Slave:

  • Slave_IO:复制master主机 binlog日志文件里的SQL命令到本机的relay-log文件里。
  • Slave_SQL:执行本机relay-log文件里的SQL语句,实现与Master数据一致。

构建主从同步

graph LR
master(master:192.168.1.11)-->slave(slave:192.168.1.12)

主从同步实现步骤

主服务器
  • 启用binlog日志
  • 授权用户
  • 查看binlog日志信息
从服务器
  • 设置server_id
  • 确保与主服务器数据一致
  • 指定主库信息
  • 启动slave程序
  • 查看状态信息
准备主服务器数据
[root@zzgrhel8 ~]# scp -r /root/tedu_nsd/dbs/mysql_scripts/ 192.168.1.11:/root
[root@zzgrhel8 ~]# ssh 192.168.1.11
[root@mysql1 ~]# mysql -uroot -pNSD2021@tedu.cn < mysql_scripts/nsd2021_data.sql 
主服务器配置
// 修改配置文件
[root@mysql1 ~]# vim /etc/my.cnf
[mysqld]
server_id = 11
log-bin = master11
... ...

// 启动服务
[root@mysql1 ~]# systemctl restart mysqld

// 验证配置
[root@mysql1 ~]# ls /var/lib/mysql/master11.*
/var/lib/mysql/master11.000001  /var/lib/mysql/master11.index
[root@mysql1 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master11.000001 |      154 |              |                  |                   |
+-----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

// 如果日志不是master11.000001,希望回到最初状态,可以执行以下命令:
mysql> reset master;

// 授权辅助服务器可以同步数据
mysql> grant replication slave on *.* to repluser@'%' identified by 'NSD2021@tedu.cn';
mysql> show grants for repluser@'%';
+--------------------------------------------------+
| Grants for repluser@%                            |
+--------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'%' |
+--------------------------------------------------+
1 row in set (0.00 sec)
配置从服务器
  • 修改配置文件
[root@mysql2 ~]# vim /etc/my.cnf
[mysqld]
server_id = 12
... ...

[root@mysql2 ~]# systemctl restart mysqld
  • 如果主服务器上已有一段时间的数据,需要将主服务器数据完全同步到从服务器。
# 主服务器备份数据
[root@mysql1 ~]# mysqldump -uroot -pNSD2021@tedu.cn --master-data nsd2021 > /root/fullbackup.sql

[root@mysql1 ~]# scp /root/fullbackup.sql 192.168.4.12:/root/

# 从服务器恢复数据
mysql> create database nsd2021 default charset utf8mb4;
[root@mysql2 ~]# mysql -uroot -pNSD2021@tedu.cn nsd2021 < /root/fullbackup.sql

--master-data的作用:如果完全备份完成后,又有新的数据产生,它可记录备份时的数据状态信息。

  • 查看binlog日志名和偏移量
// 使用备份的方式同步主服务器数据,在备份文件中查找
[root@mysql2 ~]# grep master11 fullbackup.sql
CHANGE MASTER TO MASTER_LOG_FILE='master11.000001', MASTER_LOG_POS=174149;

// 没有进行数据同步的,查看主服务器日志状态
[root@mysl2 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master11.000001 |   174149 |              |                  |                   |
+-----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
  • 在从服务器上配置同步的主库信息
[root@mysql2 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> change master to
    -> master_host="192.168.1.11",
    -> master_user="repluser",
    -> master_password="NSD2021@tedu.cn",
    -> master_log_file="master11.000001",
    -> master_log_pos=174149;
Query OK, 0 rows affected, 2 warnings (0.10 sec)
  • 启动slave程序
mysql> start slave;
Query OK, 0 rows affected (0.03 sec)
  • 验证:查看状态信息
mysql> show slave status\G
... ...
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
... ...
  • 验证:查看从服务器上的相关文件
[root@mysql2 ~]# ls /var/lib/mysql
文件 说明
master.info 主库信息
relay-log.info 中继日志信息
主机名-relay-bin.xxxxxx 中继日志
主机名-relay-bin.index 索引文件
  • 排错

    • 通过show slave status查看错误说明

    • 如果在从库上配置主库信息输入错误需要关闭后slave功能配置,然后再开启slave功能

      mysql> stop slave;
      mysql> show slave status\G
      mysql> start slave;
      
    • master.info文件和relay-log.info文件有配置记录,可用于排错

    • 将表中的4个文件全部删除重启服务,可以还原为独立的、非从服务器。

验证主从同步效果
  • 在主服务器上添加授权用户,允许客户端进行连接
[root@mysql1 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> grant all on nsd2021.* to admin@'%' identified by 'NSD2021@tedu.cn';
Query OK, 0 rows affected, 1 warning (0.06 sec)
  • 客户端连接主服务器,更新数据
// 确认客户端已安装客户端软件
[root@zzgrhel8 ~]# rpm -q mysql-community-client
mysql-community-client-5.7.17-1.el7.x86_64

[root@zzgrhel8 ~]# mysql -h 192.168.1.11 -uadmin -pNSD2021@tedu.cn

// 查看自己的权限
mysql> show grants;
+----------------------------------------------------+
| Grants for admin@%                                 |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO 'admin'@'%'                  |
| GRANT ALL PRIVILEGES ON `nsd2021`.* TO 'admin'@'%' |
+----------------------------------------------------+
2 rows in set (0.00 sec)

// 增加数据
mysql> use nsd2021;
mysql> insert into departments(dept_name) values('sales1');
Query OK, 1 row affected (0.05 sec)

mysql> insert into departments(dept_name) values('sales2');
Query OK, 1 row affected (0.05 sec)

mysql> insert into departments(dept_name) values('sales3');
Query OK, 1 row affected (0.08 sec)
  • 从服务器验证同步数据
[root@mysql2 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> use nsd2021;
mysql> select * from departments where dept_name like 'sales_';
+---------+-----------+
| dept_id | dept_name |
+---------+-----------+
|       9 | sales1    |
|      10 | sales2    |
|      11 | sales3    |
+---------+-----------+
3 rows in set (0.00 sec)

主从同步结构

结构类型

  • 一主一从
graph LR
m(master)-->s(slave)
  • 一主多从
graph LR
m(master)-->s1(slave1)
m-->s2(slave2)
  • 主从从
graph LR
m(master)-->s1(slave1)
s1-->s2(slave2)
  • 互为主从(双主结构)
graph LR
m(master)-->s(slave)
s-->m

一主多从配置

graph LR
m(master:192.168.1.11)-->s1(slave1:192.168.1.12)
m-->s2(slave2:192.168.1.13)

主服务器数据备份

[root@mysql1 ~]# mysqldump -uroot -pNSD2021@tedu.cn --master-data nsd2021 > /root/fullbackup.sql

从服务器配置

  • 修改配置文件
[root@mysql3 ~]# vim /etc/my.cnf
[mysqld]
server_id=13
... ...

[root@mysql3 ~]# systemctl restart mysqld
  • 同步数据
# 主服务器拷贝完全备份数据到从服务器
[root@mysql1 ~]# scp fullbackup.sql 192.168.1.13:/root

# 创建数据库
[root@mysql3 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> create database nsd2021 default charset utf8mb4;

# 还原数据
[root@mysql3 ~]# mysql -uroot -pNSD2021@tedu.cn nsd2021 < fullbackup.sql 
  • 配置从服务器
# 获取日志文件名和偏移量
[root@mysql3 ~]# grep master11 fullbackup.sql
CHANGE MASTER TO MASTER_LOG_FILE='master11.000001', MASTER_LOG_POS=175286;

# 配置同步
[root@mysql3 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> change master to
    -> master_host="192.168.1.11",
    -> master_user="repluser",
    -> master_password="NSD2021@tedu.cn",
    -> master_log_file="master11.000001",
    -> master_log_pos=175286;
Query OK, 0 rows affected, 2 warnings (0.16 sec)

# 启动从库
mysql> start slave;

# 查看状态
mysql> show slave status\G

客户端验证

  • 客户端连接主服务器更新数据,查看从服务器同步内容

主从从配置

graph LR
m(master:192.168.1.13)-->s1(slave1:192.168.1.14)
s1-->s2(slave2:192.168.1.15)

主服务器配置

  • 将一主多从配置中的从服务器192.168.1.13改为主服务器
[root@mysql3 ~]# cd /var/lib/mysql
[root@mysql3 mysql]# rm -f master.info relay-log.info mysql3-relay-bin.*
[root@mysql3 ~]# systemctl restart mysqld
[root@mysql3 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> show slave status;
Empty set (0.00 sec)
  • 创建用于同步的用户
mysql> grant replication slave on *.* to repluser@'%' identified by 'NSD2021@tedu.cn';
  • 修改配置文件
[root@mysql3 ~]# vim /etc/my.cnf
[mysqld]
server_id=13
log-bin=master13
... ...
  • 重启并验证
[root@mysql3 ~]# systemctl restart mysqld
[root@mysql3 ~]# ls /var/lib/mysql/master13.*
/var/lib/mysql/master13.000001  /var/lib/mysql/master13.index

从服务器配置

  • 由于该机器也是192.168.1.14的主服务器,所以它也需要有主服务器的配置
  • 创建用于同步的用户
[root@mysql4 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> grant replication slave on *.* to repluser@'%' identified by 'NSD2021@tedu.cn';
  • 修改配置文件
[root@mysql4 ~]# vim /etc/my.cnf
[mysqld]
server_id = 14
log-bin = master14
log_slave_updates    # 在主上同步过来的日志,写到自己的binlog一份
... ...
[root@mysql4 ~]# systemctl restart mysqld
  • 从主服务器同步数据
# 主服务器备份数据
[root@mysql3 ~]# mysqldump -uroot -pNSD2021@tedu.cn --master-data nsd2021 > /root/fullbackup.sql

[root@mysql3 ~]# scp fullbackup.sql 192.168.1.14:/root/

# 从服务器恢复数据
mysql> create database nsd2021 default charset utf8mb4;
[root@mysql4 ~]# mysql -uroot -pNSD2021@tedu.cn nsd2021 < /root/fullbackup.sql
  • 查看binlog日志名和偏移量
[root@mysql4 ~]# grep master13 /root/fullbackup.sql
CHANGE MASTER TO MASTER_LOG_FILE='master13.000001', MASTER_LOG_POS=154;
  • 在从服务器上配置同步的主库信息
mysql> change master to
    -> master_host="192.168.1.13",
    -> master_user="repluser",
    -> master_password="NSD2021@tedu.cn",
    -> master_log_file="master13.000001",
    -> master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.15 sec)

mysql> start slave;

mysql> show slave status\G

从服务器192.168.1.15配置

  • 修改配置文件
[root@mysql5 ~]# vim /etc/my.cnf
[mysqld]
server_id = 15
... ...

[root@mysql5 ~]# systemctl restart mysqld
  • 从主服务器同步数据
# 主服务器备份数据
[root@mysql4 ~]# mysqldump -uroot -pNSD2021@tedu.cn --master-data nsd2021 > /root/fullbackup.sql

[root@mysql4 ~]# scp fullbackup.sql 192.168.1.15:/root/

# 从服务器恢复数据
mysql> create database nsd2021 default charset utf8mb4;
[root@mysql5 ~]# mysql -uroot -pNSD2021@tedu.cn nsd2021 < /root/fullbackup.sql
  • 查看binlog日志名和偏移量
[root@mysql5 ~]# grep master14 /root/fullbackup.sql
CHANGE MASTER TO MASTER_LOG_FILE='master14.000001', MASTER_LOG_POS=173457;
  • 在从服务器上配置同步的主库信息
mysql> change master to
    -> master_host="192.168.1.14",
    -> master_user="repluser",
    -> master_password="NSD2021@tedu.cn",
    -> master_log_file="master14.000001",
    -> master_log_pos=173457;
Query OK, 0 rows affected, 2 warnings (0.15 sec)

mysql> start slave;

mysql> show slave status\G

客户端验证

  • 在主服务器上添加授权用户,允许客户端进行连接
[root@mysql3 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> grant all on nsd2021.* to admin@'%' identified by 'NSD2021@tedu.cn';
  • 客户端连接主服务器更新数据
[root@mysql3 ~]# mysql -h192.168.1.13 -uadmin -pNSD2021@tedu.cn
mysql> use nsd2021;
mysql> insert into departments(dept_name) values('sales10');
  • 查看从服务器同步内容
[root@mysql4 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> use nsd2021;
mysql> select * from departments where dept_name like 'sales1_';
+---------+-----------+
| dept_id | dept_name |
+---------+-----------+
|      13 | sales10   |
+---------+-----------+
1 row in set (0.00 sec)


[root@mysql5 ~]# mysql -uroot -pNSD2021@tedu.cn

mysql> use nsd2021;
mysql> select * from departments where dept_name like 'sales1_';
+---------+-----------+
| dept_id | dept_name |
+---------+-----------+
|      13 | sales10   |
+---------+-----------+
1 row in set (0.00 sec)

主主模式

graph LR
m(master:192.168.1.16)-->s(slave:192.168.1.17)
s-->m

将192.168.1.16作为主服务器

  • 服务器配置
[root@mysql6 ~]# vim /etc/my.cnf
[mysqld]
server_id = 16
log_bin = master16
... ...

[root@mysql6 ~]# systemctl restart mysqld

mysql> grant replication slave on *.* to repluser@'%' identified by 'NSD2021@tedu.cn';

// 查看日志文件和偏移量
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master16.000002 |      701 |              |                  |                   |
+-----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
  • 从服务器配置
[root@mysql7 ~]# vim /etc/my.cnf
[mysqld]
server_id = 17
... ...

[root@mysql7 ~]# systemctl restart mysqld

[root@mysql7 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> change master to
    -> master_host="192.168.1.16",
    -> master_user="repluser",
    -> master_password="NSD2021@tedu.cn",
    -> master_log_file="master16.000002",
    -> master_log_pos=701;
Query OK, 0 rows affected, 2 warnings (0.65 sec)

mysql> start slave;
mysql> show slave status \G

将192.168.1.17作为主服务器

  • 服务器配置
[root@mysql7 ~]# vim /etc/my.cnf
[mysqld]
server_id = 17
log_bin = master17
... ...

[root@mysql7 ~]# systemctl restart mysqld

mysql> grant replication slave on *.* to repluser@'%' identified by 'NSD2021@tedu.cn';

// 查看日志文件和偏移量
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master17.000001 |      441 |              |                  |                   |
+-----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
  • 从服务器配置
[root@mysql6 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> change master to
    -> master_host="192.168.1.17",
    -> master_user="repluser",
    -> master_password="NSD2021@tedu.cn",
    -> master_log_file="master17.000001",
    -> master_log_pos=441;
Query OK, 0 rows affected, 2 warnings (0.31 sec)

mysql> start slave;

mysql> show slave status\G

验证

  • 以192.168.1.16作为主进行验证
// 主服务器上创建数据库和表
[root@mysql6 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> create database mydb;
mysql> use mydb;
mysql> create table students(id int primary key, name varchar(20));

// 从服务器上查看
[root@mysql7 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> use mydb;
mysql> show tables;
+----------------+
| Tables_in_mydb |
+----------------+
| students       |
+----------------+
1 row in set (0.00 sec)
  • 以192.168.1.17作为主进行验证
// 主服务器上添加用户
[root@mysql7 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> use mydb;
mysql> insert into students values(1, 'tom');

// 从服务器查看
[root@mysql6 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> use mydb;
mysql> select * from students;
+----+------+
| id | name |
+----+------+
|  1 | tom  |
+----+------+
1 row in set (0.00 sec)

复制模式

异步复制(Asynchronous replication)

  • 主服务器执行完一次事务后,立即将结果返给客户端,不关心从服务器是否已经同步数据。

半同步复制(Semisynchronous replication)

  • 介于异步复制和全同步复制之间
  • 主服务器在执行完一次事务后,等待至少一台从服务器同步数据完成,才将结果返回给客户端

模式配置

  • 查看是否允许动态加载模块
mysql> show  variables  like  'have_dynamic_loading';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| have_dynamic_loading | YES   |
+----------------------+-------+
1 row in set (0.01 sec)
  • 主主模式下启用半同步复制
# 在两台服务器上修改配置文件
[root@mysql6 ~]# vim /etc/my.cnf
[mysqld]
server_id = 16
log_bin = master16
plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1
... ...
[root@mysql6 ~]# systemctl restart mysqld

[root@mysql7 ~]# vim /etc/my.cnf
[mysqld]
server_id = 17
log_bin = master17
plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1
[root@mysql7 ~]# systemctl restart mysqld
  • 查看结果
mysql> select  plugin_name, plugin_status from  information_schema.plugins  where plugin_name like '%semi%';
+----------------------+---------------+
| plugin_name          | plugin_status |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE        |
| rpl_semi_sync_slave  | ACTIVE        |
+----------------------+---------------+
2 rows in set (0.01 sec)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容