2

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

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

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

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

我应该是可扩展的,这样我就可以放入更多的应用程序容器——比如在 Kubernetes 中它们有 pod。Pod 是组成应用程序粒度的一组节点。
因此,我正在寻找可以扩展的最佳容器组(Cassandra 和应用服务器)

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

问候

4

2 回答 2

2

请参见:

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

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

您还需要添加最佳实践,例如将数据库快照到持久存储和其他类似的东西。

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

于 2015-09-28T03:04:55.333 回答
1

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

对于 Cassandra 方面,我建议:

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

您需要在 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-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

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,只需运行

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

与卡桑德拉交谈

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

给我看代码

我使用上述设置创建了一个 GitHub 存储库:Kubernetes 上的多节点 Cassandra 集群

于 2015-09-30T17:12:00.750 回答