ShardingSphere 实战之读写分离

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS Agent(兼容OpenClaw),2核4GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 采用 ShardingShpere 的 Sharding-Porxy(透明化的数据库代理端) 模式在本地实现 mysql 数据库读写分离,并通过 java 应用程序连接.

简述


采用 ShardingShpere 的 Sharding-Porxy(透明化的数据库代理端) 模式在本地实现 mysql 数据库读写分离,并通过 java 应用程序连接.


20.jpg


ShardingSphere


本地下载并安装 最新 5.0 的 beta 版本:https://dlcdn.apache.org/shardingsphere/5.0.0-beta/

由于我需要连接 mysql 数据库所以,需要下载 mysql-connector-java-5.1.47.jar(https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.47/mysql-connector-java-5.1.47.jar),并将其放入 %SHARDINGSPHERE_PROXY_HOME%/lib 目录


修改配置文件


  • ShardingSphere-Proxy 支持多逻辑数据源,每个以 config- 前缀命名的 YAML 配置文件,即为一个逻辑数据源,比如默认文件 config-database-discovery.yaml
  • ShardingSphere-Proxy 默认使用 3307 端口,可以通过启动脚本追加参数作为启动端口号。如:bin/start.sh 3308
  • ShardingSphere-Proxy 使用 conf/server.yaml 配置注册中心、认证信息以及公用属性。


先来添加并修改 config-myapp.yaml 文件(注意扩展名要写 yaml,写 yml 不能识别)


schemaName: my-app
dataSources:
 write_ds:
   url: jdbc:mysql://mysql.local.test.myapp.com:23306/test?allowPublicKeyRetrieval=true&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=false&autoReconnect=true&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
   username: root
   password: nicai
   connectionTimeoutMilliseconds: 3000
   idleTimeoutMilliseconds: 60000
   maxLifetimeMilliseconds: 1800000
   maxPoolSize: 50
   minPoolSize: 1
   maintenanceIntervalMilliseconds: 30000
 read_ds_0:
   url: jdbc:mysql://mysql.local.test.read1.myapp.com:23306/test?allowPublicKeyRetrieval=true&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=false&autoReconnect=true&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
   username: root
   password: nicai
   connectionTimeoutMilliseconds: 3000
   idleTimeoutMilliseconds: 60000
   maxLifetimeMilliseconds: 1800000
   maxPoolSize: 50
   minPoolSize: 1
   maintenanceIntervalMilliseconds: 30000
rules:
- !READWRITE_SPLITTING # 配置读写分离规则
  dataSources:
    pr_ds: # 读写分离的逻辑数据源名称 `pr_ds` 用于在数据分片中使用
      writeDataSourceName: write_ds #写库数据源名称
      readDataSourceNames: #读库数据源名称
        - read_ds_0
      loadBalancerName: roundRobin # 负载均衡算法名称
  # 负载均衡算法配置
  loadBalancers:
    roundRobin:
      type: ROUND_ROBIN # 一共两种一种是 RANDOM(随机),一种是 ROUND_ROBIN(轮询)


如上配置我只添加了一个主库一个只读从库,而数据库之间的主从同步过程由于不是重点本文就省略了,具体我这边比较简单直接用的云创建的只读实例,也就是说主从实例同步让云帮我实现了,当然你也可以用原生的方法,通过 mysql 的 master-salve 等配置来实现。


server.yaml 文件修改如下:


rules:
 - !AUTHORITY
   users:
     - root@%:root
     - sharding@:sharding
   provider:
     type: ALL_PRIVILEGES_PERMITTED
props:
 max-connections-size-per-query: 1
 executor-size: 16  # Infinite by default.
 proxy-frontend-flush-threshold: 128  # The default value is 128.
   # LOCAL: Proxy will run with LOCAL transaction.
   # XA: Proxy will run with XA transaction.
   # BASE: Proxy will run with B.A.S.E transaction.
 proxy-transaction-type: LOCAL
 xa-transaction-manager-type: Atomikos
 proxy-opentracing-enabled: false
 proxy-hint-enabled: false
 sql-show: true
 check-table-metadata-enabled: false
 lock-wait-timeout-milliseconds: 50000 # The maximum time to wait for a lock


启动


1 在 bin 目录下 执行 start.sh 启动 ShardingSphere


2 用任意 mysql 客户端连接数据库,就像连接一个往常的数据库一样


  • 地址:127.0.0.1
  • 端口:3307
  • 账号:root/root
  • 数据库 my-app (这里就用到上面配置的逻辑数据库名了)


3 查看库表中的数据,应该跟主、从库中的一致。


这里我遇到了一个小问题,就是 select 数据的时候用 库名.表名不行,直接写表名可以。


java 应用程序修改配置


spring:
  profiles:
    include: common-local
  datasource:
    url: jdbc:mysql://127.0.0.1:3307/my-app?allowPublicKeyRetrieval=true&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=false&autoReconnect=true&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
    username: root
    password: root


由于采用 proxy 模式,对应用几乎无感,不需要修改代码,只需要修改数据库部分配置文件。


测试


在我测试读写分离时,读库的请求情况:


21.jpg


证明读请求都打到读库上了。


遇到过的问题


1 启动报错,需要配置 server.yaml 第一次启动的时候没配置


2 启动报错:The MySQL server is running with the --read-only option so it cannot execute this statement我的从库是设置的只读库,但不知道为什么会报错,没有解决,再次启动就好了。


3 启动成功后,用客户端,无法连接 sharding-proxy 数据库,连接异常报错,解决方法是修改了 server.yaml 文件


rules:
 - !AUTHORITY
   users:
     - root@%:root
     - sharding@:sharding
   provider:
     type: ALL_PRIVILEGES_PERMITTED


将 provider 的 type  从之前的 NATIVE 修改为了 ALL_PRIVILEGES_PERMITTED (默认授予所有权限(不鉴权),不会与实际数据库数据库交互。)

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
存储 SQL 关系型数据库
数据库魔法师:使用ShardingSphere实现MySQL读写分离与分片指南跟着爆叔的节奏稳了!
数据库魔法师:使用ShardingSphere实现MySQL读写分离与分片指南跟着爆叔的节奏稳了!
578 0
|
安全 算法 Java
|
消息中间件 缓存 NoSQL
热点账户高并发记账方案
热点账户高并发记账方案
2199 0
热点账户高并发记账方案
|
6月前
|
Java 关系型数据库 数据库连接
在Spring Boot + MyBatis项目中实现MySQL读写分离
在Spring Boot和MyBatis项目中实现MySQL读写分离,主要有两种思路:一种是在应用层通过代码和配置手动控制,另一种是借助中间件自动路由。
440 6
|
负载均衡 算法 关系型数据库
ShardingSphere数据库读写分离
最近这段时间来经历了太多东西,无论是个人的压力还是个人和团队失误所带来的损失,都太多,被骂了很多,也被检讨,甚至一些不方便说的东西都经历了,不过还好,一切都得到了解决,无论好坏,这对于个人来说也是一种成长吧,事后自己也做了一些深刻的检讨,总结为一句话“挫败使你难受,使你睡不着觉,使你痛苦,不过最后一定会使你变得成熟,变得认真,变得负责”,每次面临挫败,我都会告诉自己,这不算什么,十年之后,你回过头来看待这件事的时候,你一定会觉得,这算什么屁事。
416 0
|
开发框架 安全 .NET
【Azure Developer】.NET Aspire 项目本地调试遇 Grpc.Core.RpcException 异常( Error starting gRPC call ... )
Error starting gRPC call. HttpRequestException: The SSL connection could not be established, see inner exception. AuthenticationException: The remote certificate is invalid because of errors in the certificate chain: UntrustedRoot
526 12
|
JavaScript 前端开发 Java
springboot解决js前端跨域问题,javascript跨域问题解决
本文介绍了如何在Spring Boot项目中编写Filter过滤器以处理跨域问题,并通过一个示例展示了使用JavaScript进行跨域请求的方法。首先,在Spring Boot应用中添加一个实现了`Filter`接口的类,设置响应头允许所有来源的跨域请求。接着,通过一个简单的HTML页面和jQuery发送AJAX请求到指定URL,验证跨域请求是否成功。文中还提供了请求成功的响应数据样例及请求效果截图。
387 3
springboot解决js前端跨域问题,javascript跨域问题解决
|
SQL 存储 算法
SpringBoot整合ShardingSphere实现分表分库&读写分离&读写分离+数据库分表
SpringBoot整合ShardingSphere实现分表分库&读写分离&读写分离+数据库分表
3623 0
SpringBoot整合ShardingSphere实现分表分库&读写分离&读写分离+数据库分表
|
XML 前端开发 JavaScript
React 与 Angular:全面的比较
【8月更文挑战第30天】
743 1
|
JavaScript Java 关系型数据库
springboot+vue餐厅点餐系统(源码+文档)
这是一篇关于基于SpringBoot的餐厅点餐系统的介绍。该系统由Java开发者风歌分享,提供完整的源码。项目支持多种Java框架,包括SSM和SpringBoot,适用于Java毕设项目。开发环境包括Java 1.8、MySQL 5.7+、Node.js、Vue等。系统架构包括管理员、用户和食堂三个角色的功能模块,涵盖用户注册登录、食堂管理、菜单管理、订单处理、消息留言、留言板和系统管理等全面功能。文章还展示了部分界面截图。如有需要,可联系作者获取更多详情和源码。