随着数据规模的不断扩大,采用多节点集群的分布式方式逐渐成为一种趋势。在这种情况下,如何高效、自动地管理集群节点,实现不同节点的协同工作、配置一致性、状态一致性、高可用性、可观测性等。,成为一个重要的挑战。
集群管理的复杂性在于,一方面,我们需要管理所有节点,无论是底层数据库节点、中间件还是业务系统节点,并能实时检测最新的配置变化,从而进一步为集群的调控和调度提供依据。
另一方面,不同节点之间的统一协调、子数据库和子表的策略以及规则的同步也要求我们设计一套分布式的协调锁机制,用于分布式情况下的全局事件通知和独占操作。在这方面,ShardingJDBC采用Zookeeper/Etcd实现配置同步、状态变化通知和分布式锁控制独占操作。
ShardingJDBC分布式治理ShardingJDBC集成了Zookeeper/Etcd,实现了ShardingJDBC的分布式治理。我们先通过一个应用程序来演示一下实现原理。
安装Zookeeper从这个地址下载:
zookeeper https://mirrors . tuna . Tsinghua . edu . cn/Apache/zookeeper/zookeeper-3 . 6 . 3/Apache-zookeeper-3 . 6 . 3-bin . tar . gz
本阶段演示的项目代码:撒丁-JDBC-斯普利特-动物园管理员,项目结构如图9-1所示。
图9-1项目结构
添加jar包依赖引入jar包依赖(只依赖以下两个包)
& lt依赖性& gt & lt;groupId & gtorg . Apache . sharding sphere & lt;/groupId & gt; & lt;artifactId & gt鲨鱼圈-治理-仓库-动物园管理员-馆长。/artifact id & gt; & lt;版本& gt5 . 0 . 0-alpha & lt;/version & gt; & lt;/dependency & gt; & lt;依赖性& gt & lt;groupId & gtorg . Apache . sharding sphere & lt;/groupId & gt; & lt;artifactId & gtsharding sphere-JDBC-governance-spring-boot-starter & lt;/artifact id & gt; & lt;版本& gt5 . 0 . 0-alpha & lt;/version & gt; & lt;排除事项& gt & lt;排除& gt & lt;groupId & gtorg . Apache . sharding sphere & lt;/groupId & gt; & lt;artifactId & gtsharding sphere-test & lt;/artifact id & gt; & lt;/exclusion & gt; & lt;/exclusions>。 & lt;/dependency & gt; 其他基本jar包(所有项目都基于spring boot integrated mybatis副本)
& lt依赖性& gt & lt;groupId & gtorg . spring framework . boot & lt;/groupId & gt; & lt;artifactId & gtspring-boot-starter-web & lt;/artifact id & gt; & lt;/dependency & gt; & lt;依赖性& gt & lt;groupId & gtmysql & lt/groupId & gt; & lt;artifactId & gtMySQL-connector-Java & lt;/artifact id & gt; & lt;范围& gt运行时& lt/scope & gt; & lt;/dependency & gt; & lt;依赖性& gt & lt;groupId & gtcom.baomidou & lt/groupId & gt; & lt;artifactId & gtmy batis-plus-boot-starter & lt;/artifact id & gt; & lt;版本& gt3 . 4 . 3 & lt;/version & gt; & lt;/dependency & gt; & lt;依赖性& gt & lt;groupId & gtcom.baomidou & lt/groupId & gt; & lt;artifactId & gtmybatis加发电机& lt/artifact id & gt; & lt;版本& gt3 . 4 . 1 & lt;/version & gt; & lt;/dependency & gt; & lt;依赖性& gt & lt;groupId & gtcom .阿里巴巴& lt/groupId & gt; & lt;artifactId & gtfastjson & lt/artifact id & gt; & lt;版本& gt1 . 2 . 72 & lt;/version & gt; & lt;/dependency & gt; & lt;依赖性& gt & lt;groupId & gtorg . Apache . commons & lt;/groupId & gt; & lt;artifactId & gtcommons-lang 3 & lt;/artifact id & gt; & lt;版本& gt3.9 & lt/version & gt; & lt;/dependency & gt; & lt;依赖性& gt & lt;groupId & gtorg.projectlombok & lt/groupId & gt; & lt;artifactId & gt龙目岛& lt/artifact id & gt; & lt;版本& gt1 . 18 . 12 & lt;/version & gt; & lt;/dependency & gt; 添加配置文件添加基本子表配置-application.properties
spring . sharding sphere . data source . names = ds-0,ds-1 spring . sharding sphere . data source . common . type = com . zax xer . hikari . hikari data source spring . sharding sphere . data source . common . driver-class-name = com . MySQL . JDBC . driver spring . sharding sphere . data source . ds-0 . ds-0 . password = 1233server time zone = UTC & use SSL = false & use unicode = true & character encoding = UTF-8 spring . sharding sphere . data source . ds-1 . username = root spring . sharding sphere . data source . ds-1 . password = 123456 spring . sharding sphere . data source . ds-1 . JDBC-URL = JDBC:MySQL://192 . 168 . 221 . 128:3306/sharserver time zone = UTC & use SSL = false & use unicode = true & character encoding = UTF-8 spring . sharding sphere . rules . sharding . default-database-strategy . standard . sharding-column = user _ id spring . sharding sphere . rules . sharding . default-database-strategy . standard . sharding-algorithm-name = database-inline spring . sharding sphere . rules . sharding . tables . t _ order . actual-data-tables{0..1}.t _ order _ $-& gt;{0..1 } spring . sharding sphere . rules . sharding . tables . t _ order . table-strategy . standard . sharding-column = order _ id spring . sharding sphere . rules . sharding . tables . t _ order . table-strategy . standard . sharding-algorithm-name = t-order-INLINE spring . sharding sphere . rules . sharding . tables . t _ order . key-generate-strategy . column = order _ id spring . sharding sphere{ user _ id % 2 } spring . sharding sphere . rules . sharding . sharding-algorithms . t-order-INLINE . type = INLINE spring . sharding sphere . rules . sharding . sharding-algorithms . t-order-INLINE . props . algorithm-expression = t _ order _ $-& gt;{ order _ id % 2 } spring . sharding sphere . rules . sharding . sharding-algorithms . t-order-item-INLINE . type = INLINE spring . sharding sphere . rules . sharding . sharding-algorithms . t-order-item-INLINE . props . algorithm-expression = t _ order _ item _ $-& gt;{ order _ id % 2 } spring . sharding sphere . rules . sharding . key-generators . snow flare . type = snow flare spring . sharding sphere . rules . sarharding . key-generators . snow flare . props . worker-id = 123 添加zookeeper配置#治理名称(Zookeeper上的节点名称) spring . sharding sphere . Governance . name = Harding-JDBC-split-Zookeeper 。如果可以覆盖的话,每次启动都要经过本地配置。 spring . sharding sphere . government . overwrite = true # ZooKeeper/etcd spring . sharding sphere . governance . registry-center . type = ZooKeeper spring . sharding sphere . government . registry-center . server-lists = 192 . 168 . 221 . 131:2181 #添加以下两个参数的原因是链接的默认超时时间为1500毫秒连接失败 # Retries spring . sharding place . government . registry-center . props . max Retries = 4 # Retry interval spring . sharding sphere . governance . registry-center . props . retryinvalmillicenses = 6000 启动项目进行测试启动过程中会看到以下日志,这表明zookeeper配置成功。启动时,会先将本地配置保存到zookeeper中,然后我们可以在zookeeper中修改相关配置,再同步通知相关应用节点。
2021-07-29 21:31:25.007 INFO 112916-[main]org . Apache . zookeeper . zookeeper:客户端环境:Java . io . tmpdir = C:UsersmaynAppDataLocalTemp 2021-07-29 21:31:25.007 INFO 112916-[main]org . Apache . zookeeper . zookeeper:客户端环境:java.compiler = & ltNA & gt 2021-07-29 21:31:25.007 INFO 112916-[main]org . Apache . zookeeper . zookeeper:客户端环境:OS . name = Windows 10 2021-07-29 21:31:25.007 INFO 112916-[main]org . Apache . zookeeper . zookeeper:客户端环境:OS . arch = amd64 2021-2021er 2021-07-29 21:31:25.007 INFO 112916-[main]org . Apache . zookeeper . zookeeper:客户端环境:OS . memory . free = 482 MB 2021-07-29 21:31:25.007 INFO 112916-[main]org . Apache . zookeeper . zookeeper:客户端环境:os.memory.max=7264MB 功能已启用= false 2021-07-29 21:31:25.030 info 112916-[main]o . a . c . f . Imps策展人Frameworkimpl:默认schema 然后访问以下接口进行测试。

@ rest controller @ request mapping(& # 34;/t-order & # 34;) public class torder controller { @ Autowired ITOrderService orderService; @ get mapping public void init()抛出SQLException { orderservice . init environment(); orderservice . process success(); } } 配置中心的数据结构描述注册中心的数据结构如下
命名空间:即spring。shardingsphere.government.name
Namespace ├──users #权限配置 ├──props #属性配置 ├──schemas #模式配置 ├├── $ {schema _ 1 ├├├-Rule #规则配置 ├├├-Table #表结构配置 ├├-$ {schema _ 2} #模式名2 [/h]表结构配置 规则全局配置规则可以包含访问ShardingSphere的权限配置-代理用户名和密码。
- !权限用户:-root @ %:root-Harding @ 127 . 0 . 0 . 1:sharding provider:type:native props属性配置ShardingSphere相关属性配置
executor-size:20 SQL-show:true /schemas/$ { scheme name }/data sources多个数据库连接池的集合。不同的数据库连接池属性是自适应的(比如DBCP,C3P0,德鲁伊,HikariCP)。
ds _ 0:data source class name:com . zax xer . hikari . hikari data source props:URL:JDBC:MySQL://127 . 0 . 0 . 1:3306/demo _ ds _ 0?server time zone = UTC & use SSL = false password:null maxPoolSize:50 connectionTimeoutMilliseconds:30000 idleTimeoutMilliseconds:60000 minPoolSize:1用户名:root maxLifeti memillissues:1800000 ds _ 1:data source class name:com . zax xer . hikari . hikari data source props:URL:JDBC:MySQL://127 . 0 . 0 . 1:3306/demo _ ds _ 1?server time zone = UTC & use SSL = false password:null maxPoolSize:50 connectionTimeoutMilliseconds:30000 idleTimeoutMilliseconds:60000 minPoolSize:1用户名:root maxLifeti Me milliseconds:1800000 /schemes/$ { scheme name }/rule规则配置,可以包括数据分片、读写分离等配置规则。
规则:-!分片默认数据库策略:标准:分片算法名称:数据库内联分片列:user_id密钥生成器:雪花:道具:worker-id:& # 39;123'type:雪花分片algorithms:t-order-inline:props:algorithm-expression:t _ order _ $-& gt;{order_id % 2}类型:内联数据库-内联:props:算法-表达式:ds-$-& gt;{ user _ id % 2 } type:INLINE t-order-item-INLINE:props:algorithm-expression:t _ order _ item _ $-& gt;{order_id % 2}类型:内联表:t _ order:actual datanodes:ds-$-& gt;{0..1}.t _ order _ $-& gt;{0..1 } key generate strategy:column:order _ id key generator name:snow flake logical table:t _ order table strategy:standard:sharding algorithm name:t-order-inline s Harding column:order _ id /schemas/$ { schemename }/table表结构配置,暂时不支持动态修改。
configuredschemayetadata:tables:t _ order:columns:order _ id:case sensitive:false dataType:0 generated:true name:order _ id primary key:true user _ id:case sensitive:false dataType:0 generated:false name:user _ id primary key:false address _ id:case sensitive:false dataType:0 generated:false status:case sensitive:false dataType:0 generated:false name:status primary key:false unconfiguredschemayetadata map:ds-0:-t
例如,我们修改了图9-2中红色部分的位置,并把T _ order _ $-->:{ 0..1}被改为t _ order _ $-->;{0..4},所以会生成四个切片,取片规则也会相应改变。
然后点击保存,在应用节点没有重启的情况下,重新发起接口测试请求,修改成功后可以看到结果。
http://localhost:8080/swagger-ui . html
图9-2动物园管理员配置中心
注册中心节点在zookeeper服务器上,还存在以下节点信息。
命名空间├──states├├──proxynodes├├├──${your_instance_ip_a}@${your_instance_pid_x}@${uuid}├├├──${your_instance_ip_b}@${your_instance_pid_y} @ $ { uuid }├├├──....├├──datanodes├├├──${schema_1}├├├├──${ds_0}├├├├──${ds_1}├├├──${schema_2}├├├├──${ds_0}├├├├──${ds_1}├├├——... 这是注册表节点,用于存储shardingsphere-proxy中间件的服务器实例信息和实例运行状态。
运行实例ID由运行服务器的IP地址和PID组成。
正在运行的实例标识符是临时节点,当实例联机时注册,当它脱机时自动清除。注册中心监控这些节点的变化,管理运行实例对数据库的访问等。
由于注册中心会在后面的内容中讲到,这里暂时不展开。
分布式治理总结引入zookeeper的角色可以帮助ShardingJDBC完成以下功能
到目前为止,ShardingSphere中的Sharding-JDBC部分的内容到此结束,另一个组件Harding-proxy还没有开发,因为它相当于在数据库层面实现了代理,也就是说,开发者不需要在应用中配置数据库子表的规则,而是直接连接Harding-proxy作为数据库源。Harding-proxy相当于Mysql数据库的代理。请求发送到Harding-proxy后,Harding-proxy上会配置相关的分片规则,然后根据分片规则进行相关的处理。
原文:https://www.cnblogs.com/mic112/p/15459515.html
作者:遵循Mic架构
如果你觉得这篇文章对你有帮助,可以转发关注支持。








