1.集群安装,一个shard、三个配置服务器、一个副本集(一个主节点、一个备节点和一个仲裁节点),这里用端口来实现节点。
1).启动副本集各节点(需要注意目录)//启动主节点
./mongod --shardsvr --replSet shard1 --port 18010 --oplogSize 100 \
--dbpath /usr/local/mongodb/shardserver1/shard1/replcaset1/master \
--logpath /usr/local/mongodb/shardserver1/shard1/replcaset1/master/log/master.log \
--logappend --fork --rest
//启动备节点(我的磁盘空间不够了,使用--smallfiles参数,下面一样)
./mongod --smallfiles --shardsvr --replSet shard1 --port 18011 --oplogSize 100 \
--dbpath /usr/local/mongodb/shardserver1/shard1/replcaset1/slaver \
--logpath /usr/local/mongodb/shardserver1/shard1/replcaset1/slaver/log/slaver.log \
--logappend --fork --rest
//启动仲裁节点
./mongod --smallfiles --shardsvr --replSet shard1 --port 18012 --oplogSize 100 \
--dbpath /usr/local/mongodb/shardserver1/shard1/replcaset1/arbiter \
--logpath /usr/local/mongodb/shardserver1/shard1/replcaset1/arbiter/log/arbiter.log \
--logappend --fork --rest
2).登陆主节点
./mongo admin -port 18010
3).初始化
//部署副本集,优先级(这里priority:2最高)最高的为主节点,仲裁节点中arbiterOnly设为true,不然贮备模式不生效。
config_shard1={_id:"shard1",members:[{_id:0,host:"127.0.0.1:18010",priority:2},{_id:1,host:"127.0.0.1:18011",priority:1},{_id:2,host:"127.0.0.1:18012",arbiterOnly:true}]}
//使上面的配置生效。
rs.initiate(config_shard1);
//也可以下面这样初始化,初始化备节点
rs.add("127.0.0.1:18011")
//初始化仲裁节点
rs.addArb("127.0.0.1:18012")
//查看部署结果
rs.conf()
4).启动配置服务器(这里我配了三个服务器,一般测试环境一个,生产环境三个,同样注意目录)
./mongod --configsvr --dbpath /usr/local/mongodb/configserver/set1 \
--port 40000 --logpath /usr/local/mongodb/configserver/set1/config.log \
--logappend -fork --rest
./mongod --configsvr --dbpath /usr/local/mongodb/configserver/set2 \
--port 40001 --logpath /usr/local/mongodb/configserver/set2/config.log \
--logappend -fork --rest
./mongod --configsvr --dbpath /usr/local/mongodb/configserver/set3 \
--port 40002 --logpath /usr/local/mongodb/configserver/set3/config.log \
--logappend -fork --rest
5).启动路由服务器
./mongos --configdb 127.0.0.1:40000,127.0.0.1:40001,127.0.0.1:40002 --port 50000 --chunkSize 5 \
--logpath /usr/local/mongodb/log/route.log --logappend --fork
6).添加数据库的用户名和密码
//连接mongos
./mongo admin -port 50000
//添加用户
db.addUser("admin","admin")
//使用admin
use admin
//添加shard
db.runCommand({addshard:"shard1/127.0.0.1:18010"})
//db.runCommand({addshard:"shard2/127.0.0.1:18030"})
//列出shard个数
db.runCommand({listshards:1})
//创建库
db.runCommand({enablesharding:"test_demo"})
//使用test_demo.student表来做分片,片键为id,唯一
db.runCommand({shardcollection:"test_demo.student",key:{"_id":1},unique:true})
//查看配置结果:
printShardingStatus();
--- Sharding Status ---
sharding version: {
"_id" : 1,
"version" : 3,
"minCompatibleVersion" : 3,
"currentVersion" : 4,
"clusterId" : ObjectId("589c0e39c86fed5bc778e1ad")
}
shards:
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
2.
1).mongodb正常关闭:kill -2 50000或者use admin ,db.shutdownServer();
2).集群:use admin,db.adminCommand({shutdown:1,force:true}) 或者 db.shutdownServer({force:true});
3).集群指定时间关闭:use admin,db.adminCommand({shutdown:1,force:true,timeoutsec:5}) 或者 db.shutdownServer({force:true,timeoutsec:5});
3.
mongodb启动时出现以下错误:
about to fork child process, waiting until server is ready for connections.
forked process: 134148
all output going to: /usr/local/mongodb/shardserver1/shard1/replcaset1/arbiter/log/arbiter.log
ERROR: child process failed, exited with error number 100
刚开始一直以为mongodb非正常关闭导致,后来发现不是这个原因。
日志查看:
一定要看日志,log/日志文件.
查看日志文件如下:
Thu Feb 9 00:37:52.502 [initandlisten] MongoDB starting : pid=134148 port=18012 dbpath=/usr/local/mongodb/shardserver1/shard1/replcaset1/arbiter 64-bit host=test_node2
Thu Feb 9 00:37:52.503 [initandlisten] db version v2.4.9
Thu Feb 9 00:37:52.503 [initandlisten] git version: 52fe0d21959e32a5bdbecdc62057db386e4e029c
Thu Feb 9 00:37:52.503 [initandlisten] build info: Linux ip-10-2-29-40 2.6.21.7-2.ec2.v1.2.fc8xen #1 SMP Fri Nov 20 17:48:28 EST 2009 x86_64 BOOST_LIB_VERSION=1_49
Thu Feb 9 00:37:52.503 [initandlisten] allocator: tcmalloc
Thu Feb 9 00:37:52.503 [initandlisten] options: { dbpath: "/usr/local/mongodb/shardserver1/shard1/replcaset1/arbiter", fork: true, logappend: true, logpath: "/usr/local/mongodb/shardserver1/shard1/replcaset1/arbiter/log/arbiter.log", oplogSize: 100, port:
18012, replSet: "shard1", rest: true, shardsvr: true }
Thu Feb 9 00:37:52.513 [initandlisten] journal dir=/usr/local/mongodb/shardserver1/shard1/replcaset1/arbiter/journal
Thu Feb 9 00:37:52.513 [initandlisten] recover : no journal files present, no recovery needed
Thu Feb 9 00:37:52.513 [initandlisten]
Thu Feb 9 00:37:52.513 [initandlisten] ERROR: Insufficient free space for journal files
Thu Feb 9 00:37:52.513 [initandlisten] Please make at least 3379MB available in /usr/local/mongodb/shardserver1/shard1/replcaset1/arbiter/journal or use --smallfiles
Thu Feb 9 00:37:52.513 [initandlisten]
Thu Feb 9 00:37:52.513 [initandlisten] exception in initAndListen: 15926 Insufficient free space for journals, terminating
Thu Feb 9 00:37:52.513 dbexit:
Thu Feb 9 00:37:52.513 [initandlisten] shutdown: going to close listening sockets...
Thu Feb 9 00:37:52.513 [initandlisten] shutdown: going to flush diaglog...
Thu Feb 9 00:37:52.513 [initandlisten] shutdown: going to close sockets...
Thu Feb 9 00:37:52.513 [initandlisten] shutdown: waiting for fs preallocator...
Thu Feb 9 00:37:52.513 [initandlisten] shutdown: lock for final commit...
Thu Feb 9 00:37:52.513 [initandlisten] shutdown: final commit...
Thu Feb 9 00:37:52.513 [initandlisten] shutdown: closing all files...
Thu Feb 9 00:37:52.513 [initandlisten] closeAllFiles() finished
Thu Feb 9 00:37:52.513 [initandlisten] journalCleanup...
Thu Feb 9 00:37:52.513 [initandlisten] removeJournalFiles
Thu Feb 9 00:37:52.514 [initandlisten] shutdown: removing fs lock...
Thu Feb 9 00:37:52.514 dbexit: really exiting now
导致的原因:journal至少以2G的数量进行增长,我这边是磁盘不够用报的错。
解决方法:./mongod --smallfiles 带这个参数就可以。