CentOS7的mongodb分片群集
简介
高数据量和吞吐量的数据库应用会对单机的性能造成较大的压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。
mongodb分片是使用多个服务器存储数据的方法,以支持巨大的数据存储和对数据进行操作。分片技术可以满足Mongodb数据量大量增长的需求。,当一台mongodb服务器不足以存储海量数据或不足以提供可接受的读写吞吐量时,就可以通过在多台服务器上分割数据,使得数据库系统能存储和处理更多的数据。
分片的优势
-
使用分片减少了每个分片需要处理的请求数,通过水平扩展,群集可以提高自己的存储容量和吞吐量。
- 使用分片减少了每个分片存储的数据
分片群集的组成
- Shard:分片服务器,用于存储实际的数据块
- configserver:配置服务器,存储整个分片群集的配置信息
- routers:路由服务器
分片群集管理的实验
实验配置图如上
下面开始实验,这里我在一台机器上开启多个实例来代替多台服务器
安装mongodb3.2版本(手工编译安装)
- 安装软件环境包
yum -y install openssl-devel
- 解压缩mongodb软件包
tar zxvf mongodb-linux-x86_64-3.2.1.tgz -C /opt
- 移动软件包至系统识别的目录下
mv mongodb-linux-x86_64-3.2.1/ /usr/local/mongodb
- 创建mongodb的数据存储(/data/mongodb1、2、3、4、)和日志存储目录(/data/logs)
mkdir -p /data/mongodb/mongodb{1,2,3,4}
mkdir /data/mongodb/logs
touch /data/mongodb/logs/mongodb{1,2,3,4}.log
chmod -R 777 /data/mongodb/logs/*.log
- 设置ulimit -n和ulimit -u 的值
当mongodb处于频繁访问的状态,如果shell启动进程所占用的资源设置过低,将会产生错误导致无法连接mongodb实例,所以这里需要设置ulimit -n和ulimit -u 的值大于20000
ulimit -n 25000
ulimit -u 25000
- 创建配置服务器的配置文件
cd /usr/local/mongodb/bin/
vim mongodb1.conf
port=37017 #端口
dbpath=/data/mongodb/mongodb1 #数据存储位置
logpath=/data/mongodb/logs/mongodb1.log #日志存储位置
logappend=true #错误日志采用追加模式,配置这个选项后mongodb的日志会追加到现有的日志文件,而不是从新创建一个新文件
fork=true #后台运行
maxConns=5000 #最大同时连接数
storageEngine=mmapv1 #指定存储引擎为内存映射文件
configsvr=true #指定配置服务器的模式
- 设置内核参数
当某节点内存不足时,系统会从其他节点分配内存
sysctl -w vm.zone_reclaim_mode=0 #永久设置
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
- 创建软链接,方便管理
ln -s /usr/local/mongodb/bin/mongo /usr/bin/mongo
ln -s /usr/local/mongodb/bin/mongod /usr/bin/mongod
- 开启第一个实例(配置服务器)
-
配置分片服务器的实例
复制生成配置文件cp -p mongodb1.conf mongodb2.conf #复制配置服务器的配置文件生成实例2的配置文件
cp -p mongodb1.conf mongodb3.conf #复制配置服务器的配置文件生成实例2的配置文件 - 修改实例2、3的配置文件
vim mongodb2.conf
port=47017 #修改端口号
dbpath=/data/mongodb/mongodb2 #修改数据存放目录
logpath=/data/mongodb/logs/mongodb2.log #修改日志存放目录
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
shardsvr=true #指定分片服务器的模式
vim mongodb3.conf
port=47018
dbpath=/data/mongodb/mongodb3
logpath=/data/mongodb/logs/mongodb3.log
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
shardsvr=true
- 开启两个分片服务器的实例
mongod -f mongodb2.conf
mongod -f mongodb3.conf
- 启动路由服务器
./mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.234.177:37017 --chunkSize 1
这里关于mongos命令不知道该怎么使用,可以查看帮助信息
- 启用分片服务器
mongo
- 添加分片服务器
sh.addShard("192.168.234.177:47017")
sh.addShard("192.168.234.177:47018")
添加分片服务器之后再次查看
-
测试分片功能
mongos> show dbs
config 0.031GB
mongos> use kgc #进入并创建一个use的集合
switched to db kgc
mongos> db.users.insert({"id":1,"name":"zhangsan"}) #添加一条数据
WriteResult({ "nInserted" : 1 })
mongos> for(var i=2;i<=20000;i++)db.users.insert({"id":i,"name":"zyc"+i}) #使用for循环添加20000条数据
WriteResult({ "nInserted" : 1 })
mongos> show dbs #查看表空间就会有一个kgc
config 0.031GB
kgc 0.078GB
mongos> show tables #查看表信息也可以看到users表
system.indexes
users
- 开启分片功能
sh.enableSharding("kgc")
- 对数据库中的集合开启分片
db.users.createIndex({"id":1}) #对users表创建索引
sh.shardCollection("kgc.users",{"id":1}) #表分片
sh.status() #此时再次查看,就可以已经进行分片处理了
到这里mongodb分片群集管理的介绍就全部完成了,如果觉得有帮助记得点赞、打赏下小弟哦!!!