加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 服务器 > 系统 > 正文

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

发布时间:2023-09-26 15:13:28 所属栏目:系统 来源:
导读:MongoDB分片简述

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

MongoDB 分
MongoDB分片简述
 
高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的 CPU 耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘 IO 上。
 
MongoDB 分片是使用多个服务器存储数据的方法,以支持巨大的数据存储和对数据进行操作。分片技术可以满足 MongoDB 数据量大量增长的需求,当一台 MongoDB 服务器不足以存储海量数据或不足以提供可接受的读写吞吐量时,我们就可以通过在多台服务器上分割数据,使得数据库系统能存储和处理更多的数据。
 
MongoDB分片优势
 
分片为应对高吞吐量与大数据量提供了方法:
 
使用分片减少了每个分片需要处理的请求数,因此,通过水平扩展,群集可以提高自己的存储容量。比如,当插入一条数据时,应用只需要访问存储这条数据的分片。
 
使用分片减少了每个分片村存储的数据。
 
分片的优势在于提供类似线性增长的架构,提高数据可用性,提高大型数据库查询服务器的性能。当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
 
三台物理服务器安装及配置
 
下载解压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
 
创建路由、配置、分片服务器的数据存放目录及日志管理
 
路由服务器不存储数据,因此不需要创建数据存储目录,日志文件创建完成还需给予权限。
 
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
 
创建管理用户,修改目录权限
 
useradd -M -s /sbin/nologin mongo
 
chown -R mongo:mongo /usr/local/mongodb
 
chown -R mongo:mongo /data/mongodb
 
添加环境变量,便于使用
 
echo 'export MONGODB_HOME=/usr/local/mongodb' >> /etc/profile
 
echo 'export PATH=$PATH:$MONGODB_HOME/bin' >> /etc/profile
 
source /etc/profile
 
系统参数优化
 
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  //*注意*这些优化都是临时的,重启失效
 
部署配置服务器(三台物理服务器配置步骤相同)
 
写入配置文件,我们可以用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
 
配置复制集(任意一台物理机上操作即可)
 
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()
 
# 查看分片相关的命令
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章