小公司里用SpringBoot做MySQL分库分表,踩了一些坑!
1、MySQL主从复制
读和写所有压力都由一台数据库承担, 压力大 数据库服务器磁盘损坏则 数据丢失 ,单点故障
1.1、介绍
二进制日志:
MySQL复制过程分成三步:
MySQL master 将数据变更写入二进制日志( binary log ) slave将master的binary log拷贝到它的中继日志( relay log ) slave重做中继日志中的事件,将数据变更反映它自己的数据
1.2、主从库搭建
1.2.1、主库配置
1、修改Mysql数据库的配置文件 vim /etc/my.cnf
在打开的文件中加入下面两行,其中的server-id不一定是100,确保即可
log-bin=mysql-bin #[必须]启用二进制日志
server-id=100 #[必须]服务器ID
2、重启Mysql服务
net stop mysql;net start mysql;
systemctl restart mysqld
service mysqld restart
3、创建数据同步的用户并授权
GRANT REPLICATION SLAVE ON *.* to '用户名'@'开放的地址' identified by '密码';
eg: GRANT REPLICATION SLAVE ON *.* to 'masterDb'@'%' identified by 'Master@123456';
记得刷一下权限
FLUSH PRIVILEGES;
4、查看master同步状态
show master status;
1.2.2、从库配置
1、 修改Mysql数据库的配置文件 vim /etc/my.cnf
2、重启Mysql服务
net stop mysql;net start mysql;
systemctl restart mysqld
service mysqld restart
3、设置主库地址及同步位置
设置主库地址和同步位置
change master to master_host='192.168.150.100',master_user='masterDb',master_password='Master@123456',master_log_file='mysql-bin.000010',master_log_pos=68479;
记得记得开启从库配置
start slave;
master_host: 主库的 IP地址 master_user: 访问主库进行主从复制的 用户名 ( 上面在主库创建的 ) master_password: 访问主库进行主从复制的用户名对应的 密码 master_log_file: 从哪个 日志文件 开始同步 ( 即1.2.1中第4步获取的 File ) master_log_pos: 从指定日志文件的哪个 位置 开始同步 ( 即1.2.1中第4步获取的 Position )
4、查看从数据库的状态
show slave status\G;
1.3、坑位介绍
1.3.1、UUID报错
vim /var/lib/mysql/auto.cnf
1.3.2、server_id报错
1.3.3、同步异常解决
MASTER_LOG_POS
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
START SLAVE;
SHOW SLAVE STATUS\G;
USE dbname
。操作不规范,亲人两行泪……
2、项目中实现
2.1、ShardingJDBC
适用于任何基于JDBC的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。 支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。 支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92标准的数据库。
2.2、依赖导入
<!--sharding-jdbc-->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0-RC1</version>
</dependency>
2.3、配置文件
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.150.100:3306/db_test?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
# 从数据源
slave:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.150.101:3306/db_test?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
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
# 覆盖注册bean,后面创建数据源会覆盖前面创建的数据源
main:
allow-bean-definition-overriding: true
2.4、测试跑路
更新操作(写操作)
查询操作(读操作)
相关文章