分布式系统设计策略

一、容错性设计


概念

            分布式流处理系统中,由于各个节点的算力、网络、负载等情况各有不同,每个节点的状态直接合并不能得到一个真正的全局状态。为了得到一致性的结果,分布式处理系统需要对节点的失败要有弹性,即失败时可以恢复到一致性的结果。


全局一致性快照

全局一致性快照是可以用来给分布式系统做备份和故障恢复的机制。

它有几个特点

一个分布式应用,它有多个进程分布在多个服务器上;
有状态,并且状态随着数据处理产生变化;
应用间可以相互通信,消息在channel内进行传递;
在某一时刻/事件的统一状态,包括各个进程的本地状态和传递的消息,并且事件的状态遵循happens-before;

它的作用

用作Checkpoint,可以定期对全局状态做备份,故障时可以通过已完成的全局快照恢复到某一时刻;
判断处理逻辑是否死锁;
通过全局一致性进行小文件压缩等;


核心原理

Chandy-Lamport 算法


在 Chandy-Lamport 算法中,为了定义分布式系统的全局状态,我们先将分布式系统简化成有限个进程和进程之间的 channel 组成,也就是一个有向图:节点是进程,边是 channel。因为是分布式系统,也就是说,这些进程是运行在不同的物理机器上的。那么一个分布式系统的全局状态就是有进程的状态和 channel 中的 message 组成,这个也是分布式快照算法需要记录的。

因为是有向图,所以每个进程对应着两类 channel: input channel, output channel。同时假设 Channel 是一个容量无限大的 FIFO 队列,收到的 message 都是有序且无重复的。Chandy-Lamport 分布式快照算法通过记录每个进程的 local state 和它的 input channel 中有序的 message,我们可以认为这是一个局部快照。那么全局快照就可以通过将所有的进程的局部快照合并起来得到。


流程主要包括下面三个部分:

  • Initiating a snapshot: 也就是开始创建 snapshot,可以由系统中的任意一个进程发起
  • Propagating a snapshot: 系统中其他进程开始逐个创建 snapshot 的过程
  • Terminating a snapshot: 算法结束条件

*Initiating a snapshot*


进程 Pi 发起: 记录自己的进程状态,同时生产一个标识信息 marker,marker 和进程通信的 message 不同
将 marker 信息通过 ouput channel 发送给系统里面的其他进程
开始记录所有 input channel 接收到的 message

*Propagating a snapshot*


对于进程 Pj 从 input channel Ckj 接收到 marker 信息:
如果 Pj 还没有记录自己的进程状态,则
Pj 记录自己的进程状态,同时将 channel Ckj 置为空
Pj从Ckj收到marker说明Pj已经处理完了收到marker时间点之前的所有从Ckj收到的messages,只要记录Pj此时的状态就包含了之前从Ckj收到的所有messages
向 output channel 发送 marker 信息

否则
记录其他 channel 在收到 marker 之前的 channel 中收到所有 message

所以这里的 marker 其实是充当一个分隔符,分隔进程做 local snapshot (记录进程状态)的 message。比如 Pj 做完 local snapshot 之后 Ckj 中发送过来的 message 为 [a,b,c,marker,x,y,z] 那么 a, b, c 就是进程 Pk 做 local snapshot 前的数据,Pj 对于这部分数据需要记录下来,比如记录在 log 里面。而 marker 后面 message 正常处理掉就可以了。

*Terminating a snapshot*

所有的进程都收到 marker 信息并且记录下自己的状态和 channel 的状态(包含的 message)
                
                *Initiating a snapshot*
                *Propagating a snapshot*


二、安全性设计


1 身份验证

身份验证是确认一个用户或系统是谁的过程。在分布式系统中,身份验证通常涉及到用户名和密码的验证,以及通过SSL/TLS加密的通信。

2 授权

授权是确定用户或系统可以执行哪些操作的过程。在分布式系统中,授权通常涉及到角色和权限的管理,以及访问控制列表(ACL)的实现。

3 加密

加密是将明文转换为密文的过程,以保护数据和通信的安全性。在分布式系统中,加密通常涉及到对数据和通信进行加密和解密的算法,如AES、RSA等。

4 数据完整性

数据完整性是确保数据在存储和传输过程中不被篡改的过程。在分布式系统中,数据完整性通常涉及到哈希算法、消息摘要和数据签名等技术。

5 一致性

一致性是确保分布式系统中所有节点看到相同数据的过程。在分布式系统中,一致性通常涉及到分布式锁、版本控制和事务处理等技术。

三、心跳检测机制


        
        若Server没有收到Node3的心跳时,Server认为Node3失联。但是失联是失去联系,并不确定是否 是Node3故障,有可能是Node3处于繁忙状态,导致调用检测超时;也有可能是Server与Node3之间链 路出现故障或闪断。所以心跳不是万能的,收到心跳可以确认节点正常,但是收不到心跳也不能认为该 节点就已经宣告“死亡”。此时,可以通过一些方法帮助Server做决定: 周期检测心跳机制、累计失效检 测机制。

周期检测心跳

累积失效检测

           
            
四、高可用设计


主备模式

            主备模式就是Active-Standby模式,当主机宕机时,备机接管主机的一切工作,待主机恢复正常
后,按使用者的设定以自动(热备)或手动(冷备)方式将服务切换到主机上运行。在数据库部 分,习惯称之为MS模式。MS模式即Master/Slave模式,这在数据库高可用性方案中比较常用,如 MySQL、Redis等就采用MS模式实现主从复制。

            
互备模式

            互备模式指两台主机同时运行各自的服务工作且相互监测情况。在数据库高可用部分,常见的互备是MM模式。MM模式即Multi-Master模式,指一个系统存在多个master,每个master都具有 read-write能力,会根据时间戳或业务逻辑合并版本。

            
集群模式

            集群模式是指有多个节点在运行,同时可以通过主控节点分担服务请求
          

 
五、负载均衡策略


DNS

            DNS 实现负载均衡是最基础简单的方式。一个域名通过 DNS 解析到多个 IP,每个 IP 对应不同的服务器实例,这样就完成了流量的调度,虽然没有使用常规的负载均衡器,但实现了简单的负载均衡功能。

硬件

            硬件负载均衡是通过专门的硬件设备来实现负载均衡功能,是专用的负载均衡设备。目前业界典型的硬件负载均衡设备有两款:F5 和 A10。

软件

软件负载均衡,可以在普通的服务器上运行负载均衡软件,实现负载均衡功能。目前常见的有 Nginx、HAproxy、LVS。其中的区别:

Nginx:七层负载均衡,支持 HTTP、E-mail 协议,同时也支持 4 层负载均衡;

HAproxy:支持七层规则的,性能也很不错。OpenStack 默认使用的负载均衡软件就是 HAproxy;

LVS:运行在内核态,性能是软件负载均衡中最高的,严格来说工作在三层,所以更通用一些,适用各种应用服务。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值