MongoDB分片群集(实现分片服务启用、分片服务管理、单点故障模拟)
2018-07-18 22:52
836 查看
MongoDB分片概述
1、什么是分片
高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。MongoDB分片是使用多个服务器存储数据的方法,以支持巨大的数据存储和对数据进行操作。分片技术可以满足MongoDB数据量大量增长的需求,当一台服务器存储量不够时,可以通过再外接一台分片服务器,使得数据库系统能够存储更多的数据
2、MongoDB分片优势
使用分片减少了每个分片需要处理的请求数,因此,通过水平扩展,群集可以提高自己的存储容量和吞吐量,比如,当插入一条数据时,应用只需要访问存储这条数据的分片。使用分片减少了每个分片存储的数据。
优势在于提供类似线性增长的架构,提高数据可用性,提高大数据库查询服务器的性能,当MongoDB单点数据库服务器存储成为瓶颈、单点数据库服务器的性能成为瓶颈或者需要部署大型应用以充分利用内存时,可以使用分片技术。
3、MongoDB分片群集的构成
shard:分片服务器,用于存储实际的数据块,实际生产环境中一个shard server角色可由几台服务器组成一个replica set承担,防止主机单点故障。config server:配置服务器,存储了整个分片群集的配置信息,其中包括chunk信息。
routers:前端路由,客户端由此接入,且让整个群集看上去像单一数据库,前端应用可以透明使用。
MongoDB分片群集部署
群集环境
分片服务器 | 对应配置文件 | 服务端口设定 |
---|---|---|
配置服务器 | mongod1.conf | 37017 |
分片服务器1 | mongod2.conf | 47017 |
分片服务器2 | mongod3.conf | 47018 |
分片服务器3 | mongod4.conf | 47019 |
路由服务器 | mongod.conf | 27017 |
安装MongoDB3.2
注:此处选择MongoDB3.2版本是由于在MongoDB3.4版本以后安全性增加,针对分片管理时需要设置下面分片服务器在一个复制集当中,此处为了简化操作选择MongoDB2.3版本,最新版本分片群集管理相关内容后续将会补充。MongoDB2.3版本可在MongoDB官方网站下载:https://www.mongodb.com/
安装环境包
yum install openssl-devel -y
解压软件包,创建工作目录及日志文件
tar zxvf mongdb-linux-x86_64-3.2.1.tgz -C /opt
mv mongodb-linux-x86_64-3.2.1/ /usr/local/mongodb
mkdir -p /data/mongodb/mongodb{1,2,3,4,5}
mkdir /data/mongodb/logs
touch /data/mongodb/logs/mongodb{1,2,3,4,5}.log
chmod -R 777 /data/mongodb/logs/*.log
进行系统内存和文件优化
ulimit -n 25000
ulimit -u 25000
创建每个节点配置文件
配置服务器
vim /etc/mongod1.conf
port=37017 //服务端口号 dbpath=/data/mongodb/mongodb1 //工作目录 logpath=/data/mongodb/logs/mongodb1.log //日志文件位置 logappend=true 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
创建MongoDB常用命令软连接,方便系统识别,可直接使用
ln -s /usr/local/mongodb/bin/mongo /usr/bin/mongo
ln -s /usr/local/mongodb/bin/mongod /usr/bin/mongod
创建分片服务器的配置文件,包含mongodb3.conf和mongodb4.conf
vim /etc/mongodb2.conf
port=47017 //其他两个分片服务器端口分别为47018和47019 dbpath=/data/mongodb/mongodb2 //工作目录也要更换 logpath=/data/mongodb/logs/mongodb2.log //日志文件也要更改 logappend=true fork=true maxConns=5000 storageEngine=mmapv1 shardsvr=true //设置为分片服务器功能
启动服务器
mongod -f mongodb1.conf
mongod -f mongodb2.conf
mongod -f mongodb3.conf
mongod -f mongodb4.conf
启动路由服务器
路由服务器不需要创建工作目录与日志文件,在启动时可通过命令指定即可
./mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.144.113:37017 --chunkSize 1 //客户端通过27017端口访问,工作模式为fork,日志文件位置及配置文件位置,交给配置服务器的37017去处理调度分片服务器
当启用路由服务器出现如下内容表示启动成功
2018-07-16T21:54:55.081+0800 W SHARDING [main] Running a sharded cluster with fewer than 3 config servers should only be done for testing purposes and is not recommended for production. about to fork child process, waiting until server is ready for connections. forked process: 3058 child process started successfully, parent exiting
路由服务器添加分片服务器
为了能够让路由服务器通过配置服务器找到分片服务器,需要在路由服务器中添加分片服务器信息进入路由服务器
mongo
mongos> show dbs mongos> sh.status() //此时查看shards下为空,没有分片服务器 mongos> sh.addShard("192.168.144.113:47017") //添加分片服务器 mongos> sh.addShard("192.168.144.113:47018") mongos> sh.status() //再次查看shards下有了分片服务器
启用分片存储功能
当路由服务器可以找到分片服务器后,并不能将数据存储在不同的分片服务器中,需要开启此功能才可以。首先查看分片存储功能有没有打开。
mongos> use kgc //创建数据库 mongos> for(var i=1;i<=10000;i++)db.users.insert({"id":i,"name":"jack"+i}) //创建一万条数据 mongos> sh.status() //查看数据库分片信息 databases: { "_id" : "kgc", "primary" : "shard0000", "partitioned" : false } //当看到false时表示分片存储功能未开启
想要对数据库中某一集合采取数据分片存储,首先需要对集合里面的数控建立一个索引,然后指定将数据库中的集合分片即可。操作如下:
mongos> db.users.createIndex({"id":1}) //对users集合创建索引 mongos> sh.shardCollection("kgc.users",{"id":1}) //集合分片 mongos> sh.status()
当查看到如图状态时,表示分片存储已经完成。
分片服务管理
为了方便看清与记忆,我们可以将不同分片服务器添加标记。当数据量不断增大时,MongoDB的分片存储功能可实现在线扩容,也就是增加分片服务器,使得数据可自动平均分片存储,避免了单点故障与免停机维护。
添加标签
在进行完分片服务器启动与分片存储功能后mongos> sh.addShardTag("shard0000","first") mongos> sh.addShardTag("shard0001","second") //添加标签 mongos> sh.removeShardTag("shard0000","sales01") //删除标签
当看到如下图所示,表示标签添加成功。
链接配置服务器
由于所有通过路由服务器对分片服务器的操作都是通过配置服务器完成的,所以,可以进入配置服务器查看。mongo --port 37017
configsvr> use config //配置数据库 configsvr> show collections .... collections //集合信息 chunks //分片节点信息 databases //数据库信息 .... configsvr> db.chunks.findOne() configsvr> db.collections.find() configsvr> db.databases.find()
添加分片服务器
动态添加分片服务器,自动可以平均分片存储首先启动需要添加的分片服务器
mongod -f mongodb4.conf
mongo //进入路由服务器
mongos> sh.addShard("192.168.144.113:47019") //添加分片服务器 mongos> sh.status() //查看状态 chunks: shard0000 4 shard0001 5 shard0002 2
如图:
删除分片服务器
当删除一个分片服务器时,也就是模拟单点故障时,配置服务器会将数据库中的数据重新分配,平均存储到其他分片服务器上,也不会丢失数据。mongos> use admin mongos> db.runCommand({"removeshard":"192.168.144.113:47019"})
模拟单点故障,如图结果
相关文章推荐
- 【CSDN开源夏令营】 基于Web的SSH客户端,实现跨平台的云服务管理(五)模拟复制粘贴功能的实现
- 已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。
- IceWarp 集成 LDAP 服务 同步管理用户,实现客户端地址簿查找
- flume源码学习2-服务管理实现
- 定制微型linux实现启用虚拟终端基于帐号密码登录、提供ssh服务,提供Web服务
- VCenter中对VAPP池可以实现多台服务统一管理
- 虚存管理页面置换算法 — FIFO和RUL算法模拟实现
- 第四篇 ANDROID窗口管理服务实现机制
- 提高IT运维综合管理能力,实现业务服务管理 推荐
- 易宝典文章——玩转Office 365中的Exchange Online服务 之十六 怎样管理已启用邮件的安全组
- 如何实现邮件服务的日常管理
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十九):服务消费(Ribbon、Feign)
- Windows 2003 群集服务故障 -1073741476
- CentOS6服务管理之WEB-httpd用户认证控制和https在httpd上的实现
- WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于HTTP-GET的实现](提供模拟程序)
- Windows Server 2012 中核心服务管理增强(实现存储池和存储空间)
- 前端httpd+heepalived加后端heartbeat+nfs+drbd实现httpd服务的高效应用及资源统一管理
- 【操作系统】可变分区存储管理,模拟实现
- 已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。 与基础事务管理器的通信失败。 .net 代码里 写事务代码