十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
高数据量和吞吐量的数据库应用会对单机的性能造成较大的压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。
创新互联公司主营永清网站建设的网络公司,主营网站建设方案,APP应用开发,永清h5成都小程序开发搭建,永清网站营销推广欢迎永清等地区企业咨询
MongoDB分片是使用多个服务器储存数据的方法,以支持巨大的数据存储和对数据进行操作。分片技术可以满足MongoDB数据量大量增长的需求,当一台MongoDB服务器不足以存储海量数据或者不足以能提供可接受打读写吞吐量时,我们可以通过在多台服务器上分割数据,使得数据库系统能存储和处理更多的数据。
分片为应对吞吐量和大数据量提供了方法。
1、使得分片减少了每个分片需要处理的请求数,因此,通过水平扩展,群集可以提高自己的存储容量和吞吐量。比如,当插入一条数据时,应用只需要访问存储这条数据的分片。
2、使用分片减少了每个分片存储的数据。
如下图所示,假设一个collection中有1TB的数据,通过分片可以将1TB数据分片到四个shard中,当查询对应数据时,就会去对应的分片服务器查询,可以提高数据可用性。
MongoDB分片集群主要有三个主要组件:
1、Shard:分片服务器,用于存储实际的数据块,实际生产环境中一个shard server角色可以由几台服务器组成一个复制集(Replica Set)承担,防止主机单点故障。
2、Config Server:配置服务器,存储了整个分片群集的配置信息,其中包括chunk信息。
3、Routers:前端路由,客户端由此接入,且让整个群集看上去像单一数据库,前端应用可以透明使用。
这里实验是在同一台服务器上搭建MongoDB分片,但是MongoDB3.4以后Shard默认都是要搭建MongoDB服务集,为了方便起见,我们使用的MongoDB版本是3.2的。
组件 | 端口号 |
---|---|
路由实例 | 27017 |
配置实例 | 37017 |
Shard1实例 | 47017 |
Shard2实例 | 47018 |
安装相关依赖包和解压软件到指定目录中。
[root@localhost ~]# yum install openssl-devel -y #安装依赖包
[root@localhost ~]# tar xfvz 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]# mkdir -p /data/mongodb/mongodb{1,2,3,4}
#创建实例的数据存储目录
[root@localhost opt]# mkdir /data/mongodb/logs
#创建实例的日志目录
[root@localhost opt]# touch /data/mongodb/logs/mongodb{1,2,3,4}.log
#创建实例的日志文件
[root@localhost opt]# chmod -R 777 /data/mongodb/logs/*.log
#修改日志权限
[root@localhost opt]# ulimit -n 25000
#将可以打开的最大进程数修改为25000
[root@localhost opt]# ulimit -u 25000
#将可以打开的最大文件数修改为25000
[root@localhost opt]# sysctl -w vm.zone_reclaim_mode=0
#当某个节点可用内存不足时,如果为0的话,那么系统会倾向于从其他节点分配内存。如果为1的话,那么系统会倾向于从本地节点回收Cache内存多数时候。
[root@localhost opt]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@localhost opt]# echo never > /sys/kernel/mm/transparent_hugepage/defrag
#当节点可用内存不足时,选择关闭占内存多的大页面
[root@localhost opt]# export PATH=$PATH:/usr/local/mongodb/bin/
#将MongoDB路径添加到环境变量中
[root@localhost bin]# vim mongodb1.conf
#创建配置服务器的配置文件
port=37017
dbpath=/data/mongodb/mongodb1
logpath=/data/mongodb/logs/mongodb1.log
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
configsvr=true #设置为配置服务器
[root@localhost mongodb]# mongod -f /usr/local/mongodb/bin/mongodb1.conf
#启动配置服务器进程
编辑mongodb2.conf配置文件,端口为47017,设置为shardsvr=true,同样编辑mongodb3.conf,端口为47018,shardsvr=true,然后同时启动。
[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
fork=true
maxConns=5000
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
fork=true
maxConns=5000
storageEngine=mmapv1
shardsvr=true
都修改完后,将两个分片服务器启动。
[root@localhost bin]# ./mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.58.131:37017 --chunkSize 1
#这条命令意思就是凡事访问mongodb 27017端口的,都会转到 192.168.58.131:37017上面
[root@localhost bin]# ./mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.58.131:37017 --chunkSize 1
2018-07-17T17:20:58.990+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: 6430
child process started successfully, parent exiting
[root@localhost ~]# mongo
MongoDB shell version: 3.2.1
connecting to: test
Server has startup warnings:
2018-07-17T17:20:59.120+0800 I CONTROL [main] ** WARNING: You are running this process as the root user, which is not recommended.
2018-07-17T17:20:59.120+0800 I CONTROL [main]
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5b4db4fdf19287c74d1a4081")
}
shards:
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:
#可以看到shards下面为空,所以我们需要将两个分片服务器添加进去
mongos> sh.addShard("192.168.58.131:47017")
#将47017端口的分片服务器添加进去
{ "shardAdded" : "shard0000", "ok" : 1 }
mongos> sh.addShard("192.168.58.131:47018")
#将47018端口的分片服务器添加进去
{ "shardAdded" : "shard0001", "ok" : 1 }
进行测试,查看是否能够进行分片功能,我们创建一个collection,在里面插入50000条数据。
mongos> use test
switched to db test
mongos> for(var i=1;i<=50000;i++) db.users.insert({"id":i,"name":"tom"+i})
#利用for循环往collection中插入50000条数据
mongos> db.users.find().limit(10)
#查看collection中的前10条数据,表示插入成功。
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5b4db4fdf19287c74d1a4081")
}
shards:
{ "_id" : "shard0000", "host" : "192.168.58.131:47017" }
{ "_id" : "shard0001", "host" : "192.168.58.131: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:
{ "_id" : "test", "primary" : "shard0000", "partitioned" : false }
#可以看到partitioned:false,说明并没有进行分片。
mongos> sh.enableSharding("test")
{ "ok" : 1 }
#启用分片功能
mongos> sh.status()
{ "_id" : "test", "primary" : "shard0000", "partitioned" : true }
mongos> db.users.createIndex({"id":1})
{
"raw" : {
"192.168.58.131:47017" : {
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
},
"ok" : 1
}
#创建索引,方便分片
mongos> sh.shardCollection("test.users",{"id":1})
{ "collectionsharded" : "test.users", "ok" : 1 }
#执行分片,可以看到分片成功1-20165,写入到shard0001中,20166-50000写入到shard0000中