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

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

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

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

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

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

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

问候

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

对于卡桑德拉方面的事情,我build议:

  • 一个复制控制器,所以你可以轻松地扩展你的Cassandra节点的数量。 幸运的是,C *节点都是一样的。
  • 一个Cassandra服务,以便您的应用程序窗格有一个稳定的端点,可以与C *
  • 一个无头的Kubernetes服务,为您的Cassandra豆荚提供种子节点的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 Alogging提供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对等发现服务即可configuration种子节点:

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。 它指向Cassandra服务。

给我看代码

我用上面的设置做了一个GitHub 仓库 : Kubernetes上的多节点Cassandra集群 。

请参见:

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

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

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

(为什么你说Kubernetes是昂贵的?Google容器引擎只收取小群集的虚拟机的成本,而且你可以自由的部署开源的Kubernetes)