MongoDB集群解决方案-分片技能51CTO博客 - 娱乐之横扫全球

MongoDB集群解决方案-分片技能51CTO博客

2019年03月09日09时56分07秒 | 作者: 昌淼 | 标签: 集群,节点,装备 | 浏览: 307

    MongoDB,NoSQL技能的完成,根据分布式文件存储的数据库,由C++言语编写。主要是处理海量数据的拜访功率问题,为web使用供给可扩展的高性能数据库存储处理方案


    MongoDB集群的完成方法:

      1、Replica Set:也叫作副本集,简略来说就是集群中的效劳器包括了多分数据,确保主节点挂掉了。备节点能够持续的供给效劳,可是供给的条件就是数据有必要要和主节点的共同,如下图:







   

    MongoDB(M)表明主节点,MongoDB(S)表明从节点,MongoDB(A)表明裁定节点;

    M节点存储数据并供给一切的增拿手效劳,S节点默许不供给效劳,可是能够经过设置使备节点供给查询效劳,这样能够削减主节点的压力。A节点是一个特别的节点,不供给任何效劳,仅仅起一个推举的效果,当有主节点宕机时,可经过A节点来选取出那个S节点来提高为主节点。


    2、Master-Slave:相似于MySQL的主从形式,装备很简略,这儿我就不多说了

    3、Sharding:和Replica Set相似,也需求一个裁定节点,可是Sharding还需求装备效劳器和路由节点,如下图:

    MongoDB(R)为路由节点(mongos),数据库集群恳求的进口,一切的恳求都经过mongos进行和谐,它就是一个恳求分发器,他担任把对应的数据恳求转发到对应的shard效劳器上。

    MongoDB(C1)为装备效劳器,存储了集群的元信息,元信息保存了集群的状况和安排结构,元信息包括每个分片保存的数据块信息以及每个数据块的规模,mongos会缓存这个信息用来做读写的路由分发!


    本文主要是完成第三种Sharding方法,架构布置图如下


布置环境:

                           主机名
                                 IP
                           node1
                         192.168.1.109
                           node2
                         192.168.1.107
                           node3
                         192.168.1.110

一、规划每个效劳对应的端口

config server:11000
路由:10000
shard:10001
shard:10002
shard:10003


二、在node1、node2、node3上创立相应的目录(以下操作均在mongodb用户下履行)

[root@node1 ~]# cat /etc/passwd | grep mongodb
mongodb:x:10001:10001::/data/mongodb:/bin/bash
[root@node1 ~]# su - mongodb
[mongodb@node1 ~]$ pwd
/data/mongodb
[mongodb@node1 ~]$ mkdir -p config/{data,log}   config server的数据、日志途径
[mongodb@node1 ~]$ mkdir -p mongos/log          路由的日志途径
[mongodb@node1 ~]$ mkdir -p shard1/{data,log}   副本集1的数据、日志途径
[mongodb@node1 ~]$ mkdir -p shard2/{data,log}
[mongodb@node1 ~]$ mkdir -p shard3/{data,log}
[mongodb@node1 ~]$ tar -xf mongodb-linux-x86_64-rhel62-3.2.7.tgz   这儿用的是3.2.7的版别,现在官网最新是3.2.9
[mongodb@node1 ~]$ ll
drwxr-xr-x 4 mongodb dev     4096 Sep 30 20:50 config
drwxr-xr-x 3 mongodb dev     4096 Sep 30 20:55 mongodb-linux-x86_64-rhel62-3.2.7
-rw-rr 1 mongodb dev 74938432 Sep 30 20:40 mongodb-linux-x86_64-rhel62-3.2.7.tgz
drwxr-xr-x 3 mongodb dev     4096 Sep 30 20:50 mongos
drwxr-xr-x 4 mongodb dev     4096 Sep 30 20:50 shard1
drwxr-xr-x 4 mongodb dev     4096 Sep 30 20:51 shard2
drwxr-xr-x 4 mongodb dev     4096 Sep 30 20:51 shard3
#node2、node3亦是如此


三、发动node1、node2、node3的装备效劳器

[mongodb@node1 bin]$ pwd     
/data/mongodb/mongodb-linux-x86_64-rhel62-3.2.7/bin
[mongodb@node1 bin]$ ./mongod configsvr port 11000 dbpath /data/mongodb/config/data/ logpath /data/mongodb/config/log/config.log fork   "fork"在后台运转,在node1上履行
[mongodb@node2 bin]$ ./mongod configsvr port 11000 dbpath /data/mongodb/config/data/ logpath /data/mongodb/config/log/config.log fork   在node2上履行
[mongodb@node3 bin]$ ./mongod configsvr port 11000 dbpath /data/mongodb/config/data/ logpath /data/mongodb/config/log/config.log fork   在node3上履行


四、发动node1、node2、node3的路由

[mongodb@node1 bin]$ ./mongos configdb 192.168.1.109:11000,192.168.1.107:11000,192.168.1.110:11000 port 10000 logpath /data/mongodb/mongos/log/mongos.log fork   node1发动路由
[mongodb@node2 bin]$ ./mongos configdb 192.168.1.109:11000,192.168.1.107:11000,192.168.1.110:11000 port 10000 logpath /data/mongodb/mongos/log/mongos.log fork   node2发动路由
[mongodb@node3 bin]$ ./mongos configdb 192.168.1.109:11000,192.168.1.107:11000,192.168.1.110:11000 port 10000 logpath /data/mongodb/mongos/log/mongos.log fork   node3发动路由


五、在node1、node2、node3上设置shard并发动

./mongod shardsvr replSet shard1 port 11001 dbpath /data/mongodb/shard1/data logpath /data/mongodb/shard1/log/shard1.log fork  oplogSize 10240 logappend   设置shard1
./mongod shardsvr replSet shard2 port 11002 dbpath /data/mongodb/shard2/data logpath /data/mongodb/shard2/log/shard2.log fork  oplogSize 10240 logappend   设置shard2
./mongod shardsvr replSet shard3 port 11003 dbpath /data/mongodb/shard3/data logpath /data/mongodb/shard3/log/shard3.log fork  oplogSize 10240 logappend   设置shard3
#node2、node3操作亦是如此


六、登录恣意一台机器,在相应的端口对shard进行装备

    1、对shard1进行装备

[mongodb@node1 bin]$ ./mongo port 11001   衔接至副本集shard1
> use admin 
> config  = {_id:"shard1",members:[{_id:0,host:"192.168.1.109:11001"},{_id:1,host:"192.168.1.107:11001"},{_id:2,host:"192.168.1.110:11001",arbiterOnly:true}]}    "arbiterOnly"设定谁为裁定节点
> rs.initiate(config);   对shard1进行初始化


    2、对shard2进行装备

[mongodb@node1 bin]$ ./mongo port 11002   衔接至副本集shard2
> use admin
> config2 = {_id:"shard2",members:[{_id:0,host:"192.168.1.109:11002"},{_id:1,host:"192.168.1.107:11002",arbiterOnly:true},{_id:2,host:"192.168.1.110:11002"}]}
> rs.initiate(config2);   对shard2进行初始化


    3、对shard3进行装备

[mongodb@node2 bin]$ ./mongo port 11003   衔接至副本集shard3
> use admin
> config3 = {_id:"shard3",members:[{_id:0,host:"192.168.1.109:11003",arbiterOnly:true},{_id:1,host:"192.168.1.107:11003"},{_id:2,host:"192.168.1.110:11003"}]}
> rs.initiate(config3);   对shard3进行初始化

#留意:本机装备shard时,不能把本机设置为"arbiter",不然会报错,有必要要去其他节点设置。
#在装备shard1、shard2时都是在node1上装备的,由于裁定节点分别是node3、node2。当node1为裁定节点时,有必要
要去node2或者是node3上去装备


七、装备好副本集后,还需求将路由与副本集串联起来,由于一切的恳求都是经过路由,随后再到装备效劳器的

[mongodb@node1 bin]$ ./mongo port 10000   衔接至mongos
mongos> use admin
mongos> db.runCommand({addshard:"shard1/192.168.1.109:11001,192.168.1.107:11001,192.168.1.110:11001"});   将路由和副本集shard1串联起来
{ "shardAdded" : "shard1", "ok" : 1 }
mongos> db.runCommand({addshard:"shard2/192.168.1.109:11002,192.168.1.107:11002,192.168.1.110:11002"});   将路由和副本集shard2串联起来
{ "shardAdded" : "shard2", "ok" : 1 }
mongos> db.runCommand({addshard:"shard3/192.168.1.109:11003,192.168.1.107:11003,192.168.1.110:11003"});   将路由和副本集shard1串联起来  
{ "shardAdded" : "shard3", "ok" : 1 }


八、检测装备是否成

    1、衔接至mongos检查sh

[mongodb@node1 bin]$ ./mongo port 10000
mongos> use amdin
mongos> sh.status()
    shards:
    {  "_id" : "shard1",  "host" : "shard1/192.168.1.107:11001,192.168.1.109:11001" }
    {  "_id" : "shard2",  "host" : "shard2/192.168.1.109:11002,192.168.1.110:11002" }
    {  "_id" : "shard3",  "host" : "shard3/192.168.1.107:11003,192.168.1.110:11003" }


    2、衔接至各个shard的端口检查rs

[mongodb@node1 bin]$ ./mongo port 11001
shard1:PRIMARY> rs.status()
    "name" : "192.168.1.109:11001",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
    "name" : "192.168.1.107:11001",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
    "name" : "192.168.1.110:11001",
            "health" : 1,
            "state" : 7,
            "stateStr" : "ARBITER",

其他节点检查方法相同


九、刺进数据,测试数据能否进行主动分片

[mongodb@node1 bin]$ ./mongo port 10000
mongos> use admin
mongos> db.runCommand( { enablesharding :"testdb"});  创立数据库,指定数据库"testdb"进行分片收效
{ "ok" : 1 }
mongos> db.runCommand({shardcollection:"testdb.table1",key:{apId:1,_id:1}})  MongoDB具有许多片键,此处创立ID片键,指定"testdb"数据库中的"table1"表中的数据经过ID片键进行分片
{ "collectionsharded" : "testdb.table1", "ok" : 1 }
mongos> use testdb;
switched to db testdb
mongos> for(var i=1;i<100000;i++)db.table1.save({id:i,"test1":"testval1"});   在"testdb"中的表"table1"中刺进10w个id

[mongodb@node2 bin]$ ./mongo port 11003   node2上衔接至shard3
shard3:PRIMARY> use testdb
switched to db testdb
shard3:PRIMARY> db.table1.find()
{ "_id" : ObjectId("57ef6d2e4eec2b8ef67ad1ce"), "id" : 1, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2e4eec2b8ef67ad1cf"), "id" : 2, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2e4eec2b8ef67ad1d1"), "id" : 4, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2e4eec2b8ef67ad1d2"), "id" : 5, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2e4eec2b8ef67ad1d6"), "id" : 9, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2e4eec2b8ef67ad1d9"), "id" : 12, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2e4eec2b8ef67ad1db"), "id" : 14, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2e4eec2b8ef67ad1dd"), "id" : 16, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2e4eec2b8ef67ad1de"), "id" : 17, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2e4eec2b8ef67ad1e0"), "id" : 19, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2e4eec2b8ef67ad1e3"), "id" : 22, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2e4eec2b8ef67ad1e4"), "id" : 23, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2f4eec2b8ef67ad1e5"), "id" : 24, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2f4eec2b8ef67ad1e8"), "id" : 27, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2f4eec2b8ef67ad1ea"), "id" : 29, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2f4eec2b8ef67ad1eb"), "id" : 30, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2f4eec2b8ef67ad1ee"), "id" : 33, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2f4eec2b8ef67ad1ef"), "id" : 34, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2f4eec2b8ef67ad1f2"), "id" : 37, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2f4eec2b8ef67ad1f4"), "id" : 39, "test1" : "testval1" }
 
[mongodb@node3 bin]$ ./mongo port 11002    node3上衔接至shard2
shard2:PRIMARY> use testdb
switched to db testdb
shard2:PRIMARY> db.table1.find()
{ "_id" : ObjectId("57ef6d2e4eec2b8ef67ad1d4"), "id" : 7, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2e4eec2b8ef67ad1d8"), "id" : 11, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2e4eec2b8ef67ad1da"), "id" : 13, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2e4eec2b8ef67ad1df"), "id" : 18, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2e4eec2b8ef67ad1e2"), "id" : 21, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2f4eec2b8ef67ad1e9"), "id" : 28, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2f4eec2b8ef67ad1f0"), "id" : 35, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2f4eec2b8ef67ad1fa"), "id" : 45, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2f4eec2b8ef67ad1fc"), "id" : 47, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2f4eec2b8ef67ad1fe"), "id" : 49, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2f4eec2b8ef67ad200"), "id" : 51, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2f4eec2b8ef67ad202"), "id" : 53, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2f4eec2b8ef67ad203"), "id" : 54, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2f4eec2b8ef67ad206"), "id" : 57, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2f4eec2b8ef67ad208"), "id" : 59, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2f4eec2b8ef67ad204"), "id" : 55, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2f4eec2b8ef67ad209"), "id" : 60, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2f4eec2b8ef67ad20c"), "id" : 63, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2f4eec2b8ef67ad20f"), "id" : 66, "test1" : "testval1" }
{ "_id" : ObjectId("57ef6d2f4eec2b8ef67ad210"), "id" : 67, "test1" : "testval1" }

#node1上检查方法亦是如此
#留意:检查数据,只能在主节点上进行


问题小结:

1、集群中的每台效劳器时刻有必要要保持共同,不然发动mongos会呈现"Error Number 5"

2、在装备Replica Set时,只能指明三个节点,官网明确指出。

3、在布置集群时,假如不想设置"arbitrate“,能够经过设定副本会集的优先级"priority"来界说主备备4、

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表娱乐之横扫全球立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章