#昊鼎王五:mongodb的副本集与分片的对比?
本文基于:《昊鼎王五:linux(centos7)如何七分钟搭建mongodb集群服务器?》
https://blog.csdn.net/haoding205/article/details/82253048
每个shard 片区都是一个副本集(Replica Set) 每个片区都有一个主的服务可以写入还有N个副本的数据备份,几个片区的数据加起来就一个完整的数据集
##1.2、config配置服务
配置服务器相当于集群的大脑,保存着集群和分片的配置信息。因此,应该首先建立配置服务器,鉴于它所包含的的数据极端重要性,必须启用其日志功能,并确保其数据保存在非易失性驱动器上。每个配置服务器都应该位于单独的物理机上,最好是分布在不同地址位置的机器上。(注:在测试环境上配置服务可以开一个,但是在生产环境,则要开3个或以上。如:一个数据中心,数据分布在,北京、上海、广州,则在每个区域都需要启动一个配置服务)
##1.3、mongos路由服务
相当于进入集群的一个路由器、可以启动任意数量的mongos进程。其职责是隐藏分片内部的复杂性并向用户提供一个简洁的单服务器接口。ssssss通常的设置时每个应用程序服务器使用一个mongos进程(与应用服务器运行在同一台机器上)
Mongo中对数据的分割
Mongodb使用基于区间的方法来划分片区如下
Mongo中多以[a,b)来表示区间范围
假如我们有四个分片区以用户名做为片键,用户名都以”a” 到 “z”之间的字母开头,其可表示的区间范围为[a, }),} 是ASCII码表中字母z后面的字符。分区大致如下图
#2.片键选择
拆分数据最常用的数据分发方式有三种:升序片键、随机分发的片键和基于位置的片键。
##2.1.升序片键:升序片键通常有点类似于"date"字段或者是ObjectId,是一种随着时间稳定增长的字段。缺点:例如ObjectId可能会导致接下来的所有的写入操作都在同一块分片上。
如:db.runCommand( { shardcollection : "dydb.user ",key : {_id : 1} } )
##2.2.随机分发的片键:随机分发的片键可以是用户名,邮件地址,UDID,MD5散列值或者数据集中其他一些没有规律的键。缺点:MongoDB在随机访问超出RAM大小的数据时效率不高。
如:db.runCommand( { shardcollection : "dydb.user ",key : {username : 1} } )
##2.3.基于位置的片键:基于位置的片键可以是用户的IP、经纬度、或者地址。这里的"位置"比较抽象,不必与实际的物理位置字段相关。
如果希望特定范围内的块出现在特定的分片中,可以为分片添加tag,然后为块指定相应的tag
如:
1、为分片指定tag:sh.addShardTag('shardName','tagName')
mongos> sh.addShardTag("mablevi","AAA")
mongos> sh.addShardTag("shard0000","BBB")
2、为tag指定规则:sh.addTagRange('库.集合',{minkey:num},{maxkey:num},tagName)
mongos> sh.addTagRange("abc.number",{"num":0},{"num":20},"AAA")
mongos> sh.addTagRange("abc.number",{"num":21},{"num":50},"BBB")
(1和2的意思是把分片mablevi、shard000指定AAA、BBB标签。并且0到20的数据写到AAA标签里,21到50的数据写到BBB标签里。其他范围的数据也可以写进)
3、删除分片
use admin
db.runCommand({"removeshard" : "s3"});
##2.4.片键规则和指导方针:
1、 片键限制:片键不可以是数组。文档一旦插入,其片键就无法修改了。要修改文档的片键值,就必须先删除文档。
2、 片键的势:选择一个值会变化的的键非常重要,即值很多,随着数据量的增大可以分出更多的片键。分片在势比较高的字段上性能更佳。
数据均衡:
1、均衡器:均衡器只使用块的数量,而非数据大小,作为衡量分片间是否均衡的指标。自动均衡总是根据数据集的当前状态来决定数据迁移,而不考虑数据集历史状态。我们可以手动均衡数据集块的数量。
2、修改块的大小:块的大小默认为64M,这个大小的块既易于迁移,又不至于导致过多的流失。使用shell连接到mongos,修改config.setting集合,从而完成块大小的修改。
如果MongoDB频繁进行数据迁移或文档增大,则可能需要增加块的大小。
3、迁移块:同一块内的所有数据都位于同一分片上。如该分片的块数量比其他分片多,则MongoDB会将其中的一部分块迁移到其他块数量较少的分片上。移动快的过程叫迁移,MongoDB就是这样在集群中
#3.副本集的操作:
##3.1主从及副本权重关系
###3.1.1主从切换
rs.stepDown([secs])
###3.1.2副本集权重设置
配置过程:
通过修改priority的值来实现(默认的优先级是1(0-100),priority的值设的越大,就优先成为主)
1)PRIMARY> config=rs.conf()
2)PRIMARY>config.members[1].priority = 3
3)PRIMARY> rs.reconfig(config)
config=rs.conf()
config.members[1].priority = 2
rs.reconfig(config)
##3.2复制节点的增减
###3.2.1.增加复制节点
./mongo -port 77018
shard2:PRIMARY> rs.add('192.168.1.293:77018');
{ "ok" : 1 }
shard2:PRIMARY> rs.config();
shard2:PRIMARY> rs.status();
###3.2.2.减少复制节点
./mongo -port 77018
shard2:PRIMARY> rs.remove('virtual-node.com:67020');
{ "ok" : 1 }
shard2:PRIMARY> rs.status();
##3.3均衡器管理
db.locks.findOne({'_id':'balancer'})
db.settings.find({'_id':'balancer'})
sh.getBalancerState()
sh.setBalancerState(true)
sh.setBalancerState(false)
db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "23:00", stop : "6:00" } } }, true )
##3.4可以通过下面的方式查看当前是否有迁移在进行:
while(db.locks.findOne({'_id':'balancer'}).state){print('wating...');sleep(1000)}
##3.5释放空间
db.repairDatabase()
##3.6查看复制集
db.printReplicationInfo()
db.printSlaveReplicationInfo()
##3.7查看连接状态
> db.serverStatus().connections
{ "current" : 224, "available" : 400317, "totalCreated" : 632 }
>
##3.8监控集群
mongostat --authenticationDatabase admin -u root -p root --port 90000
#4分片的操作
##4.1.添加分片
use admin
db.runCommand({addshard:"shard1/192.168.1.101:27017,192.168.1.102:27017,192.168.1.103:27017", name:"s1", maxsize:20480});
db.runCommand({addshard:"shard2/192.168.1.101:27018,192.168.1.102:27018,192.168.1.103:27018", name:"s2", maxsize:20480});
db.runCommand({addshard:"shard3/192.168.1.101:27019,192.168.1.102:27019,192.168.1.103:27019", name:"s3", maxsize:20480});
##4.2.单分片
db.runCommand({addshard:"192.168.1.101:27017"});
db.runCommand({addshard:"192.168.1.102:27017"});
db.runCommand({addshard:"192.168.1.103:27017"});
db.runCommand({addshard:"192.168.1.101:27018"});
db.runCommand({addshard:"192.168.1.102:27018"});
db.runCommand({addshard:"192.168.1.103:27018"});
db.runCommand({addshard:"192.168.1.101:27019"});
db.runCommand({addshard:"192.168.1.102:27019"});
db.runCommand({addshard:"192.168.1.103:27019"});
##4.3.删除分片
use admin
db.runCommand({"removeshard" : "s3"});
##4.4.打印分片状态
db.printShardingStatus();
##4.5.指定dbname分片生效
db.runCommand( { enablesharding :"dbname"});
##4.6.指定数据库里需要分片的集合和片键
db.runCommand( { shardcollection : "testdb.c1",key : {id: 1} } )
##4.7.chunks表分片
db.fs.chunks.ensureIndex({files_id: 1});
db.runCommand( { enablesharding :"dbname"});
db.runCommand( { shardcollection : "dbname.fs.chunks",key : {files_id : 1} } )
##4.8.hashed key 分片
db.runCommand( { shardcollection : "dbname.fs.chunks",key : {files_id : "hashed"} } )
db.runCommand( { shardcollection : "dbname.fs.files",key : {_id : 1,filename:1} } )
##4.9.查看chunks状态
use dbname
db.fs.chunks.stats();
##4.10.插入测试数据
for (var i = 1; i <= 100000; i++){
db.c1.save({id:i,"name":"testval"+i});
}
##4.11.统计
db.c1.stats()
##4.12.如何查看shard信息
登上mongos
sh.status()或者需要看详细一点
sh.status({verbose:true})
use config
db.settings.save( { _id:"chunksize", value: 1024} )
db.settings.save( { _id:"chunksize", value: 512} )
好了,聪明如你,知道了mongodb的副本集与分片的对比,是不是很欢喜 _