MySQL主从复制
MySQL Replication#
作用#
- Replication可以将一台主服务器数据库(master)同步到一台或多台从服务器数据库(slave)
- 其复制方式属于异步复制无需要长时间连接
- Replication是MySQL内建自带的
主从复制原理#
简单的说就是 master 将数据库的改变写入二进制日志, slave 同步这些二进制日志,并根据这些二进制日志进行数据操作
- master记录二进制日志文件 在每个事物更新数据完成之前 master在二进制日志文件记录这些改变的数据 MySQL将事物写入二进制日志文件中 在事件写入二进制日志完成之后 master通知存储引擎提交事务
- slave将master的binary log拷贝到自己的中继日志文件 首先slave会执行I/O thread线程 I/O线程会在master上打开一个普通的链接 然后开始binlog dump process binlog dump process从master读取二进制文件 如果已经读取完master的二进制日志文件 其会进入休眠状态并等待产生新的日志文件 同时将读取的事件写入到自己的中继日志文件
- SQL从线程处理最后一步 SQL从线程读取中继日志的事件且执行其中的事件 使master与slave数据保持一致
Replication作用#
- 故障切换
- 备份服务 但是无法对SQL语句产生的故障就行恢复 有限的备份
- 可以多台slave实现读写分离
Replication原理#
- master将改变的记录写到(binary log)二进制日志文件中
- slave将master上二进制日志(binary log)日志拷贝到自己的中继日志(Relay log)
- slave读取中级日志的内容 修改slave的数据
常见MySQL主从复制架构#
一主多备(One master and Muti salve)#
- 一般适用于做读写分离 master进行数据写入 slave进行数据读取
- master压力较大需要与多台slave有I/O操作
slave中继#
- 使用一台slave作为中继设备缓解master的压力
- slave需要开启bin-log并且配置log-slave-updates
- slave作为中转设备可以使用黑洞引擎无需承载数据
双主互备#
- 服务器之间互相成为master与slave
- 其破坏了事务的隔离性与一致性
MySQL主从配置#
主从配置#
在配置之前保证mysql的版本一致 防止出现未知的错误
master配置#
# 首先创建数据库 创建表格
mysql> create database TestMasterSlave;
Query OK, 1 row affected (0.00 sec)
mysql> use TestMasterSlave;
Database changed
mysql> create table test(id int,name varchar(254));
Query OK, 0 rows affected (0.01 sec)
mysql> grant replication slave on *.* to slave@'10.1.1.%' identified by "root123"; # 设置授权账号 slave通过该账号访问master
mysql> show master status;
+-------------------------+----------+-----------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------------+----------+-----------------+------------------+-------------------+
| mysql-master-log.000001 | 597 | TestMasterSlave | mysql | |
+-------------------------+----------+-----------------+------------------+-------------------+
[root@master ~]# systemctl stop firewalld.service && iptables -F && setenforce 0 # 关闭防火墙
[root@master~]# mysqldump -uroot -proot123 -B > test.sql # 将主服务器中数据库表结构导出
[root@master~]# scp test.sql 10.1.1.2:/root/ # 将导出的数据库传递给slave
[root@master~]# vim /etc/my.cnf
server-id=1 # 配置服务ID
log-bin=mysql-master-log # 配置二进制文件
binlog-do-db=TestMasterSlave # 需要同步的数据库
binlog-ignore-db=mysql # 忽略的数据库 即不需要同步
[root@master~]# systemctl restart mysqld # 重启mysql服务
slave配置#
[root@slave~]# systemctl stop firewalld.service && iptables -F && setenforce 0 # 关闭防火墙
[root@slave~]# mysql -e 'create database TestMasterSlave' -u root -p # 创建数据库
[root@slave ~]# mysql -uroot -p <test.sql # 同步master传来的数据库
[root@slave ~]# vim /etc/my.cnf
server-id=2 # 每台服务器的server-id必须唯一
[root@slave ~]# systemctl restart mysqld # 重启mysql
[root@slave ~]# mysql -uroot -p # 进入mysql
mysql> stop slave; # 先停止中继线程
mysql> change master to master_host='10.1.1.1' ,master_user='slave' ,master_password='root123'; # 使用授权账号进行数据同步
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> start slave; # 开启slave
mysql> show slave status\G; slave状态查询 # 进行
测试数据#
# master插入数据
mysql> use TestMasterSlave;
mysql> insert into test values(1,'SR');
# slave查看数据
mysql> use TestMasterSlave;
mysql> show tables;
+---------------------------+
| Tables_in_TestMasterSlave |
+---------------------------+
| test | # 表格同步
+---------------------------+
1 row in set (0.00 sec)
mysql> select * from test;
+------+------+
| id | name |
+------+------+
| 1 | SR | # 数据同步
+------+------+
双向主从#
master#
[root@master ~]# vim /etc/my.cnf
server-id=1
log-bin=mysql-bin-master
binlog-do-db=test
binlog-ignore-db=mysql
mysql> grant replication slave on *.* to slave@'10.1.1.%' identified by "root123"; # 设置授权账号
mysql> stop slave;
mysql> change master to master_host='10.1.1.2',master_user='slave',master_password='root123'; # 设置master
mysql> start slave;
mysql> show slave status;
slave#
[root@slave ~]# vim /etc/my.cnf
server-id=2
log-bin=mysql-master-bin
binlog-do-db=test
binlog-ignore-db=mysql
mysql> grant replication slave on *.* to slave@'10.1.1.%' identified by "root123"; # 设置授权账号
mysql> stop slave;
mysql> change master to master_host='10.1.1.1',master_user='slave',master_password='root123'; # 设置master
mysql> start slave;
mysql> show slave status;
测试数据#
# 10.1.1.1插入数据
mysql> use test;
mysql> create table test(id int, name varchar(254));
mysql> insert into test values(1,'SR');
# 10.1.1.2查看数据
mysql> select * from test;
+------+------+
| id | name |
+------+------+
| 1 | SR |
+------+------+
# 10.1.1.2插入数据
mysql> insert into test values(2,'MZ');
mysql> select * from test;
+------+------+
| id | name |
+------+------+
| 1 | SR |
| 2 | MZ |
+------+------+
中继主从复制#
master#
[root@master ~]# vim /etc/my.cnf
server-id=1
log-bin=master-bin-log
binlog-do-db=test
binlog-ignore-db=mysql
sync_binlog=1 # binlog写入到硬盘
binlog-format=row # binlog以行格式化输出
[root@master ~]# systemctl restart mysqld
mysql> grant replication slave on *.* to slave@'10.1.1.%' identified by "root123";
relay中继#
[root@relay ~]# vim /etc/my.cnf
server-id=2
log-bin=relay-bin-log # 二进制日志
log-slave-updates=1 # 从relay-log读取的日志文件以及本机进行的操作写到中继日志里 这样slave才能知道数据变化
binlog-format=row
[root@relay ~]# systemctl restart mysqld
mysql> grant replication slave on *.* to relay@'10.1.1.%' identified by "root123";
mysql> stop slave;
mysql> change master to master_host='10.1.1.1',master_user='slave',master_password='root123';
mysql> start slave;
slave#
[root@slave ~]# vim /etc/my.cnf
server-id=3
log-bin=slave-bin-log
binlog-format=row
[root@slave ~]# systemctl restart mysqld
mysql> stop slave;
mysql> change master to master_host='10.1.1.1',master_user='relay',master_password='root123'; # 设置master
mysql> start slave;
mysql> show slave status;
测试数据#
mysql> create database HA;
mysql> use HA
mysql> create table test(id int,name varchar(20));
mysql> insert into test values (1,'AA');
Query OK, 1 row affected (0.09 sec)
relay#
mysql> set sql_log_bin=off;
mysql> alter table test ENGINE=blackhole; # 将存储引擎修改为黑洞引擎 则中继不会保存数据
mysql> select * from test;
Empty set (0.01 sec)
slave#
mysql> select * from test;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
2019-07-24 面向对象基础