大规模集群下的分片管理之服务状态

349 阅读2分钟

这是我参与8月更文挑战的第22天,活动详情查看:8月更文挑战

大规模系统的分片部署是一个难点,既要考虑容灾和故障转移,又要考虑负载均衡和资源利用率。本文就从服务状态、故障转移、负载及资源利用率等几个方面来阐述下他们的关系

1 有状态&无状态的服务部署

应用服务,根据其类型一般可以分为两种:无状态服务有状态服务

无状态的服务,扩展起来其实比较容易,用流量路由等负载均衡方式即可实现;

但是有状态服务不太容易,让所有服务器一直能够持有全部数据时不现实的。

-- 散列是一种方案 --

如一致性散列策略,将数据散列部署。但是,一致性散列会存在一些不可避免的问题,主要有数据倾斜、数据漂移等。虽然我们可以通过将某节点的一部分数据移到其他节点来解决,但这需要非常细粒度的负载统计标尺来进行发现和衡量。

图片

来源:百度百科

另外,由于一致性散列对多数据中心的支持不太友好,比如,希望让某些区域的用户走特定数据中心,以降低延迟的话,用该策略不好实现。

-- 分片是另一种方案 --

其目的是支持业务增长、应对系统的高并发及吞吐量。并且加载和使用更加灵活。

图片

来源:fb engineering

数以万计、亿计的数据分散存储在多个数据库实例中,则每个实例都叫一个分片。另外,为了容错,每个分片都可以有多个副本,而每个副本根据不同的一致性要求可以分为主副本和从副本。

然后,分片又通过多种策略规范,显示计算出到服务器的映射,以向用户提供完整的服务。这些策略规范包括:不同用户ID选择不同的服务分区、不同地理位置的请求分散到较近的数据中心等等。

从这个要求来看,分片的方式要比散列更灵活,更适用大型服务部署。