昆山便宜做网站,php做网站需要什么,品传集团网站建设,wordpress 的客户端1、概述
读写分离是一种常见的数据库架构#xff0c;它将数据库分为主从库#xff0c;一个主库#xff08;Master#xff09;用于写数据#xff0c;多个从库#xff08;Slave#xff09;进行轮询读取数据的过程。主从库之间通过某种通讯机制进行数据的同步。 所以…1、概述
读写分离是一种常见的数据库架构它将数据库分为主从库一个主库Master用于写数据多个从库Slave进行轮询读取数据的过程。主从库之间通过某种通讯机制进行数据的同步。 所以数据的读写分离是在数据库的主从复制基础上建立起来的。
数据库的主从复制可以参考之前的文章Mysql8.0实现主从复制。
读写分离的原理是让主数据库处理事务性增、改、删操作INSERT、UPDATE、DELETE而从数据库处理SELECT查询操作。这样可以有效地减轻主数据库的压力提高数据库的并发性能和稳定性。 2、优缺点
优点
减轻数据库压力通过将读操作和写操作分开到不同的数据库服务器上可以有效地减轻主数据库的压力提高数据库的并发性能和稳定性。提高性能只读服务器没有写操作可以大大减轻磁盘IO等性能问题提高查询效率。同时读服务器可以采用负载均衡实现读操作的可伸缩性。易于扩展读写分离可以很容易地扩展到更多的数据库服务器上以满足不断增长的业务需求。
缺点
数据实时性差数据不是实时同步到只读服务器上的当数据写入主服务器后要在下次同步后才能查询到。这可能导致数据不一致的问题。数据量大时同步效率差单表数据量过大时插入和更新因索引、磁盘IO等问题性能会变的很差。这可能影响到只读服务器的性能和稳定性。连接多个数据库至少要连接到两个数据库实际的读写操作是在程序代码中完成的容易引起混乱。这增加了开发和维护的复杂性。
3、SpringBoot整合实现
使用SpringBoot对ShardingSphere的基本整合可以浏览之前的文章 ShardingSphere数据分片之分表操作。
因为是SpringBoot整合ShardingSphere所以我们只需要配置Yaml文件便可以轻松的实现数据库的读写分离。
3.1、引入依赖
CSDN上很多博客都使用的是sharding-jdbc-spring-boot-starter依赖但是这个依赖是很久以前的了在需求日益增长的现在还是要紧跟时代比较好所以我就用了离现在不是很久的依赖。
dependencygroupIdorg.apache.shardingsphere/groupIdartifactIdshardingsphere-jdbc-core-spring-boot-starter/artifactIdversion5.1.1/version/dependency3.2、配置YAML文件
这里结合了读写分离 分表的操作所以YAML文件的配置就比较多。
spring:shardingsphere:props:sql-show: true # 展示shardingSphere对SQL的处理datasource: # 配置真实的数据源master: # 主数据库username: rootpassword: 123456url: jdbc:mysql://wangwu_mysql:3306/mysql_test?serverTimezoneAsia/Shanghai # zhoujn.e3.luyouxia.net:11580type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverslave: # 从数据库username: rootpassword: 123456url: jdbc:mysql://zhangsan_mysql:3306/mysql_test?serverTimezoneAsia/Shanghaitype: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Drivernames: masterrules: # 配置路由规则readwrite-splitting: # 配置读写分离data-sources: # 读写分离数据库配置read-write-datasource: # 自定义读写分离数据库配置名称type: Static # 静态配置配置的选项来自同一个YAML文件的datasource参数props:write-data-source-name: master # 写库的配置read-data-source-names: slave # 读库的配置多个从库之间使用逗号进行隔开load-balancer-name: round-robin # 多个读库之间采用的访问策略load-balancers: # 访问策略的配置round-robin: # 自定义策略名称type: ROUND_ROBIN # 明确的策略sharding: # 数据分片配置sharding-algorithms: # 数据分片算法配置table-inline:type: INLINEprops:algorithm-expression: test_$-{id % 2}tables: # 表的分片配置logic_table_name:actual-data-nodes: read-write-datasource.test_${0..1}table-strategy:standard:sharding-column: idsharding-algorithm-name: table-inlinemode:type: Memoryrepository:type: JDBCload-balancers.type从库访问策略可以是以下的值
参数名称描述ROUND_ROBIN轮询负载均衡器。按照顺序依次将请求分配给每个分片当所有分片都处理完后再从头开始分配。LEAST_ACTIVE最少活跃调用负载均衡器。选择当前活跃请求数最少的分片作为目标分片。LEAST_CONNECTION最少连接负载均衡器。选择当前连接数最少的分片作为目标分片。RANDOM随机负载均衡器。随机选择一个分片作为目标分片。LEAST_RESPONSE_TIME最少响应时间负载均衡器。选择当前响应时间最少的分片作为目标分片。
注意点 在使用读写分离时actual-data-nodes参数所对应的真是表的名称不再是Master或者Slave而是rules.readwrite-splitting.data-sources下自定义是读写分离数据库的名称。 否则读写分离不会成功。
其他的分库分表参数请浏览ShardingSphere数据分片之分表操作。
3.3、代码层面
整合了ShardingSphere后代码层面还是和日常的编写方式一样就可以了。
3.3.1、controller
RestController
RequiredArgsConstructor
public class shardingController {private final TestServiceImpl testService;GetMapping(value /add)public String addData(){for(int i 1; i 10; i){// 此处的操作一定是在Master库中执行的testService.save(new Test().setTestName(data_ i).setId(i));}return 插入完成;}GetMapping(value /list)public ListTest list(){// 此处的操作一定是在Slave库中执行return testService.list();}}3.3.2、service
Service
public class TestServiceImpl extends ServiceImplTestMapper, Test implements IServiceTest {
} 3.3.3、mapper
Mapper
public interface TestMapper extends BaseMapperTest {
}