云课堂:关于kubernetes管理高可用的mongo集群

上期“云课堂”我们的主题是:应用上云,要避开那些坑。时隔许久之后,“云课堂”终于又跟大家见面了,此次我们要讲的是——关于kubernetes管理高可用的mongo集群。

Kubernetes是一个基于Docker容器的开源编制系统,它能在跨多个主机上管理Docker应用,并提供应用程序部署维护和扩展的基本机制,是目前受关注度非常高的技术,因此此次云课堂来给大家特别介绍一下。

接下来简单介绍一下如何用kubernetes管理mongo docker的高可用集群,以及Kubernetes的若干概念

Pod是Kubernetes的基本操作单元,最小部署单元,是一个容器或者多个容器的集合。Service也是Kubernetes的基本操作单元,是真实应用服务的抽象,每一个服务后面都有很多对应的容器来支持。Replication Controller确保任何时候Kubernetes集群中有指定数量的pod副本(replicas)在运行。上述概念之间关系。

如果我们创建一个使用mongo的docker的Replication Controller,它会自动生成一个或多个pod(具体数量由自己指定),接着就可以用pod来提供mongo服务了。但是现在问题来了,当一个pod挂掉的时候,Replication Controller会自动启动一个全新的pod,旧的那个pod就会被删除,里面的数据就会丢失。若想达到高可用的状态,我们使用mongo官方推荐的复制集。复制集一般有奇数节点组成,其中一个作为primary节点,其他的作为secondary节点,其中写入操作只可在primary节点操作,secondary节点做多只提供读的操作。当primary节点挂掉的时候,剩余节点会自动选出一个新的primary节点,从而保证了服务的连续和数据库不会丢失。

首先我们需要有三个不同的mongo节点即用三个Replication Controller去分别创建一个pod,其中一个作为primary节点,另外两个作为secondary节点,并创建三个service为相对应的Replication Controller去提供服务。为此,我们需要修改镜像文件,在mongo启动的时候增加参数 –noprealloc –smallfiles –replSet “rs0″ ,并在mongo启动之后对复制集进行初始化,语句为

rs.initiate({_id:’rs0′, members:[{_id:0, host:’$HOST1:27017′},{_id:1, host:’$HOST2:27017′, },{_id:2, host:’$HOST3:27017′}]})  其中$HOST1、$HOST2、$HOST3 为每个Replication Controller对应的service地址。修改之后便可以创建Replication Controller和svc了。创建成功后执行指令kubectl get svc便可看到如下:

接着我们便可以用每个service对应的CLUSTER_IP及PORTQ去登陆mongo。如:

然后就可以使用了,这样即使一个pod挂掉,Replication Controller会自动启动另外一个pod,此时该pod的mongo会自动从其他的节点上面同步数据,原先的数据也会恢复,从而保证数据不丢失。

好了,以上便是本期“云课堂”向大家介绍的“关于kubernetes管理高可用的mongo集群”,如果您有想要知晓的技术信息,请在我们微信号中留言,有可能下期我们所讲的主题就是您所关心的哦!今天就到这里,我们下期见!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>