分布式系统基础
分布式系统
本文版权归作者xybaby(博文地址:http://www.cnblogs.com/xybaby/)所有,欢迎转载和商用,请在文章页面明显位置给出原文链接并保留此段声明,否则保留追究法律责任的权利,其他事项,可留言咨询。
- 定义
分布式系统是由一组通过网络进行通信,为了完成共同的任务而协调工作的计算机节点组成的系统。
- 目的
利用更多的机器,处理更多的数据
- 两大技术
- 分片(partition):分而治之,对计算任务进行切换,每个节点算一些,最终汇总。
- 冗余(replication):多个节点负责同一个任务
- 分片
- 提升性能和并发,操作被分发到不同的分片,相互独立
- 提升系统的可用性,即使部分分片不能用,其他分片不会受到影响
存在问题
分布式系统中有大量的节点,且需要通过网络通信,单点故障(进程crash、断电、磁盘损坏)虽是小概率事件,但整个系统的故障率会随节点的增加而指数增加,网络通信也可能出现断网、高延迟的情况。在这种一定会出现的“异常”情况下,分布式系统还是需要继续稳定的对外提供服务,即需较强的容错性。
解决方法
引入冗余或复制集(replication),即多个节点负责同一个任务,最为常见的就是分布式存储中,多个节点负责存储同一份数据,以增强可用性与可靠性。同时,replication也会带来性能的提升,比如数据的locality(本地化存储)可以减少用户的等待时间。
- 冗余
优点
- 提高可靠性和可用性
存在问题
各个副本间的一致性问题,一致性在系统的角度和用户的角度又有不同的等级划分,如果要保证强一致性,那么会影响可用性和性能,在一些应用(如电商、搜索)是难以接受的。如果是最终一致性,那么就需要处理数据冲突的情况,CAP、FLP这些理论告诉我们,在分布式系统中,没有最佳的选择,都需要权衡、做出最合适的选择。
分布式系统的挑战
1 异构的机器和网络
分布式系统中的机器,配置不一样,其上运行的服务也可能由不同的语言。架构实现,因此处理能力也不一样,如何保证大家齐头并进,共用完成目标?
2 普遍的节点故障
分布式系统需保证故障发生的时候,系统仍是可用的,这就需要监控节点的状态,在节点故障的时候将该节点负责的计算、存储任务转移到其他节点
3 不可靠网络
可能的网络问题包括:网络分割、延时、丢包、乱序等
分布式系统衡量指标
1 透明性:用户感知不到这是一个分布式系统
2 可扩展性:当任务增加时,分布式系统的处理能力需要随之增加,当任务规模缩减时,也可撤掉些机器,达到动态伸缩的效果
3 可用性与可靠性:可用性是指系统在各种情况对外服务的能力,可用:不可用时间与正常服务时间的比值来衡量;可靠性是指计算结果正确,存储数据不丢失
4 高性能:高并发,单位时间内处理的任务越多越好;低延迟,每个任务的平均时间越少越好。这与操作系统CPU的调度策略很像
5 一致性:冗余如何保证副本一致,一致性越强,对用户越友好,但会制约系统的可用性;一致性约差,用户就需要兼容数据不一致的情况,但系统的可用性、并发性会好很多
大致流程
用户使用Web/APP/SDK,通过HTTP/TCP连接到系统中,采用负载均衡(nginx)找到一个提供服务的节点,若本地可以服务(如读取缓存中的数据)则采用HTTP/FTP等获取服务,否则,采用(RPC,remote produce call)进行远程调用。若请求中涉及多个服务协作,则需要协调中心(如zookeeper,提供中心化服务)进行服务注册与发现,提供服务节点注册自己的地址,使用服务的节点去协调中心获取地址。用户请求后对信息的使用分两种消息的生产者和消费者,采用消息队列存储消息,队列将消息按topic(主题)分发给感兴趣的消费者。消息队列起到异步处理,应用解耦的作用。对于用户操作产生的数据,催生了分布式计算平台(Hadoop、Storm),来处理海量数据。最后,采用分布式存储将用户数据持久保存。
各部分实现
l 负载均衡:
1. Nginx:高性能、高并发的web服务器;功能包括负载均衡、反向代理、静态内容缓存、访问控制;工作在应用层
2. LVS: Linux virtual server,基于集群技术和Linux操作系统实现一个高性能、高可用的服务器;工作在网络层
l webserver:
1. Java:Tomcat,Apache,Jboss
2. Python:gunicorn、uwsgi、twisted、webpy、tornado
l service:
SOA、微服务、springboot,django
l 容器:
docker,kubernetes
l cache:
memcache、redis等
l 协调中心:
zookeeper、etcd等
zookeeper使用了Paxos协议Paxos是强一致性,高可用的去中心化分布式。zookeeper的使用场景非常广泛,之后细讲。
l rpc框架:
grpc、dubbo、brpc
dubbo是阿里开源的Java语言开发的高性能RPC框架,在阿里系的诸多架构中,都使用了dubbo + springboot
l 消息队列:
kafka、rabbitMQ、rocketMQ、QSP
消息队列的应用场景:异步处理、应用解耦、流量削锋和消息通讯
l 实时数据平台:
storm、akka
l 离线数据平台:
hadoop、spark
PS: apark、akka、kafka都是scala语言写的,看到这个语言还是很牛逼的
l dbproxy:
cobar也是阿里开源的,在阿里系中使用也非常广泛,是关系型数据库的sharding + replica 代理
l db:
mysql、oracle、MongoDB、HBase
l 搜索:
elasticsearch、solr
l 日志:
rsyslog、elk、flume