MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的二进制日志功能。就是一台或多台Mysql数据库(slave从库)从另一台mysql数据库(master,主库)进行日志的复制然后再解析日志并应用到自身,最终实现从库的数据库和主库的数据库保持一致。MySQL的主从复制是mysql数据库自带功能,无需借助第三方工具。
配置-前提条件
提前准备好两台服务器,分别安装Mysql并启动服务器成功
主库Master: IP地址:假设192.168.138.100
从库slave: IP地址:假设192.168.138.101
配置主库
1.修改msql数据库的配置文件 /etc/my.cnf
在配置文件中 [mysqld] 下面加上两段代码
[mysqld]
log-bin=mysql-bin #启用二进制日志
server-id=100 #服务器唯一ID
2.重启Mysql服务
systemctl restart mysqld
3.登录Mysql数据库,执行SQL
//mysql8授权用户需要先创建,创建和授权同一条语句的话会报错
create user slave@'%' identified by '135564';
//再授权
GRANT ALL PRIVILEGES ON *.* TO 'slave'@'%'WITH GRANT OPTION;
//刷新
flush privileges;
注:上面SQL的作用是创建一个用户slave,密码为135564,并且给slave用户授予REPLICATION SLAVE权限。常用于建立复制时所需要用到的用户权限,也就是slave必须被master授权具有该权限的用户,才能通过该用户复制。
4.登录Mysql数据库,执行下面SQL,记录下结果中File和Position的值
show master status;
配置从库
1.修改msql数据库的配置文件 /etc/my.cnf
[mysqld]
server-id=101 #服务器唯一ID
2.重启Mysql服务
systemctl restart mysqld
3.登录Mysql数据库,执行SQL
//执行前先停下slave
stop slave;
//这是从库和主库连接的关键一步,host是主库的ip,user是前面创建的slave用户,file和pos是主库show master status的信息
change master to
master_host='192.168.1381.100',master_user='slave',master_password='135564',
master_log_file='mysql-bin.000005',master_log_pos=441;
//执行后启动slave
start slave;
4.登录Mysql数据库,执行下面SQL,查看从数据库的状态(我这边登录统一用root)
show slave status;输出会很乱
show slave status\G;这样就竖着输出,不会乱
两个yes则表示成功配置主从复制,Connection和No都是配置有问题
后面自己可以测试两个数据库,主库增删改,可以发现从库也被同步了。
读写分离:
数据库主库负责处理事务性的增删改操作,从库负责处理查询操作。
Shardjing-JDBC
Sharding-JDBC通过sql语句语义分析,当sql语句有insert、update、delete时,Sharding-JDBC就把这次操作在主数据库上执行;当sql语句有select时,就会把这次操作在从数据库上执行,从而实现读写分离过程。但Sharding-JDBC并不会做数据同步,数据同步是配置MySQL后由MySQL自己完成的。
Springboot案例
1.导入依赖sharding-jdbc-spring-boot-starter
2.在yml配置文件中配置读写分离原则
3.在配置文件中配置允许bean定义覆盖配置项
spring:
shardingsphere:
# 数据源配置
datasource:
# 数据源名称,多数据源以逗号分隔,名称可以随意起名
names: master,slave
#配置主数据源
master:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
password: xxxxxx
username: xxxxxx
url: jdbc:mysql://192.168.138.100:3306/xxxxx
#配置从数据源
slave:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
password: xxxxxx
username: xxxxxx
url: jdbc:mysql://192.168.138.101:3306/xxxxx
props:
sql:
show: true #开启SQL显示,默认false
main:
allow-bean-definition-overriding: true
后面可以使用springboot controller,service,mapper对数据库操作测试