mongodb分片
一般用得比较少,需要较多服务器,还有三种的角色。
一般把mongodb的副本集应用得好就足够用了,可搭建多套mongodb副本集。
mongodb分片技术
mongodb副本集可以解决数据备份,读性能的问题,但由于mongodb副本集是每份数据都是一模一样的,无法解决数据量过大的问题。
mongodb分片技术能够把数据分成两份存储,假如liangqicong.test里面有1亿条数据,分片能够实现5千万左右存储在data1,5千万左右存储在data2
data1、data2需要使用副本集的形式,预防数据丢失。
生产环境如果数据量不大,直接用副本集,大的话,分片+副本集。
mongodb分片集群三种juese
router角色 #mongodb的路由,提供入库,是的分片集群对外透明。router不存储数据。
configsvr角色 #mongodb的配置角色,存储元数据信息。分片集群后端有多分存储,读取数据该去哪个存储上读取,依赖于配置角色,配置角色建议使用副本集。
shardsvr角色 #mongodb的存储角色,存储真正的数据,建议使用副本集。
依赖关系
当用户通过router角色插入数据时,需要从configsvr知道这份数据插入到哪个节点,然后执行插入动作插入数据导sharedsvr。
当用户获取数据时,需要从configsvr知道这份数据时存储在哪个节点,然后再去sharedsvr获取数据。
configsvr配置
systemLog: destination: file #日志路径 logAppend: true #每次启动用追加的模式生成日志 path: /data/mongodb/28017/mongodb.log storage: dbPath: /data/mongodb/28017/ journal: enabled: true #数据日志,避免数据丢失 processManagement: fork: true net: port: 28017 bindIp: 127.0.0.1,172.16.1.52 #监听的ip replication: replSetName: liangqicong sharding: clusterRole: configsvr
进入mongodb
config =
{ "_id" : "liangqicong", "configsvr" : true, "members" : [ { "_id" : 0, "host" : "172.16.1.52:28017" }, { "_id" : 1, "host" : "172.16.1.52:28018" }, { "_id" : 2, "host" : "172.16.1.52:28019" } ] }
router
配置
systemLog: destination: file #日志路径 logAppend: true #每次启动用追加的模式生成日志 path: /data/mongodb/27017/mongodb.log processManagement: fork: true net: port: 27017 bindIp: 127.0.0.1,172.16.1.51 #监听的ip sharding: configDB: liangqicong/172.16.1.52:28017,172.16.1.52:28018,172.16.1.52:28019
mongos -f /data/mongodb/27019/mongodb.conf
shardsvr
数据节点1
systemLog: destination: file #日志路径 logAppend: true #每次启动用追加的模式生成日志 path: /data/mongodb/29017/mongodb.log storage: dbPath: /data/mongodb/29017/ journal: enabled: true #数据日志,避免数据丢失 processManagement: fork: true net: port: 29017 bindIp: 127.0.0.1,172.16.1.53 #监听的ip replication: replSetName: liangqicongdata1 sharding: clusterRole: shardsvr
进入mangodb
config =
{ "_id" : "liangqicongdata1", "members" : [ { "_id" : 0, "host" : "172.16.1.53:29017" }, { "_id" : 1, "host" : "172.16.1.53:29018" }, { "_id" : 2, "host" : "172.16.1.53:29019" } ] }
数据节点2
systemLog: destination: file #日志路径 logAppend: true #每次启动用追加的模式生成日志 path: /data/mongodb/29017/mongodb.log storage: dbPath: /data/mongodb/29017/ journal: enabled: true #数据日志,避免数据丢失 processManagement: fork: true net: port: 29017 bindIp: 127.0.0.1,172.16.1.53 #监听的ip replication: replSetName: liangqicongdata2 sharding: clusterRole: shardsvr
进入mongodb
config = { "_id" : "liangqicongdata2", "members" : [ { "_id" : 0, "host" : "172.16.1.53:29020" }, { "_id" : 1, "host" : "172.16.1.53:29021" }, { "_id" : 2, "host" : "172.16.1.53:29022" } ] }
--------------------------使用---------------------------------
在进入router角色的mongodb
sh.addShard("liangqicongdata1/172.16.1.53:29017,172.16.1.53:29018,172.16.1.53:29019")
sh.addShard("liangqicongdata2/172.16.1.53:29020,172.16.1.53:29021,172.16.1.53:29022")
查看分片集群状态
sh.status()
分片集群操作都是在router角色里面
启动分片功能(先确认liangqicong数据库不存在,因为如果数据库已存在,且有数据,在分片之前,它会先让你在表中建立索引)
db.runCommand({enablesharding:"liangqicong"}) #这里是数据库名
db.runCommand({shardcollection:"liangqicong.test",key:{_id:"hashed"}}) #这里是对数据库里面test表的_id进行hash分片
sh.status()
这里是在什么情况下数据会存进那个数据节点。
hunks: liangqicongdata1 2 { "_id" : { "$minKey" : 1 } } -->> { "_id" : NumberLong(0) } on : liangqicongdata1 Timestamp(1, 0) { "_id" : NumberLong(0) } -->> { "_id" : { "$maxKey" : 1 } } on : liangqicongdata1 Timestamp(1, 1)