Cassandra on Mesos with Docker


【编者的话】分布式系统是难于理解、设计、构建和管理的,Apache Mesos能够在集群机器上运行多种分布式系统,并可高效的共享资源。Marathon是一个mesos框架,支持运行长服务。本文介绍了如何在Mesos上运行Docker化的Cassandra集群,推荐阅读。

目标

我们想在Mesos集群上使用Docker容器,并以Marathon长期运行job的方式部署Datastax Cassandra集群。别以为我们只是想将这些热点词汇堆砌在一起,接下来我会具体介绍我们是怎么做的。

在过去的几个月里,我们使用Mesos作为云资源管理器,并且成功部署了Mesos集群。这些集群和Jenkins、Mesos Jekins Scheduler以及开发环境整合在一起支持CI/CD环境,并用Marahon来运行时间较长的任务,同时,我们选择Docker作为容器化工具。现在我们已经成功部署了Cassandra,并且我们推荐在高吞吐量的项目里使用Datastax Cassandra。

场景

我们之前在Akka集群中使用了一个Cassandra节点,现在正准备使用Cassandra集群。当我们想要在Mesos为基础的测试环境中使用Cassandra时,一切很简单,因为只要求一个单节点的Cassandra。而当我们想要转到预生产环境时,事情开始变得复杂起来,因为这时必须使用Cassandra集群。我们完成的就是从单节点Cassandra到Cassandra集群的转变。本练习里使用的项目是我们自己项目的一个开源分支:Lift这篇文章介绍了该项目的架构详情。

Cassandra背景介绍

我们在2011年就开始使用和推广Cassandra数据库,算是第一批Apache Cassandra NoSql数据库的使用者,当时使用的是0.8.x版本。我们从一开始就在AWS云上使用Cassandra。我们也使用新的版本,并且在此之间成功升级到新版本上。2015年,我们开始结合Mesosphere运行Spotify的Cassandra Docker镜像

方案

Cassandra单节点

Mesosphere提供了很好的工具,Spotify社区贡献了官方Datastax Cassandra版本的Docker镜像,所以在开发或者模拟环境里使用Cassandra单节点非常容易。

如下是我们系统的简单介绍:

使用Puppet作为配置管理工具。之前这篇文章介绍了我们是怎么使用Puppet的。

Mesosphere工具中我们选择使用Marathon框架来运行Cassandra节点。Marathon可以支持应用在Mesos上长期运行,我们使用的是最新版本,具体内容记录在这篇博客了。

我们场景的前提是在Marathon框架里使用Mesos集群,以及很多能运行Docker容器的Mesos slave。单节点Cassandra的搭建需要如下代码和配置:
Puppet代码,确保可以运行任何Marathon任务:
class profile::marathon_jobs ( $jobs     = {} ) {
create_resources ( 'profile::resources::marathon_job', $jobs, $defaults )
}

创建profile的同时创建了resource,用来装载Marathon job hash到json文件里,并将其发送给Marathon框架。精简的Puppet resource如下:
define profile::resources::marathon_job ( ... ) {
file { ".../${title}.json": ...  } ->
exec { "post ${title}.json": ... }
}

所以单节点Cassandra job在Hiera的配置如下:
profile::marathon_jobs::jobs:
lift_cassandra:
docker:
  image: 'spotify/cassandra'
  privileged: true
id: 'lift-cassandra'
instances: '1'
cpus: '1'
mem: '1000'
constraints:
  -
    - "rack-id"
    - "CLUSTER"
    - "cassandra-single-rack-1"

我们借助Marathon jobs constraints确保Cassandra单节点容器在带有所需属性的Mesos Slave上运行:[ “rack-id”, “CLUSTER”, “cassandra-single-rack-1”]。这是基础用法,用资源本身的作用来做其拓扑标签,因为Mesos和Cassandra都有“集群”的概念。

我们也要确保Cassandra单节点运行的Mesos slave有正确的名字,这样应用才可以使用它。为此我们使用如下Hiera配置在Route53上注册:
profile::aws_manager::route53_register::records:
cassandra: {}

这样一切都配置好了,Datastax Cassandra节点在应用层已经可用了。

扩展到集群

到目前为止一切都很好很简单,但要是想在Mesos上部署Cassandra集群还不够。

为了搭建所需的四个节点的集群,我们确保Mesos有所需的资源提供给Marathon。这需要4个用已知名称(s1.cassandra.eigengo.io)注册了的Mesos slave docker主机。
本练习中我们在虚拟节点上使用spotify Cassandra:cluster,因此令牌会自动生成。

Marathon job的Hiera配置如下:
profile::marathon_jobs::jobs:
lift_cassandra_cluster:
docker:
  image: 'cakesolutions/cassandra:cluster'
  privileged: true
  parameters:
    - key: env
      value: CASSANDRA_CLUSTERNAME=eigengo
    - key: env
      value: CASSANDRA_SEEDS=s1.cassandra.eigengo.io,s2.cassandra.eigengo.io,s3.cassandra.eigengo.io,s4.cassandra.eigengo.io
id: 'lift-cassandra'
instances: '4'
cpus: '4'
mem: '8000'
volumes:
  - hostPath: "%{hiera('cassandra::raid_volume')}"
    containerPath: "/var/lib/cassandra"
    mode: "RW"
constraints:
  -
    - "rack-id"
    - "CLUSTER"
    - "cassandra-single-rack-1"
    - 

关键的配置项是特权模式。启用特权模式允许Cassandra进程,thrift client,CQL native transport, internode 通信端口,绑定到Cassandra容器运行的Docker主机上。特权模式的替代方案是使用网络HOST模式。有人可能会说在Docker主机上运行多个Cassandra节点有限制。针对这个明显局限的例子是在预生产环境上的Cassandra集群必须满足某些资源的需求,尤其是存储需求。我们认为,在同一个Docker主机上运行多个Cassandra Docker容器,共享机器资源是很好的想法,不过需要参考Cassandra生产环境最佳实践
我们还fork了spotify docker-Cassandra仓库,撤销了Cassandra默认配置上的一处改动。简单来说,我们重新启用了虚拟节点的使用,这样我们依赖Cassandra自己生成令牌。spotify/cassandra:cluster上的替代方案只要有特定的令牌就可以工作。也就是说每个Cassandra节点需要一个Marathon job,分配了预定义的和每个Marathon job关联的令牌,这看上去有点矫枉过正。

根据Cassandra生产环境推荐设置,我们假设这样的Cassandra容器会运行在准备了raid0卷,并且有充足内存资源的主机上。以生产为目的基准线我们考虑的是m3.xlarge AWS实例,但是你也完全可以尝试一个小规模用途的集群来验证你的想法。

集群图

Cassandra_Cluster_Mesos_Cluster_-_New_Page.png

如上图你可以一下子了解集群创建流程,Marathon Mesos scheduler 作为触发器,Mesos作为资源管理器。Docker是Mesos资源的容器化选择方案。

其他方案

Mesosphere允许运行称为Cassandra Mesos框架,如何构建弹性mesos这里有篇不错的实践文章。
Cassandra Mesos框架正在被重写,因此需要时刻关注着。
这里有一篇tuplejump.com写的文章,在Cassandra ring里使用了一种独特的方式管理资源,在Mesos集群基础上使用了Spark和Akka RM。

结论和考虑

安全考虑

另外值得考虑的一点是Cassandra集群的安全性。建模Mesos集群Cassandra分区时考虑到安全性,才能从早期发现安全问题。根据不同的需求来源可以实现多层次的安全性。

在Cassandra上采用这种方案的优势

通过点击按钮,提交为新数据中心配置过的Marathon job,就能添加额外的数据中心。一个具体的例子就是在现有的基础架构上再另外的地区添加一个同等的VPC。在新的VPC里使用额外的Cassandra数据中心需要如下步骤:
  • 部署Mesos基础
  • 调整运行在Cassandra集群里Merathon已有job的限制,调整Docker环境变量指到新的地区(可能的同等VPC)
  • 准备一个新的Marathon job,在新的VPC上部署新的Cassandra集群。


参考资料

* http://www.datastax.com/blog
* http://www.datastax.com/docume ... .html
* https://github.com/spotify/docker-cassandra
* https://www.youtube.com/watch?v=efYIRKs63T4
* https://github.com/mesosphere/cassandra-mesos
* https://github.com/spotify/docker-cassandra
* https://github.com/cakesolutions/docker-cassandra

原文链接:Cassandra on Mesos with Docker(翻译:崔婧雯 校对:李颖杰)
===========================
译者介绍
崔婧雯,现就职于VMware,高级软件工程师,负责桌面虚拟化产品的质量保证工作。曾在IBM WebSphere业务流程管理软件担任多年系统测试工作。对虚拟化,中间件技术有浓厚的兴趣。

0 个评论

要回复文章请先登录注册