其他
小公司里用SpringBoot做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
log-bin=mysql-bin #[必须]启用二进制日志
server-id=100 #[必须]服务器唯一ID
2、重启Mysql服务
systemctl restart mysqld
service mysqld restart
3、创建数据同步的用户并授权
eg: GRANT REPLICATION SLAVE ON *.* to 'masterDb'@'%' identified by 'Master@123456';
记得刷一下权限
FLUSH PRIVILEGES;
4、查看master同步状态
1.2.2、从库配置
1、 修改Mysql数据库的配置文件 vim /etc/my.cnf
2、重启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、查看从数据库的状态
1.3、坑位介绍
1.3.1、UUID报错
vim /var/lib/mysql/auto.cnf
1.3.2、server_id报错
1.3.3、同步异常解决
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
START SLAVE;
SHOW SLAVE STATUS\G;
USE dbname
。操作不规范,亲人两行泪……
项目中实现
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、依赖导入
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0-RC1</version>
</dependency>
2.3、配置文件
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、测试跑路
更新操作(写操作)
查询操作(读操作)
作者:码老二
https://juejin.cn/post/7118215682205941796
最近有很多人问,有没有读者交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!
(微信小程序):3000+道面试题,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计等,在线随时刷题!
特别推荐:专注分享最前沿的技术与资讯,为弯道超车做好准备及各种开源项目与高效率软件的公众号,「大咖笔记」,专注挖掘好东西,非常值得大家关注。点击下方公众号卡片关注。