设为首页 收藏本站
查看: 642|回复: 0

[经验分享] 使用zookeeper实现静态数据中心化配置管理

[复制链接]
发表于 2017-4-19 11:51:03 | 显示全部楼层 |阅读模式
使用zookeeper实现静态数据中心化配置管理
    各个项目都会存在静态数据配置,这些数据平台变化很少,为提高性能一般采用缓存的方式缓存数据。如果采用分布式缓存,网络成本比较高不太适合
一般采用本地缓存,在单机环境下修改缓存数据方式比较简单,更新数据库的同时,也修改更新本地缓存,但在集群模式下可就没有这么简单,最简单直接
的方式就是一台台服务器等去修改,费时费力。或者通过jms消息同步的方式进行处理,具体不描述太多。这里介绍另外一种方式,即使用zookeeper实现
静态数据中心化配置管理。
    先简单介绍一下zookeeper,ZooKeeper是近期比较热门的一个Paxos算法实现,也是Hadoop下的一个子项目,被认为是Google Chubby的开源版,
主要用来在分布式环境下提供分布式锁、配置管理、名字服务、群组服务。它具有很高的可用性、稳定性、可靠性。它在分布式应用中像一把瑞士军刀,
很多地方都用得着。
为了缓存数据,需要一个HashMap对象,但JDK中的HashMap是不支持分布式环境同步数据的。为此需要结合zookeeper重新实现一个HashMap,
取名叫做ZKHashMap。连接到zookeeper服务器的任何一个客户端修改了ZKHashMap。能够通过zookeeper服务器主动同步到其它连接到zookeeper服务器的客户端。
搜索发现已经有这样的实现工具包:menagerie(https://github.com/openUtility/menagerie)。官网描述为:Menagerie is an implementation of the
Java Concurrency Libraries based on the popular Apache ZooKeeper。主要功能有分布式集合、分布式队列、分布式锁的实现。有兴趣可以去学习一下源码
为了演示其效果,做个测试,代码如下,
public class TestZKHashMap {
private static final String hostString = "localhost:2181";
private static final String baseHashMapPath = "/test-maps";
private static final String baseLockPath = "/test-locks";
private static final String Init_Done = "/initData";
private static final int timeout = 2000;
private static ZooKeeper zk1, zk2;
private static ZkSessionManager zkSessionManager1, zkSessionManager2;
private static ZkHashMap<String,Person> testMap1, testMap2;
private static Serializer<Entry<String, Person>> serializer = new JavaSerializer<String, Person>();
public static void main(String[] args) throws Exception {
setup();
final CountDownLatch latch = new CountDownLatch(2);
Thread thread1 = new Thread() {
@Override
public void run() {
initData(zk1, zkSessionManager1);
String znode = "test1";
Person person = new Person("melin");
testMap1.put(znode, person);
latch.countDown();
}
};
Thread thread2 = new Thread() {
@Override
public void run() {
initData(zk2, zkSessionManager2);
String znode = "test2";
Person person = new Person("melin");
testMap2.put(znode, person);
latch.countDown();
}
};
thread1.start();
thread2.start();
latch.await();
Thread.sleep(100);
if(testMap1.containsKey("test2")) {
System.out.println("testMap1 包含 test2");
}
if(testMap2.containsKey("test1")) {
System.out.println("testMap2 包含 test1");
}
tearDown();
}
private static ZooKeeper newZooKeeper() throws IOException {
return new ZooKeeper(hostString, timeout,new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("+++++++++"+event);
}
});
}
public static void setup() throws Exception {
zk1 = newZooKeeper();
zk1.create(baseHashMapPath,new byte[]{}, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
zkSessionManager1 = new BaseZkSessionManager(zk1);
testMap1 = new ZkHashMap<String, Person>(baseHashMapPath, zkSessionManager1, serializer);
zk2 = newZooKeeper();
zkSessionManager2 = new BaseZkSessionManager(zk2);
testMap2 = new ZkHashMap<String, Person>(baseHashMapPath, zkSessionManager2, serializer);
}
public static void tearDown() throws Exception{
try{
ZkUtils.recursiveSafeDelete(zk1,baseHashMapPath,-1);
ZkUtils.recursiveSafeDelete(zk1,baseLockPath,-1);
ZkUtils.recursiveSafeDelete(zk1,Init_Done,-1);
}catch(KeeperException ke){
//suppress because who cares what went wrong after our tests did their thing?
}finally{
zk1.close();
zk2.close();
}
}
public static void initData(ZooKeeper zk, ZkSessionManager zkSessionManager) {
final Lock lock = new ReentrantZkLock(baseLockPath, zkSessionManager);
try {
if (null == zk.exists(Init_Done, true)) {
// if the init_done node not exists we try to init
lock.lock();
if(zk.exists(Init_Done, true) != null) {
System.out.println("已经初始化数据"+zk);
return;
}
System.out.println("初始化数据"+zk);
//创建初始化成功标识,注意这个标志是永久节点
zk.create(Init_Done, null, Ids.OPEN_ACL_UNSAFE,  CreateMode.PERSISTENT);
//工作完成,释放锁
lock.unlock();
} else {// if init_done exists we simply load data from gcih
System.out.println("已经初始化数据"+zk);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

感叹zookeeper用一个简单的树结构模型实现Paxos算法......
资料
1:Paxos算法之旅(一)追本溯源
http://rdc.taobao.com/team/jm/archives/397
2:Paxos算法中文翻译
   http://wenku.baidu.com/view/87276e1dfad6195f312ba6d7.html
3:Blog:http://zoutm.iteye.com/blog/708324

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-366373-1-1.html 上篇帖子: hbase 下篇帖子: 使用zookeeper实现静态数据中心化配置管理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表