方案概述
mongodb 集群搭建包括分片副本集的搭建、config server的搭建及mongos配置
实施步骤
一、 搭建说明
1、集群的组件介绍
A、mongos(query routers):查询路由,负责client的连接,并把任务分给shards,然后收集结果。一个集群可以有多个query routers(replica sets),以分担客户端请求(负载均衡)。
B、config server:配置服务器。保存了集群的元数据(比如数据放在哪个shards上),query router通过config server中的配置信息决定把任务分配到哪个shards上。从3.4开始,config servers可以做成replica sets。
C、shards:分片,即数据结点,存储数据和执行计算。为了保证高可用和数据一致性,生产环境中shards应该做成replicasets(防止丢失数据)。

2、IP及端口规划
| 实例 | 192.168.1.140 | 192.168.1.141 | 192.168.1.142 |
|---|---|---|---|
| Router | mongos1(65313) | mongos2(65313) | mongos3(65313) |
| Config | config server1 (configRS 23015) | config server2 (configRS 23015) | config server3 (configRS 23015) |
| Shard | shard1-主(28011) | shard2-主(28012) | shard3-主(28013) |
| Shard | shard2-从(28012) | shard1-从(28011) | shard2-从(28012) |
| Shard | shard3-从(28013) | shard3-从(28013) | shard1-从(28011) |
3、linux目录规划

二、 准备工作
1、下载mongodb软件
https://www.mongodb.com/download-center#atlas
2、服务器IP设置
[root@node1]$ vi /etc/sysconfig/network-scripts/ifcfg-eth0
将BOOTPROTO=dhcp 修改成 =static,将 ONBOOT=no 改成 =yes
在文件末添加:
IPADDR=192.168.1.140
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
[root@node1]$ systemctl restart network
3、新建用户组及用户
[root@node1]$ groupadd mongo
[root@node1]$ useradd -g mongo -m mongo
[root@node1]$ passwd mongo
4、建立相应的目录
[mongo@node1]$ mkdir -p /home/mongo/dbs/{config,router,shard}
[mongo@node1]$ mkdir -p /home/mongo/dbs/config/{data,logs}
[mongo@node1]$ mkdir -p /home/mongo/dbs/router/logs
[mongo@node1]$ mkdir -p /home/mongo/dbs/shard/{data,logs}
[mongo@node1]$ mkdir -p /home/mongo/dbs/shard/data/{shard1,shard2,shard3}
5、安装软件
[mongo@node1]$ tar -xvf mongodb-linux-x86_64-4.0.10.tgz -C /home/mongo/mongodb
6、配置环境变量
[mongo@node1]$ echo “PATH=$PATH:/home/mongo/mongodb/bin
export PATH”
三、配置config server
1、新建config实例的启动参数文件,并启动实例
注:每台服务器都顺序执行一次
[mongo@node1]$ cd /home/mongo/dbs/config/
[mongo@node1]$ vi mongo.config
dbpath=/home/mongo/dbs/config/data
logpath=/home/mongo/dbs/config/logs/mongo.log
port=23015
fork=true
replSet=configRS
configsvr=true
[mongo@node1]$ mongod -f /home/mongo/dbs/config/mongo.config
2、任意进入一台服务器,配置config server为replica sets
[mongo@node1]$ mongo --port 23015
use admin
rs.initiate( {
… _id: “configRS”,
… configsvr: true,
… members: [
… { _id: 0, host: “192.168.1.140:23015” },
… { _id: 1, host: “192.168.1.141:23015” },
… { _id: 2, host: “192.168.1.142:23015” }
… ]
… } );
rs.status()
四、启动mongos server
注:每台服务器都顺序执行一次
[mongo@node1]$ cd /home/mongo/dbs/router
[mongo@node1]$ vi mongos.config
configdb = configRS/192.168.1.140:23015,192.168.1.141:23015,192.168.1.142:23015
port = 65313
chunkSize = 1
logpath =/home/mongo/dbs/router/logs/mongos.log
logappend = true
fork = true
[mongo@node1]$ mongos -f /home/mongo/dbs/router/mongos.config
五、配置shard server
1、新建shard实例的启动参数文件
注:每台服务器都顺序执行一次
[mongo@node1]$ cd /home/mongo/dbs/shard
[mongo@node1]$ vi shard1.config
dbpath=/home/mongo/dbs/shard/data/shard1
logpath=/home/mongo/dbs/shard/logs/shard1.log
port=28011
fork=true
replSet=shard1
[mongo@node1]$ vi shard2.config
dbpath=/home/mongo/dbs/shard/data/shard2
logpath=/home/mongo/dbs/shard/logs/shard2.log
port=28012
fork=true
replSet=shard2
[mongo@node1]$ vi shard3.config
dbpath=/home/mongo/dbs/shard/data/shard3
logpath=/home/mongo/dbs/shard/logs/shard3.log
port=28013
fork=true
replSet=shard3
2、启动shard实例
第一台服务器先启动shard1,然后去第二台服务器启动shard2,再去第三台服务器启动shard3。
启动完后,每个服务器再去启动剩下的2个实例。
[mongo@node1]$ mongod -f /home/mongo/dbs/shard/shard1.config
[mongo@node1]$ mongod -f /home/mongo/dbs/shard/shard2.config
[mongo@node1]$ mongod -f /home/mongo/dbs/shard/shard3.config
3、任意进入一台服务器,配置每个shard为replica sets
[mongo@node1]$ mongo --port 28011
use admin
config = {"_id" : “shard1”,
“members” : [
{"_id" : 0, “host” : “192.168.1.140:28011”},
{"_id" : 1, “host” : “192.168.1.141:28011”},
{"_id" : 2, “host” : “192.168.1.142:28011”}
]}
rs.initiate(config)
rs.status()
[mongo@node1]$ mongo --port 28012
use admin
config = {"_id" : “shard2”,
“members” : [
{"_id" : 0, “host” : “192.168.1.141:28012”},
{"_id" : 1, “host” : “192.168.1.140:28012”},
{"_id" : 2, “host” : “192.168.1.142:28012”}
]}
rs.initiate(config)
rs.status()
[mongo@node1]$ mongo --port 28013
use admin
config = {"_id" : “shard3”,
“members” : [
{"_id" : 0, “host” : “192.168.1.142:28013”},
{"_id" : 1, “host” : “192.168.1.141:28013”},
{"_id" : 2, “host” : “192.168.1.140:28013”}
]}
rs.initiate(config)
rs.status()
六、配置分片
[mongo@node1]$ mongo --port 65313
use admin
db.runCommand({“addShard”:“shard1/192.168.1.140:28011”})
db.runCommand({“addShard”:“shard2/192.168.1.141:28012”})
db.runCommand({“addShard”:“shard3/192.168.1.142:28013”})
db.runCommand({listshards:1})
七、测试
1、登录到router实例
[mongo@node1]$ mongo --port 65313
2、开启分片功能
use admin
对库enmo开启分片
db.runCommand({“enablesharding”:“enmo”})
–对库llh下的表person按字段ID配置hash分库算法
db.runCommand({“shardcollection”:“enmo.person”,“key”:{_id:‘hashed’}})
3、插入数据
use enmo
for(var i=0;i<100000;i++){db.person.insert({name:“test”+i});}
4、查看数据是否已经分片
[mongo@node1]$ mongo --port 28011
[mongo@node1]$ mongo --port 28012
[mongo@node1]$ mongo --port 28013
5、登录从库服务器,查看主从是否同步
八、故障模拟
情况1:关掉shard1的主节点,看是否产生了新的主节点,且数据是否正常同步

登录从库查看当前shard1的状态,可以看到已经将12的从库变成了主节点
情况2:关掉config的主节点,看数据是否能正常分片

插入新数据:

可以看到,数据分片正常,同步正常



情况3:将1台服务器直接关机,看mongo是否还能正常工作

插入数据:

可以看到,数据分片正常,同步正常



九、运维相关
1、关闭mongo
以mongo用户登录每台服务器
(1)、关闭shard实例
[mongo@node1]$ mongod --dbpath=/home/mongo/dbs/shard/data/shard1 –shutdown
[mongo@node1]$ mongod --dbpath=/home/mongo/dbs/shard/data/shard2 –shutdown
[mongo@node1]$ mongod --dbpath=/home/mongo/dbs/shard/data/shard3 –shutdown
(2)、关闭config实例
[mongo@node1]$ mongod --dbpath=/home/mongo/dbs/config/data –shutdown
(3)、关闭route实例
[mongo@node1]$ mongo --port 65313
use admin
db.shutdownServer();
2、启动mongo
以mongo用户登录每台服务器
1、启动config实例
[mongo@node1]$ mongod -f /home/mongo/dbs/config/mongo.config
2、启动route实例
[mongo@node1]$ mongos -f /home/mongo/dbs/router/mongos.config
3、启动shard实例
[mongo@node1]$ mongod -f /home/mongo/dbs/shard/shard1.config
[mongo@node1]$ mongod -f /home/mongo/dbs/shard/shard2.config
[mongo@node1]$ mongod -f /home/mongo/dbs/shard/shard3.config
3、查看mongo的进程
一共有4个mongod进程,1个mongos进程。
[mongo@node1]$ ps -ef|grep -E ‘mongod|mongos’ |grep -v grep
附加命令
1、关闭mongo实例
mongod --dbpath=/home/mongo/dbs/shard/data/shard1 --shutdown
2、设置副本节点可以读数据:db.getMongo().setSlaveOk();
3、查看分片情况:db.runCommand({listshards:1})
4、更改配置立即生效:rs.reconfig(config, { force: true})




