前言
知道自己是什么年纪 并把这个年纪能做好的事情尽力做好 才可能有下个年纪的随心所欲
一.概览
ShardingSphere-Jdbc定位为轻量级Java框架,在Java的Jdbc层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,可理解为增强版的Jdbc驱动,完全兼容Jdbc和各种ORM框架。
文档地址:https://shardingsphere.apache.org/document/current/cn/overview/

二.MySQL主从复制原理

从库B和主库A之间维持了一个长连接。主库A内部有一个线程,专门用于服务从库B的这个长连接。一个事务日志同步的完整过程如下:
- 在从库B上通过change master命令,设置主库A的IP、端口、用户名、密码,以及要从哪个位置开始请求binlog,这个位置包含文件名和日志偏移量。
- 在从库B上执行start slave命令,这时从库会启动两个线程,就是图中的I/O线程和SQL线程。其中I/O线程负责与主库建立连接。
- 主库A校验完用户名、密码后,开始按照从库B传过来的位置,从本地读取binlog,发给B。
- 从库B拿到binlog后,写到本地文件,称为中继日志。
- SQL线程读取中继日志,解析出日志里的命令,并执行。
由于多线程复制方案的引入,SQL线程演化成了多个线程。主从复制不是完全实时地进行同步,而是异步实时。这中间存在主从服务之间的执行延时,如果主服务器的压力很大,则可能导致主从服务器延时较大。
三.环境准备(Docker配置Mysql主从)
1.创建mysql宿主机对应目录
-- master mysql 对应目录
mkdir -p /home/mysql/sharding-mysql/master-mysql/cnf
mkdir -p /home/mysql/sharding-mysql/master-mysql/data
-- slave mysql 对应目录
mkdir -p /home/mysql/sharding-mysql/slave-mysql/cnf
mkdir -p /home/mysql/sharding-mysql/slave-mysql/data
2.创建mysql.cnf配置文件
-- master mysql,cnf
vim /home/mysql/sharding-mysql/master-mysql/cnf/mysql.cnf
-- slave mysql.cnf
vim /home/mysql/sharding-mysql/slave-mysql/cnf/mysql.cnf
完整配置文件如下:
-- master
[mysqld]
## 设置server_id,注意要唯一
server-id=1
## 开启binlog
log-bin=mysql-bin
## binlog缓存
binlog_cache_size=1M
## binlog格式(mixed、statement、row,默认格式是statement)
binlog_format=mixed
-- slave
[mysqld]
## 设置server_id,注意要唯一
server-id=2
## 开启binlog,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
relay_log=edu-mysql-relay-bin
## 如果需要同步函数或者存储过程
log_bin_trust_function_creators=true
## binlog缓存
binlog_cache_size=1M
## binlog格式(mixed、statement、row,默认格式是statement)
binlog_format=mixed
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
3.启动mysql
3.1.拉取镜像
docker pull mysql:5.7
3.2.创建网关
docker network create --driver bridge --subnet 172.18.0.0/16 self_network
3.3.启动
-- 启动master主服务器
docker create -p 13311:3306 \ -- 映射端口
--network self_network \ -- 设置网关
--network-alias master-mysql01 \ -- 网关别名
--ip 172.18.0.11 --name master-mysql01 \ --ip 固定内网Ip地址
-v /home/mysql/sharding-mysql/master-mysql/cnf:/etc/mysql/conf.d \
-v /home/mysql/sharding-mysql/master-mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
-- 启动slave从服务器
docker create -p 13312:3306 --network self_network
--network-alias slaver-mysql01
--ip 172.18.0.12 --name slaver-mysql01
-v /home/mysql/sharding-mysql/slave-mysql/cnf:/etc/mysql/conf.d
-v /home/mysql/sharding-mysql/slave-mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
-- 依次启动docker容器(create替换成run可以直接启动)
docker start 容器ID
3.4.添加复制master数据的用户reader,供从服务器使用
-- docker ps 找到容器信息
-- 进入容器
docker exec -it 容器ID/容器名称 /bin/bash
-- 登录mysql
mysql -u root -p123456
-- 创建用户
GRANT REPLICATION SLAVE ON *.* to 'reader'@'%' identified by 'reader';
-- 创建动作生效
FLUSH PRIVILEGES;
3.5.配置slave链接master
①从master服务器登录mysql查看master_log_file、master_log_pos两个参数
-- 登录mysql
mysql -u root -p123456
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 591 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
-- 如果docker创建mysql容器未设置IP地址则可以查询
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称
②从服务器上进行主服务器的连接信息的设置
-- 登录mysql
mysql -u root -p123456
-- 执行命令设置信息
change master to
master_host='172.21.24.249', -- 内网IP
master_port=13311, -- mysql对外端口
master_user='reader', -- master mysql 用户名
master_password='reader', -- slave mysql 密码
master_log_file='mysql-bin.000005',
master_log_pos=591;
-- 启动slave mysql
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: reader
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 591
Relay_Log_File: edu-mysql-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
--
Slave_IO_Running: Yes,Slave_SQL_Running: Yes即表示启动成功。
四.验证
1.Dbeaver 链接主从mysql
Dbeaver 下载地址: https://dbeaver.io/download/

-- 创建对应数据库
CREATE DATABASE `sharding-jdbc-db`
-- 新建表
-- `sharding-jdbc-db`.t_user definition
CREATE TABLE `t_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`nickname` varchar(100) DEFAULT 'JueDream',
`password` varchar(100) DEFAULT '123456',
`sex` int(11) DEFAULT '1',
`age` int(11) DEFAULT '1',
`birthday` varchar(50) DEFAULT '1997-12-19',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;
-- 查询从库已有对应表

✨“应是上帝打翻银河,星星掉落凡间 才有这水面波光粼粼,你的眼眸 浩瀚星辰”