分布式服务设计(该模式应用与所有服务器需要一份一致的内存数据时)
由于工作需要一个分布式的服务接口,最主要的是容错,这里先做一个初步的设计,后续持续更新改进,整个过程也作为一个学习的过程。
框架原理
过滤服务器模式:
1. 初始模式(INIT)该模式表是还为准备好
2. 首要过滤器(FIRST)
3. 第二首要过滤器(SECOND)
4. 本分过滤器(BACKUP)
不同模式服务器的工作职责:
FIRST
处理过滤请求:
1. 处理过滤请求。如果该请求是getSecond,则直接返回SECOND的IP。
2. 如果过滤后产生数据的变化,将该变化组装成一个数据变化请求,发送到SECOND。
a) 如果无法连接到SECOND(可能是连接中断,也可能是超时),选择一个BACKUP,并发送一个数据镜像到BACKUP使得该BACKUP和FIRST数据,保持一致,并发送任职报文,任命该BACKUP为SECOND。
b)
3. 返回处理结果给客户端。
接收到新BACKUP的广播:
不做处理。
接收到请示报文:
1. 将自身转变为BACKUP,重新申请ID,广播(认为自己已经失败并重启)
SECOND
接收到数据变化请求:
1. 将数据变化请求添加到数据变化列表中,返回成功。
2. 启动后台线程负责将数据变化列表发送到所有的BACKUP。
3. 如果出现发送失败的BACKUP,则将该BACKUP从可用BACKUP列表中移除,放置到失败BACKUP列表中。
4. 启动后台进程,如果能够重新连接到BACKUP列表,则发送数据同步命令和失败BACKUP机器进行同步,同步成功后将该BACKUP从失败列表中移动到可用列表中。
接收到命令处理请求
如果命令请求中包含指示已经尝试过FIRST的应急预案标志。认为FIRST已经挂掉。
1. 等待后台线程将所有的数据变化列表作用到自己身上保证数据最新,之后将自己改变为FIRST。
2. 从可用BACKUP列表中选择一个机器,并将该机器的剩余的数据变化报文发送到该机器,如果发送成功,发送任命包围任命该机器为SECOND。
a) 如果这个过程中出现失败,则挑选另一个可用BACKUP在重新操作。
b) 如果没有BACKUP可用,进入第三步。
3. 直到第2,3步成功后才执行接收到的请求,并返回自己选择的SECOND机器的IP。
如果命令请求中不包含指示已经尝试过FIRST的应急预案标志。
1. 返回FIRST IP。(推荐IP报文)
接收到BACKUP的广播
1. 和新的BACKUP进行同步,同步完成后加入可用BACKUP列表。
2. 如果该IP存在于失败BACKUP列表中,将该服务器从失败列表中移除。
接收到BACKUP的请示报文
1. 这种情况出现在,SECOND和FIRST都无法被客户端连接。但SECOND本身任然可以和BACKUP连接。
2. 如果还可以和FIRST相连,将该请示报文发送到FIRST,等到请示响应报文。
3. 将该BACKUP对应的还未发送的数据变化请求全部发送到BACKUP组成请示响应报文返回给改BACKUP。并将自己转变为BACKUP。重新申请SID,广播。(认为自己已经失败并重启)
BACKUP
接收到任职报文
1. 将将自身转换为SECOND角色,按照SECOND角色流程处理。
接收到同步命令
1. 保存接收到的数据。
接收到数据变化报文
1. 将数据变化报文保存到数据变化报文列表中,返回成功。
2. 后台线程处理
接收到命令请求
如果命令请求中包含指示已经尝试过SECOND的应急预案标志。
1. 当出现这个情况,认为FIRST和SECOND已经死亡。
2. 如果自身存在数据变化报文列表中未处理的报文,将其作用到自身。
3. 连接SECOND,如果可以连接,发送表达接收到命令报文请示报文。等待SECOND的响应。如果响应中带有数据变化请求,将该请求作用于自身数据。
4. 将自己转笔为FIRST,按照FIRST的流程进行处理。
如果命令请求中不包含指示已经尝试过FIRST,SECOND的应急预案标志。
1. 这种情况出现在客户端第一次连接时错误的选择了BACKUP
2. 将自身记录有SECOND的IP,返回SECOND IP。并发送请示报文。
接收到新的BACKUP广播
不做理会。
初始化过程中的模式变化
1. 没给服务器初始为INIT模式。
2. 每一个服务器都有一个服务器ID:sid,该ID在启动时自动生成,并确保在集群中唯一。
3. 每一个服务器启动时想所有服务器推送自己的SID。(这个报文成为选举报文,意思是选举该SID的服务器为首要过滤器,初始启动都推选自己)
4. 当服务器接收到一个SID比自己的SID小时,改变选票为SID小的服务器,重新推送选举报文。
5. 当一台服务器接收到超过集群服务器数量一半的推选服务器一样的选举报文时认为该被选举的服务器为首要过滤器。
6. 如果首要过滤器是自己,则自己进入FIRST模式
7. FIRST模式的服务器跟新自己到最新的过滤数据后,选择一台BACKUP(选择机制待定)机器作为第二首要过滤器,并发送任职报文给第二首要过滤器。
8. 接收到任职报文的第二首要过滤器,将自己的状态改变为SECOND状态。并记录FIRST的IP。
9. SECOND向其他服务器发送任命报文,其他服务器接收到任命报文进入BACKUP模式,并就来SECOND的IP
客户端的要求:
1. 客户端初始启动时,尝试若干次读操作(getSecondIP)。获取推荐IP,知道某台机器处理了读操作,则记录该IP为FIRST,返回的IP为SECOND。
2. 当FIRST连接重试n次失败后,设置已尝试FIRST的标志位,连接SECOND。
3. 如果连接并处理成功,将SECOND 转变为FIRST,返回的IP记录为SECOND。
4. 如果SECOND依然失败,则设置已尝试FIRST,SECOND的标志以此尝试剩余机器,直到某台成功,则记录该台IP为FIRST,返回IP为SECOND。