MongoDB分片

版本

mongodb-linux-x86_64-3.2.12

分片的概念

为了突破单点数据库服务器的I/O能力限制,对数据库存储进行水平扩展。严格地说,每一个服务器或者实例或者复制集就是一个分片。

分片的优势

(1)提供类似线性增长架构

(2)提高数据库可用性

(3)提高大型数据库查询服务性能

什么时候需要分片

(1)单点数据库服务器存储成为瓶颈

(2)单点数据库服务器的性能成为瓶颈

(3)大型应用分散数据以充分利用内存

如何部署分片

路由实例:接收客户端请求

配置实例:分片及复制集的配置信息

 

服务器角色及相关配置文件

服务器

角色

标志

127.0.0.1:47017

分片服务器(主)

shard1

127.0.0.1:47018

分片服务器

Shard2

127.0.0.1:37017

配置实例服务器

configs

127.0.0.1:27017

路由服务器

route

127.0.0.1:47019

分片服务器(从)

shard1

 

 

[root@iZ4jc05d2ictd0xzg4lzteZ opt]# vi mongodbshard1.cnf

 

dbpath=/opt/mongodb/datashard1

port=47017

logpath=/opt/mongodb/logs

fork=true

logappend=true

shardsvr=true

replSet=shard1

 

[root@iZ4jc05d2ictd0xzg4lzteZ opt]# vi mongodbshard2.cnf

 

dbpath=/opt/mongodb/datashard2

port=47018

logpath=/opt/mongodb/logs

fork=true

logappend=true

shardsvr=true

replSet=shard2

 

[root@iZ4jc05d2ictd0xzg4lzteZ opt]# vi mongodbshard3.cnf

 

dbpath=/opt/mongodb/datashard3

port=37017

logpath=/opt/mongodb/logs

fork=true

logappend=true

configsvr=true

replSet=configs

 

[root@iZ4jc05d2ictd0xzg4lzteZ opt]# vi mongodbshard6.cnf

 

dbpath=/opt/mongodb/datashard5

port=47019

logpath=/opt/mongodb/logs

fork=true

logappend=true

shardsvr=true

replSet=shard1

 

启动并初始化相关服务

./mongod -f /opt/mongodbshard1.cnf

./mongo  --port 47017

cfg={_id:'shard1',members:[ {_id:0,host:'127.0.0.1:47017'} ]}

rs.initiate(cfg)

 

 

./mongod -f /opt/mongodbshard2.cnf

./mongo  --port 47018

cfg={_id:'shard2',members:[ {_id:0,host:'127.0.0.1:47018'} ]}

rs.initiate(cfg)

 

 

./mongod -f /opt/mongodbshard3.cnf

./mongo  --port 37017

cfg={_id:'configs',members:[ {_id:0,host:'127.0.0.1:37017'} ]}

rs.initiate(cfg)

 添加相关分片

[root@iZ4jc05d2ictd0xzg4lzteZ bin]# ./mongos --port 27017  --fork --logappend  --logpath /opt/mongodb/route.log  --configdb configs/127.0.0.1:37017  --chunkSize 1

设置1M是为了测试,否则要插入大量数据才能分片。

[root@iZ4jc05d2ictd0xzg4lzteZ bin]# ./mongo --port 27017

 

mongos> use admin

 

mongos> sh.addShard("shard1/127.0.0.1:47017")

{

        "shardAdded" : "shard1",

        "ok" : 1,

        "operationTime" : Timestamp(1551230697, 10),

        "$clusterTime" : {

                "clusterTime" : Timestamp(1551230697, 10),

                "signature" : {

                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),

                        "keyId" : NumberLong(0)

                }

        }

}

db.runCommand( { enablesharding :"testdb"}); //指定分片的库

 

db.runCommand( { shardcollection : "testdb.table1",key : {id: 1} } ) //指定分片的ns及相关的分片健

 

mongos> for (var i=100001;i<=200000;i++){

... db.table1.insert({id:i,name:"hxf"})

... }

for (var i=1;i<=100000;i++){ db.table1.insert({id:i,name:"hxf"}) }   //向分片的集合写入相关数据

此时生产11chunkSize全部存放在shard1

 

mongos> sh.addShard("shard2/127.0.0.1:47018") //加入shard2

{

        "shardAdded" : "shard2",

        "ok" : 1,

        "operationTime" : Timestamp(1551230802, 4),

        "$clusterTime" : {

                "clusterTime" : Timestamp(1551230802, 4),

                "signature" : {

                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),

                        "keyId" : NumberLong(0)

                }

        }

}

此时生产11chunkSize 放在shard1中为6个,shard2中为5个,均匀分配

删除相关分片

mongos> db.runCommand( { removeshard: "shard2" } )

此时生产11chunkSize 放在shard1中为11个,shard2中为0个,均匀分配

 

mongos> use config

mongos> db.shards.find() //将该集合的shard2的记录删除掉

 

分片服务器的主从复制配置

./mongod -f /opt/mongodbshard6.cnf

./mongod -f /opt/mongodbshard1.cnf

./mongo  --port 47017

cfg={_id:'shard1',members:[ {_id:0,host:'127.0.0.1:47017'},{_id:1,host:'127.0.0.1:47019'} ]}

rs.initiate(cfg)

 

 

./mongod -f /opt/mongodbshard2.cnf

./mongo  --port 47018

cfg={_id:'shard2',members:[ {_id:0,host:'127.0.0.1:47018'} ]}

rs.initiate(cfg)

 

 

./mongod -f /opt/mongodbshard3.cnf

./mongo  --port 37017

cfg={_id:'configs',members:[ {_id:0,host:'127.0.0.1:37017'} ]}

rs.initiate(cfg)

 

[root@iZ4jc05d2ictd0xzg4lzteZ bin]# ./mongos --port 27017  --fork --logappend  --logpath /opt/mongodb/route.log  --configdb configs/127.0.0.1:37017  --chunkSize 1

 

[root@iZ4jc05d2ictd0xzg4lzteZ bin]# ./mongo --port 27017

 

mongos> sh.addShard("shard1/127.0.0.1:47017,127.0.0.1:47019")

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

 

此时能够实现主从备份,但由于水平有限,在故障时不能实现主从切换

 

 

当前分片实例的查看

sh.status()

 

 

 

分片需要索引及相关原则

                                                                 

uid 顺序增长 且 唯一

按uid分片

 

 

sex:1,2,3,使用的是固定值按sex分片

salary:2000-7000 的随机值,按saraly分片

 

 

原则:结合业务需求,尽可能选择存储分片均匀的键

(1)字段的值有限

     结果:理论上分片有限

(2)时间戳或者自动增长ID

    结果:数据大多都逻辑连续和顺序地插入到一个分片上

    优点:无限数量的字段值,提供无限数量的分片

    缺点:单一且不可分散的热点

(3)随机片键

    优点:分散热点

    缺点:数据越大,性能越差

(4)结合业务特点,组合的搜索条件就是片键

   结果:高效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值