ShardingSphere-proxy 分布式/主从配置【Apache】
ShardingSphere 简介
Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。 它们均提供标准化的数据水平扩展、分布式事务和分布式治理等功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。
Apache ShardingSphere 旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库。 关系型数据库当今依然占有巨大市场份额,是企业核心系统的基石,未来也难于撼动,我们更加注重在原有基础上提供增量,而非颠覆。
Apache ShardingSphere 5.x 版本开始致力于可插拔架构,项目的功能组件能够灵活的以可插拔的方式进行扩展。 目前,数据分片、读写分离、数据加密、影子库压测等功能,以及 MySQL、PostgreSQL、SQLServer、Oracle 等 SQL 与协议的支持,均通过插件的方式织入项目。 开发者能够像使用积木一样定制属于自己的独特系统。Apache ShardingSphere 目前已提供数十个 SPI 作为系统的扩展点,仍在不断增加中
ShardingSphere 已于2020年4月16日成为 Apache 软件基金会的顶级项目
1、下载安装:https://shardingsphere.apache.org/document/current/cn/downloads/,下载完成后解压到你想要放的盘中
sharding目录结构
1):bin目录下是启动文件 start.bat 和 start.sh 分别对应 win 和 linux 系统。
2):config目录下是主要配置文件,其中config-master_slave.yaml 做主从的、config-shadow.yaml 做分库分表、server.yaml 是核心的
3):lib目录下是配置文件夹 里面主要放的都是JAR包 【这里需要注意的是 有些版本下载下来后 这个文件夹中的jar包的后缀可能不完整,需要手动修改后缀】
注意:(1):这里需要配置mysql的jar包连接器到sharding的lib目录下【我找了一下 mysql官网找不到.jar结尾的连接器,看了网上一堆 但进去就是下载不到,后面通过其他网站下载到】
(2):因为我不是做java的 所以我本地的环境需要再安装java的JDK 配置环境变量,否则启动sharding会报错【特别注意 最好下载java8的sdk,新版本会缺包】
linux 和win 都可以使用这种安装方式
2、 配置文件:
2.1:进入config文件 先修改service.yml 打开如下的注释即可
authentication:
users:
root:
password: root
sharding:
password: sharding
authorizedSchemas: sharding_db # 数据库名字 Sharding中
props:
max.connections.size.per.query: 1
acceptor.size: 16 # The default value is available processors count * 2.
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
proxy.opentracing.enabled: false
proxy.hint.enabled: false
query.with.cipher.column: true
sql.show: false
allow.range.query.with.inline.sharding: false
2.2:进入config文件 再修改config-sharding.yaml
注意这里你使用的是什么数据库 就打开哪部分的文件,截止至今 shardingshere 目前只支持 mysql 和 PostgreSQL 俩种,后续在开放中...
我这里使用的是mysql 所以只需要关注下面这句话下的代码即可
“ If you want to connect to MySQL, you should manually copy MySQL driver to lib directory.”
注意这段 我们用mysql 所以用这一段下的示例:意思大概是 如果用的是msyql 就必须复制msyql的驱动【jar包】到 lib 目录中
schemaName: sharding_db # 对应的是server中的数据库名称 先在自己的环境新增俩个库
dataSources:
ds_0: # 源1 ShardingSphereTest 库1
url: jdbc:mysql://127.0.0.1:3306/ShardingSphereTest?serverTimezone=UTC&useSSL=false
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
ds_1: # 源1 ShardingSphereTest2 库2
url: jdbc:mysql://127.0.0.1:3306/ShardingSphereTest2?serverTimezone=UTC&useSSL=false
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
# 分表的配置
shardingRule:
tables:
t_order:
actualDataNodes: ds_${0..1}.t_order_${1..2}
tableStrategy:
inline:
shardingColumn: order_id
algorithmExpression: t_order_${order_id % 2 + 1} # 这里的规则要对应 actualDataNodes 中“规则 如果order_id余2等于0 ,0+1 就放到t_order_1中, 如果不行 就放到2中”
# 如果 actualDataNodes 中的规则是t_order_${0..1} 则 这里的 【algorithmExpression】 规则就是原始的 t_order_${order_id % 2} 不要加1
keyGenerator:
type: SNOWFLAKE
column: order_id
bindingTables:
- t_order
# 以下是分库的策略
defaultDatabaseStrategy:
inline:
shardingColumn: user_id
algorithmExpression: ds_${user_id % 2} # 如果这个user_id 余2等于0 就把这个数据 加到ds0 这个源里面的表中
defaultTableStrategy:
none:
3、# 启动 最后看到“ACTIVE” 即为启动成功
启动完成 链接sharding 和链接mysql的方式一样 只不过端口默认是3307
在sharding中 建表 添加数据 查询【本地环境也会有这些表 和数据,sharding在做,无需自己手动干预】
6、读写分离配置 修改config-master_slave.yaml
6.1 创建三个数据库 一主二从 【这里注意 主从 只有mysql配置开启后才会实现次功能,sharding 只负责操作】
shardingspheretest_master
shardingspheretest_slave_0
shardingspheretest_slave_1
schemaName: master_slave_db # 在sharding 中的数据库名称
dataSources:
master_ds:
url: jdbc:mysql://127.0.0.1:3306/shardingspheretest_master?serverTimezone=UTC&useSSL=false
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
slave_ds_0:
url: jdbc:mysql://127.0.0.1:3306/shardingspheretest_slave_0?serverTimezone=UTC&useSSL=false
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
slave_ds_1:
url: jdbc:mysql://127.0.0.1:3306/shardingspheretest_slave_0?serverTimezone=UTC&useSSL=false
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
masterSlaveRule:
name: ms_ds
masterDataSourceName: master_ds # 主服务器
slaveDataSourceNames: # 俩个从服务器
- slave_ds_0
- slave_ds_1
6.3 启动sharding
6.4 链接创建表 # 在sharding创建后 本地数据库会自动生成
6.5 添加信息,直接添加 不指定向哪个库中新增数据【这里是要看主从的读写分离是否正常,是否能直接写到主表中】
insert into t_order(order_id,user_id,status) values(11,1,'init'); # 不指定库
显示插入成功。
6.6 查询 就会有问题 返回空【因为我这里mysql没有做主从复制的功能 所以 从表不会有数据】 # 这都是在sharding中操作的 mysql 不用管它 sharding 会帮本地的数据库做所有的操作,【除了 主从复制,这个必须要mysql开启】
mysql> select * from t_order;
Empty set (0.03 sec)
到这里说明读写分离是成功的#######################。也可以手动在从库插入一条不一样的数据 看是不是查的出来,查的出来说明主从正确
6.7 注意的是在查询的时候 会自动随机查询某一个从库里的数据
作者地址:https://www.cnblogs.com/G921123/
创作也有乐趣 知识分享 转载注明出处 相互理解 谢谢!
创作也有乐趣 知识分享 转载注明出处 相互理解 谢谢!