1 背景
1.1 分布式技术的成熟,分布式的宽泛风行
分布式集群下的配置管理实现形式,在当下这个时代未然是 分布式 的时代,联合上国家提倡的新基建的大背景,云服务和虚拟化也曾经从高大上的名词变成了接地气的技术。
当初各个公司的服务,能用系统分布式的多台小型机器部署,就尽量不必大型计算机解决,一个十分经典的起因就是 单点故障。
1.2 分布式集群上的配置文件须要对立治理
当初,咱们以 JavaWeb 为例,你有一个分布式部署的 JavaWeb 服务,这些服务执行最简略的 CRUD 工作,上面连贯的是 MySQL,当初你须要在分布式部署的每台服务器上都写入同样的配置文件
jdbc.user=root
jdbc.password=123456
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://xxx.xxx.xxx.xxx:3306/database?useUnicode=true&characterEncoding=utf8
这时你面对几个问题:
- 哪里能够对立看到本人的集群配置
- 如果我须要批改连贯的 DB(比方主从切换),难道要一台台 ssh 下来改吗?
简略的解决办法就是写一个脚本,批量上传配置文件到每台服务器上的相应地位,而后重启服务。然而这样的问题在于没有方法对立治理和查看配置,而且存在上传失败的问题
能够发现配置的属性比拟相似于 dubbo 的 注册核心 ,保障 配置文件在分布式服务下的一致性
1.3 配置管理文件的几种实现计划
Zookeeper
Eureka
git
redis
对于这几种配置存储形式的比拟,咱们会独自开一个坑去探讨。本次咱们先探讨 ZooKeeper 的个性如何保障并实现高可用的配置管理系统。
1.4 采纳 ZooKeeper 可能存在问题
因为 ZooKeeper 在CAP 原理(C- 数据一致性;A- 服务可用性;P- 服务对网络分区故障的容错性,这三个个性在任何分布式系统中不能同时满足,最多同时满足两个)上只能满足 CP(数据统一和分区故障容错),zk 在 master 节点故障的时候整个 zk 服务选主过程不可用,因而会有稳定性问题。
解决的计划是在 zk 集群和使用者之间结构一层缓存层
2 总体构造
2.1 搭建一个 zk 集群
https://zookeeper.apache.org/
首先须要搭建一个 zk 的集群,能够参照官网上的教程执行,本文不再赘述
2.2 开发 client 端
针对不同的开发语言(Java,C++,python,go),不同的环境(Spring…),开发配置核心 client 端,cient 端须要做到的事件:
- 封装 zkClient 操作,反对对于配置的 文件缓存 + 内存缓存 性能
- 通过 zkClient 的 watcher 订阅机制 订阅监听 zk 节点变更事件,以便于及时刷新缓存
- 对于例如 Spring 的环境,须要反对
#{property}
或者对于 SpringBoot 反对@Value
等注解的配置注入性能
2.3 开发治理端
治理端的性能是封装对于 zk 文件的查看和批改逻辑,以便于对配置文件进行对立治理,这里能够反对的操作有:
- 权限管制,通过 CAS 零碎建设账号体系,治理端保护 < 账户名 - 账户角色 > 的映射关系,对于不同角色的账户裸露不同的操作权限
- 查看目录构造和查看文件,即 zk 的 ls 和 get 命令
- 删除配置文件,即 zk 的 delete 命令
- 公布配置(发送 watcher 事件到 client 端),即对 zk 指定地位的文件进行批改操作
- 配置反对回滚操作,即 zk 的门路中反对版本号,公布操作时 copy 出一份原配置正本后再执行配置批改
reference
[1]《从 Paxos 到 ZooKeeper 分布式一致性原理与实际》
[2] 服务注册核心,Eureka 与 Zookeeper 比拟
[3] ZooKeeper 官网文档[OL]. http://zookeeper.apache.org/doc/