我正在使用容器运行app服务器和Cassandra节点。
启动app服务器容器时,我需要指定要连接的Cassandra节点(1..n)。你会如何划分工作量?
这适用于生产设置,100%正常运行时间。来自cassandra的每个数据负载很小但很多
我应该是可扩展的,所以我可以放入更多的应用程序容器 - 就像在Kubernetes中他们有容器一样。 Pod是一组构成应用程序粒度的节点。
因此,我正在寻找可扩展的最佳容器组(Cassandra和App服务器)
信息:Kubernets在开始时是一个昂贵的设置。在等待Docker Swarm处于释放状态时,我将手动执行此操作。欢迎任何见解?
此致
答案 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方面的事情,我建议:
您需要在Kubernetes群集中使用DNS。
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服务非常简单。如果需要,添加thrift端口。
cassandra-service.yml
apiVersion: v1
kind: Service
metadata:
labels:
name: cassandra
name: cassandra
spec:
ports:
- port: 9042
name: cql
selector:
name: 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图像:
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
主机名连接到Cassandra。它指向Cassandra服务。
我使用上面的设置创建了一个GitHub仓库:Multinode Cassandra Cluster on Kubernetes。