基础架构之分布式
分布式的出现的目的有2个:
- 避免单点故障(集中式)
- 性能或者容量扩展
实现方式分为:主-主,主-从
对于一些没有集中式的服务,引申出了分布式算法,以实现分布式效果上的后2项:性能和容量的扩展
分布式的服务搭建后,还需要考虑负载均衡,也需要通过分布式算法实现
分布式算法将分布式的性能充分利用,达到性能的扩展
当一个分布式服务由2个角色组成时,其内部角色之间的访问一般就是通过分布式算法实现负载均衡,这也是服务建立多个角色的主要原因
分布式算法:
- Paxos:是一种一致性的算法,该算法保证了数据一致性(数据或丢失或者延迟,但不会出错),用于实现服务内部保证数据一致的算法。具体实现原理是根据法律选举的方式实现,允许参选者的变更,通过消息传递进行节点通信
- Consistent hash(一致性hash算法):是一种DHT算法(分散式散列表算法),有离散性(构成系统的节点没有任何中央式协调机制)、伸缩性(即使有成千上万个节点,系统仍然应该十分有效率)、容错性(即使节点不断的加入、离开或者停止工作,系统仍然必须达到一定的可靠度)。该算法实现了系统节点的动态变更,每次的变更只会影响相邻节点的信息,多用于做大范围的缓存、路由算法。该算法的一致性不是指数据的一致性,是指数据所在数据节点的一致性,不会让一份数据存在2个节点中,照成系统资源的浪费
以上2种算法适用于不同的环境,第一种算法保证数据的一致性,但该算法的伸缩性不会很高(节点之间互相通信),对于性能主要用于并发的提高,可以避免单点故障;第二种算法在允许部分数据丢失的情况下保证了性能及容量的扩展,节点之间无须任何通信,用于缓存系统非常合适,也是P2P传输中会使用到的算法
每个分布式算法实现的目标不同,所以在选择分布式算法的时候需要充分了解该算法的目的是否与环境的需求一致
分布式算法的适合与否严重影响到该服务的性能及扩展
分布式的实现方法除了服务内部的分布式实现,及在客户端用分布式算法实现(不支持分布式的服务),也有通过环境搭建组合型的分布式服务网络,主要目的是为了提高冗余,保证系统正常运行
具体功能分析:
Mysql:提供主从数据库设置,并且也支持主主数据库设置,从传统数据库(关系型数据库)角度,数据需要的是一致性,分布式的设置提供的是性能上的扩展。Mysql本身也有一个集群版本,通过设置数据表引擎实现,该引擎是建立在内存上,已提高数据性能,支持分组(容量扩展)副本(性能或冗余扩展)
Memcache:是一款集中式的内存缓存,在环境中大多使用分布式算法实现该服务的分布式扩展,常用的算法就是Consistent hash,几乎本身该算法的适用环境就是以缓存服务为目的的,所以非常适合
FashDFS:是一款分布式文件系统,该分布式通过内部分组实现容量扩展,副本数提供性能及冗余扩展,大多数数据存储的服务实现的分布式都是支持分组及副本数来实现横向和纵向的扩展,该理念不是分布式算法,可以算是分布式构架
Mongodb:是一款非关系型数据库,也就是NoSql,内部实现的相对网站的分布式网络,配置管理、数据分片、服务器分组、节点仲裁(用于在数据节点的数量不足的情况下完成系统的仲裁功能)、非单点故障、主库Down后的自动选举新主库、主从备份等,无论从性能,功能还是学习角度,都是一款很不错的服务软件
Coreseek:是基于Sphinx封装中文分词后的索引服务,该内部实现的分布式功能相对简单,可以对任意一台中的索引设置分布式索引,用于读取其他索引(可以是本机也可以是其他机器),其他索引也能这么做。对于一款复杂的服务来说灵活性很大,但方便性不足,需要很好的管理规划
Redis:也是一款内存缓存系统,目前只支持主从设置,不支持主主设置。对于这么一款不支持主主,就需要通过工具自动实现主库Down的情况下将从库升级成主库的操作,也就是我前面提到的分布式网络的一部分。
WebServer:所有的web服务器都是集中式的,职责单一。如何实现性能扩展?可以使用代理设置(Nginx,apache等web服务器都支持代理设置),代理设置中设置多台服务器通过内部的分布式算法实现负载均衡(不用考虑什么一致性),这也是分布式网络建设的一部分
从web网站的建设角度,分布式网络的建立对提高性能是很重要的,如动静页面分离
分布式网络主要是通过对于服务的设置实现,整体的规划。网站不是达到瓶颈就可以通过添加服务器实现性能的扩展,没有底层结构的支持,甚至没有代码支持是不可能的,也就是上次说的云平台,整体的环境对未来发展的大小是至关重要的