ShardingSphere实战之读写分离

发布网友 发布时间:2024-09-27 18:25

我来回答

1个回答

热心网友 时间:2024-10-01 00:17

简述

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

sharding-sphere

本地下载并安装最新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.sh3308

ShardingSphere-Proxy使用conf/server.yaml配置注册中心、认证信息以及公用属性。

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

schemaName:my-appdataSources: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=convertToNullusername:rootpassword:nicaiconnectionTimeoutMilliseconds:3000idleTimeoutMilliseconds:60000maxLifetimeMilliseconds:1800000maxPoolSize:50minPoolSize:1maintenanceIntervalMilliseconds:30000read_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=convertToNullusername:rootpassword:nicaiconnectionTimeoutMilliseconds:3000idleTimeoutMilliseconds:60000maxLifetimeMilliseconds:1800000maxPoolSize:50minPoolSize:1maintenanceIntervalMilliseconds:30000rules:-!READWRITE_SPLITTING#配置读写分离规则dataSources:pr_ds:#读写分离的逻辑数据源名称`pr_ds`用于在数据分片中使用writeDataSourceName:write_ds#写库数据源名称readDataSourceNames:#读库数据源名称-read_ds_0loadBalancerName:roundRobin#负载均衡算法名称#负载均衡算法配置loadBalancers:roundRobin:type:ROUND_ROBIN#一共两种一种是RANDOM(随机),一种是ROUND_ROBIN(轮询)

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

server.yaml文件修改如下:

rules:-!AUTHORITYusers:-root@%:root-sharding@:shardingprovider:type:ALL_PRIVILEGES_PERMITTEDprops:max-connections-size-per-query:1executor-size:16#Infinitebydefault.proxy-frontend-flush-threshold:128#Thedefaultvalueis128.#LOCAL:ProxywillrunwithLOCALtransaction.#XA:ProxywillrunwithXAtransaction.#BASE:ProxywillrunwithB.A.S.Etransaction.proxy-transaction-type:LOCALxa-transaction-manager-type:Atomikosproxy-opentracing-enabled:falseproxy-hint-enabled:falsesql-show:truecheck-table-metadata-enabled:falselock-wait-timeout-milliseconds:50000#Themaximumtimetowaitforalock启动

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

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

地址:127.0.0.1

端口:3307

账号:root/root

数据库my-app(这里就用到上面配置的逻辑数据库名了)

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

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

java应用程序修改配置spring:profiles:include:common-localdatasource: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=convertToNullusername:rootpassword:root

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

测试

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

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

遇到过的问题

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

2启动报错:TheMySQLserverisrunningwiththe--read-onlyoptionsoitcannotexecutethisstatement我的从库是设置的只读库,但不知道为什么会报错,没有解决,再次启动就好了。

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

rules:-!AUTHORITYusers:-root@%:root-sharding@:shardingprovider:type:ALL_PRIVILEGES_PERMITTED

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

参考:

https://shardingsphere.apache.org/document/5.0.0-beta/cn/overview/

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com