mongo复制集+分片实现海量数据存储-创新互联

   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 Sets“shard1”,执行:

[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

}

配置3Config Server

Server ABC上执行:

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

配置3Route 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"
     }
   ]
 }

)

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


标题名称:mongo复制集+分片实现海量数据存储-创新互联
网址分享:http://pwwzsj.com/article/dcjgsg.html