专栏首页运维经验分享MongoDB4.0构建分布式分片群集

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

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

你讲多次关注0人评论2087人阅读2018-08-09 20:48:43

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() # 查看分片相关的命令

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MySQL笔记-基本架构

    本文以及接下来的几篇 MySQL 笔记是本人在「极客时间」的专栏『MySQL实战45讲』和掘金小册「MySQL 是怎样运行的:从根儿上理解 MySQL」的学习笔...

    o对酒当歌
  • Hibernate配置

    Hibernate核心配置文件传递的是连接数据库的必备信息,还有一些可选配置,所以在一个使用Hibernate的工程中需要去完成一个这样的配置文件

    木瓜煲鸡脚
  • SPI 机制-插件化扩展功能

    SPI(Service Provider Interfaces),中文直译服务提供者接口,一种服务发现机制。可能很多人都不太熟悉这个机制,但是平常或多或少都用到...

    andyxh
  • 6个常见的高并发缓存问题,你知道几个?

    一般来说,现在的互联网应用网站或者APP,它的整体流程可以用我们这个图里展示的来表示,用户请求开始,从这个界面是最里面的浏览器和APP,到网络转发,再到应用服务...

    程序员追风
  • 深圳Java技术培训:MyBatis之基本使用

    本章我们将开始学习一个非常优秀的ORM(对象关系映射)框架:MyBatis,它是目前企业中使用最多的数据库框架。

    深圳java培训技术
  • 请解释一下String为什么不可变?

    不可变对象是指一个对象的状态在对象被创建之后就不再变化。不可改变的意思就是说:不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他...

    剑走天涯
  • sql格式化工具

    该工具支持oracle、mysql、sql server等关系型数据库,能让你看到sql美化后的清晰的结构,可运用于对复杂SQL语句的分析或者是程序代码优化上,...

    ixiaoyang8
  • 详解关系型数据库运作机制

    一说到关系型数据库,我总感觉缺了点什么。如果你尝试透过“关系型数据库是如何运作的”的关键词句来进行搜索,其搜索结果是少量的而且内容是简短的。难道说是...

    kubernetes中文社区
  • SQL语言快速入门

    SQL是英文Structured Query Language的缩写,意思为结构化查询语言。SQL语言的主要功能就是同各种数据库建立联系,进行沟通。按照ANSI...

    程序源代码
  • 【MySQL】MySQL 数据库设计铁律

    好的数据库规范有助于减少软件实现的复杂度,降低沟通成本,本铁律主要涵盖了建库建表、建索引、写 SQL、ORM 映射等方面的处理约定。

    挨踢小子部落阁

扫码关注云+社区

领取腾讯云代金券