赞
踩
”分布式系统设计“系列第一篇文章,这篇文章主要介绍一些入门的概念和原理,后面带来一些高可用、数据分布的实践方法!!
各位亲,如果你们觉得本文有还不错的地方,请点击“投一票”支持本文,多谢!
http://vote.blog.csdn.net/Article/Details?articleid=36688043
各个节点的状态可以是“无状态”或者“有状态的”.
一般认为,节点是偏计算和通信的模块,一般是无状态的。这类应用一般不会存储自己的中间状态信息,比如Nginx,一般情况下是转发请求而已,不会存储中间信息。另一种“有状态”的,如mysql等数据库,状态和数据全部持久化到磁盘等介质。
“无状态”的节点一般我们认为是可随意重启的,因为重启后只需要立刻工作就好。“有状态”的则不同,需要先读取持久化的数据,才能开始服务。所以,“无状态”的节点一般是可以随意扩展的,“有状态”的节点需要一些控制协议来保证扩展。其实,这就是著名的“拜占庭将军”问题:
异常可以分为如下几类:
节点错误:
一般是由于应用导致,一些coredump和系统错误触发,一般重新服务后可恢复。
硬件错误:
由于磁盘或者内存等硬件设备导致某节点不能服务,需要人工干预恢复。
网络错误:
由于点对点的网络抖动,暂时的访问错误,一般拓扑稳定后或流量减小可以恢复。
网络分化:
网络中路由器、交换机错误导致网络不可达,但是网络两边都正常,这类错误比较难恢复,并且需要在开发时特别处理。【这种情况也会比较前面的问题较难处理】
Consistency(all nodes see the same data at the same time)
Availability (a guarantee that every request receives a response about whether it was successful or failed)
Partition tolerance (the system continues to operate despite arbitrary message loss or failure of part of the system)
(摘自 :http://en.wikipedia.org/wiki/CAP_theorem)
一般情况下,写一段网络交互的代码,发起rpc或者http,都会遇到请求超时而失败情况。可能是网络抖动(暂时的网络变更导致包不可达,比如拓扑变更)或者对端挂掉。这时一般处理逻辑是将请求包在一个重试循环块里,如下:
- int retry = 3;
- while(!request() && retry--)
- sched_yield(); // or usleep(100)
无中心化的设计,例如cassandra、zookeeper,系统中不存在一个领导者,节点彼此通信并且彼此合作完成任务。好处在于如果出现异常,不会影响整体系统,局部不可用。缺点是比较协议复杂,而且需要各个节点间同步信息。
此处,如果是”无状态“型的节点,影响比较小,但遇到”有状态“的存储节点时,会发生大量数据位置需要变更,发生大量数据迁移的问题。这个问题在实际生产中,可以通过按2的幂的机器数,成倍扩容的方式来缓解,如图:
一致性哈希的优点在于可以任意动态添加、删除节点,每次添加、删除一个节点仅影响一致性哈希环上相邻的节点。 为了尽可能均匀的分布节点和数据,一种常见的改进算法是引入虚节点的概念,系统会创建许多虚拟节点,个数远大于当前节点的个数,均匀分布到一致性哈希值域环上。读写数据时,首先通过数据的哈希值在环上找到对应的虚节点,然后查找到对应的real节点。这样在扩容和容错时,大量读写的压力会再次被其他部分节点分摊,主要解决了压力集中的问题。如图:
http://blog.csdn.net/gugemichael/article/details/8964834
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。