应用程序容器到cassandra节点 – 一对一还是?
我正在使用容器来运行应用程序服务器和Cassandra节点。
启动应用程序服务器容器时,我需要指定要连接到哪个Cassandra节点(1..n)。 你将如何划分工作量?
- 一个应用程序容器到一个或多个Cassandra节点(多less个)。
- 一个或多个应用程序容器到一个Cassandra节点(多less个)。
- 多到多(多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)