- 论坛徽章:
- 9
|
本帖最后由 wlmqgzm 于 2017-02-23 13:50 编辑
回复 126# benjiamsh
正在开发中 主备用 机制,这样能够就不用等待了。
本来想参考redis的 slaveof 和 move等命令,先实现一个版本,实现起来不难, 本来计划是照此方案执行。
但是开发中,几轮讨论下来,觉得这个方案太简陋了,用户的主备用机制还需要第3方的软件或者手动,程序员是容易了,但是用户不方便。
因为我们更希望创新,给用户提供前所未有的体验。
现在的思路是:
重新设计一套集成在内部的主备用机制,增加更多的功能点:
1)设计一个master_slave组,可以有多台机器,master中断后,其中一台slave将启动为主用,slave竞争master的机制上有微创新,可以更快的进入master状态。
这块的公开资料已经足够多了,各公司都有自己的实现,不详细说了。
2)master_slave组中,有多种同步模式, 至少包括下列模式:
A)同步1, 就是用户的命令在执行成功后,要等待slave收到同样的命令,并且执行后,返回run_ack, 才返回用户ok.
B)同步2, 就是用户的命令在执行成功后,要等待slave收到命令后ack,才返回用户ok. 命令已经进入slave命令缓冲区,slave可能在稍后的0-几十微秒内执行,只要不掉电,一定会执行。
C)异步1,就是用户的命令在执行成功后,立即返回用户ok,把命令放到通知队列中,等待执行.
D)异步2,就是用户的命令在执行成功后,把命令放到通知队列中,命令被后台线程send到TCP/IP缓冲区中,再返回用户ok.
总体的思路是将流程分解为多个片段,设置work_mode=0---X, 有不同的时延,越大的值,时延越大,性能越低,可靠性越高。
3)将支持自动代理模式,
A) 就是用户无论连接 主备用组中的任何一台机器的任何一块网卡,只要网络正常,insert/delete/update命令都将被代理传送到主用机器去执行,并且返回代理结果,客户端不需要关心哪一台是主用,哪台机器是备用。
B) 查询命令至少有2个模式可以配置:
模式1:在本地查询,无论本机是主,还是备。推荐模式1,这个查询性能是最高的。
模式2:如果本机是主用,直接查询;如果本机是备用,代理到主用机器去查询,然后返回代理结果。这种模式适合异步情况下,又希望始终能够返回最新的值。
查询命令工作模式可以随时变更,支持命令集和config/argv三种方式配置。
命令集正在设计中,讨论中的命令集;
例如:命令 master_slave query_work_mode 1 将变更查询模式为1.
主要的优势就是:
把全部 master_slave组 中的多台机器看做一个整体,几台机器所有对外网卡都作为这个虚拟服务器的网卡,如果部分网卡连不上,只是当做某些网卡坏掉了,整机还是好的。
对于客户端来说,就非常简单,相当于要连接的服务器是一个HA高可用服务器,这个高可用服务器只有个别网卡会坏掉(但是有冗余网卡),其余部分都是不会停机的。
我们这块的程序设计就非常复杂,计划要增加的额外功能点包括:
1)master_slave组 中计算机名称 的添加/删除/保存/同步到其他机器。
例如:master_salve add server_XXX 1971, 然后该命令将被代理到主用机器执行,然后被同步到所有机器,在本地的config文件中保存。该命令执行后,将启动push方式的数据推送,开始对 server_XXX 1971的数据同步
2)数据同步,总体上的思路是尽量采用push推送方式,少用pull, push后对端有ack应答。首次同步,将清除掉slave内存中的全部数据, 再开始同步。增加日志长度的查询指令,支持断点续传。
3)为了提供理论上更好的代理性能,计划在各服务器间启用长连接,长连接的TCP/IP底层启动keep_alive自动检测,支持CPU数量远程查询指令,长连接数量=主用服务器CPU数量。
长连接内部再启用子连接,将外部的连接分别代理到长连接内部的子连接中,这样就可以不用单独创建连接了,性能比较快,在子连接封装中增加额外的校验码,可以提供比TCP/IP的16位更多的校验码,以及nack重传,提供更高的可靠性,
各个外部连接也做到了完全隔离,另外一方面也降低了主用服务器的连接开销,实现更高的并发。
总之,其实是从零开始设计一个完善的HA系统,然后与现有的代码融合,实现多台主机的对外一致性。
|
|