应用程序容器到 cassandra 节点 - 一对一还是?
App container to cassandra node - one to one or?
我正在使用容器 运行 应用程序服务器和 Cassandra 节点。
启动应用服务器容器时,我需要指定要连接到哪个Cassandra 节点(1..n)。你会如何分配工作量?
- 一个应用程序容器到一个或多个 Cassandra 节点(多少)。
- 一个或多个应用程序容器到一个 Cassandra 节点(多少)。
- 多对多(多少)。
这适用于生产设置,100% 正常运行时间。来自cassandra的每个数据负载很小但很多。
我应该是可扩展的,这样我就可以放入更多的应用程序容器——就像在 Kubernetes 中他们有 pods。 Pods 是构成应用程序颗粒的一组节点。
因此,我正在寻找可扩展的最佳容器组(Cassandra 和 App 服务器)
信息:Kubernetes 在一开始是一个非常昂贵的设置。在等待 Docker Swarm 处于释放状态时,我将手动执行此操作。欢迎任何见解?
此致
请看:
https://github.com/kubernetes/kubernetes/blob/release-1.0/examples/cassandra/README.md
有关如何在 Kubernetes 上 运行 Cassandra 的教程。
您还需要添加最佳实践,例如将数据库快照到持久存储等。
(为什么说Kubernetes贵?GoogleContainer Engine只收取小型集群的VM成本,开源Kubernetes可以免费自己部署)
不要 运行 应用程序容器和 Cassandra 节点在同一个 pod 中。您希望能够独立于您的应用程序扩展您的 Cassandra 集群。
对于 Cassandra 方面的事情,我建议:
- 一个复制控制器,因此您可以轻松地扩展您的 Cassandra 节点数量。对我们来说幸运的是,C* 节点都是一样的。
- 一个 Cassandra 服务,使您的应用程序 pods 有一个稳定的端点,它们可以通过该端点与 C*
通信
- 为您的 Cassandra pods 提供种子节点 IP 地址的无头 Kubernetes 服务
您需要在 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 服务非常简单。如果需要,请添加节俭端口。
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
卡桑德拉 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
要启动 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
与卡桑德拉交谈
您的应用程序 pods 可以使用 cassandra
主机名连接到 Cassandra。它指向 Cassandra 服务。
显示代码
我用上面的设置做了一个 GitHub 回购:Multinode Cassandra Cluster on Kubernetes.
我正在使用容器 运行 应用程序服务器和 Cassandra 节点。
启动应用服务器容器时,我需要指定要连接到哪个Cassandra 节点(1..n)。你会如何分配工作量?
- 一个应用程序容器到一个或多个 Cassandra 节点(多少)。
- 一个或多个应用程序容器到一个 Cassandra 节点(多少)。
- 多对多(多少)。
这适用于生产设置,100% 正常运行时间。来自cassandra的每个数据负载很小但很多。
我应该是可扩展的,这样我就可以放入更多的应用程序容器——就像在 Kubernetes 中他们有 pods。 Pods 是构成应用程序颗粒的一组节点。
因此,我正在寻找可扩展的最佳容器组(Cassandra 和 App 服务器)
信息:Kubernetes 在一开始是一个非常昂贵的设置。在等待 Docker Swarm 处于释放状态时,我将手动执行此操作。欢迎任何见解?
此致
请看:
https://github.com/kubernetes/kubernetes/blob/release-1.0/examples/cassandra/README.md
有关如何在 Kubernetes 上 运行 Cassandra 的教程。
您还需要添加最佳实践,例如将数据库快照到持久存储等。
(为什么说Kubernetes贵?GoogleContainer Engine只收取小型集群的VM成本,开源Kubernetes可以免费自己部署)
不要 运行 应用程序容器和 Cassandra 节点在同一个 pod 中。您希望能够独立于您的应用程序扩展您的 Cassandra 集群。
对于 Cassandra 方面的事情,我建议:
- 一个复制控制器,因此您可以轻松地扩展您的 Cassandra 节点数量。对我们来说幸运的是,C* 节点都是一样的。
- 一个 Cassandra 服务,使您的应用程序 pods 有一个稳定的端点,它们可以通过该端点与 C* 通信
- 为您的 Cassandra pods 提供种子节点 IP 地址的无头 Kubernetes 服务
您需要在 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 服务非常简单。如果需要,请添加节俭端口。
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
卡桑德拉 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
要启动 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
与卡桑德拉交谈
您的应用程序 pods 可以使用 cassandra
主机名连接到 Cassandra。它指向 Cassandra 服务。
显示代码
我用上面的设置做了一个 GitHub 回购:Multinode Cassandra Cluster on Kubernetes.