zookeeper学习笔记2
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相关推荐
- ZooKeeper学习笔记(八):ZooKeeper集群写数据原理
写数据原理 写流程直接请求发送给Leader节点 这里假设集群中有三个zookeeper服务端 ACK (Acknowledge character)即是确认字符,在数据通信中,接收站发给发送站的一种 ...
- Zookeeper学习笔记
Zookeeper学习笔记 概念 Zookeeper工作机制 特点 数据结构 应用场景 统一命名服务 统一配置管理 统一集群管理 软负载均衡 Zookeeper本地安装 本地模式安装 安装前准备 配置 ...
- ZooKeeper学习笔记1-----------安装启动
ZooKeeper是一套协作服务,主要用来构建分布式架构的应用,通过ZooKeeper我们可以安全的处理分布式应用下的局部故障问题.我们知道ZooKeeper就是Hadoop中的分布式协作服务组件.下 ...
- 【三万字!】Dubbo、Zookeeper学习笔记!秒杀面试官!——双非上岸阿里巴巴系列
东北某不知名双非本科,四面成功上岸阿里巴巴,在这里把自己整理的笔记分享出来,欢迎大家阅读. 恰个饭--><阿里巴巴 Java 开发手册>,业界普遍遵循的开发规范 本博客内容持续维护, ...
- ZooKeeper学习笔记—配置管理
为什么80%的码农都做不了架构师?>>> 最近在工作中,为了完善公司集群服务的架构,提高可用性,降低运维成本,因此开始学习ZooKeeper. 至于什么是ZooKeep ...
- ZooKeeper学习笔记五 ZooKeeper开源客户端ZkClient
本文学习资源来自<从Paxos到ZooKeeper分布式一致性原理与实践> ZkClient ZkClient 在ZooKeeper原生API接口之上进行了封装,是一个更易用的ZooKee ...
- zookeeper 学习笔记 (C语言版本)
1.zookeeper简介 zookeeper是Hadoop的子项目,在大型分布式系统中,zookeeper封装好了一些复杂易出错的服务,提供简单易用的接口,给使用者提供高效稳定的服务.这些服务包括配 ...
- zookeeper学习笔记之zk选举(二)
目录 zookeeper选举机制 一.zk集群的角色与作用 二.zk集群选举核心概念与选举状态 三.zk集群发生时机与选举算法 四.zk集群三种模式 zookeeper选举机制 不对的地方欢迎指出! ...
- 【大数据】Zookeeper学习笔记
第1章 Zookeeper入门 1.1 概述 Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目. 1.2 特点 1.3 数据结构 1.4 应用场景 提供的服务包括:统 ...
最新文章
- MySQL高可用之mysql-mmm环境搭建
- DirectX 9高层着色语言介绍3——语言基础(2)
- 同时设置超时时间_刚入职的小菜鸡,设错了RPC超时,搞了个线上事故
- MyEclipse部署Web项目Servers报错:NullPointerException at com.genuitec.eclipse.ast.deploy.core.Deployment
- Vue.js(5)- 全局组件
- 手把手教Electron+vue的使用
- 1014 福尔摩斯的约会 (20分)
- openerp mac os 下 报表中文乱码问题。
- calibration trl 设计_校准:怎样设计和验证TRL校准件以及TRL校准的具体过程
- Python 模拟微博登陆,亲测有效!
- layui的tree如何实现动态加载_layui tree动态加载 利用CAReplicatorLayer实现的加载动画 - 电脑常识 - 服务器之家...
- Android日志系统Logcat源代码简要分析
- 轻量级MVC框架(自行开发)
- [转]	Photoshop教程8000例
- MacOS删除系统自带软件-MacOS10.15 Catalina删除系统系统软件
- C# HttpWebRequest 模拟下载
- Linux实现ISCSI共享设备
- stm32 不断进入串口中断的bug解决方法
- 控制台报错element: <Goods> - did you register the component correctly? For recursive components, make sur
- 打印机计算机不在同一个工作组,不在一个工作组的两台电脑怎么实现打印共享?...