千家信息网

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

发表于:2024-11-30 作者:千家信息网编辑
千家信息网最后更新 2024年11月30日,MongoDB分片简述高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的 CPU 耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘 IO 上。Mo
千家信息网最后更新 2024年11月30日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)Shard1Shard2Shard3
192.168.125.1192701727018270012700227003
192.168.125.1202701727018270012700227003
192.168.125.1212701727018270012700227003

部署分片群集

 

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

  1. 下载解压MongoDB
    wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.0.tgztar zxvf mongodb-linux-x86_64-4.0.0.tgz -C /optmv /opt/mongodb-linux-x86_64-4.0.0/ /usr/local/mongodb
  2. 创建路由、配置、分片服务器的数据存放目录及日志管理
    路由服务器不存储数据,因此不需要创建数据存储目录,日志文件创建完成还需给予权限。
    mkdir -p /data/mongodb/configmkdir -p /data/mongodb/shard{1,2,3}mkdir -p /data/mongodb/logstouch /data/mongodb/logs/shard{1,2,3}.logtouch /data/mongodb/logs/mongos.logtouch /data/mongodb/logs/config.logchmod 777 /data/mongodb/logs/*.log
  3. 创建管理用户,修改目录权限
    useradd -M -s /sbin/nologin mongochown -R mongo:mongo /usr/local/mongodbchown -R mongo:mongo /data/mongodb
  4. 添加环境变量,便于使用
    echo 'export MONGODB_HOME=/usr/local/mongodb' >> /etc/profileecho 'export PATH=$PATH:$MONGODB_HOME/bin' >> /etc/profilesource /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/enabledecho never > /sys/kernel/mm/transparent_hugepage/defrag  //*注意*这些优化都是临时的,重启失效

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

  1. 写入配置文件,我们可以用scp命令把配置文件发到其他两台物理服务器
    # vim config.confdbpath=/data/mongodb/config  //数据文件存放位置logpath=/data/logs/config.log    //日志文件port=27018    //端口号logappend=truefork=truemaxConns=5000  storageEngine=mmapv1replSet=configs  //复制集名称configsvr=true    //设置参数为true# mongod -f config.conf  //启动config实例scp /usr/local/mongodb/bin/config.conf root@192.168.125.120:/usr/local/mongodb/binscp /usr/local/mongodb/bin/config.conf root@192.168.125.121:/usr/local/mongodb/bin
  2. 配置复制集(任意一台物理机上操作即可)
    mongo --port 27018config={_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.confdbpath=/data/mongodb/shard1logpath=/data/logs/shard1.logport=27001logappend=truefork=truemaxConns=5000  storageEngine=mmapv1shardsvr=true# mongod -f shard1.conf# 与另外两台配置实例配置文件相同,仅端口、数据文件存放及日志文件要改,只需配置完成后启动即可
  • 将shard1配置为复制集(这里需要注意的是,预先被设为仲裁节点的服务器上创建复制集会报错。)
    mongo --port 27001use adminconfig={_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.conflogpath=/data/mongodb/logs/mongos.loglogappend = trueport = 27017fork = trueconfigdb = configs/192.168.125.119:27018,192.168.125.120:27018,192.168.125.121:27018maxConns=20000
  • 启动mongos实例
    mongs -f /usr/local/mongodb/bin/mongos.conf# 注意,这边启动mongos实例用的是mongos命令

启动分片功能

mongo  //默认进入27017端口mongos> use adminmongos> 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 configmongos> db.settings.save({"_id":"chunksize","value":1})# 设置块大小为1M是方便实验,不然需要插入海量数据
  • 模拟写入数据
    mongos> use schoolmongos> show collectionsmongos> 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