作者介绍
魏世江
希云联合创始人、CTO,负责基于Docker的自动化服务管理平台的后端研发工作。擅长Docker相关技术、PasS平台架构及企业自动化运维系统的设计及开发。创业之前在新浪SAE平台任技术经理,从09年SAE立项至13年下半年的四年多时间里,一直负责SAEPasS平台各种基于Web的服务管理系统的设计及开发,在DevOps方面积累了丰富的经验。Docker引擎代码贡献者,在Docker开源项目中代码贡献量全球排名50名左右。
开篇
Mongo在很早就支持了replication set和sharding集群。经过了这么多年的沉淀,Mongo集群的成熟度已经非常稳定,被大量公司用到自己的生产环境下。如何使用容器技术来实现Mongo集群的一键式交付部署,屏蔽底层实现的细节,是很多人关心的话题。
本文将给大家介绍基于进程的容器技术实现Mongo sharding集群的一键部署,充分展现了容器的强大威力。
什么是Mongo sharding集群
Mongo(mongodb.com)作为流行的文档数据库,有很多有趣的特性,比如内置failover、支持文件存储、支持mapreduce以及可以在服务器端直接运行js脚本,当然我们今天最关心的是它内置的sharding功能。分布式系统的设计向来具有很高的挑战,在最近一些年,随着互联网的发展,分布式的实践逐步开始得到推广和重视。
如果要深入了解Mongo sharding的原理,参考:
集群编排规划
mongo集群涉及到多个服务,包括:
- configdb, sharding集群的中心配置,是一个replicaset集群,监听在27019端口
- mongos, 作为sharding集群的访问和管理入口,监听在27017端口
- mongo slices,数据分片节点
- mongo replicaset,每个数据分片是一个replicaset集群,用于保障没有单点,并提供自动failover能力
- mongo express, mongodb的管理dashboard
拓扑图
本次部署,configdb3台,mongo数据节点12台,分成4个分片,每个分片1主2从
首先准备mongo镜像
Mongo官方已经提供了Mongo 3.2的镜像,可以用来作为Mongo集群的镜像.为了减少后续维护工作,我们尽可能不构建自己的镜像。
下面我们按照mongo sharding官方的部署文档,一步步编排集群。
https://docs.mongodb.com/manual/tutorial/deploy-shard-cluster/
部署的顺序是:configdb -> mongos -> mongo-replicaset/mongo-slices -> mongo-express
部署mongo configdb
准备configdb的配置文件
# cat mongo-config.conf
systemLog:
verbosity: 0
operationProfiling:
slowOpThresholdMs: 3000
processManagement:
fork: false
storage:
dbPath: /data/db
journal:
enabled: true
engine: wiredTiger
replication:
replSetName: {
{.ReplSetName}}
sharding:
clusterRole: configsvr
net:
port: 27019
准备 configdb集群的初始化js脚本
# cat configdb-init.js
{
{ $s := service "mongo-configsvr" }}
config = {
_id : "{
{.ReplSetName}}",
members : [
{
{range $c := $s.Containers }}{_id : {
{
$c.Seq}}, host: