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

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

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、创建路由、配置、分片服务器的数据存放目录及日志管理

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

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、创建管理用户,修改目录权限

useradd -M -s /sbin/nologin mongo
chown -R mongo:mongo /usr/local/mongodb
chown -R mongo:mongo /data/mongodb

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

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

5、系统参数优化

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命令把配置文件发到其他两台物理服务器

# 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、配置复制集(任意一台物理机上操作即可)

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,启动分片服务器

# 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配置为复制集(这里需要注意的是,预先被设为仲裁节点的服务器上创建复制集会报错。)

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设置相同,注意端口及仲裁节点的问题即可

部署路由服务器

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

# 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实例

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

启动分片功能

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大小

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

模拟写入数据

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

启动数据库分片

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

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

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

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

(0)

相关推荐

  • MongoDB分片详解

    分片是MongoDB的扩展方式,通过分片能够增加更多的机器来用对不断增加的负载和数据,还不影响应用. 1.分片简介 分片是指将数据拆分,将其分散存在不同机器上的过程.有时也叫分区.将数据分散在不同的机器上,不需要功能 强大的大型计算机就可以存储更多的数据,处理更大的负载. 使用几乎所有数据库软件都能进行手动分片,应用需要维护与若干不同数据库服务器的连接,每个连接还是完全 独立的.应用程序管理不同服务器上的不同数据,存储查村都需要在正确的服务器上进行.这种方法可以很好的工作,但是也 难以维护,比如

  • MongoDB分片键的选择和案例实例详解

    前言 分片键选择不好,应用程序就无法利用分片集群所提供的诸多优势.在这种情况下,插入和查询的性能都会显著下降.下决定时一定要严肃,一旦选择了分片键,就必须坚持选择,分片键是不可以修改的.要让分片键提供好的体验,部分源自了解怎样才算一个好的分片键. 本文将详细介绍关于MongoDB分片键的选择和案例,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. MongoDB版本:3.6 一.分片键类别 1.升序片键 升序片键例如:日期时间字段.自增字段. 2.随机分发片键 随机分发片键例如:

  • mongodb3.4集群搭建实战之高可用的分片+副本集

    前言 最近因为工作的原因,在学习使用mongodb数据库,mongodb是最常用的nodql数据库,在数据库排名中已经上升到了前六.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置服务器等. 相关概念 先来看一张图: 从图中可以看到有四个组件:mongos.config server.shard.replica set. mongos,数据库集群请求的入口,

  • MongoDB分片在部署与维护管理中常见的事项总结大全

    前言 分片(sharding)是MongoDB将大型集合分割到不同服务器(或者说集群)上所采用的方法,主要为应对高吞吐量与大数据量的应用场景提供了方法. 将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载.基本思想就是将集合切成小块,这些块分散到若干片里,每个片只负责总数据的一部分,最后通过一个均衡器来对各个分片进行均衡(数据迁移).通过一个名为mongos的路由进程进行操作,mongos知道数据和片的对应关系(通过配置服务器).大部分使用场景都是解决磁盘空间的

  • mongodb分片技术_动力节点Java学院整理

    在mongodb里面存在另一种集群,就是分片技术,当数据量达到T级别的时候,我们的磁盘,内存就吃不消了,针对这样的场景我们该如何应对. 一:分片 mongodb采用将集合进行拆分,然后将拆分的数据均摊到几个片上的一种解决方案. 下面我对这张图解释一下: 人脸:代表客户端,客户端肯定说,你数据库分片不分片跟我没关系,我叫你干啥就干啥,没什么好商量的. mongos: 首先我们要了解"片键"的概念,也就是说拆分集合的依据是什么?按照什么键值进行拆分集合.... 好了,mongos就是一个路

  • Mongodb 删除添加分片与非分片表维护

    MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 一.如何移除分片 1.确认balancer已经开启 mongos> sh.getBalancerState() true 2.移除分片 注:在admin db下执行命令. mongos> use admin switched to db admin mon

  • MongoDB的分片集群基本配置教程

    为何要分片 1.减少单机请求数,降低单机负载,提高总负载 2.减少单机的存储空间,提高总存空间. 常见的mongodb sharding 服务器架构 要构建一个 MongoDB Sharding Cluster,需要三种角色: 1.Shard Server 即存储实际数据的分片,每个Shard可以是一个mongod实例,也可以是一组mongod实例构成的Replication Set.为了实现每个Shard内部的auto-failover(自动故障切换),MongoDB官方建议每个Shard为一

  • 深入理解MongoDB分片的管理

    前言 在MongoDB(版本 3.2.9)中,分片集群(sharded cluster)是一种水平扩展数据库系统性能的方法,能够将数据集分布式存储在不同的分片(shard)上,每个分片只保存数据集的一部分,MongoDB保证各个分片之间不会有重复的数据,所有分片保存的数据之和就是完整的数据集.分片集群将数据集分布式存储,能够将负载分摊到多个分片上,每个分片只负责读写一部分数据,充分利用了各个shard的系统资源,提高数据库系统的吞吐量. 数据集被拆分成数据块(chunk),每个数据块包含多个do

  • MongoDB分片测试

    分片是mongoDB扩展的一种方式.分片分割一个collection并将不同的部分存储在不同的机器上.当一个数据库的collections相对于当前空间过大时,你需要增加一个新的机器.分片会自动的将collection数据分发到新的服务器上. 1. 连接到mongos可查看系统相关信息 configsvr> show dbs configsvr> use config configsvr> show collections onfigsvr> db.mongos.find() {

  • MongoDB入门教程之分片技术详解

    在mongodb里面存在另一种集群,就是分片技术,跟sql server的表分区类似,我们知道当数据量达到T级别的时候,我们的磁盘,内存就吃不消了,针对这样的场景我们该如何应对.  一:分片 mongodb采用将集合进行拆分,然后将拆分的数据均摊到几个片上的一种解决方案. 下面我对这张图解释一下:  人脸:       代表客户端,客户端肯定说,你数据库分片不分片跟我没关系,我叫你干啥就干啥,没什么好商量的.  mongos: 首先我们要了解"片键"的概念,也就是说拆分集合的依据是什么

随机推荐