MySQL 主从复制架构搭建及其原理

前言

系统的性能瓶颈一般出现在数据库上,以 mysql 为例,如果存在高并发的写请求,势必会有锁表,锁数据行的情况发生,这时候如果有读请求刚好访问到被锁的数据,那么读请求会阻塞,直到写请求处理完释放锁,系统性能大大下降。

为了提高数据库性能,可以搭建一个简单的 mysql 主从复制集群。使用 mysql 主从复制集群,master 节点用来处理写请求,slave 节点用来处理读请求,当 master 数据变化时,自动将新的数据异步同步到 slave 节点上,实现读写分离。根据读请求的并发量的大小,动态扩展集群里的 slave 节点,实现水平化扩容。

本文演示搭建一个 mysql 主从复制集群(一主一从)的基本流程。

启动两台虚拟机,地址分别为 192.168.130.128,192.168.130.129,两台机器都以安装了 mysql 8.0.36

Linux(CentOS7)安装 MySQL8-CSDN博客https://blog.csdn.net/typeracer/article/details/137183709

主库

配置文件

[mysqld]下增加以下内容

配置要给Slave同步的数据库

binlog-do-db=test

不用给Slave同步的数据库,一般是Mysql自带的数据库就不用给Slave同步了

binlog-ignore-db=mysql

binlog-ignore-db=information_schema

binlog-ignore-db=performance_schema

binlog-ignore-db=sys

自动清理7天前的log文件

expire_logs_days=7

启用二进制日志

log-bin=mysql-bin

为 0 则是文件系统自行决定什么时候来做同步,或者cache满了之后才同步到磁盘,性能最好,不过风险也最大

为 n 每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。

sync_binlog=1

Master的id,这个要唯一,唯一是值,在主从中唯一

server-id=1

主库读写

read_only = 0

启动服务

指定我们自己的配置文件启动 mysql 服务

bash 复制代码
./mysqld --defaults-file=/usr/local/mysql/my.cnf

查看 log_bin 是否开启

bash 复制代码
show variables like '%log_bin%';

查看主库状态

bash 复制代码
show master status;

File 和 Position 需要记下来,在从库配置连接主库时需要用到。

创建同步用户

bash 复制代码
create user 'backup'@'%' IDENTIFIED BY '123456';
grant file on *.* to 'backup'@'%';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to 'backup'@'%';

从库

配置文件

指定要同步master的数据库,不填默认复制全部

replicate-do-db=test

配置从服务器的ID,唯一的

server-id=2

从库只读

read_only=1

启动服务

指定我们自己的配置文件启动 mysql 服务

bash 复制代码
./mysqld --defaults-file=/usr/local/mysql/my.cnf

配置主库连接

  • source_host 主库ip
  • source_port 主库端口
  • source_user 主库创建的同步用户
  • source_password 密码
  • master_log_file 主库的binlog文件
  • mast_log_pos 主库的binlog文件偏移量
  • get_master_public_key 获取主库公钥加密密码
bash 复制代码
change replication source  to source_host='192.168.130.128',source_port=3306,source_user='backup',source_password='123456',master_log_file='mysql-bin.000001',master_log_pos=157,get_master_public_key=1;

注意

这里是从库配置连接主库使用的用户和密码

由于本文使用的是mysql8,在创建主库的同步用户时没有指定认证方式,所以在配置连接主库时需要加上 get_master_public_key=1 这个参数,否则启用同步后,IO线程会出错误,状态一直为Replica_IO_Running: Connecting,从而同步不了。

如果创建用户时指定了 mysql_native_password 认证方式,则不需要加上此参数。

bash 复制代码
#指定认证方式
create user 'backup'@'%' identified with 'mysql_native_password' by '123456';

#若没有指定认证方式,MySQL 8.0默认使用caching_sha2_password
# 如果使用caching_sha2_password认证方式,mysql会要求连接开启SSL,或者使用RSA对密码进行加密
# 否则连接可能会报如下的错误:Message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.

create user 'backup'@'%' IDENTIFIED BY '123456';

开启同步

开启同步

bash 复制代码
start replica;

其他相关命令

bash 复制代码
stop replica;

reset replica all;

查看从库状态

bash 复制代码
show replica status\G;

IO 线程和 SQL 线程状态都为 Yes,即主从配置成功。

验证

在主库创建 test 库,在 test 库中创建 test 表,插入一条数据

create database test;

use test;

create table test

(

id varchar(30) collate utf8mb4_general_ci default '' not null

primary key,

name varchar(100) collate utf8mb4_general_ci null,

parentId varchar(30) collate utf8mb4_general_ci null comment '父分类id'

)

comment 'test';

insert into test values('1','name1',null);

从库检查

主从复制原理

plantUML

复制代码
@startuml
'https://plantuml.com/sequence-diagram

autonumber

database master
participant 主库bin_log
participant 从库IO线程
participant 从库relay_log
participant 从库SQL线程
database slave

master <- slave: 连接主库
master -> 主库bin_log: 数据更新\n写入二进制日志
从库IO线程 -> 主库bin_log: 读取
从库IO线程 -> 从库relay_log: 写入
从库SQL线程 -> 从库relay_log: 读取
从库SQL线程 -> slave: 重放

@enduml

时序图

相关推荐
Elastic 中国社区官方博客几秒前
Elasticsearch 和 Kibana 8.16:Kibana 获得上下文和 BBQ 速度并节省开支!
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
车载诊断技术2 分钟前
电子电气架构--- 实施基于以太网的安全车载网络
网络·人工智能·安全·架构·汽车·电子电器架构
晴天のVlog3 分钟前
Fastapi使用MongoDB作为数据库
数据库·python·mongodb·fastapi
三杯温开水4 分钟前
基于 CentOS7.6 的 Docker 下载常用的容器(MySQL&Redis&MongoDB),解决拉取容器镜像失败问题
redis·mysql·docker
向上的车轮8 分钟前
ODOO学习笔记(8):模块化架构的优势
笔记·python·学习·架构
chusheng184016 分钟前
Python 正则表达式进阶用法:量词与范围
python·mysql·正则表达式
Desmend__16 分钟前
正则表达式那些事儿
数据库·mysql·正则表达式
袁庭新33 分钟前
LuaRocks如何安装数据库驱动?
java·数据库·redis·lua·luarocks·袁庭新
Narutolxy44 分钟前
从 MySQL 5.7 到 8.0:理解 GROUP BY 的新规则与实战优化20241112
数据库
chusheng18401 小时前
Python 正则表达式进阶用法:分组与引用详解
数据库·python·正则表达式