mongodb 分片底层的主备切换是否会影响分片集群对外服务的详细剖析

来源:互联网 发布:linux下载命令sz 编辑:程序博客网 时间:2024/06/01 10:29



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、去mongoscheck新建的库集合

 

[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:看来需要在mongodbmongos上面录入测试数据,然后在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、去shar1shard2上验证新录入的数据

然后去验证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分片集群底层的主备故障切换不影响业务应用程序的正常使用,这对于高可用是非常有效的。

3 0