Swarm集群中的服务发现与有状态服务扩展
1. 有状态实例扩展的问题
在Swarm集群中扩展服务看似简单,只需执行 docker service scale <SERVICE_NAME> <NUMBER_OF_INSTANCES> 命令,服务就会运行多个副本。但实际上,准确来说是“在Swarm集群中扩展无状态服务很容易”。
无状态服务扩展容易的原因在于无需考虑状态。无论实例运行多久,其状态都不会改变,新实例和运行了一周的实例没有区别。由于状态不随时间变化,我们可以在任何时刻创建新副本,它们都是相同的。
然而,现实世界并非无状态的。一旦创建了第一条信息,就需要将其存储在某个地方,存储数据的地方必须是有状态的,其状态会随时间变化。如果要扩展有状态服务,至少需要考虑以下两个问题:
1. 如何将一个实例的状态变化传播到其他实例?
2. 如何创建有状态服务的副本(新实例),并确保状态也被复制?
通常,我们会将无状态服务和有状态服务组合成一个逻辑实体。后端服务可以是无状态的,并依赖数据库服务作为外部数据存储,这样可以实现关注点的清晰分离,且每个服务有不同的生命周期。
2. 有状态服务扩展的挑战
没有一种通用的解决方案能使有状态服务具备可扩展性和容错性。以数据库为例,虽然有一些常见模式,但几乎每个数据库都提供不同的数据复制机制,这使得我们无法找到适用于所有情况的确定答案。
下面以HAProxy为例,探讨将其状态存储在配置文件中的服务的可扩展性。如果使用官方HAProxy镜像,面临的挑战之一是如何更新所有实例的状态。可以尝试以下两种方法,
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



