使用ShardingSphere实现MySQL读写分离(一)

本篇先介绍mysql一主二从的搭建

1、配置mysql一主2从

这里我使用docker创建3个mysql容器:

1、容器A:端口3309,充当主服务器,负责写入数据;

2、容器B:端口3310,充当从服务器1,负责读取数据;

3、容器B:端口3311,充当从服务器2,负责读取数据。

使用docker创建mysql容器可以查看我之前写的博客:

使用docker安装myql 8.0

这里主要介绍一主二从的mysql配置

一、准备主服务器

1、 主服务器mysql的配置

bash 复制代码
[mysqld]
# 基础配置
default-authentication-plugin=mysql_native_password  # 兼容旧客户端
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-time_zone = '+8:00'  # 中国时区
lower_case_table_names=1  # 表名不区分大小写(Windows兼容)

# 服务器唯一id,默认值1                                                                                                                                                                
server-id=1
#设置日志格式,默认为ROW                                                                                                                                                               
binlog_format=STATEMENT

# 性能配置(基础版)
max_connections=1000
innodb_buffer_pool_size=256M
skip-name-resolve  # 跳过域名解析,提升连接速度

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

2、在主服务器上创建一个slave用户

sql 复制代码
-- 创建slave用户
CREATE USER 'slave'@'%';
-- 设置密码
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
-- 刷新权限
FLUSH PRIVILEGES;

3、在主服务器上查询master状态

sql 复制代码
show MASTER STATUS;

执行后获得binlog和position的值,类似下面这样的

file:binlog.000006 position:1083

把这两值记下来,后面会用到。

注意:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化!!!

二、准备2个从服务器

1、配置mysql的my.cnf文件

容器B配置:

bash 复制代码
[mysqld]
# 服务器唯一id,默认值1
server-id=2

容器C配置:

bash 复制代码
[mysqld]
# 服务器唯一id,默认值1
server-id=3

2、在从机上配置主从关系

登录这2台从服务器,分别执行下面的命令,注意需替换为自己主服务器的信息

sql 复制代码
CHANGE MASTER TO MASTER_HOST='192.168.100.201', 
MASTER_USER='atguigu_slave',MASTER_PASSWORD='123456', MASTER_PORT=3306,
MASTER_LOG_FILE='binlog.000006',MASTER_LOG_POS=1083;

3、启动主从同步

执行下面的SQL,启动从机的复制功能

sql 复制代码
-- 启动同步
START SLAVE;
-- 查看状态(不需要分号)
SHOW SLAVE STATUS\G

使用\G让查询结果一列展示,这样看起来比较直观

当Slave_IO_Running和Slave_SQL_Running状态为yes时,则说明主从配置成功!

三、建库建表

在主机中执行以下SQL,在从机中查看数据库、表和数据是否已经被同步

sql 复制代码
CREATE DATABASE db_user;
USE db_user;
CREATE TABLE t_user (
 id BIGINT AUTO_INCREMENT,
 uname VARCHAR(30),
 PRIMARY KEY (id)
);
INSERT INTO t_user(uname) VALUES('Tim');
INSERT INTO t_user(uname) VALUES(@@hostname);

如果从机出现同样的库和表,则说明mysql主从配置成功!

四、主从配置的停止和重置

1、停止

需要的时候,可以使用如下SQL语句

-- 在从机上执行。

-- 功能说明:停止I/O 线程和SQL线程的操作。

sql 复制代码
stop slave; 

2、重置

-- 在从机上执行。

-- 功能说明:用于删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件。

sql 复制代码
reset slave;

-- 在主机上执行。

-- 功能说明:删除所有的binglog日志文件,并将日志索引文件清空,重新开始所有新的日志文件。

-- 用于第一次进行搭建主从库时,进行主库binlog初始化工作;

sql 复制代码
reset master;

五、 常见问题

1、启动主从同步后,常见错误是`Slave_IO_Running: No 或者 Connecting` 的情况,此时查看下方的 `Last_IO_ERROR`错误日志,根据日志中显示的错误信息在网上搜索解决方案即可

2、典型的错误例如:`Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from position > file size'`

解决方案:

sql 复制代码
-- 在从机停止slave
SLAVE STOP;

-- 在主机查看mater状态
SHOW MASTER STATUS;
-- 在主机刷新日志
FLUSH LOGS;
-- 再次在主机查看mater状态(会发现File和Position发生了变化)
SHOW MASTER STATUS;
-- 修改从机连接主机的SQL,并重新连接即可

3、启动docker容器后提示 `WARNING: IPv4 forwarding is disabled. Networking will not work.`

此错误,虽然不影响主从同步的搭建,但是如果想从远程客户端通过以下方式连接docker中的MySQL则没法连接

解决方案:

bash 复制代码
#修改配置文件:
vim /usr/lib/sysctl.d/00-system.conf
#追加
net.ipv4.ip_forward=1
#接着重启网络
systemctl restart network

拓展:MySQL binlog的工作模式

MySQL binlog的三种工作模式:

1、Row(用到MySQL的特殊功能如存储过程、触发器、函数,又希望数据最大化一直则选择Row模式)

简介:日志中会记录每一行数据被修改的情况,然后在slave端对相同的数据进行修改。

优点:能清楚的记录每一行数据修改的细节

缺点:数据量太大

2、Statement (默认)

简介:每一条被修改数据的sql都会记录到master的bin-log中,slave在复制的时候sql进程会解析成和原来master端执行过的相同的sql再次执行。在主从同步中一般是不建议用statement模式的,因为会有些语句不支持,比如语句中包含UUID函数,以及LOAD DATA IN FILE语句等

优点:解决了 Row level下的缺点,不需要记录每一行的数据变化,减少bin-log日志量,节约磁盘IO,提高性能。

缺点:容易出现主从复制不一致

3、Mixed(混合模式) 简介:结合了Row level和Statement level的优点,同时binlog结构也更复杂。

可以简单理解为binlog是一个记录数据库更改的文件,主从复制时需要此文件。

相关推荐
CoovallyAIHub2 小时前
BMW GenAI4Q:每57秒下线一辆车,AI如何为每辆车定制专属质检清单
数据库·算法·架构
wang2455981992 小时前
Redis基础——1、Linux下安装Redis(超详细)
linux·数据库·redis
oscar9992 小时前
Memurai:Redis官方认可的Windows原生解决方案
数据库·windows·redis
A10169330712 小时前
redis的启动方式
数据库·redis·bootstrap
IvorySQL2 小时前
速看!HOW 2026 12 大分论坛出品人集结
数据库·postgresql·开源
V1ncent Chen2 小时前
SQL大师之路 11 外连接和自连接
数据库·sql·mysql·数据分析
zklgin2 小时前
PostgreSQL常用时间函数与时间计算提取示例说明
数据库·postgresql
曾阿伦2 小时前
SQL CRUD 用法详解:从入门到实战的完整指南
数据库·sql
gaozhiyong08132 小时前
SpringBoot连接多数据源MySQL、SqlServer等(MyBatisPlus测试)
spring boot·mysql·sqlserver