使用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是一个记录数据库更改的文件,主从复制时需要此文件。

相关推荐
张洛闻Eren1 小时前
MySQL 维护稳定系统【MySQL第二课】
linux·数据库·mysql·云原生
布莱克6052 小时前
理解索引:从概念到实践
数据库·mysql
g10565591395 小时前
LAMP博客平台Wordpress实战
android·mysql·nginx·php
我不是疯子是傻子5 小时前
Qt CAN通信周期发送抖动?实测定时器精度校准与时间戳补偿方案
开发语言·数据库·qt
这个DBA有点耶6 小时前
数据库迁移怎么做到“零翻车“:金仓 KDMS/KDTS/KFS 工具链实测
数据库·架构·dba
2501_937860946 小时前
MySQL联合查询(多表查询)
数据库·mysql
名字还没想好☜7 小时前
Next.js 用 Server Components 直连数据库:去掉 API 层的边界,和三条别踩的安全红线
前端·javascript·数据库·安全·react·next.js
迷迭香yy7 小时前
行业板块轮动因子实战从板块资金到因子建模的本地化Python全流程
数据库·人工智能·python
SelectDB8 小时前
抖音集团 实时数据仓库:Apache Doris / SelectDB 的技术能力与实践
数据库
SelectDB8 小时前
网易 日志与时序数据分析:Apache Doris / SelectDB 的技术能力与实践
数据库