分布式要弄清楚的几大问题:
(1)数据分布:哈希分布还是顺序分布
简单地说,相当于比较哈希函数和B+树树的优劣。
哈希分布,首先找一个散列性比较好的哈希函数(非常难),并且不支持顺序扫描,但是随机存取的速度都很快。
顺序分布,一般的都会采用B+树的方式存储。支持顺序扫描,很容易让数据分布均匀,但相应的随机存取速度比哈希慢。
哈希分布的哈希函数是不建议使用id进行哈希的,因为容易造成数据倾斜,也就是把同一批非常活跃的用户哈希到同一台机器上,那样就失去了集群的意义。
(2)复制和备份
分布式系统的作用之一就是有备份,同一条数据在不同的服务器上存几份。这样一台服务器挂掉,还有其他服务器顶替。这就涉及到把一个服务器的数据复制到其他的服务器上。
同时还可以让多个服务器同时对外服务,让服务器之间进行负载均衡。
(3)一致性和可用性:
其实这个问题,相当于在讨论同步和异步的优劣。
一致性:读一定保证读到之前写操作的结果。比如集群中有A和A_BAK两个服务器,最苛刻的情况是在A中写个数据,再到A_BAK中读,要也能确认读到了之前写的结果。
可用性:如果A_BAK或A中任意一个挂掉,都要能保证依靠另一个能正常工作。
(4)负载均衡:
一个万兆的网卡,即使满负荷,每个用户占1Mb(相当于每人占125KB)的网速,那么1万个用户就让它崩溃了。为了应对大并发的需求,通常最简单的做法,就是通过添加服务器来分摊压力,这就是负载均衡。
(5)故障检测:
以google的数据中心为例见下表。所以为了确认机器可以提供服务,那么就需要发送心跳,设计切换服务算法等。
发生概率 | 故障类型 | 影响范围 |
0.5 | 数据中心过热 | 5分钟内大部分机器断电,一到两天恢复 |
1 | 配电装置(PDU)故障 | 大约500-1000台机器瞬间下线,6小时恢复 |
1 | 机架调整 | 大量告警,500-1000台机器断点,6小时恢复 |
1 | 网络重新布线 | 大约5%机器下线超过两天。 |
20 | 机架故障 | 40到80台机器下线,1到6小时恢复 |
5 | 机架不稳定 | 40到80台机器发生50%的丢包 |
12 | 路由器重启 | DNS对外虚IP服务失效约几分钟 |
3 | 路由器故障 | 需要立即切换流量,持续约1小时 |
几十 | DNS故障 | 持续约30秒 |
1000 | 单机故障 | 机器无法提供服务 |
几千 | 硬盘故障 | 硬盘数据丢失 |
(6)同构系统和异构系统
同构系统:相当于完整地复制了一下集群
异构系统:在同一个集群当中的所有机器互相形成备份。
(7)分布式协议
两阶段提交协议(2PC):①所有人对协调者的建议表态②当且仅当所有人都同意时执行;例如,A说大家一起吃饭怎么样,F说他没空,那么大家都去不成。
Paxos协议:每个人都说出自己的想法,谁的想法能得到大多数人的同意,那么就执行他的想法。
Paxos保证了多个副本之间数据的一致性。2PC用于保证属于多个分片上的操作的原子性。
(8)单机存储介质对比
类别 | 每秒读写(IOPS)次数 | 每GB价格(元) | 随机读取 | 随机写入 |
内存 | 千万级 | 150 | 友好 | 友好 |
SSD盘 | 35000 | 20 | 友好 | 写入放大问题 |
SAS磁盘 | 180 | 3 | 磁盘寻道 | 磁盘寻道 |
SATA磁盘 | 90 | 0.5 | 磁盘寻道 | 磁盘寻道 |