1、先在shard1上准备数据
库:ysdb1
集合:c1
数据:db.c1.save({x:1});……db.c1.save({x:4});
[mongodb@hch_test_dbm1_121_62 mongodb]$ /usr/local/mongodb-linux-x86_64-3.0.3/bin/mongo mongodb1:37027/admin MongoDB shell version: 3.0.3 connecting to: mongodb1:37027/admin Server has startup warnings: 2016-07-11T14:38:24.351+0800 I CONTROL [initandlisten] 2016-07-11T14:38:24.351+0800 I CONTROL [initandlisten] ** WARNING: You are running on a NUMA machine. 2016-07-11T14:38:24.351+0800 I CONTROL [initandlisten] ** We suggest launching mongod like this to avoid performance problems: 2016-07-11T14:38:24.351+0800 I CONTROL [initandlisten] ** numactl --interleave=all mongod [other options] 2016-07-11T14:38:24.351+0800 I CONTROL [initandlisten] 2016-07-11T14:38:24.351+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 2016-07-11T14:38:24.351+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2016-07-11T14:38:24.351+0800 I CONTROL [initandlisten] 2016-07-11T14:38:24.352+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 2016-07-11T14:38:24.352+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2016-07-11T14:38:24.352+0800 I CONTROL [initandlisten] shard1:PRIMARY> shard1:PRIMARY> shard1:PRIMARY> use ysdb1; switched to db ysdb1 shard1:PRIMARY> db.c1.save({x:1}); WriteResult({ "nInserted" : 1 }) shard1:PRIMARY> db.c1.save({x:2}); WriteResult({ "nInserted" : 1 }) shard1:PRIMARY> db.c1.save({x:3}); WriteResult({ "nInserted" : 1 }) shard1:PRIMARY> db.c1.save({x:4}); WriteResult({ "nInserted" : 1 }) shard1:PRIMARY> |
2、去mongos上check新建的库集合
[mongodb@hch_test_dbm1_121_63 ~]$ /usr/local/mongodb-linux-x86_64-3.0.3/bin/mongo mongodb1:40000 MongoDB shell version: 3.0.3 connecting to: mongodb1:40000/test mongos> show dbs; admin (empty) bg 0.078GB config 0.016GB ysdb1 0.078GB # 库存在 mongos> use ysdb1; switched to db ysdb1 mongos> db.c1.find(); mongos> show tables; # 表不存在,也就意味着mongos severs默认连接的不是shard1而是shard2 mongos> |
PS:看来需要在mongodb上mongos上面录入测试数据,然后在shard2上面做主备切换,看mongos客户端上是否能正常连接使用。
3、在mongos servers上录入数据
[mongodb@hch_test_dbm1_121_63 ~]$ /usr/local/mongodb-linux-x86_64-3.0.3/bin/mongo mongodb1:40000 MongoDB shell version: 3.0.3 connecting to: mongodb1:40000/test mongos> use ysdb1; switched to db ysdb1 mongos> show dbs; admin (empty) bg 0.078GB config 0.016GB ysdb1 0.078GB mongos> show tables; mongos> db.c1.save({x:5}); WriteResult({ "nInserted" : 1 }) mongos> db.c1.save({x:6}); WriteResult({ "nInserted" : 1 }) mongos> db.c1.save({x:7}); WriteResult({ "nInserted" : 1 }) mongos> mongos> db.c1.find(); { "_id" : ObjectId("5783542d549dd66d4ac66d52"), "x" : 5 } { "_id" : ObjectId("57835430549dd66d4ac66d53"), "x" : 6 } { "_id" : ObjectId("57835432549dd66d4ac66d54"), "x" : 7 } mongos> |
4、然后去shard2上进行主备切换操作
[mongodb@hch_test_dbm1_121_62 mongodb]$ /usr/local/mongodb-linux-x86_64-3.0.3/bin/mongo mongodb1:37028/admin MongoDB shell version: 3.0.3 connecting to: mongodb1:37028/admin Server has startup warnings: 2016-07-09T19:08:58.250+0800 I CONTROL [initandlisten] 2016-07-09T19:08:58.250+0800 I CONTROL [initandlisten] ** WARNING: You are running on a NUMA machine. 2016-07-09T19:08:58.250+0800 I CONTROL [initandlisten] ** We suggest launching mongod like this to avoid performance problems: 2016-07-09T19:08:58.250+0800 I CONTROL [initandlisten] ** numactl --interleave=all mongod [other options] 2016-07-09T19:08:58.251+0800 I CONTROL [initandlisten] 2016-07-09T19:08:58.251+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 2016-07-09T19:08:58.251+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2016-07-09T19:08:58.251+0800 I CONTROL [initandlisten] 2016-07-09T19:08:58.251+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 2016-07-09T19:08:58.251+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2016-07-09T19:08:58.251+0800 I CONTROL [initandlisten] shard2:PRIMARY> use ysdb1; switched to db ysdb1 shard2:PRIMARY> db.c1.find(); { "_id" : ObjectId("5783542d549dd66d4ac66d52"), "x" : 5 } { "_id" : ObjectId("57835430549dd66d4ac66d53"), "x" : 6 } { "_id" : ObjectId("57835432549dd66d4ac66d54"), "x" : 7 } shard2:PRIMARY> shard2:PRIMARY> rs.stepDown(); 2016-07-11T16:11:30.274+0800 I NETWORK DBClientCursor::init call() failed 2016-07-11T16:11:30.281+0800 E QUERY Error: error doing query: failed at DBQuery._exec (src/mongo/shell/query.js:83:36) at DBQuery.hasNext (src/mongo/shell/query.js:240:10) at DBCollection.findOne (src/mongo/shell/collection.js:187:19) at DB.runCommand (src/mongo/shell/db.js:58:41) at DB.adminCommand (src/mongo/shell/db.js:66:41) at Function.rs.stepDown (src/mongo/shell/utils.js:1006:15) at (shell):1:4 at src/mongo/shell/query.js:83 2016-07-11T16:11:30.283+0800 I NETWORK trying reconnect to mongodb1:37028 (192.168.121.62) failed 2016-07-11T16:11:30.283+0800 I NETWORK reconnect mongodb1:37028 (192.168.121.62) ok shard2:SECONDARY> |
5、然后再去mongos客户端上进行数据变更
在原来打开的mongos上进行操作,录入一条新的数据db.c1.save({x:8});:然后回车执行,发现执行成功,也就是意味着shard2上的主备切换基本不影响客户端对集群的正常操作。
mongos> db.c1.save({x:8}); WriteResult({ "nInserted" : 1 }) mongos> db.c1.find(); { "_id" : ObjectId("5783542d549dd66d4ac66d52"), "x" : 5 } { "_id" : ObjectId("57835430549dd66d4ac66d53"), "x" : 6 } { "_id" : ObjectId("57835432549dd66d4ac66d54"), "x" : 7 } { "_id" : ObjectId("578354a1549dd66d4ac66d55"), "x" : 8 } mongos> |
6、去shar1和shard2上验证新录入的数据
然后去验证mongos上的操作是否已经准确录入到了shard2分片上。
[mongodb@hch_test_dbm1_121_62 mongodb]$ /usr/local/mongodb-linux-x86_64-3.0.3/bin/mongo mongodb1:37028/ysdb1 MongoDB shell version: 3.0.3 connecting to: mongodb1:37028/ysdb1 Server has startup warnings: 2016-07-09T19:08:58.250+0800 I CONTROL [initandlisten] 2016-07-09T19:08:58.250+0800 I CONTROL [initandlisten] ** WARNING: You are running on a NUMA machine. 2016-07-09T19:08:58.250+0800 I CONTROL [initandlisten] ** We suggest launching mongod like this to avoid performance problems: 2016-07-09T19:08:58.250+0800 I CONTROL [initandlisten] ** numactl --interleave=all mongod [other options] 2016-07-09T19:08:58.251+0800 I CONTROL [initandlisten] 2016-07-09T19:08:58.251+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 2016-07-09T19:08:58.251+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2016-07-09T19:08:58.251+0800 I CONTROL [initandlisten] 2016-07-09T19:08:58.251+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 2016-07-09T19:08:58.251+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2016-07-09T19:08:58.251+0800 I CONTROL [initandlisten] shard2:PRIMARY> db.c1.find(); { "_id" : ObjectId("5783542d549dd66d4ac66d52"), "x" : 5 } { "_id" : ObjectId("57835430549dd66d4ac66d53"), "x" : 6 } { "_id" : ObjectId("57835432549dd66d4ac66d54"), "x" : 7 } { "_id" : ObjectId("578354a1549dd66d4ac66d55"), "x" : 8 } shard2:PRIMARY> # 看到了shard2上有新添加的x:8这条数据,表示数据已经录入进来。 |
然后去shard1上查看数据,则没有记录:
[mongodb@hch_test_dbm1_121_62 mongodb]$ /usr/local/mongodb-linux-x86_64-3.0.3/bin/mongo mongodb1:37027/ysdb1 MongoDB shell version: 3.0.3 connecting to: mongodb1:37027/ysdb1 Server has startup warnings: 2016-07-11T14:38:24.351+0800 I CONTROL [initandlisten] 2016-07-11T14:38:24.351+0800 I CONTROL [initandlisten] ** WARNING: You are running on a NUMA machine. 2016-07-11T14:38:24.351+0800 I CONTROL [initandlisten] ** We suggest launching mongod like this to avoid performance problems: 2016-07-11T14:38:24.351+0800 I CONTROL [initandlisten] ** numactl --interleave=all mongod [other options] 2016-07-11T14:38:24.351+0800 I CONTROL [initandlisten] 2016-07-11T14:38:24.351+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 2016-07-11T14:38:24.351+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2016-07-11T14:38:24.351+0800 I CONTROL [initandlisten] 2016-07-11T14:38:24.352+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 2016-07-11T14:38:24.352+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2016-07-11T14:38:24.352+0800 I CONTROL [initandlisten] shard1:PRIMARY> db.c1.find(); { "_id" : ObjectId("578352598ffbf6368275706d"), "x" : 1 } { "_id" : ObjectId("5783525b8ffbf6368275706e"), "x" : 2 } { "_id" : ObjectId("5783525d8ffbf6368275706f"), "x" : 3 } { "_id" : ObjectId("578352618ffbf63682757070"), "x" : 4 } shard1:PRIMARY> |
7、分片主备切换操作记录总结
结论:当分片shard2进行主备切换时,对外面连接集群的mongos客户端来说,是透明的,是无影响的。这也就意味着,mongodb分片集群底层的主备故障切换不影响业务应用程序的正常使用,这对于高可用是非常有效的。