总览
共三台机器:
172.17.10.227
172.17.10.228
172.17.10.229
每台起两个mongod到23021、23022端口,如下:
程序 | 端口 | 说明 |
---|---|---|
mongod | 27021/27022 | Shard Server,两套,用于存储实际的数据块 |
mongo config | 20000 | config server,存储了整个 Cluster Metadata,其中包括 chunk 信息 |
mongos | 30000 | Route Server,前端路由,客户端由此接入,且让整个集群看上去像单一数据库 |
安装
yum install mongo-10gen
准备并启动两个mongod实例
创建目录
mkdir -p /data/mongodb/{db,logs}
mkdir -p /data/mongodb/db/{shard11,shard21,config}
mkdir -p /data/mongodb/{db,logs}
mkdir -p /data/mongodb/db/{shard12,shard22,config}
mkdir -p /data/mongodb/{db,logs}
mkdir -p /data/mongodb/db/{shard13,shard23,config}
运行mongod
每台机器启动两个mongod,分别在27021和27022端口,直接用脚本,因为都类似就贴一个
# 脚本
/opt/mongodb/bin/mongod -shardsvr -replSet shard1 -port 27021 -dbpath /data/mongodb/db/shard11 -oplogSize 1000 -logpath /data/mongodb/logs/shard11.log -logappend --maxConns 10000 --quiet -fork --directoryperdb
sleep 2
/opt/mongodb/bin/mongod -shardsvr -replSet shard2 -port 27022 -dbpath /data/mongodb/db/shard21 -oplogSize 1000 -logpath /data/mongodb/logs/shard21.log -logappend --maxConns 10000 --quiet -fork --directoryperdb
sleep 2
ps aux | grep mongo
配置出两个replicate set(Shard Server)
上面启动的6个mongod分两组配置
第一组:
[root@kevin~]# mongo 172.17.10.227:27021
> config = {_id: 'shard1', members: [
{_id: 0, host: '172.17.10.227:27021'},
{_id: 1, host: '172.17.10.228:27021'},
{_id: 2, host: '172.17.10.229:27021'}]
}
> rs.initiate(config)
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
# 则成功
『>』 马上变为 『shard1:PRIMARY>』
此时执行:
shard1:PRIMARY> rs.status()
{
"set" : "shard1",
"date" : ISODate("2016-07-21T17:21:10Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "172.17.10.227:27021",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 286905,
"optime" : Timestamp(1469121563, 170),
"optimeDate" : ISODate("2016-07-21T17:19:23Z"),
"electionTime" : Timestamp(1468837010, 1),
"electionDate" : ISODate("2016-07-18T10:16:50Z"),
"self" : true
},
{
"_id" : 1,
"name" : "172.17.10.228:27021",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 284670,
"optime" : Timestamp(1469121563, 170),
"optimeDate" : ISODate("2016-07-21T17:19:23Z"),
"lastHeartbeat" : ISODate("2016-07-21T17:21:10Z"),
"lastHeartbeatRecv" : ISODate("2016-07-21T17:21:10Z"),
"pingMs" : 0,
"syncingTo" : "172.17.10.227:27021"
},
{
"_id" : 2,
"name" : "172.17.10.229:27021",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 284668,
"optime" : Timestamp(1469121563, 170),
"optimeDate" : ISODate("2016-07-21T17:19:23Z"),
"lastHeartbeat" : ISODate("2016-07-21T17:21:10Z"),
"lastHeartbeatRecv" : ISODate("2016-07-21T17:21:10Z"),
"pingMs" : 0,
"lastHeartbeatMessage" : "syncing to: 172.17.10.227:27021",
"syncingTo" : "172.17.10.227:27021"
}
],
"ok" : 1
}
第二组类似:略
配置三台配置服务器(config server)
/opt/mongodb/bin/mongod --configsvr --dbpath /data/mongodb/db/config --port 20000 --logpath /data/mongodb/logs/config.log --logappend --fork --directoryperdb
配置mongos(路由进程)
因为rs的特性,可以决策并切换primary,所以需要一个router来统一访问入口,当然也可以启动多个mongos
/opt/mongodb/bin/mongos -configdb 172.17.10.227:20000,172.17.10.228:20000,172.17.10.229:20000 -port 30000 -chunkSize 50 -logpath /data0/mongodb/logs/mongos.log -logappend -fork
如上20000端口是config server,所以路由进程必须在config server进程都成功启动的状态下才可以启动到30000端口
配置shared集群
连接路由
[root@kevin ~]# mongo 172.17.10.227:30000/admin
加入shards
mongos> db.runCommand({ addshard : "shard1/172.17.10.227:27021,172.17.10.228:27021,172.17.10.229:27021",name:"shard1",maxSize:20480})
{ "shardAdded" : "shard1", "ok" : 1 }
mongos> db.runCommand({ addshard : "shard2/172.17.10.227:27022,172.17.10.228:27022,172.17.10.229:27022",name:"shard2",maxSize:20480})
{ "shardAdded" : "shard2", "ok" : 1 }
上张图:
shards已经配置成功。
如果primary挂了,其它两个节点中某个会成为主节点,mongos会自动连接到主节点。