以fourinone为例详细解析分布式协调的设计原理

fourinone 实际上可以单独当做 Zookeeper 用,它使用最少的代码实现了 Zookeeper 的所有功能,并且力图做到功能更强但是使用更简洁。本文以 fourinone 为例详细解析了分布式协调的设计原理。

Fourinone(中文名字“四不像”)是一个四合一分布式计算框架,在写这个框架之前,我对分布式计算进行了长时间的思考,也看了老外写的其他开源框架。当我们把复杂的 Hadoop 当作一门学科学习时,似乎忘记了我们想解决问题的初衷:我们仅仅是想写个程序把几台甚至更多的机器一起用起来计算,把更多的 CPU 和内存利用上,来解决我们数量大和计算复杂的问题。当然这个过程中要考虑到分布式的协同和故障处理。如果仅仅是为了实现这个简单的初衷,为什么一切会那么复杂。我觉的自己可以写一个更简单的东西,它不需要过度设计,只需要看上去更酷一点,更小巧一点,功能更强一点。于是我将自己对分布式的理解融入到这个框架中,考虑到底层实现技术的相似性,我将 Hadoop,Zookeeper,MQ, 分布式缓存四大主要的分布式计算功能合为一个框架内,对复杂的分布式计算应用进行了大量简化和归纳。

Fourinone2.0 提供了一个 4 合 1 分布式框架和简单易用的编程 API,实现对多台计算机 CPU、内存、硬盘的统一利用,从而获取到强大计算能力去解决复杂问题。由于多计算机物理上独立,Fourinone 框架也提供完整的分布式协同和锁以及简化 MQ 功能,用于实现多机的协作和通讯。

Fourinone 框架提供了一系列并行计算模式(农民工 / 包工头 / 职介绍 / 手工仓库)用于利用多机多核 CPU 的计算能力; 提供完整的分布式缓存和小型缓存用于利用多机内存能力; 使提供像操作本地文件一样操作远程文件(访问、并行读写、拆分、排它、复制、解析、事务等)用于利用多机硬盘存储能力; 由于多计算机物理上独立,Fourinone 框架也提供完整的分布式协同和锁以及简化 MQ 功能,用于实现多机的协作和通讯。

Fourinone 采用 Java 开发,2.0 版本整体大小 150k,就一个 jar 和一个配置文件,没有任何依赖,很方便嵌入式开发使用。

Zookeeper 简介

Zookeeper 是 Hadoop 生态系统中协同实现,提供协调服务包括分布式锁,统一命名等。Chubby 是 Google 分布式系统中的协同实现,和 Zookeeper 类似。Zookeeper 实际上是 Google 的 Chubby 一个开源的实现。Paxos 算法是 1989 年由莱斯利.兰伯特提出,此算法被广泛用于处理分布式系统的消息传递一致性。

Zookeeper 的配置中心实现更像一个文件系统,文件系统中的所有文件形成一个树状结构。Zookeeper 维护着这样的树形层次结构,树中的节点称为 znode, 每个 znode 存储的数据有小于 1m 的大小限制。zookeeper 对 znode 提供了几种类型:临时 znode、持久 znode、顺序 node 等几种类型,用于不同的一致性需求。在 znode 发生变化时,通过“观察”(watch)机制可以让客户端得到通知。可以针对 ZooKeeper 服务的“操作”来设置观察,该服务的其他操作可以触发观察。ZooKeeper 服务的“操作”包括一些对 znode 添加修改获取操作。ZooKeeper 采用一种类似 Paxos 的算法实现领导者选举,用于解决集群宕机的一致性和协同保障。总体上,Zookeeper 提供了一个分布式协同系统,包括配置维护、名字服务、分布式同步、组服务等功能,并将相关操作接口提供给用户。

实现原理

fourinone 对分布式协同的实现, 是通过建立一个 domain、node 两层结构的节点信息去完成。domain 可以是分类或者包,node 可以是具体属性。domain 和 node 都是自己根据需求设计命名,比如可以将 domain 命名为“a.b.c...”表示一个树型类目。

一个 domain 下可以有很多个 node,每个 node 只指定一个 domain,可以通过 domain 返回它下面所有的 node。

domain 不需要单独建立,通常在建立 node 时,如果不存在 domain 会自动创建。

如果 domain 下没有 node 了,该 domain 会自动删除。

如果删除 domain,该 domain 下面 node 也都会删除。

每个 node 下可以存放一个值,可以是任意对象。

所有的节点信息存放在 parkserver 里,parkserver 提供协同者的功能。如下图所示:

图 1. 协调实现架构

从上图可以看到,其他分布式进程可以通过 parkserver 的用户接口:ParkLocal,对节点进行增加、修改、删除、指定心跳、指定权限等操作,并且结合 parkserver 提供同步备份、领导者选举、过期时间设置等功能,共同来实现众多分布式协同功能。

我们举个例子,说明两个分布式应用完成协同功能的流程:

分布式应用 A 通过 ParkLocal 在 ParkServer 上创建一个 domain/node 的节点,并且在节点里存放相应的 value,这个节点以及它的 value 值代表分布式应用 A 的某种协同信息,它存放在 ParkServer 上用于向分布式应用 B 分享。 分布式应用 B 通过 ParkLocal 操作 ParkServer,对它上面的分布式应用 A 建立的这个 domain/node 节点进行监听,如果节点 value 发生变化,那么分布式应用 B 可以获取到这个 value,并进行相应的业务处理,这样便将各自独立的分布式应用 A 和 B 协同了起来。 由于 ParkServer 保存着用于协同的节点和信息,为了
防止 ParkServer 宕机导致整体故障,ParkServer 配置为一主多备的关系,互相同步信息,在故障时可以进行领导者选举,切换到备用 ParkServer 上继续提供协同服务。

关于分布式协同的场景还有很多,可以参考:

分布式配置,多个机器的应用公用一个配置信息,并且挂掉能够通过领导者选举进行恢复,详细见 指南和demo 分布式锁,多个机器竞争一个锁,当某个机器释放锁或者挂掉,其他机器可以竞争到锁继续,详细见 指南和demo 集群管理,集群内机器可以互相感知和领导者选举,详见 指南和demo

时间: 2024-10-25 05:12:34

以fourinone为例详细解析分布式协调的设计原理的相关文章

Photoshop详细解析斜面浮雕和等高线原理

Photoshop详细解析斜面浮雕和等高线原理         注:更多请关注photoshop教程栏目,三联PS群:182958314欢迎你的加入 分类: PS入门教程

分布式文件系统FastDFS设计原理

  原文地址: http://blog.chinaunix.net/uid-20196318-id-4058561.html FastDFS是一个开源的轻量级分布式文件系统,由跟踪服务器(tracker server).存储服务器(storage server)和客户端(client)三个部分组成,主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务.   Storage server Storage server(后简称st

Photoshop详细解析置换滤镜的工作原理

    当我第一次使用Photoshop的时候,我直奔滤镜菜单,想要研究一下这些可以做出很多绚丽效果的非常棒的功能.在这些菜单里,我第一次看到了这个名字:"置换 ".我将滤镜挨着试了一遍后最终又到了"置换 ". 这到底是个什么东东?在毫不犹豫地点击之后,呈现在我眼前的是一个充满陌生参数的奇怪的对话框. 我随意调整置换滤镜的默认参数,图片竟然没有丝毫变化. 好吧~ 点击"确定"!竟然弹出一个让我"选择一个置换图"的对话框. 我疑

分布式缓存服务器设计原理

1.数据是如何被分布到多个服务器上的?(一致性哈希算法) 假设有n台服务器, 计算这n台服务器的IP地址的哈希值, 把这些哈希值从小到大按顺时针排列组成一个"服务器节点环", 客户端需要存储一系列的"键值对"到这些服务器上去, 计算这些"键"的哈希值, 看看这些"键"的哈希值落在"服务器环"的哪些区间, 如下图所示: 根据上图示意,数据将被存储在"顺时针方向上的下一个服务器节点" 读取数

C++中的friend函数详细解析_C 语言

为什么要使用友元函数 在实现类之间数据共享时,减少系统开销,提高效率.如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数.具体来说:为了使其他类的成员函数直接访问该类的私有变量.即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数. 实际上具体大概有下面两种情况需要使用友元函数:(1)运算符重载的某些场合需要使用友元.(2)两个类要共享数据的时候. 使用友元函数的优缺点 优点:能够提高效率,表达简单.清晰. 缺点:友元函数破环

详细解析C#多线程同步事件及等待句柄_C#教程

最近捣鼓了一下多线程的同步问题,发现其实C#关于多线程同步事件处理还是很灵活,这里主要写一下,自己测试的一些代码,涉及到了AutoResetEvent 和 ManualResetEvent,当然还有也简要提了一下System.Threading.WaitHandle.WaitOne .System.Threading.WaitHandle.WaitAny和System.Threading.WaitHandle.WaitAll ,下面我们一最初学者的角度来看,多线程之间的同步. 假设有这样的一个场

一脸懵逼学习Zookeeper(动物园管理员)---》高度可靠的分布式协调服务

 1:Zookeeper是一个分布式协调服务:就是为用户的分布式应用程序提供协调服务 A.zookeeper是为别的分布式程序服务的 B.Zookeeper本身就是一个分布式程序(只要有半数以上节点存活,Zookeeper就能正常服务) C.Zookeeper所提供的服务涵盖:主从协调.服务器节点动态上下线.统一配置管理.分布式共享锁.统一名称服务-- D.虽然说可以提供各种服务,但是zookeeper在底层其实只提供了两个功能: 管理(存储,读取)用户程序提交的数据: 并为用户程序提供数据节点

Photoshop详细解析古风人像的摄影和后期过程

  本教程主要使用Photoshop详细解析古风人像的摄影和后期过程,拍摄古风作品前,我们首先要了解什么是古风.我理解的古风为"具有古代韵味气息的文化及作品",所以在拍摄前后均围绕"古代韵味"做文章.既然构思的是清妆古韵,那在后期处理上自然就选择了偏冷的色调. 一.拍摄部分 1.场景 原计划是去青城山,因为当天拍摄时间有限,最后选择在市区内的望江公园,这个场地很多摄影师都去拍过,为了避免重复,我们没有去标志性的建筑拍摄,或者说有意避开了"热门"拍

Photoshop详细解析室内婚片婚宴的整体色彩处理教程

  中国婚礼由于传统因素影响,婚礼与婚宴同时进行,婚礼现场拍摄很大一部份在室内进行,这些场合环境灯光昏暗,人员众多,画面效果很难保障.如何简单有效处理婚礼现场照,就需要后期上打开思路了,这里为大家介绍几种简单有效的方法,轻松搞定婚礼现场. 效果图 原图 该片在酒店中婚礼进行时拍摄,新人即将走向红毯彼端,场面温馨浪漫,只是现场灯光很暗,只有一个追光灯做为主光源,拍摄出的画面整体为黑色,画面的氛围就差了很多,因此,处理该图时暗部的处理尤为重要. 具体操作如下: 1.首先利用阴影高光工具将画面暗部层次