目录基础知识MySQL主从同步的主要应用场景有:原理设置主从同步,还有以下几个前提:实验环境模拟实现主从同步首先在docker中拉取mysql5.7版本的镜像:通过以下命令进入到Mast...
基础知识
随着业务复杂度的增加,单台 MySQL 数据库服务器已不能满足实际的需求,取而代之的是数据库服务器集群。MySQL 具有支持分布式的特性,能轻松搭建一个支持高并发的 MySQL 数据库服务器集群。在集群中我们必须保证各个 MySQL 节点的数据是同步的。主从同步就是一种最为常见的同步方式。
主从同步是指,在数据同步过程中,一台服务器充当主服务器(Master),接收来自用户的内容更新,另一个或多个其它的服务器充当从服务器(Slave),接收来自主服务器的 binlog 内容,解析出 SQL 语句,更新到从数据库,使得主从服务器的数据达到一致。
MySQL 主从同步的主要应用场景有:
- 从服务器作为主服务器的备份节点,防止单点灾难;
- 后续,可以在主从同步的基础上,通过一些数据库中间件实现读写分离,从而大幅提高数据库的并发性能;
- 根据业务将多个从服务器进行拆分,实现专库专用。
从 MySQL5.6 版本开始,实现主从数据同步有两种方式:基于日志(binlog)和基于 GTID(全局事务标示符)。
原理
要实现 MySQL 主从同步,首先必须打开 Master 端的 binlog 记录功能,否则就无法实现。因为整个同步过程实际上就是 Slave 端从 Master 端获取 binlog 日志,然后再在 Slave 上以相同的顺序执行从 binlog 日志中所记录的各种 SQL,如下图所示。
m:
sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
apt update
apt install vim
使用以下命令切换到 /etc/mysql
目录下,修改配置文件 my.cnf
:
cd /etc/mysql
vim my.cnf
在 my.cnf
中添加如下配置:
[mysqld]
server-id=101
log-bin=mysql-slave-bin
relay_log=edu-mysql-relay-bin
参数说明:
log-bin
:开启二进制日志功能,以备 Slave 作为其它 Slave 的 Master 时使用relay_log
:配置中继日志
之后使用以下命令重启 mysql 使配置文件生效。
service mysql restart
docker start slaveMysql
docker exec -it slaveMysql /bin/bash
进入 MySQL:
mysql -uroot -p123456
接下来执行以下命令:
change master to
master_host='172.17.0.2',
master_user='slave',
master_password='123456',
master_port=3306,
master_log_file='mysql-bin.000001',
master_log_pos= 617,
master_connect_retry=30;
参数说明:
master_host
:Master 的地址,指的是容器的独立 IP,可以通过docker inspect --format='{{.NetworkSettings.IPAddress}}' masterMysql
查询 Master 的 IP
master_user
:Master 中设置的用户名
master_password
:Master 中设置的用户名对应密码
master_port
: Master 的端口号,指的是容器的端口号
master_log_file
:二进制日志文件名(这里注意填写为实验者在之前使用 show master status
命令查询出来的值)
master_log_pos
:二进制日志的 position 值(这里注意填写为实验者在之前使用 show master status
命令查询出来的值)
master_connect_retry
:如果连接失败,重试的时间间隔,单位是秒,默认是 60 秒
执行以下命令,启动主从操作:
start slave;
执行以下命令,查询 Slave 状态:
show slave status\G
结果如下:
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.17.0.2
Master_User: slave
Master_Port: 3306
Connect_Retry: 30
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 617
Relay_Log_File: edu-mysql-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
我们主要查看的是 Slave_IO_Running 和 Slave_SQL_Running ,如果它们的值都是 Yes,则表示主从环境配置成功。
测试主从复制就比较简单了,我们仿照之前的实验,在 Master 中新建一个 world 数据库,然后插入一些数据:
CREATE DATABASE world;
USE world;
CREATE TABLE student(
stuId INT(10) NOT NULL,
stuName VARCHAR(10) NOT NULL,
stuAge INT(10) NOT NULL,
PRIMARY KEY(stuId)
);
INSERT INTO student(stuId, stuName, stuAge) VALUES(1, 'zhangsan', 18),(2, 'lisi', 19), (3, 'wangwu', 18);
在 Slave 中执行:
SHOW DATABASES;
可以看到我们在 Master 中新建的 world 数据库已经同步过来了。
再执行以下命令查看插入的数据是否也同步过来了:
USE world;
SELECT * FROM student;
可以看到插入的数据也已经同步过来了。
接下来再在 Master 删除一条数据:
DELETE FROM student
WHERE stuId = 1;
再在 Slave 中执行以下命令查看数据是否同步成功:
SELECT * FROM student;
此时主从复制情况良好。
以上就是mysql主从同步原理及应用场景示例详解的详细内容,更多关于mysql主从同步的资料请关注我们其它相关文章!
本文标题为:mysql主从同步原理及应用场景示例详解
- Numpy中如何创建矩阵并等间隔抽取数据 2023-07-28
- 基于Python制作一个简单的文章搜索工具 2023-07-28
- SQLSERVER调用C#的代码实现 2023-07-29
- MySQL8.0.28安装教程详细图解(windows 64位) 2023-07-26
- Mongodb启动报错完美解决方案:about to fork child process,waiting until server is ready for connections. 2023-07-16
- 在阿里云CentOS 6.8上安装Redis 2023-09-12
- redis清除数据 2023-09-13
- SQL Server 2022 AlwaysOn新特性之包含可用性组详解 2023-07-29
- Oracle 删除大量表记录操作分析总结 2023-07-23
- 搭建单机Redis缓存服务的实现 2023-07-13