ShardingSphere 实战之读写分离

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 采用 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 (默认授予所有权限(不鉴权),不会与实际数据库数据库交互。)

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
Java 关系型数据库 中间件
分库分表(3)——ShardingJDBC实践
分库分表(3)——ShardingJDBC实践
304 0
分库分表(3)——ShardingJDBC实践
|
3月前
|
NoSQL Java MongoDB
MongoDB 读写分离——SpringBoot读写分离
MongoDB 读写分离——SpringBoot读写分离
118 0
|
4月前
|
Java Apache Maven
Apache ShardingSphere 实现分库分表及读写分离
Apache ShardingSphere 实现分库分表及读写分离
75 0
|
6月前
|
Java 关系型数据库 MySQL
②⑩② 【读写分离】Sharding - JDBC 实现 MySQL读写分离[SpringBoot框架]
②⑩② 【读写分离】Sharding - JDBC 实现 MySQL读写分离[SpringBoot框架]
76 0
|
6月前
|
负载均衡 算法 Java
Sharding-JDBC如何实现读写分离
通过以上步骤,Sharding-JDBC能够实现数据库的读写分离,从而提高应用程序的读取性能。欢迎关注威哥爱编程,一起学习成长。
|
负载均衡 算法 关系型数据库
ShardingSphere数据库读写分离
最近这段时间来经历了太多东西,无论是个人的压力还是个人和团队失误所带来的损失,都太多,被骂了很多,也被检讨,甚至一些不方便说的东西都经历了,不过还好,一切都得到了解决,无论好坏,这对于个人来说也是一种成长吧,事后自己也做了一些深刻的检讨,总结为一句话“挫败使你难受,使你睡不着觉,使你痛苦,不过最后一定会使你变得成熟,变得认真,变得负责”,每次面临挫败,我都会告诉自己,这不算什么,十年之后,你回过头来看待这件事的时候,你一定会觉得,这算什么屁事。
128 0
|
监控 中间件 关系型数据库
MyCAT、ShardingSphere和Mocc这三个中间件的优缺点对比
MyCAT、ShardingSphere和Mocc这三个中间件的优缺点对比
|
存储 SQL 缓存
分库分表之ShardingSphere(一)
分库分表之ShardingSphere
|
JavaScript 小程序 Oracle
Sharding JDBC 实战:分布式事务处理
Sharding JDBC 实战:分布式事务处理
|
SQL 负载均衡 算法
聊聊 Sharding-JDBC 实现 读写分离~
聊聊 Sharding-JDBC 实现 读写分离~