1.简介
主从复制:
在实际的生产中,为了解决Mysql的单点故障已经提高MySQL的整体服务性能,一般都会采用「主从复制」。
比如:在复杂的业务系统中,有一句sql执行后导致锁表,并且这条sql的的执行时间有比较长,那么此sql执行的期间导致服务不可用,这样就会严重影响用户的体验度。
主从复制中分为「主服务器(master)「和」从服务器(slave)」,「主服务器负责写,而从服务器负责读」,Mysql的主从复制的过程是一个「异步的过程」。
这样读写分离的过程能够是整体的服务性能提高,即使写操作时间比较长,也不影响读操作的进行。
读写分离:
只在主服务器上写,只在从服务器上读。
主数据库处理事务性查询,而从数据库处理 select 查询。
数据库复制被用来把主数据库上事务性查询导致的变更同步到集群中的从数据库。
2.主从复制
1.编辑主库mysql中my.cnf文件
#添加如下
server-id = 129
log-bin=master-bin #添加,主服务器开启二进制日志
之后重启mysql,之后登录mysql
#给从服务器授权
use mysql;
create user 'xiaoming'@'%' identified by '111111';
grant all privileges on *.* to 'xiaoming'@'%';
FLUSH PRIVILEGES;
上面的代码意思是创建一个xiaoming的用户,密码是111111,并授予其REPLICATION SLAVE权限
最后使用 show master status;
2.编辑从库mysql中my.cnf文件
#添加如下
server-id = 130
登录mysql,执行如下命令
#下面的字段都要和本机对应
change master to master_host='192.168.108.129' , master_user='xiaoming',master_password='111111',master_log_file='mysql-bin.000001',master_log_pos=1005;
#启动slave
start slave;
#查看slave状态;
show slave status\G;
//确保 IO 和 SQL 线程都是 Yes,代表同步正常。
Slave_IO_Running: Yes #负责与主机的io通信
Slave_SQL_Running: Yes #负责自己的slave mysql进程
3.读写分离(基于Sharding-JDBC)
以springboot项目为例
1.导入sharding-jdbc maven依赖
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0-RC1</version>
</dependency>
2.在application.yml文件中加入如下代码:
spring:
application:
#应用的名称,可选
name: railway_take_out
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.108.129:3306/railway?characterEncoding=utf-8
username: root
password: 111111
# 从数据源
slave:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.108.130:3306/railway?characterEncoding=utf-8
username: root
password: 111111
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:
#允许bean定义覆盖配置项(不然和默认Durid数据源写入冲突)
allow-bean-definition-overriding: true