Get the App
SLTechnology News&Howtos  ›  Database  › 

57-4 Database slicing concept and implementation of mongodb sharding

Shulou Source: shulou.com Published: 2022-06-01 12:22:59 11月13日 Update

The concept of 04 database slicing and the implementation of mongodb sharding

Configure the environment:

Node1: 192.168.1.121 CentOS release 6.7

Node2: 192.168.1.122 CentOS release 6.7

Node3: 192.168.1.123 CentOS release 6.7

[root@node1 ~] # vim / etc/hosts

Add

192.168.1.121 node1

192.168.1.122 node2

192.168.1.123 node3

[root@node1 ~] # scp / etc/hosts node2:/etc

[root@node1 ~] # scp / etc/hosts node3:/etc

[root@node1 ~] # service mongod stop

[root@node1 ~] # vim / etc/mongod.conf

Modify

# replSet=setname

For

ReplSet=testSet

ReplIndexPrefetch=_id_only

[root@node1 ~] # service mongod start

[root@node1 ~] # mongo

MongoDB shell version: 2.6.4

Connecting to: test

> show dbs

Admin (empty)

Local 0.078GB

Testdb 0.078GB

> use local

Switched to db local

> show collections

Startup_log

System.indexes

> exit

Bye

[root@node1 mongodb-2.6.4] # scp mongodb-org-server-2.6.4-1.x86_64.rpm mongodb-org-tools-2.6.4-1.x86_64.rpm mongodb-org-shell-2.6.4-1.x86_64.rpm node2:/root

[root@node1 mongodb-2.6.4] # scp mongodb-org-server-2.6.4-1.x86_64.rpm mongodb-org-tools-2.6.4-1.x86_64.rpm mongodb-org-shell-2.6.4-1.x86_64.rpm node3:/root

[root@node2] # yum-y install * rpm

[root@node2] # mkdir-p / mongodb/data

[root@node2] # chown-R mongod.mongod / mongodb/

[root@node3] # yum-y install * rpm

[root@node3] # mkdir-p / mongodb/data

[root@node3] # chown-R mongod.mongod / mongodb/

[root@node1 ~] # scp / etc/mongod.conf node2:/etc/

[root@node1 ~] # scp / etc/mongod.conf node3:/etc/

[root@node2 ~] # service mongod start

[root@node3 ~] # service mongod start

[root@node1 ~] # mongo

MongoDB shell version: 2.6.4

Connecting to: test

> rs.status ()

{

"startupStatus": 3

"info": "run rs.initiate (...) if not yet done for the set"

"ok": 0

"errmsg": "can't get local.system.replset config from self or any seed (EMPTYCONFIG)"

}

> rs.initiate ()

{

"info2": "no configuration explicitly specified-making one"

"me": "node1:27017"

Info: "Config now saved locally. Should come online in about a minute."

"ok": 1

}

> rs.status ()

{

"set": "testSet"

Date: ISODate ("2017-01-08T14:33:14Z")

"myState": 1

"members": [

{

"_ id": 0

"name": "node1:27017"

"health": 1

"state": 1

"stateStr": "PRIMARY"

"uptime": 1316

Optime: Timestamp (1483885955, 1)

OptimeDate: ISODate ("2017-01-08T14:32:35Z")

ElectionTime: Timestamp (1483885956, 1)

ElectionDate: ISODate ("2017-01-08T14:32:36Z")

"self": true

}

]

"ok": 1

}

# add Node

TestSet:PRIMARY > rs.add ("192.168.1.122")

{"ok": 1}

TestSet:PRIMARY > rs.status ()

{

"set": "testSet"

Date: ISODate ("2017-01-08T14:38:50Z")

"myState": 1

"members": [

{

"_ id": 0

"name": "node1:27017"

"health": 1

"state": 1

"stateStr": "PRIMARY"

"uptime": 1652

Optime: Timestamp (1483886304, 1)

OptimeDate: ISODate ("2017-01-08T14:38:24Z")

ElectionTime: Timestamp (1483885956, 1)

ElectionDate: ISODate ("2017-01-08T14:32:36Z")

"self": true

}

{

"_ id": 1

"name": "192.168.1.122 purl 27017"

"health": 1

"state": 2

"stateStr": "SECONDARY"

"uptime": 26

Optime: Timestamp (1483886304, 1)

OptimeDate: ISODate ("2017-01-08T14:38:24Z")

LastHeartbeat: ISODate ("2017-01-08T14:38:48Z")

LastHeartbeatRecv: ISODate ("2017-01-08T14:38:48Z")

"pingMs": 1

"syncingTo": "node1:27017"

}

]

"ok": 1

}

[root@node2 ~] # mongo

MongoDB shell version: 2.6.4

Connecting to: test

Welcome to the MongoDB shell.

For interactive help, type "help".

For more comprehensive documentation, see

Http://docs.mongodb.org/

Questions? Try the support group

Http://groups.google.com/group/mongodb-user

TestSet:SECONDARY > show dbs

Admin (empty)

Local 1.078GB

Testdb 0.078GB

TestSet:SECONDARY > use testdb

Switched to db testdb

TestSet:SECONDARY > rs.slaveOk ()

TestSet:SECONDARY > rs.status ()

{

"set": "testSet"

Date: ISODate ("2017-01-09T12:02:14Z")

"myState": 2

"syncingTo": "node1:27017"

"members": [

{

"_ id": 0

"name": "node1:27017"

"health": 1

"state": 1

"stateStr": "PRIMARY"

"uptime": 77028

Optime: Timestamp (1483886304, 1)

OptimeDate: ISODate ("2017-01-08T14:38:24Z")

LastHeartbeat: ISODate ("2017-01-09T12:02:13Z")

LastHeartbeatRecv: ISODate ("2017-01-09T12:02:13Z")

"pingMs": 1

ElectionTime: Timestamp (1483885956, 1)

ElectionDate: ISODate ("2017-01-08T14:32:36Z")

}

{

"_ id": 1

"name": "192.168.1.122 purl 27017"

"health": 1

"state": 2

"stateStr": "SECONDARY"

"uptime": 77851

Optime: Timestamp (1483886304, 1)

OptimeDate: ISODate ("2017-01-08T14:38:24Z")

"self": true

}

]

"ok": 1

}

TestSet:SECONDARY > rs.isMaster ()

{

"setName": "testSet"

"setVersion": 2

"ismaster": false

"secondary": true

"hosts": [

"192.168.1.122purl 27017"

"node1:27017"

]

"primary": "node1:27017"

"me": "192.168.1.122 purl 27017"

"maxBsonObjectSize": 16777216

"maxMessageSizeBytes": 48000000

"maxWriteBatchSize": 1000

LocalTime: ISODate ("2017-01-09T12:03:59.702Z")

"maxWireVersion": 2

"minWireVersion": 0

"ok": 1

}

TestSet:PRIMARY > rs.isMaster ()

{

"setName": "testSet"

"setVersion": 2

"ismaster": true

"secondary": false

"hosts": [

"node1:27017"

"192.168.1.122purl 27017"

]

"primary": "node1:27017"

"me": "node1:27017"

"maxBsonObjectSize": 16777216

"maxMessageSizeBytes": 48000000

"maxWriteBatchSize": 1000

LocalTime: ISODate ("2017-01-09T12:05:47.182Z")

"maxWireVersion": 2

"minWireVersion": 0

"ok": 1

}

# add new nodes

TestSet:PRIMARY > rs.add ("192.168.1.123")

{"ok": 1}

[root@node3 ~] # mongo

MongoDB shell version: 2.6.4

Connecting to: test

Welcome to the MongoDB shell.

For interactive help, type "help".

For more comprehensive documentation, see

Http://docs.mongodb.org/

Questions? Try the support group

Http://groups.google.com/group/mongodb-user

TestSet:SECONDARY > rs.slaveOk ()

TestSet:SECONDARY > rs.status ()

{

"set": "testSet"

Date: ISODate ("2017-01-09T12:10:20Z")

"myState": 2

"syncingTo": "node1:27017"

"members": [

{

"_ id": 0

"name": "node1:27017"

"health": 1

"state": 1

"stateStr": "PRIMARY"

"uptime": 78

Optime: Timestamp (1483963739, 1)

OptimeDate: ISODate ("2017-01-09T12:08:59Z")

LastHeartbeat: ISODate ("2017-01-09T12:10:18Z")

LastHeartbeatRecv: ISODate ("2017-01-09T12:10:19Z")

"pingMs": 1

ElectionTime: Timestamp (1483885956, 1)

ElectionDate: ISODate ("2017-01-08T14:32:36Z")

}

{

"_ id": 1

"name": "192.168.1.122 purl 27017"

"health": 1

"state": 2

"stateStr": "SECONDARY"

"uptime": 78

Optime: Timestamp (1483963739, 1)

OptimeDate: ISODate ("2017-01-09T12:08:59Z")

LastHeartbeat: ISODate ("2017-01-09T12:10:18Z")

LastHeartbeatRecv: ISODate ("2017-01-09T12:10:18Z")

"pingMs": 1

"syncingTo": "node1:27017"

}

{

"_ id": 2

"name": "192.168.1.123 purl 27017"

"health": 1

"state": 2

"stateStr": "SECONDARY"

"uptime": 78317

Optime: Timestamp (1483963739, 1)

OptimeDate: ISODate ("2017-01-09T12:08:59Z")

"self": true

}

]

"ok": 1

}

TestSet:SECONDARY > use testdb

Switched to db testdb

TestSet:SECONDARY > db.students.findOne ()

{"_ id": ObjectId ("5871e94113222f399a5240a3"), "name": "tom", "age": 23}

TestSet:SECONDARY > rs.conf ()

{

"_ id": "testSet"

"version": 3

"members": [

{

"_ id": 0

"host": "node1:27017"

}

{

"_ id": 1

"host": "192.168.1.122 purl 27017"

}

{

"_ id": 2

"host": "192.168.1.123 purl 27017"

}

]

}

TestSet:PRIMARY > use testdb

Switched to db testdb

TestSet:PRIMARY > db.classes.insert ({class: "One", nostu: 40})

WriteResult ({"nInserted": 1})

TestSet:PRIMARY > show collections

Classes

Students

System.indexes

TestSet:SECONDARY > db.classes.findOne ()

{

"_ id": ObjectId ("58737e8606a316aec46edfdc")

"class": "One"

"nostu": 40

}

TestSet:SECONDARY > db.classes.insert ({class: "Two", nostu: 50})

WriteResult ({"writeError": {"code": undefined, "errmsg": "not master"}})

TestSet:SECONDARY > rs.conf ()

{

"_ id": "testSet"

"version": 3

"members": [

{

"_ id": 0

"host": "node1:27017"

}

{

"_ id": 1

"host": "192.168.1.122 purl 27017"

}

{

"_ id": 2

"host": "192.168.1.123 purl 27017"

}

]

}

# make the master node "step down"

TestSet:PRIMARY > rs.stepDown ()

2017-01-09T20:23:48.978+0800 DBClientCursor::init call () failed

2017-01-09T20:23:48.980+0800 Error: error doing query: failed at src/mongo/shell/query.js:81

2017-01-09T20:23:48.982+0800 trying reconnect to 127.0.0.1 27017 (127.0.0.1) failed

2017-01-09T20:23:48.984+0800 reconnect 127.0.0.1 27017 (127.0.0.1) ok

TestSet:SECONDARY > rs.status ()

{

"set": "testSet"

Date: ISODate ("2017-01-09T12:24:27Z")

"myState": 2

"syncingTo": "192.168.1.123 purl 27017"

"members": [

{

"_ id": 0

"name": "node1:27017"

"health": 1

"state": 2

"stateStr": "SECONDARY"

"uptime": 79989

Optime: Timestamp (1483964038, 1)

OptimeDate: ISODate ("2017-01-09T12:13:58Z")

"infoMessage": "syncing to: 192.168.1.123pur27017"

"self": true

}

{

"_ id": 1

"name": "192.168.1.122 purl 27017"

"health": 1

"state": 2

"stateStr": "SECONDARY"

"uptime": 78363

Optime: Timestamp (1483964038, 1)

OptimeDate: ISODate ("2017-01-09T12:13:58Z")

LastHeartbeat: ISODate ("2017-01-09T12:24:25Z")

LastHeartbeatRecv: ISODate ("2017-01-09T12:24:25Z")

"pingMs": 1

"lastHeartbeatMessage": "syncing to: node1:27017"

"syncingTo": "node1:27017"

}

{

"_ id": 2

"name": "192.168.1.123 purl 27017"

"health": 1

"state": 1

"stateStr": "PRIMARY"

"uptime": 928

Optime: Timestamp (1483964038, 1)

OptimeDate: ISODate ("2017-01-09T12:13:58Z")

LastHeartbeat: ISODate ("2017-01-09T12:24:26Z")

LastHeartbeatRecv: ISODate ("2017-01-09T12:24:25Z")

"pingMs": 1

ElectionTime: Timestamp (1483964629, 1)

ElectionDate: ISODate ("2017-01-09T12:23:49Z")

}

]

"ok": 1

}

TestSet:PRIMARY > db.printReplicationInfo ()

Configured oplog size: 990MB

Log length start to end: 299secs (0.08hrs)

Oplog first event time: Mon Jan 09 2017 20:08:59 GMT+0800 (CST)

Oplog last event time: Mon Jan 09 2017 20:13:58 GMT+0800 (CST)

Now: Mon Jan 09 2017 20:27:20 GMT+0800 (CST)

TestSet:SECONDARY > db.printReplicationInfo ()

Configured oplog size: 990MB

Log length start to end: 77734secs (21.59hrs)

Oplog first event time: Sun Jan 08 2017 22:38:24 GMT+0800 (CST)

Oplog last event time: Mon Jan 09 2017 20:13:58 GMT+0800 (CST)

Now: Mon Jan 09 2017 20:28:01 GMT+0800 (CST)

TestSet:SECONDARY > rs.status ()

{

"set": "testSet"

Date: ISODate ("2017-01-09T12:29:38Z")

"myState": 2

"syncingTo": "node1:27017"

"members": [

{

"_ id": 0

"name": "node1:27017"

"health": 1

"state": 2

"stateStr": "SECONDARY"

"uptime": 78672

Optime: Timestamp (1483964038, 1)

OptimeDate: ISODate ("2017-01-09T12:13:58Z")

LastHeartbeat: ISODate ("2017-01-09T12:29:37Z")

LastHeartbeatRecv: ISODate ("2017-01-09T12:29:37Z")

"pingMs": 1

"syncingTo": "192.168.1.123 purl 27017"

}

{

"_ id": 1

"name": "192.168.1.122 purl 27017"

"health": 1

"state": 2

"stateStr": "SECONDARY"

"uptime": 79495

Optime: Timestamp (1483964038, 1)

OptimeDate: ISODate ("2017-01-09T12:13:58Z")

"self": true

}

{

"_ id": 2

"name": "192.168.1.123 purl 27017"

"health": 1

"state": 1

"stateStr": "PRIMARY"

"uptime": 1238

Optime: Timestamp (1483964038, 1)

OptimeDate: ISODate ("2017-01-09T12:13:58Z")

LastHeartbeat: ISODate ("2017-01-09T12:29:37Z")

LastHeartbeatRecv: ISODate ("2017-01-09T12:29:37Z")

"pingMs": 1

ElectionTime: Timestamp (1483964629, 1)

ElectionDate: ISODate ("2017-01-09T12:23:49Z")

}

]

"ok": 1

}

# node1 node offline

TestSet:SECONDARY > exit

Bye

[root@node1 ~] # service mongod stop

Stopping mongod: [OK]

# Save the configuration file to cfg (must be configured on the primary node)

TestSet:PRIMARY > cfg=rs.conf ()

{

"_ id": "testSet"

"version": 3

"members": [

{

"_ id": 0

"host": "node1:27017"

}

{

"_ id": 1

"host": "192.168.1.122 purl 27017"

}

{

"_ id": 2

"host": "192.168.1.123 purl 27017"

}

]

}

# set node priority

TestSet:PRIMARY > cfg.members [1] .priority = 2

two

# reread the cfg configuration file

TestSet:PRIMARY > rs.reconfig (cfg)

2017-01-09T21:08:58.403+0800 DBClientCursor::init call () failed

2017-01-09T21:08:58.404+0800 Error: error doing query: failed at src/mongo/shell/query.js:81

2017-01-09T21:08:58.406+0800 trying reconnect to 127.0.0.1 27017 (127.0.0.1) failed

2017-01-09T21:08:58.407+0800 reconnect 127.0.0.1 27017 (127.0.0.1) ok

TestSet:SECONDARY >

TestSet:SECONDARY > rs.status ()

{

"set": "testSet"

Date: ISODate ("2017-01-09T13:09:46Z")

"myState": 2

"syncingTo": "192.168.1.122 purl 27017"

"members": [

{

"_ id": 0

"name": "node1:27017"

"health": 1

"state": 2

"stateStr": "SECONDARY"

"uptime": 98

Optime: Timestamp (1483967288, 1)

OptimeDate: ISODate ("2017-01-09T13:08:08Z")

LastHeartbeat: ISODate ("2017-01-09T13:09:45Z")

LastHeartbeatRecv: ISODate ("2017-01-09T13:09:45Z")

"pingMs": 1

"lastHeartbeatMessage": "syncing to: 192.168.1.122pur27017"

"syncingTo": "192.168.1.122 purl 27017"

}

{

"_ id": 1

"name": "192.168.1.122 purl 27017"

"health": 1

"state": 1

"stateStr": "PRIMARY"

"uptime": 98

Optime: Timestamp (1483967288, 1)

OptimeDate: ISODate ("2017-01-09T13:08:08Z")

LastHeartbeat: ISODate ("2017-01-09T13:09:45Z")

LastHeartbeatRecv: ISODate ("2017-01-09T13:09:46Z")

"pingMs": 1

ElectionTime: Timestamp (1483967290, 1)

ElectionDate: ISODate ("2017-01-09T13:08:10Z")

}

{

"_ id": 2

"name": "192.168.1.123 purl 27017"

"health": 1

"state": 2

"stateStr": "SECONDARY"

"uptime": 81883

Optime: Timestamp (1483967288, 1)

OptimeDate: ISODate ("2017-01-09T13:08:08Z")

"infoMessage": "syncing to: 192.168.1.122pur27017"

"self": true

}

]

"ok": 1

}

TestSet:SECONDARY > rs.conf ()

{

"_ id": "testSet"

"version": 4

"members": [

{

"_ id": 0

"host": "node1:27017"

}

{

"_ id": 1

"host": "192.168.1.122 purl 27017"

"priority": 2

}

{

"_ id": 2

"host": "192.168.1.123 purl 27017"

}

]

}

TestSet:PRIMARY > cfg=rs.conf ()

{

"_ id": "testSet"

"version": 4

"members": [

{

"_ id": 0

"host": "node1:27017"

}

{

"_ id": 1

"host": "192.168.1.122 purl 27017"

"priority": 2

}

{

"_ id": 2

"host": "192.168.1.123 purl 27017"

}

]

}

TestSet:PRIMARY > cfg.members [2] .arbiterOnly = true

True

TestSet:PRIMARY > rs.reconfig (cfg)

{

"errmsg": "exception: arbiterOnly may not change for members"

"code": 13510

"ok": 0

}

TestSet:PRIMARY > rs.conf ()

{

"_ id": "testSet"

"version": 4

"members": [

{

"_ id": 0

"host": "node1:27017"

}

{

"_ id": 1

"host": "192.168.1.122 purl 27017"

"priority": 2

}

{

"_ id": 2

"host": "192.168.1.123 purl 27017"

}

]

}

TestSet:PRIMARY > rs.printSlaveReplicationInfo ()

Source: node1:27017

SyncedTo: Mon Jan 09 2017 21:08:08 GMT+0800 (CST)

0 secs (0 hrs) behind the primary

Source: 192.168.1.123:27017

SyncedTo: Mon Jan 09 2017 21:08:08 GMT+0800 (CST)

0 secs (0 hrs) behind the primary

[root@node1 ~] # service mongod stop

[root@node2 ~] # service mongod stop

[root@node1 ~] # rm-rf / mongodb/

[root@node2 ~] # rm-rf / mongodb/data/

[root@node3 ~] # rm-rf / mongodb/data/

[root@node3 ~] # scp * rpm node4:/root

[root@node4] # mkdir-p / mongodb/data

[root@node4] # yum-y install * rpm

[root@node4] # chown-R mongod.mongod / mongodb/

[root@node2 ~] # vim / etc/mongod.conf

Modify

ReplSet=testSet

ReplIndexPrefetch=_id_only

For

# replSet=testSet

# replIndexPrefetch=_id_only

Add

Dbpath=/mongodb/data

Configsvr=true

[root@node2] # install-o mongod-g mongod-d / mongodb/data

[root@node2 ~] # ls-ld / mongodb/data/

Drwxr-xr-x 2 mongod mongod 4096 Jan 9 22:13 / mongodb/data/

[root@node2 ~] # service mongod start

[root@node1 ~] # cd mongodb-2.6.4/

[root@node1 mongodb-2.6.4] # yum-y install mongodb-org-mongos-2.6.4-1.x86_64.rpm

[root@node2 ~] # service mongod stop

[root@node2 ~] # rm-rf / mongodb/data/*

[root@node2 ~] # service mongod start

[root@node1 mongodb-2.6.4] # mongos-configdb=192.168.1.122-fork

[root@node1 mongodb-2.6.4] # mongos-configdb=192.168.1.122-fork-logpath=/var/log/mongodb/mongod.log

2017-01-09T22:28:03.812+0800 warning: running with 1 config server should be done only for testing purposes and is not recommended for production

About to fork child process, waiting until server is ready for connections.

Forked process: 18397

Child process started successfully, parent exiting

[root@node1 mongodb-2.6.4] # mongo-- host 192.168.1.121

MongoDB shell version: 2.6.4

Connecting to: 192.168.1.121:27017/test

[root@node3] # install-o mongod-g mongod-d / mongodb/data

[root@node3 ~] # vim / etc/mongod.conf

Modify

ReplSet=testSet

ReplIndexPrefetch=_id_only

For

# replSet=testSet

# replIndexPrefetch=_id_only

[root@node3 ~] # service mongod start

[root@node4 ~] # vim / etc/mongod.conf

Modify

Dbpath=/var/lib/mongo

For

Dbpath=/mongodb/data

Modify

Bind_ip=127.0.0.1

For

# bind_ip=127.0.0.1

[root@node4 ~] # service mongod start

Mongos > sh.addShard ("192.168.1.122")

{

"ok": 0

"errmsg": "couldn't connect to new shard socket exception [CONNECT_ERROR] for 192.168.1.122 purl 27017"

}

Mongos > sh.status ()

-Sharding Status

Sharding version: {

"_ id": 1

"version": 4

"minCompatibleVersion": 4

"currentVersion": 5

"clusterId": ObjectId ("58739d7487c21f53b917098b")

}

Shards:

Databases:

{"_ id": "admin", "partitioned": false, "primary": "config"}

Mongos > sh.addShard ("192.168.1.123")

{

"ok": 0

"errmsg": "host is part of set testSet, use replica set url format /,...."

}

100DU 33 (91411)

Tags: Node configuration file data database offline priority environment node Apple Docker Huawei Linux macOS MariaDB Microsoft MySQL NVidia OPPO Reno Microsoft Shulou Technology vpn Shulou Tech Info MariaDB