这是我参与8月更文挑战的第22天,活动详情查看:8月更文挑战
大规模系统的分片部署是一个难点,既要考虑容灾和故障转移,又要考虑负载均衡和资源利用率。本文就从服务状态、故障转移、负载及资源利用率等几个方面来阐述下他们的关系
1 有状态&无状态的服务部署
应用服务,根据其类型一般可以分为两种:无状态服务 和 有状态服务
无状态的服务,扩展起来其实比较容易,用流量路由等负载均衡方式即可实现;
但是有状态服务不太容易,让所有服务器一直能够持有全部数据时不现实的。
-- 散列是一种方案 --
如一致性散列策略,将数据散列部署。但是,一致性散列会存在一些不可避免的问题,主要有数据倾斜、数据漂移等。虽然我们可以通过将某节点的一部分数据移到其他节点来解决,但这需要非常细粒度的负载统计标尺来进行发现和衡量。
来源:百度百科
另外,由于一致性散列对多数据中心的支持不太友好,比如,希望让某些区域的用户走特定数据中心,以降低延迟的话,用该策略不好实现。
-- 分片是另一种方案 --
其目的是支持业务增长、应对系统的高并发及吞吐量。并且加载和使用更加灵活。
来源:fb engineering
数以万计、亿计的数据分散存储在多个数据库实例中,则每个实例都叫一个分片。另外,为了容错,每个分片都可以有多个副本,而每个副本根据不同的一致性要求可以分为主副本和从副本。
然后,分片又通过多种策略规范,显示计算出到服务器的映射,以向用户提供完整的服务。这些策略规范包括:不同用户ID选择不同的服务分区、不同地理位置的请求分散到较近的数据中心等等。
从这个要求来看,分片的方式要比散列更灵活,更适用大型服务部署。