一、MongoDB集群概念
1、组织架构
搭建一个MongoDB集群,需要三种角色:
① Shard Server:
mongod实例,用于存储实际的数据块,实际生产环境中一个shard server角色可以由几台机器组成一个replica set承担,通过这种方式防止主机的单点故障。
② Config Server:
mongod实例,存储了整个Cluster Metadata,其中包括 chunk 信息。
③ Route Server:
mongos实例,前端路由,客户端由此接入,而且让整个集群看上去像单个数据库,前端应用可以透明使用。
2、实例分配和配置
根据实际的生产环境和应用的要求,摒弃了通常使用的单服务器单实例的部署方案,而是选择单机多实例的混合部署策略。
① 分别在2台机器运行6个mongod实例,组织replica set,作为cluster的shard。
② 在两台机器共运行3个mongod(config)实例,配置3个config server。
注意:
在Mongo3.2中,支持configserver进行副本配置,避免了以前版本中多config部署时遇到的同步时出现各个config中的时间戳相异而导致的集群无法启动的问题。
③ 每台机器运行1个mongos进程,用于客户端连接。
二、MongoDB集群搭建
1、安装MongoDB软件
① 下载最新版的MongoDB的安装包
② 解压安装包
2、配置Relica Sets
① 创建数据目录(以shard11为例,路径可以按需求更改)
mkdir –p /data/shard11
touch /data/shard11.log
touch /data/shard11.cnf
② 编辑配置文件
③ 启动
cd /usr/local/server/mongodb/bin
./bin/mongod -–config=/data/shard11.cnf
④ 初始
用mongo连接其中一个mongod,执行:
./bin/mongo --port 27017
> config = ,
,
]
}
> rs.initiate(config);
3、配置Config Server
① 创建数据目录(以config1为例,路径可以按需求更改)
mkdir –p /data/config1
touch /data/config1.log
touch /data/config1.cnf
② 编辑配置文件
③ 启动
cd /usr/local/server/mongodb/bin
./bin/mongod -–config=/data/config1.cnf
4、配置Mongos
① 创建数据目录
touch /data/mongos.log
touch /data/mongos.cnf
② 编辑配置文件
③ 启动
cd /usr/local/server/mongodb/bin
./bin/mongos -–config=/data/ mongos.cnf
5、配置分片
① 连接到mongs,并切换到admin
./bin/mongo 172.16.101.244:30000/admin
Admin
② 加入shards
采用replicaSetName/[:port][,serverhostname2[:port],…]这样的格式,例如本例执行:
>db.runCommand();
>db.runCommand();
>db.runCommand();
>db.runCommand();
注意:
name:用于指定每个shard的名字,不指定的话系统将自动分配
maxSize:指定各个shard可使用的最大磁盘空间,单位megabytes
③ Listing shards
>db.runCommand( { listshards : 1 } )
如果列出了以上二个你加的shards,表示shards已经配置成功。
6、激活分片
① 激活数据库分片
> db.runCommand();
注意:
通过执行以上命令,可以让数据库跨shard,如果不执行这步,数据库只会存放在一个shard,一旦激活数据库分片,数据库中不同的collection将被存放在不同的shard上,但一个collection仍旧存放在同一个shard上,要使单个collection也分片,还需单独对collection作些操作。
② 激活集合分片
要使单个collection也分片存储,需要给collection指定一个分片key:
> db.runCommand( { shardcollection : “”,key : });
例如:
> db.runCommand(});{ "collectionsharded" : "test.c1", "ok" : 1 }
7、关于仲裁者(哨兵)
看到这里,我相信很多朋友都在纳闷,为什么在上面的配置过程中,都没有提到MongoDB集群中最重要的仲裁者呢?其实关于仲裁者,最大的好处就在于当集群节点意外挂掉以后,可以帮助分片选举出新的主分片节点,使得系统能正常运行,对外界屏蔽了单点故障。同时它自身并不存储任何数据,不耗费任何的磁盘空间,是个轻量级的进程。
当我们配置分片中的节点数是奇数时,其实我们就不必担心这一类问题了,因为这时候3副本的集群自带了仲裁的效果,就省去了设置仲裁者的步骤了。不过我们也可以通过下面的命令手动添加仲裁者:
rs.addArb("ip:port")
三、MongoDB集群的难点
大家发现了吧,其实MongoDB集群的搭建不算困难,只需要按部就班的配置,几分钟完成一个能用的Mongo集群绝对是有可能的,但是要搭建一个高可用的优质集群,那么需要研究的还远不止这些。对于配置文件中的参数选择才是需要我们根据实际生产环境和业务需求去好好琢磨的,MongoDB的性能极度依赖于集群初期搭建时的参数选择,至于这一点,在之后的测评报告中会逐一向大家展示。
领取专属 10元无门槛券
私享最新 技术干货