零、本文纲要
- 一、MySQL主从复制
- 主从复制
- 主从复制过程
- 配置主从复制
- 二、MySQL读写分离
- 读写分离
- Sharding-JDBC
- Sharding-JDBC快速入门
- MasterSlaveDataSource
一、MySQL主从复制
1. 主从复制
MySQL主从复制是一个异步的复制过程,底层是基于MySQL数据库自带的二进制日志
功能。
就是一台或者多台MySQL数据库(slave从库)从另一台(master主库)进行日志复制、解析日志并应用到自身。最终实现从库的数据和主库的数据保持一致。
MySQL的主从复制是自带功能
,无需借助第三方工具。
2. 主从复制过程
① master将改变记录到二进制日志binary log
② slave将master的binary log拷贝到自己的中继日志relay log
③ slave重做replay
中继日志中的事件,将改变应用到自身数据库中
3. 配置主从复制
- ① 配置主库master
Ⅰ 修改MySQL的配置文件/etc/my.cnf
命令:vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin #【必须】启用二进制日志
server-id=100 #【必须】服务器唯一ID
注意:server-id只要保证多台数据库ID不同即可
Ⅱ 重启服务使其生效
命令:systemctl restart mysqld
Ⅲ 登录MySQL,创建授权通信账户
命令:mysql -uroot -p
登录MySQL
命令:GRANT REPLICATION SLAVE ON *.* to 'slaveconnector'@'%' identified by 'Root@123456';
创建一个用户slaveconnector,密码为Root@123456,并且给该用户授予REPLICATION SLAVE权限。slave使用带有该权限该账户才能进行复制。
GRANT [OPTIONS] ON db_name.tbl_name TO 'USERNAME'@'PATH' IDENTIFIED BY 'PASSWORD';
授予 [权限] 在 某数据库.某表 给 '用户'@'访问地址' 识别码是 '密码';
更多内容可以参考:Grant语句官方文档
Ⅳ 查看File和Position
命令:show master status;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000040 | 156 | | | |
+---------------+----------+--------------+------------------+-------------------+
如上,记录下此处的File和Position信息
注:此SQL命令的作用是查看Master的状态,执行完命令不要再执行任何操作
- ② 配置从库slave
Ⅰ 修改MySQL数据库的配置文件/etc/my.cnf
命令:vim /etc/my.cnf
[mysqld]
server-id=101 #【必须】服务器唯一ID
注意:此处我们slave的ID要与master不同
Ⅱ 重启服务使其生效
命令:systemctl restart mysqld
Ⅲ 登录MySQL,配置从库关系
命令:change master to master_host='192.168.138.128',master_user='slaveconnector',master_password='Root@123456',master_log_file='binlog.000040',master_log_pos=156;
参数名 | 含义 | 8.0.23之前 |
---|---|---|
SOURCE_HOST | 主库IP地址 | MASTER_HOST |
SOURCE_USER | 连接主库的用户名 | MASTER_USER |
SOURCE_PASSWORD | 连接主库的密码 | MASTER_PASSWORD |
SOURCE_LOG_FILE | binlog日志文件名 | MASTER_LOG_FILE |
SOURCE_LOG_POS | binlog日志文件位置 | MASTER_LOG_POS |
命令:start slave;
注意:如果先前该数据库运行过slave相关配置,先stop slave;,再执行如上操作
Ⅳ 查看从库状态
命令:show slave status;
二、MySQL读写分离
1. 读写分离
将数据库分主从,主库master负责处理事务性的增删改操作,从库slave负责处理查询操作。有效避免数据更新导致的行锁,进而提升整体查询性能。
2. Sharding-JDBC
该框架兼容JDBC和各种ORM框架,可以在程序中轻松实现数据库读写分离。
① 适用于任何基于JDBC的ORM框架,如:JPA、Hibernate、MyBatis、Spring JDBC Template或者直接使用JDBC;
② 支持任何第三方的数据库连接池,如:DBCP、C3P0、BoneCP、Druid、HikariCP等;
③ 支持认知实现JDBC规范的数据库,如:MySQL、Oracle、SQLServer、PostgreSQL以及任何遵循SQL92标准的数据库;
3. Sharding-JDBC快速入门
- ① 相关依赖
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0-RC1</version>
</dependency>
- ② 配置文件配置
server:
port: 8080
spring:
shardingsphere:
datasource:
names: # 此处定义的名称任意,需要与下方配置对应
master,slave
# 主数据源
master:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.138.128:3306/rw?characterEncoding=utf-8
username: root
password: root
# 从数据源
slave:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.138.130:3306/rw?characterEncoding=utf-8
username: root
password: root
masterslave:
# 读写分离配置
load-balance-algorithm-type: round_robin
# 最终数据源名称
name: dataSource
# 主库数据源名称
master-data-source-name: master
# 从库数据源名称,如果存在多个,则用","分隔
slave-data-source-names: slave
props:
sql:
show: true # 开启SQL显示,默认false
main:
allow-bean-definition-overriding: true # 允许bean定义覆盖,此处数据源bean需要此配置
mybatis-plus:
configuration:
#在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
id-type: ASSIGN_ID
- ③ 测试
注意:其他内容均不用调整,Sharding-JDBC已经可以使用了。
4. MasterSlaveDataSource
在Sharding-JDBC框架内,将数据源对象封装为MasterSlaveDataSource
。
其内部维护了一个Map<String, DataSource> dataSourceMap
,这也是其能够实现读写分离的关键。能够依据不同操作使用不同数据源。该属性可以在其继承的抽象父类AbstractDataSourceAdapter
中看到,如下:
private final Map<String, DataSource> dataSourceMap;
三、结尾
以上即为MySQL-主从复制&读写分离的全部内容,感谢阅读。
网友评论