1· MongoDB 分片概述
2· 部署 MongoDB 分片群集
3· MongoDB 分片管理
4· 推荐 MongoDB 、MySQL 基础文章
5· 文章总结
1)什么是分片:
1·不用专业的术语说,从字面的意思讲解,就是把一块东西分成很多很多块。
2·稍微专业术语:分片是一种技术,它是使用多个服务器来存放数据,不再是只用一台服务器。这样就可以满足大量的数据写入,如果没有分片技术,使用其他方法那么随着数据量的增加,磁盘空间、服务器压力总会产生问题
3·分片技术是一种将海量数据水平扩展的数据库群集系统,数据分布存储在分片(sharding)的各个节点上,管理者通过简单的配置就可以方便的构建一个分布式 MongoDB 分片群集
2).分片的条件
1:服务器磁盘不够的时候
2:服务器出现写瓶颈的时候
3:想将大量数据放在内存中提高性能
3)MongoDB 分片群集的组成
1· Shard: 分片服务器,用于存储实际的数据,在生产环境中一个 shard server 角色可以由几台服务器组成一个 Replica Set 承担,防止单点故障
2· Config Server :配置服务器,存储了整个分片群集的配置信息,其中包括chunk信息
3· Routers :前端路由,客户端是由它来接入,且让整个群集看上去像单一数据库,前端应用可以透明使用
MongoDB 分片群集的组成如下图
部署前说明:
1· 部署环境: CenOS 7.4
2· MongoDB 的安装这里不再演示,需要的朋友请点击:MongoDB 安装详解
3· 需要源码包的请点击:MongoDB 源码包点击下载密码:tpkt
1)部署开始
1·解压源码包、优化
[root@localhost ~]# tar xvf mongodb-linux-x86_64-3.2.1.tgz -C /opt/
[root@localhost ~]# cd /opt/
[root@localhost opt]# mv mongodb-linux-x86_64-3.2.1 /usr/local/mongodb
[root@localhost opt]# ln -s /usr/local/mongodb/bin/mongo /usr/bin/mongo
[root@localhost opt]# ln -s /usr/local/mongodb/bin/mongod /usr/bin/mongod
2·创建日志文件和存储文件的路径
[root@localhost opt]# mkdir -p /data/mongodb/mongodb{1,2,3,4} ----(可以连续创建4个数据储存目录)
[root@localhost opt]# cd /data/mongodb/
[root@localhost mongodb]# mkdir logs
[root@localhost mongodb]# touch mongodb{1,2,3,4}.log ----(创建日志文件)
[root@localhost mongodb]# chmod 777 .log ---(赋予权限)
[root@localhost mongodb]# ulimit -n 25000 ----(调高shell系统所暂用的资源比例)
[root@localhost mongodb]# ulimit -u 25000 ----(放大文件数量)
3·添加配置文件
[root@localhost mongodb]# vim /usr/local/mongodb/bin/mongodb1.conf ---(添加配置文件)
添加内容如下:
- > port=37017 ----(配置服务器端口)
- > dbpath=/data/mongodb/mongodb1 ----(数据存储目录)
- > logpath=/data/mongodb/logs/mongodb1.log ----(指定日志文件存储目录)
- > logappend=true -----(使用追加方式写日志)
- > maxCOnns=5000 -----(最大链接数)
- > fork=true -----(后台运行)
- > storageEngine=mmapv1 -----(指定存储引擎为内存映射文件)
- > cOnfigsvr=true -----(模式为配置服务器模式)
当一个节点可用内存不足时,系统会从其他几点分配内存
[root@localhost mongodb]# sysctl -w vm.zone_reclaim_mode=0
[root@localhost mongodb]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@localhost mongodb]# echo never > /sys/kernel/mm/transparent_hugepage/defrag
到这里配置服务器已经配置完毕,接下来会配置第一个分片服务器:
[root@localhost mongodb]# cd /usr/local/mongodb/bin/
[root@localhost bin]# cp -p mongodb1.conf mongodb2.conf ---(把配置文件复制一份出来,稍作修改)
[root@localhost bin]# vim mongodb2.conf ---(修改内容如下)
加粗内容需要注意与修改:
- > port=47017 ---(这里的端口号需要修改)
- > dbpath=/data/mongodb/mongodb2 ---(数据存储路径修改)
- > logpath=/data/mongodb/logs/mongodb2.log ----(日志存储路径修改)
- > logappend=true
- > maxCOnns=5000
- > fork=true
- > storageEngine=mmapv1
- > shardsvr=true ----(这里是最重要的,这里的模式就是代表分片模式)
配置第二个分片服务器,方法如下:
[root@localhost bin]# cp -p mongodb2.conf mongodb3.conf ---(在复制一份配置文件)
[root@localhost bin]# vim mongodb3.conf ---(修改内容如下)
修改内容如下:
- > port=47018 ----(端口号需要修改)
- > dbpath=/data/mongodb/mongodb3 ----(数据存储路径)
- > logpath=/data/mongodb/logs/mongodb3.log ---(日志文件)
- > logappend=true
- > maxCOnns=5000
- > fork=true
- > storageEngine=mmapv1
- > shardsvr=true
开启3台实例服务:
开启前端路由模式,这里不明白的可以看看上面的组成图:
显示如下字符,开启成功
2018-09-18T16:03:49.695+0800 W SHARDING [main] Running a sharded cluster with fewer than 3 config servers should only be done for testing purposes and is not recommended for production.
about to fork child process, waiting until server is ready for connections.
forked process: 41001
child process started successfully, parent exiting
现在可以进入 MongoDB 服务器
[root@localhost bin]# mongo
添加两台分片服务器:
mongos> sh.addShard("192.168.106.154:47017") ---(这里注意把端口号写正确)
{ "shardAdded" : "shard0000", "ok" : 1 }
mongos> sh.addShard("192.168.106.154:47018")
{ "shardAdded" : "shard0001", "ok" : 1 }
查看分片服务器状态信息:
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5ba0b1655ba2e21d63505818")
}
shards:
> { "_id" : "shard0000", "host" : "192.168.106.154:47017" }
> { "_id" : "shard0001", "host" : "192.168.106.154:47018" }
active mongoses:
"3.2.1" : 1
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
No recent migrations
databases:
写入五万条数据,等待测验
mongos> for(var i=1;i<=50000;i++)db.school.insert({"id":i,"name":"tpm"+i})
WriteResult({ "nInserted" : 1 }) ----(利用 for 循环添加,只是为了验证后面分片存储)
查看信息是否写入,就看前五条即可,因为数据太多。
mongos> db.school.find().limit(5)
{ "_id" : ObjectId("5ba0b3c6dcdebde5a87ce165"), "id" : 1, "name" : "tpm1" }
{ "_id" : ObjectId("5ba0b3c6dcdebde5a87ce166"), "id" : 2, "name" : "tpm2" }
{ "_id" : ObjectId("5ba0b3c6dcdebde5a87ce167"), "id" : 3, "name" : "tpm3" }
{ "_id" : ObjectId("5ba0b3c6dcdebde5a87ce168"), "id" : 4, "name" : "tpm4" }
{ "_id" : ObjectId("5ba0b3c6dcdebde5a87ce169"), "id" : 5, "name" : "tpm5" }
对 test 这个库进行分片处理,默认写入数据就是写入 test
mongos> sh.enableSharding("test")
{ "ok" : 1 }
对集合建立索引
mongos> db.school.createIndex({"id":1}) ----(建立索引以 id 为列)
{
"raw" : {
"192.168.106.154:47017" : {
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
},
"ok" : 1
}
对test.shcool这个数据库中的这个school集合进行分片,指定索引为 id:1
mongos> sh.shardCollection("test.school",{"id":1}) ----(开始分片)
{ "collectionsharded" : "test.school", "ok" : 1 }
查看分片状态:
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5ba0b1655ba2e21d63505818")
}
shards:
{ "_id" : "shard0000", "host" : "192.168.106.154:47017" }
{ "_id" : "shard0001", "host" : "192.168.106.154:47018" }
active mongoses:
"3.2.1" : 1
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
5 : Success
databases:
{ "_id" : "test", "primary" : "shard0000", "partitioned" : true }
test.school
shard key: { "id" : 1 }
unique: false
balancing: true
chunks:
shard0000 6
shard0001 5 -----(两个分片)
以下是把五万条数据分片存储
{ "id" : { "$minKey" : 1 } } -->> { "id" : 4682 } on : shard0001 Timestamp(2, 0)
{ "id" : 4682 } -->> { "id" : 9364 } on : shard0001 Timestamp(3, 0)
{ "id" : 9364 } -->> { "id" : 14046 } on : shard0001 Timestamp(4, 0)
{ "id" : 14046 } -->> { "id" : 18728 } on : shard0001 Timestamp(5, 0)
{ "id" : 18728 } -->> { "id" : 23410 } on : shard0001 Timestamp(6, 0)
{ "id" : 23410 } -->> { "id" : 28092 } on : shard0000 Timestamp(6, 1)
{ "id" : 28092 } -->> { "id" : 32774 } on : shard0000 Timestamp(1, 6)
{ "id" : 32774 } -->> { "id" : 37456 } on : shard0000 Timestamp(1, 7)
{ "id" : 37456 } -->> { "id" : 42138 } on : shard0000 Timestamp(1, 8)
{ "id" : 42138 } -->> { "id" : 46820 } on : shard0000 Timestamp(1, 9)
{ "id" : 46820 } -->> { "id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 10
现在来模拟,由于大量的数据,导致空间不足,这时我们需要添加分片服务器:
[root@localhost bin]# cp mongodb3.conf mongodb4.conf --(复制配置文件)
[root@localhost bin]# vim mongodb4.conf ---(做如下修改)
修改内容如下:
port=47019
dbpath=/data/mongodb/mongodb4
logpath=/data/mongodb/logs/mongodb4.log
logappend=true
maxCOnns=5000
fork=true
storageEngine=mmapv1
shardsvr=true
[root@localhost bin]# mongod -f mongodb4.conf ---(启动第4个实例)
[root@localhost bin]# mongo ----(进入mongo)
mongos> sh.addShard("192.168.106.154:47019")
{ "shardAdded" : "shard0002", "ok" : 1 } ---(再次添加一台分片服务器)
再次查看状态, 我们会发现会自动重新分片到新的服务器中
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5ba0b1655ba2e21d63505818")
}
shards:
{ "_id" : "shard0000", "host" : "192.168.106.154:47017" }
{ "_id" : "shard0001", "host" : "192.168.106.154:47018" }
{ "_id" : "shard0002", "host" : "192.168.106.154:47019" }
active mongoses:
"3.2.1" : 1
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
8 : Success
databases:
{ "_id" : "test", "primary" : "shard0000", "partitioned" : true }
test.school
shard key: { "id" : 1 }
unique: false
balancing: true
chunks:
shard0000 4 ------(又加入一个分片服务器)
shard0001 4
shard0002 3
{ "id" : { "$minKey" : 1 } } -->> { "id" : 4682 } on : shard0002 Timestamp(9, 0)
{ "id" : 4682 } -->> { "id" : 9364 } on : shard0001 Timestamp(9, 1)
{ "id" : 9364 } -->> { "id" : 14046 } on : shard0001 Timestamp(4, 0)
{ "id" : 14046 } -->> { "id" : 18728 } on : shard0001 Timestamp(5, 0)
{ "id" : 18728 } -->> { "id" : 23410 } on : shard0001 Timestamp(6, 0)
{ "id" : 23410 } -->> { "id" : 28092 } on : shard0002 Timestamp(7, 0)
{ "id" : 28092 } -->> { "id" : 32774 } on : shard0002 Timestamp(8, 0)
{ "id" : 32774 } -->> { "id" : 37456 } on : shard0000 Timestamp(8, 1)
{ "id" : 37456 } -->> { "id" : 42138 } on : shard0000 Timestamp(1, 8)
{ "id" : 42138 } -->> { "id" : 46820 } on : shard0000 Timestamp(1, 9)
{ "id" : 46820 } -->> { "id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 10)
结论:我们可以知道,重新添加分片服务器会让数据进行重新分片,并不会影响什么,同理,删除一台分片服务器,那么数据一样会重新重整数据,进行分片。这样的话,我们几乎就不需要在做分片服务器的集群,因为分片服务器本来就可以添加多台,无论是否挂掉都不会影响什么。
还可以给分片服务器贴上自己容易记住的标签:
mongos> sh.addShardTag("shard0000","abc00")
mongos> sh.addShardTag("shard0001","abc01")
mongos> sh.addShardTag("shard0002","abc02")
可以再次查看分片服务器:
shards:
{ "_id" : "shard0000", "host" : "192.168.106.154:47017", "tags" : [ "abc00" ] }
{ "_id" : "shard0001", "host" : "192.168.106.154:47018", "tags" : [ "abc01" ] }
{ "_id" : "shard0002", "host" : "192.168.106.154:47019", "tags" : [ "abc02" ] }
下图是数据分片的截图,让效果更加直观,重点会又标记:
MongoDB 数据库安装:http://blog.51cto.com/13746824/2174874
MongoDB 复制集 + 选举原理:http://blog.51cto.com/13746824/2175720
详解 MySQL 高可用群集,MMM搭建高可用:http://blog.51cto.com/13746824/2173073
Amoeba 代理 MySQL 主从复制 + 读写分离:http://blog.51cto.com/13746824/2172139
MongoDB 分片通过在多台服务器上分割数据,使得数据库系统能存储和处理更多的数据
MongoDB 分片群集主要如下三个组件:可以参考文章第一张图:Shard 分片服务器、Config Server 配置服务器、Routers 前端路由
重新添加分片服务器会让数据进行重新分片,并不会影响什么,同理,删除一台分片服务器,那么数据一样会重新重整数据,进行分片!