ShardingSphere下

使用规范

不支持:不支持case when,having,union 

可解析至第一个含表的子查询,在下层嵌套再次找到子查询抛错

子查询不支持聚合函数,不支持含shema的SQL:shardingsphere对sql的访问都是在同一个逻辑schema上

分页

完全支持MySQL、PostgreSQL和Oracle的分页查询,SQLServer由于分页查询较为复杂,仅部分支持

性能

编译量过大的分页导致获取数据性能下降

优化

  • 流式处理+归并排序:sql改写占用额外带宽不会导致内存暴涨,结果集有序,shardingsphere每次比较仅获取各分片当前结果集记录,在内存中的记录仅为当前路由到的分片结果集的当前游标指向,对于本身有序的待排序对象,归并排序时间复杂度O(n)
  • shardingsphere对 仅落至单分片的查询 进一步优化,落至单分片查询的请求不需要改成sql也可保证记录正确性:未改写sql

优化实例

LIMIT不能通过索引查询数据,通过连续性ID分页,或上次查询结果最后一条

SELECT * FROM t_order WHERE id > 100000 AND id <= 100010 ORDER BY id
SELECT * FROM t_order WHERE id > 100000 LIMIT 10

分页子查询

oracle,使用rownum分页

SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT o.order_id as order_id FROM t_order o JOIN t_order_item i ON o.order_id = i.order_id) row_ WHERE rownum <= ?) WHERE rownum > ?

sqlserver,TOP + ROW_NUMBER() OVER

SELECT * FROM (SELECT TOP (?) ROW_NUMBER() OVER (ORDER BY o.order_id DESC) AS rownum, * FROM t_order o) AS temp WHERE temp.rownum > ? ORDER BY temp.order_id

SQL service 2012后的offset fetch
SELECT * FROM t_order o ORDER BY id OFFSET ? ROW FETCH NEXT ? ROWS ONLY
https://www.yiibai.com/sqlserver/sql-server-offset-fetch.html

不支持Wtih *** as (select ……)分页:hibernate自动分页语句使用了,所以不支持基于hibernate的sqlservice 分页

不支持两个top+子查询的分页方式

其他功能

行表达式

实现动机:配置简化和一体化

语法:Groovy

配置中使用${expression}或$—>{expression}标识

目前支持数据节点和分片算法的配置

多个${expression} $—>{expression},结果据每个子表达式结果笛卡尔组合

分布式主键

snowflake

分片规则配置每个表主键生成策略,默认使用雪花算法生成64bit长整型数据

不同进程主键不重复,同一进程主键有序

        同进程中,通过时间位:不重复,时间同序通列位保证不重复

        主键:1bit符号位,41bit时间戳位,10bit工作进程位,12bit序列号位

符号位:预留符号位恒为0

时间戳位:毫秒数:2的41次幂,一年所使用毫秒数 365*24*60*60*1000约等于69.73年,始于2016/11/1/00:00:00

工作进程:java进程内唯一,分布式应用部署应保证每个进程id不同,该值默认为0可设置属性

序列号位:同一毫秒内生成不同ID,如该毫秒生超过4096(2的12次幂),生成器等待下一毫秒

时钟回拨

将导致重复序列,默认分布式主键生成器提供了一个最大容忍的时钟回拨毫秒数:默认0,设置属性

        超过,报错

        范围内,默认会等待时钟同步到最后一次主键生成的时间后再继续工作

leaf

leaf_segment和leaf_snowflake两种方案,目前shardingsphere已实现leaf_segment

强制分片路由

解析sql提取分片键列与值 进行分片,若无分片条件 无法分片 需全路由

使用threadlocal管理分片键值,通编程方式向hintmanager添加分片条件,仅当前线程有效

还计划通过sql中特殊注释引用hint,开发者透明方式使用该功能

指定强制分片路由sql无视原有分片逻辑,直接路由至指定真实数据节点

读写分离

据sql语义分析,读写路由至主从库

概念

主库:增删改操作使用的库,仅支持单主库

从库:查数据操作所使用的库,多从库

主从同步:主库数据异步的同步到从库,由于主从同步的异步性,主从数据短时间内不一致

功能

一主多从读写分离配置,可独立使用,可配合分库分表使用

独立使用读写分离支持sql透传

基于hint强制主库路由

同一线程且同一库连接内,如有写入,以后读均从主库取

不支持

主从数据同步,主从同步延迟导致数据不一致,主库双写或多写

编排治理

配置中心

配置中心在定义的命名空间的config下,以yaml格式存:数据源 数据分片 读写分离 properties配置

数据结构

config
    ├──authentication                            # Sharding-Proxy权限配置
    ├──props                                     # 属性配置
    ├──schema                                    # Schema配置
    ├      ├──sharding_db                        # SchemaName配置
    ├      ├      ├──datasource                  # 数据源配置
    ├      ├      ├──rule                        # 数据分片规则配置
    ├      ├──masterslave_db                     # SchemaName配置
    ├      ├      ├──datasource                  # 数据源配置
    ├      ├      ├──rule                        # 读写分离规则

https://shardingsphere.apache.org/document/current/cn/features/orchestration/config-center/  !!!

编排治理

通注册中心,提供熔断数据库访问程序对数据库访问和禁用从库访问

注册中心数据结构

在命名空间的state下,创建数据库访问对象运行节点,区分不同数据库访问实例:instances 和 datasources

state/instances:数据库访问对象运行实例信息,子节点:当前运行实例标识

        标识由 服务器IP和PID构成,临时节点 实例上线时注册下线时清理

         注册中心监控节点变化治理运行中实例对数据库的访问

state/datasources:治理读写分离从库,动态添加 删除 禁用

操作指南

熔断实例

在IP@-@PID节点写入disabled(忽略大小写):禁用该实例 删除disabled:启用

禁用从库

读写分离(数据分片+读写分离)可在数据源名称子节点中写入disabled:禁用从库数据源,删除disabled或节点:启用

注册中心

SPI:service provider interface 为被第三方实现或扩展的api:实现框架扩展或组件替换

zookeeper:

官方使用apache curator(zk的java/jvm客户端)做为zk实现方案

Etcd

官方使用原生etcd做为etcd实现方案

应用性能监控

APM:着眼于分布式系统性能诊断,调用链展示,应用拓扑分析

shardingsphere将sql解析与执行的数据分片最核心的相关信息发送至应用性能监控系统

发布了431 篇原创文章 · 获赞 155 · 访问量 44万+

猜你喜欢

转载自blog.csdn.net/ma15732625261/article/details/100085817