热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

部署MongoDB高可用ReplicaSet集群架构

ReplicaSet使用的是n个mongod节点,构建具备自动的容错功能(auto-failover),自动恢复的(auto-recovery)的高可用方案。使用ReplicaSet来实现读写分离。通过在连接时指定或者在主库指定slaveOk,由Secondary来分担读的压力,Primary只承担写操作。对于Repl

Replica Set使用的是n个mongod节点,构建具备自动的容错功能(auto-failover),自动恢复的(auto-recovery)的高可用方案。

使用Replica Set来实现读写分离。通过在连接时指定或者在主库指定slaveOk,由Secondary来分担读的压力,Primary只承担写操作。

对于Replica Set中的secondary 节点默认是不可读的。 

架构图:

分别在各服务器上运行两个mongod实例: 

shard11 + shard12 + shard13 ----> 组成一个replica set --|

   |-----> sharding_cluster

shard21 + shard22 + shard23 ----> 组成一个replica set --|

Shard Server: 用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个relica set承担,防止主机单点故障!

Config Server: 存储了整个 Cluster Metadata,其中包括 chunk 信息!

Route Server: 前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。

一、安装配置mongodb环境

1.安装

wget http: 

tar zxf mongodb-linux-x86_64-2.0.4.tgz 

mv mongodb-linux-x86_64-2.0.4 /opt/mongodb 

echo "export PATH=$PATH:/opt/mongodb/bin" >> /etc/profile 

source /etc/profile 

2.建立用户和组

useradd -u 600 -s /bin/false mongodb  

3.创建数据目录

在各服务器上建立如下目录:

30服务器: 

mkdir -p /data0/mongodb/{db,logs} 

mkdir -p /data0/mongodb/db/{shard11,shard21,config} 

31服务器: 

mkdir -p /data0/mongodb/{db,logs} 

mkdir -p /data0/mongodb/db/{shard12,shard22,config} 

32服务器: 

mkdir -p /data0/mongodb/{db,logs} 

mkdir -p /data0/mongodb/db/{shard13,shard23,config} 

4.设置各节点服务器hosts解析

true > /etc/hosts  

echo -ne " 

192.168.8.30     mong01  

192.168.8.31     mong02 

192.168.8.32     mong03 

" >>/etc/hosts 

或 

cat >> /etc/hosts << EOF 

192.168.8.30     mong01  

192.168.8.31     mong02 

192.168.8.32     mong03 

EOF 

5.同步时钟

ntpdate ntp.api.bz

写到crontab任务计划中!

这里务必要同步时钟,不然shrad不能同步!

以上配置各节点都进行操作!!

二、配置relica sets

1.配置两个shard

30 server: 

/opt/mongodb/bin/mongod -shardsvr -replSet shard1 -port 27021 -dbpath /data0/mongodb/db/shard11 -oplogSize 1000 -logpath /data0/mongodb/logs/shard11.log -logappend  --maxConns 10000 --quiet -fork --directoryperdb 

sleep 2 

/opt/mongodb/bin/mongod -shardsvr -replSet shard2 -port 27022 -dbpath /data0/mongodb/db/shard21 -oplogSize 1000 -logpath /data0/mongodb/logs/shard21.log -logappend  --maxConns 10000 --quiet -fork --directoryperdb

sleep 2 

echo "all mongo started." 

31 server: 

/opt/mongodb/bin/mongod -shardsvr -replSet shard1 -port 27021 -dbpath /data0/mongodb/db/shard12 -oplogSize 1000 -logpath /data0/mongodb/logs/shard12.log -logappend  --maxConns 10000 --quiet -fork --directoryperdb

sleep 2 

numactl --interleave=all /opt/mongodb/bin/mongod -shardsvr -replSet shard2 -port 27022 -dbpath /data0/mongodb/db/shard22 -oplogSize 1000 -logpath /data0/mongodb/logs/shard22.log -logappend  --maxConns 10000 --quiet -fork --directoryperdb

sleep 2 

echo "all mongo started." 

32 server: 

numactl --interleave=all /opt/mongodb/bin/mongod -shardsvr -replSet shard1 -port 27021 -dbpath /data0/mongodb/db/shard13 -oplogSize 1000 -logpath /data0/mongodb/logs/shard13.log -logappend  --maxConns 10000 --quiet -fork --directoryperdb 

sleep 2 

numactl --interleave=all /opt/mongodb/bin/mongod -shardsvr -replSet shard2 -port 27022 -dbpath /data0/mongodb/db/shard23 -oplogSize 1000 -logpath /data0/mongodb/logs/shard23.log -logappend  --maxConns 10000 --quiet -fork --directoryperdb  

sleep 2 

echo "all mongo started." 

可以对应的把上面的命令放在一个脚本内,方便启动!

也可以写到配置文件中,通过-f参数来启动!

改成配置文件方式:

shardsvr = true 

replSet = shard1 

port = 27021 

dbpath = /data0/mongodb/db/shard11 

oplogSize = 1000 

logpath = /data0/mongodb/logs/shard11.log 

logappend = true 

maxConns = 10000 

quit=true 

profile = 1 

slowms = 5 

rest = true 

fork = true 

directoryperdb = true 

这样可以通过 mognod -f mongodb.conf来启动了!

我这里把这些命令都放入脚本中:

启动脚本(这里只启动mongod,后面有专门启动config和mongos脚本):

[root@mon1 sh]# cat start.sh  

/opt/mongodb/bin/mongod -shardsvr -replSet shard1 -port 27021 -dbpath /data0/mongodb/db/shard11 -oplogSize 1000 -logpath /data0/mongodb/logs/shard11.log -logappend  --maxConns 10000 --quiet -fork --directoryperdb 

sleep 2 

/opt/mongodb/bin/mongod -shardsvr -replSet shard2 -port 27022 -dbpath /data0/mongodb/db/shard21 -oplogSize 1000 -logpath /data0/mongodb/logs/shard21.log -logappend  --maxConns 10000 --quiet -fork --directoryperdb 

sleep 2 

ps aux |grep mongo 

echo "all mongo started." 

[root@mon2 sh]# cat start.sh  

/opt/mongodb/bin/mongod -shardsvr -replSet shard1 -port 27021 -dbpath /data0/mongodb/db/shard12 -oplogSize 1000 -logpath /data0/mongodb/logs/shard12.log -logappend  --maxConns 10000 --quiet -fork --directoryperdb   

sleep 2 

/opt/mongodb/bin/mongod -shardsvr -replSet shard2 -port 27022 -dbpath /data0/mongodb/db/shard22 -oplogSize 1000 -logpath /data0/mongodb/logs/shard22.log -logappend  --maxConns 10000 --quiet -fork --directoryperdb   

sleep 2 

ps aux |grep mongo 

echo "all mongo started." 

[root@mongo03 sh]# cat start.sh  

/opt/mongodb/bin/mongod -shardsvr -replSet shard1 -port 27021 -dbpath /data0/mongodb/db/shard11 -oplogSize 1000 -logpath /data0/mongodb/logs/shard11.log -logappend  --maxConns 10000 --quiet -fork --directoryperdb  --keyFile=/opt/mongodb/sh/keyFile 

sleep 2 

/opt/mongodb/bin/mongod -shardsvr -replSet shard2 -port 27022 -dbpath /data0/mongodb/db/shard21 -oplogSize 1000 -logpath /data0/mongodb/logs/shard21.log -logappend  --maxConns 10000 --quiet -fork --directoryperdb  --keyFile=/opt/mongodb/sh/keyFile 

sleep 2 

echo "all mongo started." 

PS:要是想开启一个HTTP协议的端口提供rest服务,可以在mongod启动参数中加上 --rest 选项!

这样我们可以通过 http://IP:28021/_replSet 查看状态!

生产环境推荐用配置文件和脚本文件方式启动。

三、初始化replica set

1.配置shard1用到的replica sets

[root@mongo01 ~]# mongo 192.168.8.30:27021 

> config = {_id: 'shard1', members: [ 

    {_id: 0, host: '192.168.8.30:27021'}, 

    {_id: 1, host: '192.168.8.31:27021'}, 

    {_id: 2, host: '192.168.8.32:27021'}] 

  } 

> config = {_id: 'shard1', members: [ 

...                           {_id: 0, host: '192.168.8.30:27021'}, 

...                           {_id: 1, host: '192.168.8.31:27021'}, 

...                           {_id: 2, host: '192.168.8.32:27021'}] 

...            } 

    "_id" : "shard1", 

    "members" : [ 

        { 

            "_id" : 0, 

            "host" : "192.168.8.30:27021" 

        }, 

        { 

            "_id" : 1, 

            "host" : "192.168.8.31:27021" 

        }, 

        { 

            "_id" : 2, 

            "host" : "192.168.8.32:27021" 

        } 

    ] 

出现如下信息表示成功: 

> rs.initiate(config) 

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

    "ok" : 1 

> rs.status() 

    "set" : "shard1", 

    "date" : ISODate("2012-06-07T11:35:22Z"), 

    "myState" : 1, 

    "members" : [ 

        { 

            "_id" : 0, 

            "name" : "192.168.8.30:27021", 

            "health" : 1,  #1 表示正常 

            "state" : 1,   #1 表示是primary 

            "stateStr" : "PRIMARY",  #表示此服务器是主库 

            "optime" : { 

                "t" : 1339068873000, 

                "i" : 1 

            }, 

            "optimeDate" : ISODate("2012-06-07T11:34:33Z"), 

            "self" : true 

        }, 

        { 

            "_id" : 1, 

            "name" : "192.168.8.31:27021", 

            "health" : 1,    #1 表示正常 

            "state" : 2,     #2 表示是secondary 

            "stateStr" : "SECONDARY",  #表示此服务器是从库 

            "uptime" : 41, 

            "optime" : { 

                "t" : 1339068873000, 

                "i" : 1 

            }, 

            "optimeDate" : ISODate("2012-06-07T11:34:33Z"), 

            "lastHeartbeat" : ISODate("2012-06-07T11:35:21Z"), 

            "pingMs" : 7 

        }, 

        { 

            "_id" : 2, 

            "name" : "192.168.8.32:27021", 

            "health" : 1, 

            "state" : 2, 

            "stateStr" : "SECONDARY", 

            "uptime" : 36, 

            "optime" : { 

                "t" : 1341373105000, 

                "i" : 1 

            }, 

            "optimeDate" : ISODate("2012-06-07T11:34:00Z"), 

            "lastHeartbeat" : ISODate("2012-06-07T11:35:21Z"), 

            "pingMs" : 3 

        } 

    ], 

    "ok" : 1 

PRIMARY> 

可以看马上变成 PRIMARY 即主节点!

再到其它节点看下: 

[root@mongo02 sh]# mongo 192.168.8.31:27021 

MongoDB shell version: 2.0.5 

connecting to: 192.168.8.31:27021/test 

SECONDARY>  

[root@mongo03 sh]# mongo 192.168.8.32:27021 

MongoDB shell version: 2.0.5 

connecting to: 192.168.8.32:27021/test 

SECONDARY>  

在所有节点上可以查看Replica Sets 的配置信息: 

PRIMARY> rs.conf() 

    "_id" : "shard1", 

    "version" : 1, 

    "members" : [ 

        { 

            "_id" : 0, 

            "host" : "192.168.8.30:27021" 

        }, 

        { 

            "_id" : 1, 

            "host" : "192.168.8.31:27021" 

        }, 

        { 

            "_id" : 2, 

            "host" : "192.168.8.32:27021", 

            "shardOnly" : true 

        } 

    ] 

2.配置shard2用到的replica sets

[root@mongo02 sh]# mongo 192.168.8.30:27022 

MongoDB shell version: 2.0.5 

connecting to: 192.168.8.30:27022/test 

> config = {_id: 'shard2', members: [ 

    {_id: 0, host: '192.168.8.30:27022'}, 

    {_id: 1, host: '192.168.8.31:27022'}, 

    {_id: 2, host: '192.168.8.32:27022'}] 

    } 

> config = {_id: 'shard2', members: [ 

... {_id: 0, host: '192.168.8.30:27022'}, 

... {_id: 1, host: '192.168.8.31:27022'}, 

... {_id: 2, host: '192.168.8.32:27022'}] 

... } 

    "_id" : "shard2", 

    "members" : [ 

        { 

            "_id" : 0, 

            "host" : "192.168.8.30:27022" 

        }, 

        { 

            "_id" : 1, 

            "host" : "192.168.8.31:27022" 

        }, 

        { 

            "_id" : 2, 

            "host" : "192.168.8.32:27022" 

        } 

    ] 

> rs.initiate(config) 

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

    "ok" : 1 

验证节点:

> rs.status() 

    "set" : "shard2", 

    "date" : ISODate("2012-06-07T11:43:47Z"), 

    "myState" : 2, 

    "members" : [ 

        { 

            "_id" : 0, 

            "name" : "192.168.8.30:27022", 

            "health" : 1, 

            "state" : 1, 

            "stateStr" : "PRIMARY", 

            "optime" : { 

                "t" : 1341367921000, 

                "i" : 1 

            }, 

            "optimeDate" : ISODate("2012-06-07T11:43:40Z"), 

            "self" : true 

        }, 

        { 

            "_id" : 1, 

            "name" : "192.168.8.31:27022", 

            "health" : 1, 

            "state" : 2, 

            "stateStr" : "SECONDARY", 

            "uptime" : 50, 

            "optime" : { 

                "t" : 1341367921000, 

                "i" : 1 

            }, 

            "optimeDate" : ISODate("1970-01-01T00:00:00Z"), 

            "lastHeartbeat" : ISODate("2012-06-07T11:43:46Z"), 

            "pingMs" : 0, 

        }, 

        { 

            "_id" : 2, 

            "name" : "192.168.8.32:27022", 

            "health" : 1, 

            "state" : 2, 

            "stateStr" : "SECONDARY", 

            "uptime" : 81, 

            "optime" : { 

                "t" : 1341373254000, 

                "i" : 1 

            }, 

            "optimeDate" : ISODate("2012-06-07T11:41:00Z"), 

            "lastHeartbeat" : ISODate("2012-06-07T11:43:46Z"), 

            "pingMs" : 0, 

        } 

    ], 

    "ok" : 1 

PRIMARY>  

到此就配置好了二个replica sets!

PS: 初始化时,不指定priority默认id 0 为primary

状态中关键数据位:

在用 rs.status()查看replica sets状态时,

state:1表示该host是当前可以进行读写,2:不能读写

health:1表示该host目前是正常的,0:异常

注意:初使化replica sets时也可以用这种方法:

db.runCommand({"replSetInitiate":{"_id":"shard1","members":[{"_id":0,"host":"192.168.8.30:27021"},{"_id":1,"host":"192.168.8.31:27021"},{"_id":2,"host":"192.168.8.32:27021","shardOnly":true}]}})

可以省略用rs.initiate(config)。

四、配置三台config server

分别在各服务器上运行(启动都一样):

/opt/mongodb/bin/mongod --configsvr --dbpath /data0/mongodb/db/config --port 20000 --logpath /data0/mongodb/logs/config.log --logappend --fork --directoryperdb

用脚本形式:

[root@mongo01 sh]# cat config.sh  

/opt/mongodb/bin/mongod --configsvr --dbpath /data0/mongodb/db/config --port 20000 --logpath /data0/mongodb/logs/config.log --logappend --fork --directoryperdb 

[root@mongo01 sh]# pwd 

/opt/mongodb/sh 

[root@mongo01 sh]# ./config.sh 

然后在各节点查看有没有启动起来:

[root@mongo01 sh]# ps aux |grep mong 

root     25343  0.9  6.8 737596 20036 ?        Sl   19:32   0:12 /opt/mongodb/bin/mongod -shardsvr -replSet shard1 -port 27021 -dbpath /data0/mongodb/db/shard1 -oplogSize 100 -logpath /data0/mongodb/logs/shard1.log -logappend --maxConns 10000 --quiet -fork --directoryperdb 

root     25351  0.9  7.0 737624 20760 ?        Sl   19:32   0:11 /opt/mongodb/bin/mongod -shardsvr -replSet shard2 -port 27022 -dbpath /data0/mongodb/db/shard2 -oplogSize 100 -logpath /data0/mongodb/logs/shard2.log -logappend --maxConns 10000 --quiet -fork --directoryperdb 

root     25669 13.0  4.7 118768 13852 ?        Sl   19:52   0:07 /opt/mongodb/bin/mongod --configsvr --dbpath /data0/mongodb/db/config --port 20000 --logpath /data0/mongodb/logs/config.log --logappend --fork --directoryperdb 

root     25695  0.0  0.2  61220   744 pts/3    R+   19:53   0:00 grep mong 

五、配置mongs(启动路由)

分别在206、207服务器上运行(也可以在所有节点上启动):

/opt/mongodb/bin/mongos -configdb 192.168.8.30:20000,192.168.8.31:20000,192.168.8.32:20000 -port 30000 -chunkSize 50 -logpath /data0/mongodb/logs/mongos.log -logappend -fork

用脚本形式: 

[root@mongo01 sh]# cat mongos.sh  

/opt/mongodb/bin/mongos -configdb 192.168.8.30:20000,192.168.8.31:20000,192.168.8.32:20000 -port 30000 -chunkSize 50 -logpath /data0/mongodb/logs/mongos.log -logappend -fork 

[root@mongo01 sh]# pwd 

/opt/mongodb/sh 

[root@mongo01 sh]# ./mongos.sh  

[root@mongo01 sh]# ps aux |grep mong 

root     25343  0.8  6.8 737596 20040 ?        Sl   19:32   0:13 /opt/mongodb/bin/mongod -shardsvr -replSet shard1 -port 27021 -dbpath /data0/mongodb/db/shard1 -oplogSize 100 -logpath /data0/mongodb/logs/shard1.log -logappend --maxConns 10000 --quiet -fork --directoryperdb 

root     25351  0.9  7.0 737624 20768 ?        Sl   19:32   0:16 /opt/mongodb/bin/mongod -shardsvr -replSet shard2 -port 27022 -dbpath /data0/mongodb/db/shard2 -oplogSize 100 -logpath /data0/mongodb/logs/shard2.log -logappend --maxConns 10000 --quiet -fork --directoryperdb 

root     25669  2.0  8.0 321852 23744 ?        Sl   19:52   0:09 /opt/mongodb/bin/mongod --configsvr --dbpath /data0/mongodb/db/config --port 20000 --logpath /data0/mongodb/logs/config.log --logappend --fork --directoryperdb 

root     25863  0.5  0.8  90760  2388 ?        Sl   20:00   0:00 /opt/mongodb/bin/mongos -configdb 192.168.8.30:20000,192.168.8.31:20000,192.168.8.32:20000 -port 30000 -chunkSize 50 -logpath /data0/mongodb/logs/mongos.log -logappend -fork 

root     25896  0.0  0.2  61220   732 pts/3    D+   20:00   0:00 grep mong 

注意:

1). mongos里面的ip和端口是config服务的ip和端口:192.168.8.30:20000,192.168.8.31:20000,192.168.8.32:20000

2). 必须先启动config后(并且config启动正常后,有config的进程存在)再启动mongos

六、配置shard集群 

1.连接一台路由 

[root@mongo01 sh]# mongo 192.168.8.30:30000/admin 

MongoDB shell version: 2.0.5 

connecting to: 192.168.8.30:30000/admin 

mongos>  

2.加入shards 

mongos> db.runCommand({ addshard : "shard1/192.168.8.30:27021,192.168.8.31:27021,192.168.8.32:27021",name:"shard1",maxSize:20480}) 

{ "shardAdded" : "shard1", "ok" : 1 } 

mongos> db.runCommand({ addshard : "shard2/192.168.8.30:27022,192.168.8.31:27022,192.168.8.32:27022",name:"shard2",maxSize:20480}) 

{ "shardAdded" : "shard2", "ok" : 1 } 

PS:

分片操作必须在 admin 库下操作

如果只启动206和207服务器的路由!因此可不用把208服务器加进来!

可选参数说明:

Name:用于指定每个shard的名字,不指定的话系统将自动分配

maxSize:指定各个shard可使用的最大磁盘空间,单位 MegaBytes

3.列出加入的shards 

mongos> db.runCommand( { listshards : 1 } ); 

    "shards" : [ 

        { 

            "_id" : "shard1", 

            "host" : "shard1/192.168.8.30:27021,192.168.8.31:27021,192.168.8.32:27021", 

            "maxSize" : NumberLong(20480) 

        }, 

        { 

            "_id" : "shard2", 

            "host" : "shard2/192.168.8.30:27022,192.168.8.31:27022,192.168.8.32:27022", 

            "maxSize" : NumberLong(20480) 

        } 

    ], 

    "ok" : 1 

PS: 列出了以上二个我加的shards(shard1和shard2),表示shards已经配置成功!!

如果206那台机器挂了,其它两个节点中某个会成为主节点,mongos会自动连接到主节点!

mongos> db.runCommand({ismaster:1}); 

    "ismaster" : true, 

    "msg" : "isdbgrid", 

    "maxBsonObjectSize" : 16777216, 

    "ok" : 1 

mongos> db.runCommand( { listshards : 1 } ); 

{ "ok" : 0, "errmsg" : "access denied - use admin db" } 

mongos> use admin 

switched to db admin 

mongos> db.runCommand( { listshards : 1 } ); 

    "shards" : [ 

        { 

            "_id" : "s1", 

            "host" : "shard1/192.168.8.30:27021,192.168.8.31:27021" 

        }, 

        { 

            "_id" : "s2", 

            "host" : "shard2/192.168.8.30:27022,192.168.8.31:27022" 

        } 

    ], 

    "ok" : 1 

mongos>  

七.添加分片

1.激活数据库分片

db.runCommand( { enablesharding : "" } );

如:db.runCommand( { enablesharding : "" } );

插入测试数据:

mongos> use nosql 

switched to db nosql 

mongos> for(var i=0;i<100;i++)db.fans.insert({uid:i,uname:'nosqlfans'+i}); 

激活数据库:

mongos> use admin 

switched to db admin 

mongos> db.runCommand( { enablesharding : "nosql" } ); 

{ "ok" : 1 } 

通过执行以上命令,可以让数据库跨shard,如果不执行这步,数据库只会存放在一个shard,一旦激活数据库分片,数据库中不同的collection 将被存放在不同的shard上,但一个collection仍旧存放在同一个shard上,要使单个collection也分片,还需单独对 collection作些操作!

2.添加索引

必须加索引,不然不能对collections分片!

mongos> use nosql 

switched to db nosql 

mongos> db.fans.find() 

{ "_id" : ObjectId("4ff2ae6816df1d1b33bad081"), "uid" : 0, "uname" : "nosqlfans0" } 

{ "_id" : ObjectId("4ff2ae6816df1d1b33bad082"), "uid" : 1, "uname" : "nosqlfans1" } 

{ "_id" : ObjectId("4ff2ae6816df1d1b33bad083"), "uid" : 2, "uname" : "nosqlfans2" } 

{ "_id" : ObjectId("4ff2ae6816df1d1b33bad084"), "uid" : 3, "uname" : "nosqlfans3" } 

{ "_id" : ObjectId("4ff2ae6816df1d1b33bad085"), "uid" : 4, "uname" : "nosqlfans4" } 

{ "_id" : ObjectId("4ff2ae6816df1d1b33bad086"), "uid" : 5, "uname" : "nosqlfans5" } 

{ "_id" : ObjectId("4ff2ae6816df1d1b33bad087"), "uid" : 6, "uname" : "nosqlfans6" } 

{ "_id" : ObjectId("4ff2ae6816df1d1b33bad088"), "uid" : 7, "uname" : "nosqlfans7" } 

{ "_id" : ObjectId("4ff2ae6816df1d1b33bad089"), "uid" : 8, "uname" : "nosqlfans8" } 

{ "_id" : ObjectId("4ff2ae6816df1d1b33bad08a"), "uid" : 9, "uname" : "nosqlfans9" } 

{ "_id" : ObjectId("4ff2ae6816df1d1b33bad08b"), "uid" : 10, "uname" : "nosqlfans10" } 

{ "_id" : ObjectId("4ff2ae6816df1d1b33bad08c"), "uid" : 11, "uname" : "nosqlfans11" } 

{ "_id" : ObjectId("4ff2ae6816df1d1b33bad08d"), "uid" : 12, "uname" : "nosqlfans12" } 

{ "_id" : ObjectId("4ff2ae6816df1d1b33bad08e"), "uid" : 13, "uname" : "nosqlfans13" } 

{ "_id" : ObjectId("4ff2ae6816df1d1b33bad08f"), "uid" : 14, "uname" : "nosqlfans14" } 

{ "_id" : ObjectId("4ff2ae6816df1d1b33bad090"), "uid" : 15, "uname" : "nosqlfans15" } 

{ "_id" : ObjectId("4ff2ae6816df1d1b33bad091"), "uid" : 16, "uname" : "nosqlfans16" } 

{ "_id" : ObjectId("4ff2ae6816df1d1b33bad092"), "uid" : 17, "uname" : "nosqlfans17" } 

{ "_id" : ObjectId("4ff2ae6816df1d1b33bad093"), "uid" : 18, "uname" : "nosqlfans18" } 

{ "_id" : ObjectId("4ff2ae6816df1d1b33bad094"), "uid" : 19, "uname" : "nosqlfans19" } 

has more 

mongos> db.fans.ensureIndex({"uid":1}) 

mongos> db.fans.find({uid:10}).explain() 

    "cursor" : "BtreeCursor uid_1", 

    "nscanned" : 1, 

    "nscannedObjects" : 1, 

    "n" : 1, 

    "millis" : 25, 

    "nYields" : 0, 

    "nChunkSkips" : 0, 

    "isMultiKey" : false, 

    "indexOnly" : false, 

    "indexBounds" : { 

        "uid" : [ 

            [ 

                10, 

                10 

            ] 

        ] 

    } 

3.Collecton分片

要使单个collection也分片存储,需要给collection指定一个分片key,通过以下命令操作:

db.runCommand( { shardcollection : "",key : }); 

mongos> use admin 

switched to db admin 

mongos> db.runCommand({shardcollection : "nosql.fans",key : {uid:1}}) 

{ "collectionsharded" : "nosql.fans", "ok" : 1 } 

PS: 

1). 操作必须切换到admin数据库下

2). 分片的collection系统要创建好索引

3). 分片的collection只能有一个在分片key上的唯一索引,其它唯一索引不被允许

4.查看分片状态

mongos> use nosql 

mongos> db.fans.stats() 

    "sharded" : true, 

    "flags" : 1, 

    "ns" : "nosql.fans", 

    "count" : 100, 

    "numExtents" : 2, 

    "size" : 5968, 

    "storageSize" : 20480, 

    "totalIndexSize" : 24528, 

    "indexSizes" : { 

        "_id_" : 8176, 

        "uid0_1" : 8176, 

        "uid_1" : 8176 

    }, 

    "avgObjSize" : 59.68, 

    "nindexes" : 3, 

    "nchunks" : 1, 

    "shards" : { 

        "shard1" : { 

            "ns" : "nosql.test", 

            "count" : 100, 

            "size" : 5968, 

            "avgObjSize" : 59.68, 

            "storageSize" : 20480, 

            "numExtents" : 2, 

            "nindexes" : 3, 

            "lastExtentSize" : 16384, 

            "paddingFactor" : 1, 

            "flags" : 1, 

            "totalIndexSize" : 24528, 

            "indexSizes" : { 

                "_id_" : 8176, 

                "uid0_1" : 8176, 

                "uid_1" : 8176 

            }, 

            "ok" : 1 

        } 

    }, 

    "ok" : 1 

mongos> 

 些时分片没有发生变化!

再插入比较多的数据:

mongos> use nosql 

switched to db nosql 

mongos> for(var i=200;i<200003;i++)db.fans.save({uid:i,uname:'nosqlfans'+i}); 

mongos> db.fans.stats() 

    "sharded" : true, 

    "flags" : 1, 

    "ns" : "nosql.fans", 

    "count" : 200002, 

    "numExtents" : 12, 

    "size" : 12760184, 

    "storageSize" : 22646784, 

    "totalIndexSize" : 12116832, 

    "indexSizes" : { 

        "_id_" : 6508096, 

        "uid_1" : 5608736 

    }, 

    "avgObjSize" : 63.80028199718003, 

    "nindexes" : 2, 

    "nchunks" : 10, 

    "shards" : { 

        "shard1" : { 

            "ns" : "nosql.fans", 

            "count" : 9554, 

            "size" : 573260, 

            "avgObjSize" : 60.00209336403601, 

            "storageSize" : 1396736, 

            "numExtents" : 5, 

            "nindexes" : 2, 

            "lastExtentSize" : 1048576, 

            "paddingFactor" : 1, 

            "flags" : 1, 

            "totalIndexSize" : 596848, 

            "indexSizes" : { 

                "_id_" : 318864, 

                "uid_1" : 277984 

            }, 

            "ok" : 1 

        }, 

        "shard2" : { 

            "ns" : "nosql.fans", 

            "count" : 190448, 

            "size" : 12186924, 

            "avgObjSize" : 63.990821641602956, 

            "storageSize" : 21250048, 

            "numExtents" : 7, 

            "nindexes" : 2, 

            "lastExtentSize" : 10067968, 

            "paddingFactor" : 1, 

            "flags" : 1, 

            "totalIndexSize" : 11519984, 

            "indexSizes" : { 

                "_id_" : 6189232, 

                "uid_1" : 5330752 

            }, 

            "ok" : 1 

        } 

    }, 

    "ok" : 1 

mongos> 

当再次插入大量数据时。。自动分片处理了!!所以OK!!!

八.停止所有服务脚本

[root@mon1 sh]# cat /opt/mongodb/sh/stop.sh 

#!/bin/sh 

check=`ps aux|grep mongo|grep configdb|awk '{print $2;}'|wc -l` 

echo $check 

while [ $check -gt 0 ] 

do 

       # echo $check 

        no=`ps aux|grep mongo|grep configdb|awk '{print $2;}'|sed -n '1p'` 

        kill -3 $no 

        echo "kill $no mongo daemon is ok." 

        sleep 2 

        check=`ps aux|grep mongo|grep configdb|awk '{print $2;}'|wc -l` 

        echo "stopping mongo,pls waiting..." 

done 

check=`ps aux|grep mongo|grep configsvr|awk '{print $2;}'|wc -l` 

echo $check 

while [ $check -gt 0 ] 

do 

       # echo $check 

        no=`ps aux|grep mongo|grep configsvr|awk '{print $2;}'|sed -n '1p'` 

        kill -3 $no 

        echo "kill $no mongo daemon is ok." 

        sleep 2 

        check=`ps aux|grep mongo|grep configsvr|awk '{print $2;}'|wc -l` 

        echo "stopping mongo,pls waiting..." 

done 

check=`ps aux|grep mongo|grep shardsvr|awk '{print $2;}'|wc -l` 

echo $check 

while [ $check -gt 0 ] 

do 

       # echo $check 

        no=`ps aux|grep mongo|grep shardsvr|awk '{print $2;}'|sed -n '1p'` 

        kill -3 $no 

        echo "kill $no mongo daemon is ok." 

        sleep 2 

        check=`ps aux|grep mongo|grep shardsvr|awk '{print $2;}'|wc -l` 

        echo "stopping mongo,pls waiting..." 

done 

echo "all mongodb stopped!"   

九.分片管理

1.listshards:列出所有的Shard 

>use admin 

>db.runCommand({listshards:1}) 

2.移除shard 

>use admin 

>db.runCommand( { removeshard : "shard1/192.168.8.30:27021,192.168.8.31:27021" } ) 

>db.runCommand( { removeshard : "shard2/192.168.8.30:27022,192.168.8.31:27022" } ) 

对于移除的分片后,我们再加入相同分片时,会加不进去,可以按如下方法进行: 

mongos> use config 

switched to db config 

mongos> show collections 

changelog 

chunks 

collections 

databases 

lockpings 

locks 

mongos 

settings 

shards 

system.indexes 

version 

mongos> db.shards.find() 

{ "_id" : "shard1", "host" : "shard1/192.168.8.30:27021,192.168.8.31:27021,192.168.8.32:27021", "maxSize" : NumberLong(20480) } 

{ "_id" : "shard2", "host" : "shard2/192.168.8.30:27022,192.168.8.31:27022,192.168.8.32:27022", "maxSize" : NumberLong(20480) } 

 要做的就是删除shards表中的信息,把移除的shard键值删除掉!再重新加入shard

如:db.shards.remove({"_id":"shard2"})

3.查看Sharding信息

> printShardingStatus()

PRIMARY> db.system.replset.find()

PRIMARY> rs.isMaster()


推荐阅读
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • MongoDB核心概念详解
    本文介绍了NoSQL数据库的概念及其应用场景,重点解析了MongoDB的基本特性、数据结构以及常用操作。MongoDB是一个高性能、高可用且易于扩展的文档数据库系统。 ... [详细]
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • 小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限
    小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ... [详细]
  • MongoDB高可用架构:深入解析Replica Set机制
    MongoDB的高可用架构主要依赖于其Replica Set机制。Replica Set通过多个mongod节点的协同工作,实现了数据的冗余存储和故障自动切换,确保了系统的高可用性和数据的一致性。本文将深入解析Replica Set的工作原理及其在实际应用中的配置和优化方法,帮助读者更好地理解和实施MongoDB的高可用架构。 ... [详细]
  • 本文介绍了如何使用Node.js通过两种不同的方法连接MongoDB数据库,包括使用MongoClient对象和连接字符串的方法。每种方法都有其特点和适用场景,适合不同需求的开发者。 ... [详细]
  • Oracle字符集详解:图表解析与中文乱码解决方案
    本文详细解析了 Oracle 数据库中的字符集机制,通过图表展示了不同字符集之间的转换过程,并针对中文乱码问题提供了有效的解决方案。文章深入探讨了字符集配置、数据迁移和兼容性问题,为数据库管理员和开发人员提供了实用的参考和指导。 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • Node.js在服务器上的多种部署策略
    本文探讨了Node.js应用程序在服务器上部署的几种有效方法,包括使用Screen、PM2以及通过宝塔面板进行简易管理。 ... [详细]
  • 对于初学者而言,搭建一个高效稳定的 Python 开发环境是入门的关键一步。本文将详细介绍如何利用 Anaconda 和 Jupyter Notebook 来构建一个既易于管理又功能强大的开发环境。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 软件测试行业深度解析:迈向高薪的必经之路
    本文深入探讨了软件测试行业的发展现状及未来趋势,旨在帮助有志于在该领域取得高薪的技术人员明确职业方向和发展路径。 ... [详细]
  • 华为与红帽联手,加速开源电信软件革新
    华为与红帽携手合作,旨在加速开源电信软件的发展,以满足大型电信运营商对灵活网络解决方案的需求。 ... [详细]
  • CentOS下ProFTPD的安装与配置指南
    本文详细介绍在CentOS操作系统上安装和配置ProFTPD服务的方法,包括基本配置、安全设置及高级功能的启用。 ... [详细]
  • MongoVUE基础操作指南:轻松上手数据库管理
    本文介绍了MongoVUE的基础操作,旨在帮助用户轻松掌握数据库管理技巧。MongoVUE是一款功能强大的MongoDB客户端工具,虽然需要注册,但其用户友好的界面和丰富的功能使其成为许多开发者的首选。文中详细解释了安装步骤、基本配置以及常见操作方法,并对一些常见的问题进行了修正和补充,确保用户能够快速上手并高效使用MongoVUE进行数据库管理。 ... [详细]
author-avatar
S里覀格J
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有