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

时间:2015-09-24 11:10:54

标签: cassandra docker kubernetes gocql

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

启动app服务器容器时,我需要指定要连接的Cassandra节点(1..n)。你会如何划分工作量?

  1. 一个或多个Cassandra节点的应用程序容器(多少个)。
  2. 一个或多个应用程序容器到一个Cassandra节点(多少个)。
  3. 多对多(多少)。
  4. 这适用于生产设置,100%正常运行时间。来自cassandra的每个数据负载很小但很多 我应该是可扩展的,所以我可以放入更多的应用程序容器 - 就像在Kubernetes中他们有容器一样。 Pod是一组构成应用程序粒度的节点。
    因此,我正在寻找可扩展的最佳容器组(Cassandra和App服务器)

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

    此致

2 个答案:

答案 0 :(得分:2)

请参阅:

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

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

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

(为什么你说Kubernetes价格昂贵?Google Container Engine只收取小型集群虚拟机的成本,你可以免费部署开源Kubernetes)

答案 1 :(得分:1)

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

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

  • 复制控制器,因此您可以轻松扩展Cassandra节点的数量。幸运的是,C *节点都是一样的。
  • Cassandra服务,以便您的应用程序窗格具有可以与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服务非常简单。如果需要,添加thrift端口。

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 Image

我们扩展了官方的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

与卡桑德拉交谈

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

显示代码

我使用上面的设置创建了一个GitHub仓库:Multinode Cassandra Cluster on Kubernetes