提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、原理

- 想要实现mysql主从复制,至少需要两个mysql服务。
主库master: 用来增删改
从库slave: 用来读取数据 - 当主库有增删改的操作时,会将变化记录写入二进制日志binlog
- 从库有个两个线程,其中IO线程会将二进制日志binlog文件读取到,并写入中继日志Relaylog
- 从库的另一个线程SQL线程,会解析中继日志Relaylog日志文件,如果发现有变化,会将数据同步到从库
二、使用步骤
1.前提条件,准备两个安装了mysql的服务器
前提:在这开启了两个虚拟机,虚拟机内使用dockers安装了mysql
主库Master :192.168.66.132
从库Slave : 192.168.66.133
2.实现—操作主库 master
-
在安装,mysql的时候,将mysql的配置挂载到了【/soft/mysql/conf】,并创建了 【my.cnf】配置文件。docker安装mysq
-
在【/soft/mysql/conf/my.cn】配置文件中启用主库master的二进制日志,并设置唯一的服务器名
[mysqld]
log-bin=/var/lib/mysql/mysql-bin
server-id=128
expire_logs_days=30

- 修改玩配置文件后,重启Mysql服务
docker restart 容器id

- 登录主库mysql,创建用户。
从库slave向主库读取二进制日志binlog时,必须携带由主库向从库分配的用户,此时我们需要登录mysql,分配用户
//进入mysql容器
docker exec -it 容器名/容器id /bin/bash
//登录mysql
mysql -u root -p

5. 执行命令,确认之日已经开启
show variables like '%log_bin%';

6. 创建用户并给用户授予REPLICATION SLAVE权限
GRANT REPLICATION SLAVE ON *.* to '用户名'@'%' identified by '密码';

7. 查看数据库状态,
查看之后,最好不要对数据库做操作,因为File和Position的值可能会发生变化,后续在从库中我们会使用到这两个值,如果发生变化,可能会导致关联失败
show master status;

3.实现—操作从库 slave
-
在安装,mysql的时候,将mysql的配置挂载到了【/soft/mysql/conf】,并创建了 【my.cnf】配置文件。docker安装mysq
-
在【/soft/mysql/conf/my.cnf】配置文件中设置从库 slave的服务器名,保证唯一
[mysqld]
server-id=168
expire_logs_days=30
- 修改玩配置文件后,重启Mysql服务
docker restart 容器id
- 登录从库mysql
//进入mysql容器
docker exec -it 容器名/容器id /bin/bash
//登录mysql
mysql -u root -p
- 执行下面的语句
从库slave向主库读取二进制日志binlog时,必须携带由主库向从库分配的用户
change master to master_host='主库master的IP',master_user='在主库master中创建的那个用户名',master_password='在主库master中创建的那个用户的密码',master_log_file='主库master查询状态中的file属性值',master_log_pos=主库master查询状态中的Position属性值;
//
start slave;

6. 这就完成了主从复制,查看状态
show slave status\G

常用命令:`
stop slave;
reset master;
三、实现读写分离
我们在Java代码中要实现读写分离,是需要依赖Sharding-JDBC框架来实现读写分离的,不需要改代码,只需要更改一下配置,通过以下两步即可:
- 导入maven坐标
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0-RC1</version>
</dependency>
- 在配置文件中配置读写分离规则
spring:
shardingsphere:
datasource:
names:
# 定义数据源名字, 多个使用逗号隔开, 可以随便取名字,与下面对应上即可
master,slave
# 定义master为主库,用来做增删改 master名字可以随便取,与上面对应即可
master:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.XX.XX:3306/DB_NAME?characterEncoding=utf-8
username: root
password: 123456
# 定义slave为从库库,用来做查询 slave名字可以随便取,与上面对应即可
slave:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.XX.XX:3306/DB_NAME?characterEncoding=utf-8
username: root
password: 123456
masterslave:
# 读写分离配置,采用轮询方式
load-balance-algorithm-type: round_robin
# 最终的数据源名称
name: dataSource
# 指定主库数据源名称 master为上面定义的名字
master-data-source-name: master
# 指定从库数据源名称列表,slave为上面定义的名字 配置多个从库以逗号分隔
slave-data-source-names: slave
props:
sql:
show: true #开启SQL显示,默认false
main:
# 默认dataSource Bean覆盖 因为Sharding-JDBC框架会创建一个数据源 而连接池也会创建数据源, 所以导致数据源冲突
allow-bean-definition-overriding: true
- 这样在程序中就已经完成了 mysql数据库的读写分离,在我们操作数据库做CRUD操作时,会由Sharding-JDBC框架帮助我们区分该操作那个数据库。下面启动日志中可以看出,创建了两个数据源

本文详细介绍了如何在两个MySQL服务器之间配置主从复制,包括启用主库的二进制日志,创建复制用户,设置从库并进行数据同步。此外,还讲解了如何利用Sharding-JDBC在Java应用中实现读写分离,只需更改配置即可轻松实现数据库的读写分离。
2706

被折叠的 条评论
为什么被折叠?



