mongo复制集+分片实现海量数据存储
admin
2023-01-26 21:47:21
0

     MongoDB Auto-Sharding 解决了海量存储和动态扩容的问题,但离实际生产环境所需的高可

靠、高可用还有些距离,所以有了” Replica Sets + Sharding”的解决方案:

     Shard:

     使用 Replica Sets,确保每个数据节点都具有备份、自动容错转移、自动恢复能力。

     Config:

     使用3 个配置服务器,确保元数据完整性

     Route:

     使用3 个路由进程,实现负载平衡,提高客户端接入性能


基本结构如下:



  主机      IP         服务及端口


ServerA

 

192.168.10.150

   mongod shard1_1:27017

   mongod shard2_1:27018

   mongod config1:20000

   mongs1:30000

ServerB


192.168.10.151

   mongod shard1_2:27017

   mongod shard2_2:27018

   mongod config2:20000

   mongs2:30000


ServerC


192.168.10.154

   mongod shard1_3:27017

   mongod shard2_3:27018

   mongod config3:20000

   mongs3:30000

创建数据目录


serverA:

mkdir -p /data/shardset/{shard1_1,shard2_1,config}/


serverB:

mkdir -p /data/shardset/{shard1_2,shard2_2,config}/


serverC

mkdir -p /data/shardset/{shard1_3,shard2_3,config}/


配置复制集


配置shard1所用到的Replica Sets


serverA:

mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data/shardset/shard1_1 --logpath /data/shardset/shard1_1/shard1_1.log --logappend --fork


serverB:

mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data/shardset/shard1_2 --logpath /data/shardset/shard1_2/shard1_2.log --logappend --fork

serverC:

mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data/shardset/shard1_3 --logpath /data/shardset/shard1_3/shard1_3.log --logappend --fork

mongo 连接其中一台机器的27017 端口的mongod,初始化Replica Setsshard1”,执行:

[root@template ~]# mongo --port 27017

MongoDB shell version: 2.6.0

connecting to: 127.0.0.1:27017/test

>config = {_id: 'shard1', members: [ {_id: 0, host: '192.168.10.150:27017'},{_id: 1, host: '192.168.10.151:27017'},{_id: 2, host: '192.168.10.154:27017'}]}

{

        "_id" : "shard1",

        "members" : [

                {

                        "_id" : 0,

                        "host" : "192.168.10.150:27017"

                },

                {

                        "_id" : 1,

                        "host" : "192.168.10.151:27017"

                },

                {

                        "_id" : 2,

                        "host" : "192.168.10.154:27017"

                }

        ]

}

> rs.initiate(config)

{

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

        "ok" : 1

}



配置shard2所用到的Replica Sets


ServerA:

mongod --shardsvr --replSet shard2 --port 27018 --dbpath /data/shardset/shard2_1 --logpath /data/shardset/shard2_1/shard2_1.log --logappend --fork


ServerB:

mongod --shardsvr --replSet shard2 --port 27018 --dbpath /data/shardset/shard2_2 --logpath /data/shardset/shard2_2/shard2_2.log --logappend --fork


ServerC:

mongod --shardsvr --replSet shard2 --port 27018 --dbpath /data/shardset/shard2_3 --logpath /data/shardset/shard2_3/shard2_3.log --logappend --fork

 

mongo 连接其中一台机器的27018 端口的mongod,初始化Replica Sets shard2”,执行:

[root@template ~]# mongo --port 27018

MongoDB shell version: 2.6.0

connecting to: 127.0.0.1:27018/test

>config = {_id: 'shard2', members: [ {_id: 0, host: '192.168.10.150:27018'},{_id: 1, host: '192.168.10.151:27018'},{_id: 2, host: '192.168.10.154:27018'}]}

{

        "_id" : "shard2",

        "members" : [

                {

                        "_id" : 0,

                        "host" : "192.168.10.150:27018"

                },

                {

                        "_id" : 1,

                        "host" : "192.168.10.151:27018"

                },

                {

                        "_id" : 2,

                        "host" : "192.168.10.154:27018"

                }

        ]

}

>  rs.initiate(config)

{

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

        "ok" : 1

}



配置3 Config Server


Server ABC上执行:

mongod --configsvr --dbpath /data/shardset/config --port 20000 --logpath/data/shardset/config/config.log --logappend --fork


配置3 Route Process


Server ABC上执行:

mongos --configdb 192.168.10.150:20000,192.168.10.151:20000,192.168.10.154:20000 --port 30000 --chunkSize 1 --logpath /data/shardset/mongos.log --logappend --fork



配置Shard Cluster


连接到其中一台机器的端口30000 mongos 进程,并切换到admin 数据库做以下配置:

[root@template ~]# mongo --port 30000

MongoDB shell version: 2.6.0

connecting to: 127.0.0.1:30000/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

mongos>

mongos> use admin

switched to db admin

mongos> db.runCommand({addshard:"shard1/192.168.10.150:27017,192.168.10.151:27017,192.168.10.154:27017"});

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

mongos> db.runCommand({addshard:"shard2/192.168.10.150:27018,192.168.10.151:27018,192.168.10.154:27018"});

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

mongos>

激活数据库及集合的分片

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

{ "ok" : 1 }

mongos> db.runCommand({ shardcollection: "test.users", key: { _id:1 }})

{ "collectionsharded" : "test.users", "ok" : 1 }

mongos>


查看配置

mongos> use admin

switched to db admin

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

{

        "shards" : [

                {

                        "_id" : "shard1",

                        "host" : "shard1/192.168.10.150:27017,192.168.10.151:27017,192.168.10.154:27017"

                },

                {

                        "_id" : "shard2",

                        "host" : "shard2/192.168.10.150:27018,192.168.10.151:27018,192.168.10.154:27018"

                }

        ],

        "ok" : 1

}


验证Sharding正常工作


mongos> use test

switched to db test

mongos> for(var i=1;i<=200000;i++) db.users.insert({id:i,addr_1:"Beijing",addr_2:"Shanghai"});

WriteResult({ "nInserted" : 1 })

mongos> db.users.stats()

{

        "sharded" : true,

        "systemFlags" : 1,

        "userFlags" : 1,

        "ns" : "test.users",

        "count" : 200000,

        "numExtents" : 13,

        "size" : 22400000,

        "storageSize" : 33689600,

        "totalIndexSize" : 6908720,

        "indexSizes" : {

                "_id_" : 6908720

        },

        "avgObjSize" : 112,

        "nindexes" : 1,

        "nchunks" : 13,

        "shards" : {

                "shard1" : {

                        "ns" : "test.users",

                        "count" : 147600,

                        "size" : 16531200,

                        "avgObjSize" : 112,

                        "storageSize" : 22507520,

                        "numExtents" : 7,

                        "nindexes" : 1,

                        "lastExtentSize" : 11325440,

                        "paddingFactor" : 1,

                        "systemFlags" : 1,

                        "userFlags" : 1,

                        "totalIndexSize" : 4807488,

                        "indexSizes" : {

                                "_id_" : 4807488

                        },

                        "ok" : 1

                },

                "shard2" : {

                        "ns" : "test.users",

                        "count" : 52400,

                        "size" : 5868800,

                        "avgObjSize" : 112,

                        "storageSize" : 11182080,

                        "numExtents" : 6,

                        "nindexes" : 1,

                        "lastExtentSize" : 8388608,

                        "paddingFactor" : 1,

                        "systemFlags" : 1,

                        "userFlags" : 1,

                        "totalIndexSize" : 2101232,

                        "indexSizes" : {

                                "_id_" : 2101232

                        },

                        "ok" : 1

                }

        },

        "ok" : 1

}


ServerA:

[root@template ~]# mongo --port 27017

MongoDB shell version: 2.6.0

connecting to: 127.0.0.1:27017/test

shard1:PRIMARY> show dbs

admin  (empty)

local  4.076GB

test   0.078GB

shard1:PRIMARY>


ServerB:

[root@template ~]# mongo --port 27017

MongoDB shell version: 2.6.0

connecting to: 127.0.0.1:27017/test

shard1:SECONDARY>

shard1:SECONDARY> show dbs

admin  (empty)

local  4.076GB

test   0.078GB

shard1:SECONDARY>

默认从库是不可查询的,但是执行如下语句则可以查询。

rs.slaveOk();

或者

db.getMongo().setSlaveOk()

做读写分离时上述语句必不可少

 

ServerC:

[root@template ~]# mongo --port 27017

MongoDB shell version: 2.6.0

connecting to: 127.0.0.1:27017/test

shard1:SECONDARY> show dbs

admin  (empty)

local  4.076GB

test   0.078GB

shard1:SECONDARY>

如果想在线切换主从库,需要更改优先级:

[root@template ~]# mongo --port 27017

需要在主库中设置

conf=rs.conf()

conf.members[0].priority=2

conf.members[1].priority=5

conf.members[2].priority=1

rs.reconfig(conf)




查看节点

db.status()

或者

db.isMaster()


查看数据是否开启分片

use config

db.databases.find()


增加节点

db.remove("192.168.10.155:27017")


删除节点

db.add("192.168.10.154:27017")


增加仲裁节点

rs.addArb("192.168.10.155:27017")

rs.isMaster()

"arbiters" : [

                "192.168.10.155:27017"

        ],


创建用户

use admin
db.createUser(
  {
    user: "adminUserName",
    pwd: "userPassword",
    roles:
    [
      {
        roles: "userAdminAnyDatabase",
        db: "admin"
      }
    ]
  }

)


相关内容

热门资讯

白宫发布《科学:新的黄金时代》... 据白宫7月21日消息,白宫科技政策办公室、管理与预算办公室联合发布《科学:新的黄金时代》报告。本次备...
民营商业火箭首次从长三角东海海... 北京时间7月22日10时54分,我国太原卫星发射中心在上海东部海域使用引力一号遥四运载火箭,将搭载的...
美威胁袭伊基础设施,伊朗军方:... △当地时间21日,船只在霍尔木兹海峡航行伊朗武装部队哈塔姆安比亚中央总部当地时间22日发布声明称,美...
扑翼机器人问世:像潜水鸟一样在... 潜鸟、海鸥、海鹦和海燕,是自然界中约100种既能飞行又能游泳的鸟类。这些潜水鸟能够俯冲入水追逐猎物,...
当科学家走进西部脑谷:这里有望... 7月22日,2026天府科学家创新发展大会暨成都科产融合对接活动锦江经开区脑机接口专场在锦江区成功举...
女子身份证丢失后名下出现“吸毒... 四川籍的庞女士定居浙江宁波多年,她怎么也没想到,因丢失身份证一事,竟让她陷入长达7年“自证清白”的困...
省农科院成功研发我省首个高粱全... 近日,记者从省农科院获悉,该院作物资源研究所、农业生物技术研究所联合石家庄博瑞迪生物,成功研制出省内...
消息称AMD与Anthropi... IT之家 7 月 22 日消息,据华尔街日报消息,AMD 与 Anthropic 达成了一项价值数百...
独家!苹果iPhone18系列... 7月22日,中国证券报记者从产业链人士处独家获悉,进入7月,苹果iPhone 18系列手机已在量产,...
29岁的党鑫蕊倒在广西泥泞山路... 7月11日晚一通叮嘱,成了父子最后的对话;几天后父亲在殡仪馆见到一身泥的儿子,才知道“他走得有多难。...