springboot分库分表技术,springboot分库分表实现
1.MySQL主从复制
如果我们仔细观察,会发现当我们所有的项目都是单一数据库时,那么可能存在以下问题:
所有的读写压力都由一个数据库承担,数据库服务器的磁盘损坏,数据就会丢失。为了解决上面提到的两个问题,我们可以准备两台(多台)MySQL服务器,一台主服务器,一台从服务器。主数据库的数据更改(写入、更新和删除)需要同步到从数据库(主从复制)。
用户访问我们的项目时,如果是写操作(插入、更新、删除),直接操作主库;如果是读操作(select),直接操作从库,这种结构就是读写分离。
在这种读写分离结构中,可以有多个从库。
1.1.介绍
主从式MySQL复制是异步复制过程,底层基于Mysql数据库的二进制日志功能。即一个或多个MySQL数据库(从)从另一个MySQL数据库(主)复制日志,然后解析日志应用到自己身上,最终实现从数据库和主数据库的一致性。
MySQL的主从复制是MySQL数据库的原生功能,不需要借助第三方工具。
二进制日志:BINLOG记录所有DDL(数据定义语言)语句和DML(数据操作语言)语句,但不包括数据查询语句。该日志在灾难中的数据恢复中起着极其重要的作用,MySQL的主从复制就是通过该binlog实现的。MySQL默认不打开这个日志。
MySQL复制过程分为三步:MySQL master将数据变化写入二进制日志)slave将master的二进制日志复制到其中继日志)slave重做中继日志中的事件,并将数据变化反映到自己的数据中。
1.2、主从库建设
在设置环境之前,我们需要准备两台服务器。如果你比较有钱,用了两个云服务器,记得打开安全组,也就是防火墙。如果是比狗命好的虚拟机,但是也用,记得不要分那么多内存启动蓝屏(别问你怎么知道的)
这里就不展示数据库的安装和防火墙的操作了。感觉网上很多资源都能满足遇到的问题。在建立主从数据库的时候,我在网上看到MySQL版本应该是一致的。没怎么关注,只是在之前的MySQL上操作了一下。你可以自己验证一下。
1.2.1,主库配置服务器:192.168.150.100(不能黑的就不要试了,这是虚拟机的ip)
1.修改Mysql数据库的配置文件vim /etc/my.cnf,在打开的文件中添加以下两行,其中server-id不一定是100,只要保证唯一即可。
Log-bin=mysql-bin #[必须]启用二进制日志记录
Server-ID=100 #[必需]服务器的唯一ID
2.重启Mysql服务。这里有三种重启MySQL的方法。最简单的一个无疑是关机开机:
net stop mysqlnet启动mysql
systemctl重新启动mysqld
服务mysqld restart3,创建一个数据同步用户并授权登录MySQL后才能执行下面这个命令,因为这是一个SQL命令,Linux不知道这个东西是什么。
在*上授予奴隶。*以‘用户名’@‘开放地址’标识的‘密码’;
例如:在*上授予复制从属服务器。*到由“Master@123456”标识的“masterDb”@“%”;
记得刷权限。
刷新权限;4.检查主同步状态。这时候你不用退出MySQL,因为下面的命令还是一个SQL命令。通过执行下面的SQL,您可以获得我们稍后需要的两个重要参数。
显示主机状态;
执行完这句SQL语句,==不要再操作主库了!停止操作主库!停止操作主库!==重要的事情说三遍,因为再次操作主库后,红框中的两个属性值可能会改变。如果后来出了问题,可能和这里有关系。
1.2.2.从库中配置服务器:192.168.150.101(不要尝试不能黑的东西,这也是虚拟机的ip)
1.修改Mysql数据库的配置文件vim /etc/my.cnf。
这里注意,server-id不能与主库和其他从库相同,否则以后的配置会不成功。
2.重启Mysql服务。这里有三种重启MySQL的方法。最简单的一个无疑是关机开机:
net stop mysqlnet启动mysql
systemctl重新启动mysqld
服务mysqld restart3,设置主库地址和同步位置并登录MySQL后才能执行以下命令,因为是SQL命令。
设置主库地址和同步位置。
将master改为master_host=192.168.150.100 ,master_user=masterDb ,master_password=Master@123456 ,Master _ log _ file= MySQL-bin . 000010 ,master _ log _ pos=68479
记得打开从机配置。
启动从机;参数描述:master_host:主库的IP地址master_user:用户名(上面在主库中创建)访问主库进行主从复制master_password:访问主库进行主从复制的用户名对应的密码master_log_File:从哪个日志文件开始同步(即1.2.1中步骤4获取的文件)Master_log_pos:指定从哪个日志文件开始同步(即1.2.1中步骤4获取的位置)4。4.检查从属数据库的状态。此时不必退出MySQL,因为下面的命令仍然是SQL命令。您可以通过执行以下SQL来查看从属数据库的状态信息。通过状态信息中的Slave_IO_running和Slave_SQL_running可以看到主从同步是否就绪。如果两个参数都是Yes,则主从同步已经配置好了。
显示从属状态\ G;
1.3、坑位介绍
1.3.1,UUID报告了一个错误。这可能是因为linux是抄出来的。MySQL中还有一个server_uuid也是一样的,我们也需要修改。vim /var/lib/mysql/auto.cnf
1.3.2.server_id报告了一个错误。这应该是因为你丹尼尔在设置server_id的时候不小心设置了相同的id。修改一下就好。步骤如上所述。
1.3.3、同步异常解决这是狗在运行过程中犯的一个错误.
错误原因是用户信息在主库中被删除,但在从库中同步失败,因此同步停止。这里记录下自己的操作(进入MySQL的操作,是从库)。
MASTER _ LOG _ POSSTOP SLAVE
设置全局SQL _ SLAVE _ SKIP _ COUNTER=1;
启动从机;
显示从属状态\ G;在数据库中操作的时候,一定要注意自己当前在哪个数据库中。一个好的做法是,在SQL语句之前使用dbname。
操作不规范,亲戚两行泪.2.项目中的实现。
2.1、分片JDBC
Sharding-JDBC被定位为轻量级spring mvc,是Java的JDBC层提供的一项附加服务。它使用客户端直接连接数据库,以jar包的形式提供服务,不需要额外的部署和依赖。可以理解为JDBC驱动的增强版,完全兼容JDBC和各种ORM框架。
使用分片-JDBC可以很容易地在程序中实现数据库读写分离。
Sharding-JDBC有以下特点:适用于任何基于JDBC的ORM框架,如JPA、Hibernate、MyBatis、Spring JDBC模板或直接使用JDBC。支持任何第三方数据库连接池,如DBCP、C3P0、BoneCP、德鲁伊、光CP等。支持任何实现JDBC规范的数据库。目前支持MySQL、Oracle、SQLServer、PostgreSQL以及任何符合SQL92标准的数据库。接下来,我们将在项目中使用ShardingJDBC实现MySQL的读写分离。
2.2.依赖进口
在pom.xml文件中导入ShardingJDBC的依赖坐标。
!-分片-jdbc -
属国
groupId org . Apache . sharding sphere/groupId
artifactId分片-JDBC-spring-boot-starter/artifact id
版本4 . 0 . 0-RC1/版本
/dependency 2.3,配置文件
在application.yml中添加数据源的配置
春天:
分割球:
数据源:
姓名:
主人,奴隶
#主要数据源
主人:
type:com . Alibaba . druid . pool . druid data source
驱动程序类名称:com.mysql.cj.jdbc.Driver
URL:JDBC:MySQL://192 . 168 . 150 . 100:3306/db _ test?use unicode=true character encoding=utf-8 use SSL=false
用户名:root
密码:123456
#来自数据源
奴隶:
type:com . Alibaba . druid . pool . druid data source
驱动程序类名称:com.mysql.cj.jdbc.Driver
URL:JDBC:MySQL://192 . 168 . 150 . 101:3306/db _ test?use unicode=true character encoding=utf-8 use SSL=false
用户名:root
密码:123456
主从:
#读写分离配置,设置负载均衡模式为轮询。
负载平衡算法类型:循环调度
#最终的数据源名称
名称:数据源
#主库数据源的名称
主数据来源名称:主数据
#来自库数据源名称列表,用多个逗号分隔
从属数据源名称:从属
道具:
sql:
Show: true #打开SQL显示,默认值为false
#覆盖已注册的bean,稍后创建的数据源将覆盖先前创建的数据源。
主要:
allow-bean-definition-overriding:true 2.4,测试运行
这时,我们可以在我们的项目中测试配置,然后分别调用一个更新接口和一个查询接口,并检查日志中记录的数据源,以确定它是否能按照我们的预期运行。
更新操作(写操作)
查询(读取操作)
搞定了。程序按照我们的预期成功运行,在我们的项目中使用ShardingJDBC成功实现了数据库读写分离。
版权归作者所有:原创作品来自博主小二上九8,转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。