【问题标题】:Scaling a stateful service which has primary/secondary architecture by setting a property通过设置属性来扩展具有主要/次要架构的有状态服务
【发布时间】:2021-11-03 23:58:49
【问题描述】:

我有一个连接到 mongodb 的 java web 有状态服务,目前它作为 jar 直接部署在 VM 上。该服务在属性文件中有一个属性,即primary

如果我们将primary 设置为true,那么它是应用程序的主实例,并且在这个实例上将发生mongodb 聚合。

如果我们将primary 设置为 false,则它是应用程序的辅助实例,在此实例上不会发生 mongodb 聚合,但它将服务于所有读取和写入查询。

现在我们正在迁移到 k8s 部署。

挑战是:

k8s pod部署多副本时如何设置primary的值?

我们如何处理应用程序 pod 主实例的故障?

我愿意接受任何架构更改建议,以促进更好的部署结构。

提前致谢。

【问题讨论】:

    标签: java mongodb kubernetes


    【解决方案1】:

    对于 primarysecondary,您可以将 environment 变量传递给 POD,然后根据该 POD 以相应的配置开始。 p>

    import java.util.Map;
    
    public class EnvMap {
        public static void main (String[] args) {
            Map<String, String> env = System.getenv();
            for (String envName : env.keySet()) {
                System.out.format("%s=%s%n",
                                  envName,
                                  env.get(envName));
            }
        }
    }
    

    您可以在 K8s 中创建两个不同的部署,一个用于主节点,第二个用于辅助节点。

    k8s pod部署时如何设置primary的值 有多个副本?

    您可以设置在 Primary 的所有副本和辅助的不同环境变量中相同的环境变量。

    我们如何处理应用程序 pod 主实例的故障?

    您可以使用 readinessliveness 探针进行部署,因此如果发生任何故障,K8s 将自动重启 POD。

    https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

    如果可以在 K8s 中创建两个部署

    apiVersion: apps/v1
    kind: deployment
    metadata:
      name: primary
      labels:
        purpose: primary
    spec:
      containers:
      - name: primary
        image: gcr.io/google-samples/node-hello:1.0
        env:
        - name: primary
          value: "True"
    

    第二次部署环境变量会像

    apiVersion: apps/v1
    kind: deployment
    metadata:
      name: secondary
      labels:
        purpose: secondary
    spec:
      containers:
      - name: secondary
        image: gcr.io/google-samples/node-hello:1.0
        env:
        - name: secondary
          value: "False"
    

    如果您使用的是有状态集,如果不使用部署,您也可以在其中配置相同的设置。

    【讨论】:

    • 我的第二个问题更多是关于在主实例完全失败的情况下,我们如何将辅助实例之一设为主实例。我想这可以通过领导者选举算法来实现。
    猜你喜欢
    • 2019-03-11
    • 2021-10-22
    • 2011-03-05
    • 2021-04-14
    • 1970-01-01
    • 2011-06-14
    • 2018-08-30
    • 2013-10-19
    • 2016-08-04
    相关资源
    最近更新 更多