zookeeper的实用场景有统一配置,统一命名服务,集群管理,分布式锁,分布式队列。

今天,我的实验场景是集群管理的ha功能.

实验架构如下:

Server[A/B]代码:

此处,我们需要第3方的模块
zkclient.py(https://github.com/phunt/zk-smoketest/blob/master/zkclient.py)

需要做些稍微的修改,因为我这里的ACL采用的是digest,而不是world

导入些模块:

import base64
import hashlib

定义些变量

auth="badboy:test"
user="badboy"
user_auth = "%s:%s" % (user, base64.b64encode(hashlib.new("sha1", auth).digest()))
#ZOO_OPEN_ACL_UNSAFE = {"perms":0x1f, "scheme":"world", "id" :"anyone"}
ZOO_DIGEST_ACL_SAFE = {"perms":0x1f ,"scheme":"digest", "id" : user_auth}

再将代码处的ZOO_OPEN_ACL_UNSAFE修改为ZOO_DIGEST_ACL_SAFE

最后就是认证了,我们需要在ZKClient类中的__init__最后一行添加zookeeper.add_auth(self.handle,"digest",auth , None)

这样,我们连接的句柄就是经过认证的了.

注意Server[A/B]代码不同之处是service函数处,所输出的ip内容是不一样的。

#!/usr/bin/env python
import logging
from os.path import basename, join ,dirname
from zkclient import ZKClient, zookeeper
from SimpleXMLRPCServer import SimpleXMLRPCServerDEBUG=True
BASE_DIR=dirname(__file__)if DEBUG:logname=""file_mode=""
else:logname=join(BASE_DIR,"app.log")file_mode="a"logging.basicConfig(level = logging.DEBUG,format = "[%(asctime)s] %(levelname)-8s %(message)s",datefmt = "%Y-%m-%d %H:%M:%S",filename = logname,filemode = file_mode,
)log = loggingclass TCZookeeper(object):ZK_HOST = "192.168.x.5:2181"ROOT = "/tc"WORKERS_PATH = join(ROOT, "nodes")MASTERS_NUM = 1TIMEOUT = 1000def __init__(self, verbose = True):self.VERBOSE = verboseself.masters = []self.path = Noneself.zk = ZKClient(self.ZK_HOST, timeout = self.TIMEOUT)self.say("login ok!")self.__init_zk()self.register()self.start_service()def __init_zk(self):nodes = (self.ROOT, self.WORKERS_PATH)for node in nodes:if not self.zk.exists(node):try:self.zk.create(node, "")except:passdef register(self):self.path = self.zk.create(self.WORKERS_PATH + "/node", "192.168.x.4", flags=zookeeper.EPHEMERAL | zookeeper.SEQUENCE)self.paths=self.pathself.path = basename(self.path)self.say("register ok! I'm %s" % self.path)def service(self):'''do somethings'''return "My IP is:192.168.x.4"def start_service(self):server = SimpleXMLRPCServer(("192.168.x.4", 8000))self.say("Listening on port 8000...")server.register_function(self.service, "service") server.serve_forever()def say(self, msg):if self.VERBOSE:log.info(msg)if __name__ == "__main__":tczk=TCZookeeper()

启动Server[A|B]输出如下:

A机192.168.x.4:
[root@web02 scripts]# python server.py
[2014-12-24 14:40:37] INFO     login ok!
[2014-12-24 14:40:37] INFO     register ok! I'm node0000000034
[2014-12-24 14:40:37] INFO     Listening on port 8000...B机192.168.x.5(zookeeper也在这台机器噢):
[root@web02 scripts]# python server.py
[2014-12-24 14:40:37] INFO     login ok!
[2014-12-24 14:40:37] INFO     register ok! I'm node0000000035
[2014-12-24 14:40:37] INFO     Listening on port 8000...

我们再来看看Agent代码:

#!/usr/bin/env python
import xmlrpclib
import logging
from os.path import basename, join ,dirname
from zkclient import ZKClient, watchmethod
from SimpleXMLRPCServer import SimpleXMLRPCServerDEBUG=True
BASE_DIR=dirname(__file__)if DEBUG:logname=""file_mode=""
else:logname=join(BASE_DIR,"app.log")file_mode="a" logging.basicConfig(level = logging.DEBUG,format = "[%(asctime)s] %(levelname)-8s %(message)s",datefmt = "%Y-%m-%d %H:%M:%S",filename = logname,filemode = file_mode,
)log = loggingclass TCZookeeper(object):ZK_HOST = "192.168.x.5:2181"ROOT = "/tc"NODES_PATH = join(ROOT, "nodes")MASTERS_NUM = 1TIMEOUT = 1000def __init__(self, verbose = True):self.VERBOSE = verboseself.masters = []self.path = Noneself.zk = ZKClient(self.ZK_HOST, timeout = self.TIMEOUT)self.say("login ok!")self.get_master()def get_master(self):"""get children, and check who is the smallest child"""@watchmethoddef watcher(event):self.say("child changed, try to get master again.")self.get_master()children = self.zk.get_children(self.NODES_PATH, watcher)children.sort()self.say("%s's children: %s" % (self.NODES_PATH, children))self.masters = children[:self.MASTERS_NUM]self.path=self.NODES_PATH+"/"+self.masters[0]self.serverip=self.zk.get(self.path)self.say("MasterIP:%s" %self.serverip[0])       def rpc(self):try:proxy = xmlrpclib.ServerProxy("http://%s:8000/" %self.serverip[0]) return "content: %s" % str(proxy.service())except:passdef start_service(self):server = SimpleXMLRPCServer(("192.168.x.3", 8000))self.say("Listening on port 8000...")server.register_function(self.rpc, "rpc")server.serve_forever()def say(self, msg):if self.VERBOSE:log.info(msg)if __name__ == "__main__":tczk = TCZookeeper()tczk.start_service()

启动agent输出如下:

[root@web01 scripts]# python agent.py
[2014-12-24 14:43:29] INFO     login ok!
[2014-12-24 14:43:29] INFO     /tc/nodes's children: ['node0000000034', 'node0000000035']
[2014-12-24 14:43:29] INFO     MasterIP:192.168.x.4
[2014-12-24 14:43:29] INFO     Listening on port 8000...

最后,我们看下client

#!/usr/bin/env python
import xmlrpclib
import time
#proxy = xmlrpclib.ServerProxy("http://192.168.x.3:8000/")
while True:try:proxy = xmlrpclib.ServerProxy("http://192.168.x.3:8000/")print proxy.rpc()except:passtime.sleep(1)

输出结果:

root@saltstack:/scripts# python client.py
content: My IP is:192.168.x.4
content: My IP is:192.168.x.4
content: My IP is:192.168.x.4

此时,我们将其192.168.x.4服务关掉.

很快打印的内容就变成

content: My IP is:192.168.x.5
content: My IP is:192.168.x.5

再看agent输出有,

[2014-12-24 14:47:34] INFO     child changed, try to get master again.
[2014-12-24 14:47:34] INFO     /tc/nodes's children: ['node0000000035']
[2014-12-24 14:47:34] INFO     MasterIP:192.168.x.5

看到没,原先MasterIP:192.168.x.4,现在192.168.x.5

呵呵,HA的功能试验完成了.

参考文档:

http://blog.csdn.net/lengzijian/article/details/9233327

如果想了解更多,请关注我们的公众号
公众号ID:opdevos
扫码关注

zookeeper学习笔记2相关推荐

  1. ZooKeeper学习笔记(八):ZooKeeper集群写数据原理

    写数据原理 写流程直接请求发送给Leader节点 这里假设集群中有三个zookeeper服务端 ACK (Acknowledge character)即是确认字符,在数据通信中,接收站发给发送站的一种 ...

  2. Zookeeper学习笔记

    Zookeeper学习笔记 概念 Zookeeper工作机制 特点 数据结构 应用场景 统一命名服务 统一配置管理 统一集群管理 软负载均衡 Zookeeper本地安装 本地模式安装 安装前准备 配置 ...

  3. ZooKeeper学习笔记1-----------安装启动

    ZooKeeper是一套协作服务,主要用来构建分布式架构的应用,通过ZooKeeper我们可以安全的处理分布式应用下的局部故障问题.我们知道ZooKeeper就是Hadoop中的分布式协作服务组件.下 ...

  4. 【三万字!】Dubbo、Zookeeper学习笔记!秒杀面试官!——双非上岸阿里巴巴系列

    东北某不知名双非本科,四面成功上岸阿里巴巴,在这里把自己整理的笔记分享出来,欢迎大家阅读. 恰个饭--><阿里巴巴 Java 开发手册>,业界普遍遵循的开发规范 本博客内容持续维护, ...

  5. ZooKeeper学习笔记—配置管理

    为什么80%的码农都做不了架构师?>>>    最近在工作中,为了完善公司集群服务的架构,提高可用性,降低运维成本,因此开始学习ZooKeeper.     至于什么是ZooKeep ...

  6. ZooKeeper学习笔记五 ZooKeeper开源客户端ZkClient

    本文学习资源来自<从Paxos到ZooKeeper分布式一致性原理与实践> ZkClient ZkClient 在ZooKeeper原生API接口之上进行了封装,是一个更易用的ZooKee ...

  7. zookeeper 学习笔记 (C语言版本)

    1.zookeeper简介 zookeeper是Hadoop的子项目,在大型分布式系统中,zookeeper封装好了一些复杂易出错的服务,提供简单易用的接口,给使用者提供高效稳定的服务.这些服务包括配 ...

  8. zookeeper学习笔记之zk选举(二)

    目录 zookeeper选举机制 一.zk集群的角色与作用 二.zk集群选举核心概念与选举状态 三.zk集群发生时机与选举算法 四.zk集群三种模式 zookeeper选举机制 不对的地方欢迎指出! ...

  9. 【大数据】Zookeeper学习笔记

    第1章 Zookeeper入门 1.1 概述 Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目. 1.2 特点 1.3 数据结构 1.4 应用场景 提供的服务包括:统 ...

最新文章

  1. MySQL高可用之mysql-mmm环境搭建
  2. DirectX 9高层着色语言介绍3——语言基础(2)
  3. 同时设置超时时间_刚入职的小菜鸡,设错了RPC超时,搞了个线上事故
  4. MyEclipse部署Web项目Servers报错:NullPointerException at com.genuitec.eclipse.ast.deploy.core.Deployment
  5. Vue.js(5)- 全局组件
  6. 手把手教Electron+vue的使用
  7. 1014 福尔摩斯的约会 (20分)
  8. openerp mac os 下 报表中文乱码问题。
  9. calibration trl 设计_校准:怎样设计和验证TRL校准件以及TRL校准的具体过程
  10. Python 模拟微博登陆,亲测有效!
  11. layui的tree如何实现动态加载_layui tree动态加载 利用CAReplicatorLayer实现的加载动画 - 电脑常识 - 服务器之家...
  12. Android日志系统Logcat源代码简要分析
  13. 轻量级MVC框架(自行开发)
  14. [转] Photoshop教程8000例
  15. MacOS删除系统自带软件-MacOS10.15 Catalina删除系统系统软件
  16. C# HttpWebRequest 模拟下载
  17. Linux实现ISCSI共享设备
  18. stm32 不断进入串口中断的bug解决方法
  19. 控制台报错element: <Goods> - did you register the component correctly? For recursive components, make sur
  20. 打印机计算机不在同一个工作组,不在一个工作组的两台电脑怎么实现打印共享?...

热门文章

  1. Java常用消息队列原理介绍及性能对比
  2. 简述Docker过去6个月的变化
  3. JavaScript中typeof的用法
  4. cocos2dx luajavaBridge 学习笔记
  5. 没有了SA密码,无法Windows集成身份登录,DBA怎么办?
  6. JQery遍历方法each
  7. mysql find_in_set
  8. CCNA10月27日战报
  9. CCIE PASSED
  10. 制作一个简易的QQ×××