使用捕鱼大亨网络版 宠物套装 的数千个Cassandra实例
编者注:这篇文章是 系列深入文章 捕鱼大亨网络版 1.3的新功能
参加希腊宠物怪兽比赛
为了 捕鱼大亨网络版 1.3发布,我们想让新的宠物套装步入正轨。通过测试一千个实例 卡桑德拉 ,我们可以确保捕鱼大亨网络版 1.3已准备就绪。请继续阅读,了解我们如何使Cassandra适应捕鱼大亨网络版,并进行了有史以来最大规模的部署。
如今,将容器与基本的有状态应用程序一起使用非常简单。使用永久卷,您可以将磁盘安装在Pod中,并确保数据的使用寿命超出Pod的使用寿命。但是,通过部署分布式有状态应用程序,事情可能会变得更加棘手。借助捕鱼大亨网络版 1.3,新的 宠物套装 组件使一切变得简单。为了大规模测试此新功能,我们决定举办希腊宠物怪物大赛!我们在多个可用区域中进行了数十万次种族的半人马座和其他古希腊怪兽竞赛。
众所周知,捕鱼大亨网络版来自古希腊语:κυβερνήτης。这意味着舵手,飞行员,舵手或船长。因此,为了跟踪比赛结果,我们需要一个数据存储,然后选择Cassandra。 Κασσάνδρα,Cassandra,是Priam国王和Troy Hecuba皇后的女儿。通过多次提及古希腊语言,我们认为种族古希腊怪物是合适的。
从那里开始,这个故事有点偏了,因为卡桑德拉实际上也是宠物。继续阅读,我们将进行解释。
宠物套装 是捕鱼大亨网络版 1.3中令人兴奋的新功能之一。为了组织捕鱼大亨网络版内部容器的部署,可以使用不同的部署机制。这些组件的示例包括资源控制器和守护程序集。 宠物套装 s是一项新功能,提供了在捕鱼大亨网络版内部部署作为Pets的容器的功能。宠物集为宠物/吊舱部署的各个方面提供身份保证:DNS名称,一致的存储和有序的吊舱索引。以前,使用诸如Deployments和Replication Controllers之类的组件只能部署具有弱耦合身份的应用程序。弱身份对于管理微服务等应用程序非常有用,在微服务中,服务发现很重要,应用程序是无状态的,各个吊舱的命名都无关紧要。许多软件应用程序确实需要强身份,包括许多不同类型的分布式状态系统。 卡桑德拉 是需要一致的网络标识和稳定的存储的分布式应用程序的一个很好的例子。
宠物套件提供以下功能:
- 稳定的主机名,DNS中的其他用户可以使用。数字基于“宠物组”名称,从零开始。例如cassandra-0。
- 宠物的序号索引。 0、1、2、3等。
- 与Pet的序数和主机名链接的稳定存储。
- 可以通过DNS使用对等发现。使用卡桑德拉(Cassandra),在创建宠物之前就知道了同伴的名字。
- 启动和拆卸顺序。接下来知道哪个编号的宠物将被创建,并且减小宠物组大小后将销毁哪个宠物。减少群集大小时,此功能对于诸如从Pet排出数据之类的管理任务很有用。
如果您的应用程序具有这些要求中的一项或多项,那么它可能是Pet Set的候选人。
一个相关的类比是,宠物组合由宠物狗组成。如果您有一只白色,棕色或黑色的狗,而棕色的狗跑掉了,您可以用另一只棕色的狗替换它,没人会注意到。如果随着时间的流逝,您可以继续只用白色的狗代替您的狗,那么有人会注意到。 宠物套装 允许您的应用程序维护Pets的唯一标识或头发颜色。
宠物套装的工作负载示例:
- 像Cassandra,Zookeeper,etcd或Elastic这样的集群软件需要稳定的成员资格。
- 像MySQL或PostgreSQL这样的数据库,它们随时都需要将单个实例附加到持久卷上。
仅在您的应用程序需要其中一些或所有这些属性时才使用Pet Set。将Pod作为无状态副本进行管理要容易得多。
回到我们的比赛!
如前所述,Cassandra是通过Pet Set进行部署的理想人选。宠物套装很像 复制控制器 带有一些新的铃铛和口哨声。这是一个示例YAML清单:
无头服务提供DNS查找
apiVersion: v1
kind: Service
metadata:
labels:
app: cassandra
name: cassandra
spec:
clusterIP: None
ports:
- port: 9042
selector:
app: cassandra-data
----
# new API name
apiVersion: "apps/v1alpha1"
kind: PetSet
metadata:
name: cassandra
spec:
serviceName: cassandra
# replicas are the same as used by Replication Controllers
# except pets are deployed in order 0, 1, 2, 3, etc
replicas: 5
template:
metadata:
annotations:
pod.alpha.kubernetes.io/initialized: "true"
labels:
app: cassandra-data
spec:
# just as other component in 捕鱼大亨网络版 one
# or more containers are deployed
containers:
- name: cassandra
图片 : "cassandra-debian:v1.1"
图片 PullPolicy: Always
ports:
- containerPort: 7000
name: intra-node
- containerPort: 7199
name: jmx
- containerPort: 9042
name: cql
resources:
limits:
cpu: "4"
memory: 11Gi
requests:
cpu: "4"
memory: 11Gi
securityContext:
privileged: true
env:
- name: MAX\_HEAP\_SIZE
value: 8192M
- name: HEAP\_NEWSIZE
value: 2048M
# this is relying on guaranteed network identity of 宠物套装 s, we
# will know the name of the Pets / Pod before they are created
- name: CASSANDRA\_SEEDS
value: "cassandra-0.cassandra.default.svc.cluster.local,cassandra-1.cassandra.default.svc.cluster.local"
- name: CASSANDRA\_CLUSTER\_NAME
value: "OneKDemo"
- name: CASSANDRA\_DC
value: "DC1-Data"
- name: CASSANDRA\_RACK
value: "OneKDemo-Rack1-Data"
- name: CASSANDRA\_AUTO\_BOOTSTRAP
value: "false"
# this variable is used by the read-probe looking
# for the IP Address in a `nodetool status` command
- name: POD\_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
readinessProbe:
exec:
command:
- /bin/bash
- -c
- /ready-probe.sh
initialDelaySeconds: 15
timeoutSeconds: 5
# These volume mounts are persistent. They are like inline claims,
# but not exactly because the names need to match exactly one of
# the pet volumes.
volumeMounts:
- name: cassandra-data
mountPath: /cassandra\_data
# These are converted to volume claims by the controller
# and mounted at the paths mentioned above. Storage can be automatically
# created for the Pets depending on the cloud environment.
volumeClaimTemplates:
- metadata:
name: cassandra-data
annotations:
volume.alpha.kubernetes.io/storage-class: anything
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 380Gi
您可能会注意到这些容器的尺寸相当大,在具有8个CPU和16GB内存的生产环境中运行Cassandra并不少见。您将在上面注意到两个主要的新功能;动态卷配置,当然还有Pet Set。上面的清单将创建5个以数字0开头的Cassandra Pets / Pod:cassandra-data-0,cassandra-data-1等。
为了生成比赛数据,我们使用了另一个称为Jobs的捕鱼大亨网络版功能。编写了简单的python代码,以在比赛的每一秒产生怪物的随机速度。然后,这些数据,位置信息,获胜者,其他数据点和指标都存储在Cassandra中。为了可视化数据,我们使用JHipster生成带有Java服务的AngularJS UI,然后使用D3进行绘图。
作业之一的示例:
apiVersion: batch/v1
kind: Job
metadata:
name: pet-race-giants
labels:
name: pet-races
spec:
parallelism: 2
completions: 4
template:
metadata:
name: pet-race-giants
labels:
name: pet-races
spec:
containers:
- name: pet-race-giants
图片 : py3numpy-job:v1.0
command: ["pet-race-job", --length=100", "--pet=Giants", "--scale=3"]
resources:
limits:
cpu: "2"
requests:
cpu: "2"
restartPolicy: Never
因为我们在谈论怪物,所以我们必须变得更大。我们部署了1,009个奴才节点 Google Compute Engine (GCE),分布在4个区域中,并运行捕鱼大亨网络版 1.3 beta的自定义版本。因为该演示是在1.3发布日期之前设置的,所以我们在Beta代码上运行了该演示。对于minion节点,选择了GCE虚拟机n1-standard-8机器大小,即具有8个虚拟CPU和30GB内存的vm。它将允许Cassandra的单个实例在一个节点上运行,建议将其用于磁盘I / O。
然后宠物被部署了!在两个不同的Cassandra数据中心中有1000个。 卡桑德拉 分布式体系结构是专为多数据中心部署量身定制的。通常,将多个Cassandra数据中心部署在同一物理或虚拟数据中心内,以分离工作负载。数据是在所有数据中心之间复制的,但是数据中心之间的工作负载可能会有所不同,因此应用程序调整可能会有所不同。名为“ DC1-Analytics”和“ DC1-Data”的数据中心每个部署有500只宠物。竞赛数据是由连接到DC1-Data的python Batch 职位 创建的,而JHipster UI已连接到DC1-Analytics。
这是最终的数字:
- 8,072核心。主节点使用24个,小节点使用其余节点
- 1,009个IP地址
- 捕鱼大亨网络版 在Google Cloud Platform上设置的1,009条路线
- 奴才和主人使用的100,510 GB永久磁盘
- 380,020 GB SSD磁盘永久磁盘。主服务器20 GB,每个Cassandra Pet 340 GB。
- 1,000个已部署的Cassandra实例 是的,我们部署了1000只宠物,但其中一个真的不想参加聚会!从技术上讲,使用Cassandra设置,我们可能会丢失333个节点而不会丢失服务或数据。
1.3版本中宠物套装的局限性
- 宠物套装 是Alpha资源,在1.3之前的任何捕鱼大亨网络版版本中均不可用。
- 给定宠物的存储必须由动态存储提供者根据请求的存储类别来提供,或者由管理员预先提供。
- 删除宠物集不会删除任何宠物或宠物存储空间。您将需要手动删除宠物以及可能的存储空间。
- 当前,所有宠物套件都需要“管理服务”或负责宠物网络身份的服务。用户对此服务负责。
- 当前,更新现有的宠物套装是一个手动过程。您需要部署具有新映像版本的新Pet Set或孤立的Pets一次并更新其映像,这会将它们重新加入群集。