一、diamond简介
diamond是淘宝内部使用的一个管理持久配置的系统。为应用系统提供获取配置的服务,应用不仅可以启动时从diamond获取相关配置,而且可以在运行中对配置数据的变化进行感知并获取变化后的配置数据。
二、diamond架构图
三、diamond核心原理
1. diamond-server集群的数据同步
- diamond-server写数据时,先写入MySQL数据库,然后再写入本地缓存文件,写完后发送HTTP请求给集群中其它diamond-server,其它diamond-server收到请求后,从MySQL数据库中读取刚刚写入的数据至本地文件。
- diamond-server启动后会启动一个定时任务,定时从MySQL中拉取所有数据至本地文件。
2. diamond-client获取diamond-server地址
- diamond-client需要绑定域名服务器(地址服务器),域名服务器上有一个静态文件存储这diamond服务器的地址列表,客户端启动时,根据自身的域名绑定,连接到域名服务器,取回diamond-server服务器的地址列表,从中随机选择一台diamond服务器进行连接。
- diamond-client启动后会启动一个定时任务,定时从域名服务器上获取地址列表并保存到本地文件中。
3. diamond-client主动获取数据
- diamond-client调用getAvailableConfigInfomation(),即可获取一份最新的可用的配置数据。
- 为防止短时间出现大量请求,diamond-client实现了一个带有过期时间的缓存,在过期时间内的请求直接返回缓存中的数据,不再向diamond-server发出请求。
4. diamond-client运行中感知数据变化
- 通过比较diamond-client和diamond-server的数据的MD5值,判断数据是否发生变化。
- diamond-server启动时,会将所有数据的MD5加载到内存中(MD5存储在MySQL数据库中),并且启动一个定时任务,定时去diamond-server检查数据是否发生变化。若MD5相同,则返回一个不变字符串给diamond-client,否则返回dataId和group给diamond-client,diamond-client根据dataId和group去diamond-server请求数据。
四、diamond容灾
- diamond-server采用“数据库+本地文件”的方式存储数据
- diamond-server是一个集群
- diamond-client保存snapshot
五、diamond适用场景
- 持久配置的统一管理(配置内容很少发生变化、一般为手动发布配置信息)
- 运行时接收配置变化并处理
六、参考文献
- diamond专题(二)http://jm-blog.aliapp.com/?p=1592
- diamond专题(三)http://jm-blog.aliapp.com/?p=1606
- diamond专题(四)http://jm-blog.aliapp.com/?p=1617