部署MongoDB分片群集

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了部署MongoDB分片群集相关的知识,希望对你有一定的参考价值。

部署MongoDB分片群集

分片概述

高数据量和吞吐量的数据库应用会对单机的性能造成较大的压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。

MongoDB分片是使用多个服务器储存数据的方法,以支持巨大的数据存储和对数据进行操作。分片技术可以满足MongoDB数据量大量增长的需求,当一台MongoDB服务器不足以存储海量数据或者不足以能提供可接受打读写吞吐量时,我们可以通过在多台服务器上分割数据,使得数据库系统能存储和处理更多的数据。

MongoDB分片优势

分片为应对吞吐量和大数据量提供了方法。

1、使得分片减少了每个分片需要处理的请求数,因此,通过水平扩展,群集可以提高自己的存储容量和吞吐量。比如,当插入一条数据时,应用只需要访问存储这条数据的分片。

2、使用分片减少了每个分片存储的数据。

如下图所示,假设一个collection中有1TB的数据,通过分片可以将1TB数据分片到四个shard中,当查询对应数据时,就会去对应的分片服务器查询,可以提高数据可用性。

MongoDB分片群集组成

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

分片群集部署

1、部署配置服务器

安装相关依赖包和解压软件到指定目录中。

[[email protected] ~]# yum install openssl-devel -y   #安装依赖包
[[email protected] ~]# tar xfvz mongodb-linux-x86_64-3.2.1.tgz -C /opt/
[[email protected] ~]# cd /opt/
[[email protected] opt]# mv mongodb-linux-x86_64-3.2.1/ /usr/local/mongodb
#将软件包重命名,方便下面使用

将即将创建的实例所需要的数据目录,日志目录和日志文件先创建好。

[[email protected] opt]# mkdir -p /data/mongodb/mongodb{1,2,3,4}
#创建实例的数据存储目录
[[email protected] opt]# mkdir /data/mongodb/logs
#创建实例的日志目录
[[email protected] opt]# touch /data/mongodb/logs/mongodb{1,2,3,4}.log
#创建实例的日志文件
[[email protected] opt]# chmod -R 777 /data/mongodb/logs/*.log
#修改日志权限
[[email protected] opt]# ulimit -n 25000
#将可以打开的最大进程数修改为25000
[[email protected] opt]# ulimit -u 25000
#将可以打开的最大文件数修改为25000
[[email protected] opt]# sysctl -w vm.zone_reclaim_mode=0
#当某个节点可用内存不足时,如果为0的话,那么系统会倾向于从其他节点分配内存。如果为1的话,那么系统会倾向于从本地节点回收Cache内存多数时候。
[[email protected] opt]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[[email protected] opt]# echo never > /sys/kernel/mm/transparent_hugepage/defrag
#当节点可用内存不足时,选择关闭占内存多的大页面
[[email protected] opt]# export PATH=$PATH:/usr/local/mongodb/bin/
#将MongoDB路径添加到环境变量中
[[email protected] 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   #设置为配置服务器
[[email protected] mongodb]# mongod -f /usr/local/mongodb/bin/mongodb1.conf 
#启动配置服务器进程

技术分享图片

2、配置分片服务器

编辑mongodb2.conf配置文件,端口为47017,设置为shardsvr=true,同样编辑mongodb3.conf,端口为47018,shardsvr=true,然后同时启动。

[[email protected] mongodb]# cd /usr/local/mongodb/bin/
[[email protected] bin]# cp -p mongodb1.conf mongodb2.conf 
[[email protected] 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   #设置为分片服务器

[[email protected] bin]# cp -p mongodb2.conf mongodb3.conf 
[[email protected] 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

都修改完后,将两个分片服务器启动。
技术分享图片

3、启动路由服务器

[[email protected] 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上面
[[email protected] 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

技术分享图片

[[email protected] ~]# 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中

技术分享图片
技术分享图片
技术分享图片

以上是关于部署MongoDB分片群集的主要内容,如果未能解决你的问题,请参考以下文章

部署MongoDB分片群集及分片管理

MongoDB分片群集的部署(用心描述,详细易懂)!!

在CentOS7上部署MongoDB分片群集

听说MongoDB你很豪横?MDB部署分片群集及管理分片

CentOS 7上部署MongoDB分片群集(MongoDB 3.2.1版本)

MongoDB分片群集