服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - MongoDB - 详解MongoDB4.0构建分布式分片群集

详解MongoDB4.0构建分布式分片群集

2020-05-18 15:44你讲多次 MongoDB

这篇文章主要介绍了详解MongoDB4.0构建分布式分片群集,详细的介绍了什么是MongoDB分片和具体使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

MongoDB分片简述

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

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

MongoDB分片优势

分片为应对高吞吐量与大数据量提供了方法:

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

分片的优势在于提供类似线性增长的架构,提高数据可用性,提高大型数据库查询服务器的性能。当MongoDB单点数据库服务器存储成为瓶颈、单点数据库服务器的性能成为瓶颈或需要部署大型应用以充分利用内存时,可以使用分片技术。

MongoDB分片群集的组成

MongoDB分片群集主要有如下三个组件:

  • Shard:分片服务器,用于存储实际的数据块,实际生产环境中一个shard server 角色可以由几台服务器组成一个Peplica Set 承担,防止主机单点故障。
  • Config Server:配置服务器,存储了整个分片群集的配置信息,其中包括chunk信息。
  • Routers:前端路由,客户端由此接入,且让整个群集看上去像单一数据库,前端应用可以透明使用。

系统环境

系统:CentOS 7.4 x86_64

软件版本:4.0

关闭防火墙及selinux

 

IP地址 路由服务器(Routers) 配置服务器(Config Server) Shard1 Shard2 Shard3
192.168.125.119 27017 27018 27001 27002 27003
192.168.125.120 27017 27018 27001 27002 27003
192.168.125.121 27017 27018 27001 27002 27003

 

部署分片群集

三台物理服务器安装及配置

1、下载解压MongoDB

?
1
2
3
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.0.tgz
tar zxvf mongodb-linux-x86_64-4.0.0.tgz -C /opt
mv /opt/mongodb-linux-x86_64-4.0.0/ /usr/local/mongodb

2、创建路由、配置、分片服务器的数据存放目录及日志管理

路由服务器不存储数据,因此不需要创建数据存储目录,日志文件创建完成还需给予权限。

?
1
2
3
4
5
6
7
mkdir -p /data/mongodb/config
mkdir -p /data/mongodb/shard{1,2,3}
mkdir -p /data/mongodb/logs
touch /data/mongodb/logs/shard{1,2,3}.log
touch /data/mongodb/logs/mongos.log
touch /data/mongodb/logs/config.log
chmod 777 /data/mongodb/logs/*.log

3、创建管理用户,修改目录权限

?
1
2
3
useradd -M -s /sbin/nologin mongo
chown -R mongo:mongo /usr/local/mongodb
chown -R mongo:mongo /data/mongodb

4、添加环境变量,便于使用

?
1
2
3
echo 'export MONGODB_HOME=/usr/local/mongodb' >> /etc/profile
echo 'export PATH=$PATH:$MONGODB_HOME/bin' >> /etc/profile
source /etc/profile

5、系统参数优化

?
1
2
3
4
5
6
ulimit -n 25000  //可以打开的最大文件数量
ulimit -u 25000  //用户最大可用的进程数
sysctl -w vm.zone_reclaim_mode=0 //内存不足时,从其他节点分配内存
# 从CentOS7开始,MongoDB会建议关闭系统的THP特性,否则可能会导致性能下降
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag //*注意*这些优化都是临时的,重启失效

部署配置服务器(三台物理服务器配置步骤相同)

1、写入配置文件,我们可以用scp命令把配置文件发到其他两台物理服务器

?
1
2
3
4
5
6
7
8
9
10
11
12
13
# vim config.conf
dbpath=/data/mongodb/config //数据文件存放位置
logpath=/data/logs/config.log  //日志文件
port=27018  //端口号
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
replSet=configs //复制集名称
configsvr=true  //设置参数为true
# mongod -f config.conf //启动config实例
scp /usr/local/mongodb/bin/config.conf root@192.168.125.120:/usr/local/mongodb/bin
scp /usr/local/mongodb/bin/config.conf root@192.168.125.121:/usr/local/mongodb/bin

2、配置复制集(任意一台物理机上操作即可)

?
1
2
3
mongo --port 27018
config={_id:"configs",members:[{_id:0,host:"192.168.125.119:27018"},{_id:1,host:"192.168.125.120:27018"},{_id:2,host:"192.168.125.121:27018"}]}  //创建复制集
rs.initiate(config)        //初始化复制集

部署分片服务器

编辑shard{1,2,3}.conf配置文件,端口分别为27001,27002,27003,设置shardsvr=true,启动分片服务器

?
1
2
3
4
5
6
7
8
9
10
11
# vim shard1.conf
dbpath=/data/mongodb/shard1
logpath=/data/logs/shard1.log
port=27001
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
shardsvr=true
# mongod -f shard1.conf
# 与另外两台配置实例配置文件相同,仅端口、数据文件存放及日志文件要改,只需配置完成后启动即可

将shard1配置为复制集(这里需要注意的是,预先被设为仲裁节点的服务器上创建复制集会报错。)

?
1
2
3
4
mongo --port 27001
use admin
config={_id:"shard1",members:[{_id:0,host:"192.168.125.119:27001"},{_id:1,host:"192.168.125.120:27001"},{_id:2,host:"192.168.125.121:27001"}]}  //创建复制集
rs.initiate(config)        //初始化复制集

其余两台分片服务器shard2、shard3设置相同,注意端口及仲裁节点的问题即可

部署路由服务器

创建配置文件,将配置文件发送到其他物理服务器。注意,路由服务器不需要存储数据目录

?
1
2
3
4
5
6
7
# vim mongos.conf
logpath=/data/mongodb/logs/mongos.log
logappend = true
port = 27017
fork = true
configdb = configs/192.168.125.119:27018,192.168.125.120:27018,192.168.125.121:27018
maxConns=20000

启动mongos实例

?
1
2
mongs -f /usr/local/mongodb/bin/mongos.conf
# 注意,这边启动mongos实例用的是mongos命令

启动分片功能

?
1
2
3
4
5
6
mongo //默认进入27017端口
mongos> use admin
mongos> sh.addShard("shard1/192.168.125.119:27001,192.168.125.120:27001,172.16.10.29:27001")
mongos> sh.addShard("shard2/192.168.125.119:27002,192.168.125.120:27002,172.16.10.29:27002")
mongos> sh.status()      //查看群集状态
# 此处为添加两台分片服务器,后续添加的也会均匀分配分片数据

实现分片功能

设置分片chunk大小

?
1
2
3
mongos> use config
mongos> db.settings.save({"_id":"chunksize","value":1})
# 设置块大小为1M是方便实验,不然需要插入海量数据

模拟写入数据

?
1
2
3
4
mongos> use school
mongos> show collections
mongos> for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})}
# 在school库的user表中循环写入五万条数据

启动数据库分片

?
1
2
mongos>sh.enableSharding("school")
# 我们可以自定义需要分片的库或表

为school库中的user集合创建索引,然后对表进行分片

?
1
2
3
4
5
6
7
8
mongos> db.user.createIndex({"id":1})
# 以"id"作为索引
mongos> sh.shardCollection("school.user",{"id":1})
# 根据"id"user表进行分片
mongos> sh.status()
# 查看分片情况
mongos> sh.help()
# 查看分片相关的命令

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://blog.51cto.com/13625676/2156952

延伸 · 阅读

精彩推荐
  • MongoDBMongoDB的索引

    MongoDB的索引

    数据库中的索引就是用来提高查询操作的性能,但是会影响插入、更新和删除的效率,因为数据库不仅要执行这些操作,还要负责索引的更新 ...

    MongoDB教程网2532020-05-12
  • MongoDBMongoDB查询之高级操作详解(多条件查询、正则匹配查询等)

    MongoDB查询之高级操作详解(多条件查询、正则匹配查询等)

    这篇文章主要给大家介绍了关于MongoDB查询之高级操作(多条件查询、正则匹配查询等)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者...

    w田翔3872020-12-19
  • MongoDBMongoDB多条件模糊查询示例代码

    MongoDB多条件模糊查询示例代码

    这篇文章主要给大家介绍了关于MongoDB多条件模糊查询的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MongoDB具有一定的参考学习价值...

    浅夏晴空5902020-05-25
  • MongoDBMongoDB系列教程(五):mongo语法和mysql语法对比学习

    MongoDB系列教程(五):mongo语法和mysql语法对比学习

    这篇文章主要介绍了MongoDB系列教程(五):mongo语法和mysql语法对比学习,本文对熟悉Mysql数据库的同学来说帮助很大,用对比的方式可以快速学习到MongoDB的命...

    MongoDB教程网3252020-05-01
  • MongoDB在mac系统下安装与配置mongoDB数据库

    在mac系统下安装与配置mongoDB数据库

    这篇文章主要介绍了在mac系统下安装与配置mongoDB数据库的操作步骤,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    CXYhh1219312021-11-14
  • MongoDBWindows下MongoDB配置用户权限实例

    Windows下MongoDB配置用户权限实例

    这篇文章主要介绍了Windows下MongoDB配置用户权限实例,本文实现需要输入用户名、密码才可以访问MongoDB数据库,需要的朋友可以参考下 ...

    MongoDB教程网3082020-04-29
  • MongoDBMongodb索引的优化

    Mongodb索引的优化

    MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。接下来通过本文给大家介绍Mongodb索引的优化,本文介绍的非常详细,具有参考借鉴价值,感...

    MRR3252020-05-05
  • MongoDBmongodb数据库基础知识之连表查询

    mongodb数据库基础知识之连表查询

    这篇文章主要给大家介绍了关于mongodb数据库基础知识之连表查询的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mongodb具有一定的参...

    ZJW02155642020-05-22