分布式系统基础

分布式系统

本文版权归作者xybaby(博文地址:http://www.cnblogs.com/xybaby/)所有,欢迎转载和商用,请在文章页面明显位置给出原文链接并保留此段声明,否则保留追究法律责任的权利,其他事项,可留言咨询。

  •  定义

分布式系统是由一组通过网络进行通信,为了完成共同的任务而协调工作的计算机节点组成的系统。

  • 目的

利用更多的机器,处理更多的数据

  •  两大技术
  1.   分片(partition):分而治之,对计算任务进行切换,每个节点算一些,最终汇总。
  2.   冗余(replication):多个节点负责同一个任务
  • 分片
  优点
  1.  提升性能和并发,操作被分发到不同的分片,相互独立
  2. 提升系统的可用性,即使部分分片不能用,其他分片不会受到影响

   存在问题

 分布式系统中有大量的节点,且需要通过网络通信,单点故障(进程crash、断电、磁盘损坏)虽是小概率事件,但整个系统的故障率会随节点的增加而指数增加,网络通信也可能出现断网、高延迟的情况。在这种一定会出现的“异常”情况下,分布式系统还是需要继续稳定的对外提供服务,即需较强的容错性。

    解决方法

  引入冗余或复制集(replication),即多个节点负责同一个任务,最为常见的就是分布式存储中,多个节点负责存储同一份数据,以增强可用性与可靠性。同时,replication也会带来性能的提升,比如数据的locality(本地化存储)可以减少用户的等待时间。

  • 冗余

  优点

  1.   提高可靠性和可用性

  存在问题

  各个副本间的一致性问题,一致性在系统的角度和用户的角度又有不同的等级划分,如果要保证强一致性,那么会影响可用性和性能,在一些应用(如电商、搜索)是难以接受的。如果是最终一致性,那么就需要处理数据冲突的情况,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


 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值