应用程序容器到 cassandra 节点 - 一对一还是?

App container to cassandra node - one to one or?

我正在使用容器 运行 应用程序服务器和 Cassandra 节点。

启动应用服务器容器时,我需要指定要连接到哪个Cassandra 节点(1..n)。你会如何分配工作量?

  1. 一个应用程序容器到一个或多个 Cassandra 节点(多少)。
  2. 一个或多个应用程序容器到一个 Cassandra 节点(多少)。
  3. 多对多(多少)。

这适用于生产设置,100% 正常运行时间。来自cassandra的每个数据负载很小但很多。

我应该是可扩展的,这样我就可以放入更多的应用程序容器——就像在 Kubernetes 中他们有 pods。 Pods 是构成应用程序颗粒的一组节点。
因此,我正在寻找可扩展的最佳容器组(Cassandra 和 App 服务器)

信息:Kubernetes 在一开始是一个非常昂贵的设置。在等待 Docker Swarm 处于释放状态时,我将手动执行此操作。欢迎任何见解?

此致

请看:

https://github.com/kubernetes/kubernetes/blob/release-1.0/examples/cassandra/README.md

有关如何在 Kubernetes 上 运行 Cassandra 的教程。

您还需要添加最佳实践,例如将数据库快照到持久存储等。

(为什么说Kubernetes贵?GoogleContainer Engine只收取小型集群的VM成本,开源Kubernetes可以免费自己部署)

不要 运行 应用程序容器和 Cassandra 节点在同一个 pod 中。您希望能够独立于您的应用程序扩展您的 Cassandra 集群。

对于 Cassandra 方面的事情,我建议:

  • 一个复制控制器,因此您可以轻松地扩展您的 Cassandra 节点数量。对我们来说幸运的是,C* 节点都是一样的。
  • 一个 Cassandra 服务,使您的应用程序 pods 有一个稳定的端点,它们可以通过该端点与 C*
  • 通信
  • 为您的 Cassandra pods 提供种子节点 IP 地址的无头 Kubernetes 服务

您需要在 Kubernetes 集群中运行 DNS。

Cassandra 复制控制器

cassandra-replication-controller.yml

apiVersion: v1
kind: ReplicationController
metadata:
  labels:
    name: cassandra
  name: cassandra
spec:
  replicas: 1
  selector:
    name: cassandra
  template:
    metadata:
      labels:
        name: cassandra
    spec:
      containers:
        - image: vyshane/cassandra
          name: cassandra
          env:
            # Feel free to change the following:
            - name: CASSANDRA_CLUSTER_NAME
              value: Cassandra
            - name: CASSANDRA_DC
              value: DC1
            - name: CASSANDRA_RACK
              value: Kubernetes Cluster
            - name: CASSANDRA_ENDPOINT_SNITCH
              value: GossipingPropertyFileSnitch

            # The peer discovery domain needs to point to the Cassandra peer service
            - name: PEER_DISCOVERY_DOMAIN
              value: cassandra-peers.default.cluster.local.
          ports:
            - containerPort: 9042
              name: cql
          volumeMounts:
            - mountPath: /var/lib/cassandra/data
              name: data
      volumes:
        - name: data
          emptyDir: {}

Cassandra 服务

Cassandra 服务非常简单。如果需要,请添加节俭端口。

cassandra-service.yml

apiVersion: v1
kind: Service
metadata:
  labels:
    name: cassandra
  name: cassandra
spec:
  ports:
    - port: 9042
      name: cql
  selector:
    name: cassandra

Cassandra 对等发现服务

这是一个无外设的 Kubernetes 服务,它通过 DNS A 记录提供 Cassandra 节点的 IP 地址。对等服务定义如下所示:

cassandra-peer-service.yml

apiVersion: v1
kind: Service
metadata:
  labels:
    name: cassandra-peers
  name: cassandra-peers
spec:
  clusterIP: None
  ports:
    - port: 7000
      name: intra-node-communication
    - port: 7001
      name: tls-intra-node-communication
  selector:
    name: cassandra

卡桑德拉 Docker 图片

我们扩展了官方的 Cassandra 镜像:

Dockerfile

FROM cassandra:2.2
MAINTAINER Vy-Shane Xie <shane@node.mu>
ENV REFRESHED_AT 2015-09-16

RUN apt-get -qq update && \
    DEBIAN_FRONTEND=noninteractive apt-get -yq install dnsutils && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

COPY custom-entrypoint.sh /
ENTRYPOINT ["/custom-entrypoint.sh"]
CMD ["cassandra", "-f"]

注意 custom-entrypoint.sh 脚本。它只是通过查询我们的 Cassandra 对等发现服务来配置种子节点:

custom-entrypoint.sh

#!/bin/bash
#
# Configure Cassandra seed nodes.

my_ip=$(hostname --ip-address)

CASSANDRA_SEEDS=$(dig $PEER_DISCOVERY_DOMAIN +short | \
    grep -v $my_ip | \
    sort | \
    head -2 | xargs | \
    sed -e 's/ /,/g')

export CASSANDRA_SEEDS

/docker-entrypoint.sh "$@"

启动 Cassandra

要启动 Cassandra,只需 运行

kubectl create -f cassandra-peer-service.yml
kubectl create -f cassandra-service.yml
kubectl create -f cassandra-replication-controller.yml

这将为您提供一个单节点 Cassandra 集群。添加另一个节点:

kubectl scale rc cassandra --replicas=2

与卡桑德拉交谈

您的应用程序 pods 可以使用 cassandra 主机名连接到 Cassandra。它指向 Cassandra 服务。

显示代码

我用上面的设置做了一个 GitHub 回购:Multinode Cassandra Cluster on Kubernetes.