Python 进行大数据分布式系统协调的n种方式

         

Python 进行分布式系统协调

2016-11-01  Python开发者

(点击上方公众号,可快速关注)

 

来源:naughty 

链接:my.oschina.net/taogang/blog/410864

 

随着大数据时代的到来,分布式是解决大数据问题的一个主要手段,随着越来越多的分布式的服务,如何在分布式的系统中对这些服务做协调变成了一个很棘手的问题。今天我们就来看看如何使用Python,利用开源对分布式服务做协调。

 

在对分布式的应用做协调的时候,主要会碰到以下的应用场景:

 

  • 业务发现(service discovery)找到分布式系统中存在那些可用的服务和节点

  • 名字服务 (name service)通过给定的名字知道到对应的资源

  • 配置管理 (configuration management)如何在分布式的节点中共享配置文件,保证一致性。

  • 故障发现和故障转移 (failure detection and failover)当某一个节点出故障的时候,如何检测到并通知其它节点, 或者把想用的服务转移到其它的可用节点

  • 领导选举(leader election)如何在众多的节点中选举一个领导者,来协调所有的节点

  • 分布式的锁 (distributed exclusive lock)如何通过锁在分布式的服务中进行同步

  • 消息和通知服务 (message queue and notification)如何在分布式的服务中传递消息,以通知的形式对事件作出主动的响应

 

有许多的开源软件试图解决以上的全部或者部分问题,例如ZooKeeper,consul,doozerd等等,我们现在就看看它们是如何做的。

 

ZooKeeper

 

ZooKeeper是使用最广泛,也是最有名的解决分布式服务的协调问题的开源软件了,它最早和Hadoop一起开发,后来成为了Apache的顶级项目,很多开源的项目都在使用ZooKeeper,例如大名鼎鼎的Kafka。

 

Zookeeper本身是一个分布式的应用,通过对共享的数据的管理来实现对分布式应用的协调。

 

ZooKeeper使用一个树形目录作为数据模型,这个目录和文件目录类似,目录上的每一个节点被称作ZNodes。

 

 

ZooKeeper提供基本的API来操纵和控制Znodes,包括对节点的创建,删除,设置和获取数据,获得子节点等。

 

除了这些基本的操作,ZooKeeper还提供了一些配方(Recipe),其实就是一些常见的用例,例如锁,两阶段提交,领导选举等等。

 

ZooKeeper本身是用Java开发的,所以对Java的支持是最自然的。它同时还提供了C语言的绑定。

 

Kazoo是一个非常成熟的Zookeeper Python客户端,我们这就看看如果使用Python来调用ZooKeeper。(注意,运行以下的例子,需要在本地启动ZooKeeper的服务)

 

基本操作

 

以下的例子现实了对Znode的基本操作,首先要创建一个客户端的连接,并启动客户端。然后我们可以利用该客户端对Znode做增删改,取内容的操作。最后推出客户端。

 

from kazoo.client import KazooClient

 

import logging

logging.basicConfig()

 

zk = KazooClient(hosts='127.0.0.1:2181')

zk.start()

 

# Ensure a path, create if necessary

zk.ensure_path("/test/zk1")

 

# Create a node with data

zk.create("/test/zk1/node", b"a test value")

 

# Determine if a node exists

if zk.exists("/test/zk1"):

    print "the node exist"

 

# Print the version of a node and its data

data, stat = zk.get("/test/zk1")

print("Version: %s, data: %s" % (stat.version, data.decode("utf-8")))

 

# List the children

children = zk.get_children("/test/zk1")

print("There are %s children with names %s" % (len(children), children))

 

zk.stop()

 

通过对ZNode的操作,我们可以完成一些分布式服务协调的基本需求,包括名字服务,配置服务,分组等等。

 

故障检测(Failure Detection)

 

在分布式系统中,一个最基本的需求就是当某一个服务出问题的时候,能够通知其它的节点或者某个管理节点。

 

ZooKeeper提供ephemeral Node的概念,当创建该Node的服务退出或者异常中止的时候,该Node会被删除,所以我们就可以利用这种行为来监控服务运行状态。

 

以下是worker的代码

 

from kazoo.client import KazooClient

import time

 

import logging

logging.basicConfig()

 

zk = KazooClient(hosts='127.0.0.1:2181')

zk.start()

 

# Ensure a path, create if necessary

zk.ensure_path("/test/failure_detection")

 

# Create a node with data

zk.create("/test/failure_detection/worker",

          value=b"a test value", ephemeral=True)

 

while True:

    print "I am alive!"

    time.sleep(3)

 

zk.stop()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值