写点什么

架构师训练营 第 3 期 第 5 周 作业和总结

用户头像
ihiming
关注
发布于: 2020 年 12 月 27 日

作业一(2 选 1):

1 用你熟悉的编程语言实现一致性 hash 算法。

2 编写测试用例测试这个算法,测试 100 万 KV 数据,10 个服务器节点的情况下,计算这些 KV 数据在服务器上分布数量的标准差,以评估算法的存储负载不均衡性。

关于一致性 hash 算法(consistent hashing)

没来及实战。又欠账。。。


Consistent Hashing :

一致性哈希算法在 1997 年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和 CARP 十分类似。一致性哈希修正了 CARP 使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在 P2P 环境中真正得到应用。

一致性 hash 算法提出了在动态变化的 Cache 环境中,判定哈希算法好坏的四个定义:

1、平衡性(Balance):平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。

2、单调性(Monotonicity):单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到原有的或者新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。

3、分散性(Spread):在分布式环境中,终端有可能看不到所有的缓冲,而是只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上时,由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓冲中去,降低了系统存储的效率。分散性的定义就是上述情况发生的严重程度。好的哈希算法应能够尽量避免不一致的情况发生,也就是尽量降低分散性。

4、负载(Load):负载问题实际上是从另一个角度看待分散性问题。既然不同的终端可能将相同的内容映射到不同的缓冲区中,那么对于一个特定的缓冲区而言,也可能被不同的用户映射为不同 的内容。与分散性一样,这种情况也是应当避免的,因此好的哈希算法应能够尽量降低缓冲的负荷。


在分布式集群中,对机器的添加删除,或者机器故障后自动脱离集群这些操作是分布式集群管理最基本的功能。如果采用常用的 hash(object)%N 算法,那么在有机器添加或者删除后,很多原有的数据就无法找到了,这样严重的违反了单调性原则。


关于 Consistent Hashing 的 Python 实现,详见链接源码:https://github.com/ultrabug/uhashring


我的记录:

  • 智慧老师说,Consistent Hashing 的越能够均匀分布,越好。那创建节点时,限定其在平均值附近创建节点,不就可以了?


作业二:根据当周学习情况,完成一篇学习总结


1 越贴近用户侧布置缓存,越有效。

缓存,本质上是减少 服务器查询/读取数据。

更贴近用户的缓存依次是(更能减少读取数据工作量):本地缓存(app 客户端缓存、所有的服务器缓存和分布式缓存,内存缓存 > SSD 缓存),CDN 缓存,反向代理缓存(反向代理 可以放在用户与服务器之间,也可以放在前后服务器之间)


其实反向代理,是负载均衡措施,并不能减少 读取数据工作量,只是将任务分配的更合理。

上面的缓存,并不仅限于以上,所有的 应用、服务,所有的一切环节,都可以增加缓存,来减少后环节的读取数据工作量。

2 缓存什么时候无用?

缓存仅能治“读”病,无此病,比如写入操作、网络 or 硬盘瓶颈等,都不能解决。

读取数据时,查询越集中,缓存越有效。

缓存,就意味着可能会有更新延迟(非最新数据),如果必须保证数据必须是最新的,那么缓存就取消。

使用缓存,需要关注系统的高可用性,避免错误传递,避免宕机传递。

3 通过消息队列,可以提升写入数据性能,但它什么时候不适用呢?

消息队列,与很多功能一样,通过增加了“秘书”类中间环节,用架构的复杂性,换取了 提升响应速度。

所有的功能,它的适用范围都很重要,对于消息队列,一些情况可能不适合使用:

  • 如果本身响应就很快,就没有必要增加复杂度。

  • 使用消息队列,增加了中间环节,中间环节如果宕机了呢?是否可以承受?不能承受,就不能用,或者要想办法打补丁

  • 有时候通过数据库等的记录,就可以达到消息队列的效用。注意:同样先考虑适用条件。

4 负载均衡

http 服务器,如何实现集群?也就是,如何实现负载均衡?

负载均衡服务器(http……)

ip 负载均衡

dns 负载均衡

反向代理(nginx 是 http 的反向代理,比较重,最多支持 10 台多点服务器)

dns+负载均衡服务器


负载均衡的算法:

  • 轮询

  • 随机(挺平均的)

  • 加权轮询(用的不多)

  • 最少连接(用的也不太多,有算错的)

  • 源地址散列(来源 ip hash 后,一直与同一服务器通信,用的比例也不高)


在使用负载均衡时,session 如何管理?(会话有上下文)

  • 服务器之间,session 复制、同步(很少使用)

  • session 绑定,也很少、几乎不会用,因为不满足高可用原则,比如当服务器宕机时(实际情况时,因为开发迭代速度快,宕机概率并不低!),其他服务器没有 session 上下文

  • 通过 cookie 记录 session,常用的方式,也有问题:禁用 cookie、cookie 大小有限、cookie 安全问题

  • 使用 session 服务器,最常用的方式,最好的解决方案,服务器是无状态应用服务器(无共享信息服务器)


发布于: 2020 年 12 月 27 日阅读数: 23
用户头像

ihiming

关注

还未添加个人签名 2020.03.19 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 第3期 第5周 作业和总结