MongoDB分片群集(实现分片服务启用、分片服务管理、单点故障模拟)

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"})
  • 模拟单点故障,如图结果

原文地址:http://blog.51cto.com/13659253/2146967

时间: 2024-10-11 06:30:01

MongoDB分片群集(实现分片服务启用、分片服务管理、单点故障模拟)的相关文章

mongodb 3.4 集群搭建:分片+副本集

mongodb是最常用的nodql数据库,在数据库排名中已经上升到了前六.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群. 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置服务器等. 相关概念 先来看一张图: 从图中可以看到有四个组件:mongos.config server.shard.replica set. mongos,数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把

MongoDB分片群集

一.关于分片 1.什么是分片 高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询会将单机的CPU耗尽,大的数据量对单机的存储压力比较大,最终会耗尽系统的内存而将压力转移到磁盘IO上.MongoDB分片是使用多个服务器存储数据的方法,以支持巨大的数据存储和对数据进行操作.分片技术可以满足MongoDB数据量大量增长的需求,当一台MongoDB服务器不足以存储海量数据或不足以提供可接受的读写吞吐量时,我们就可以通过在多台服务器上分割数据,使得数据库系统能存储和处理更多的数据. 2.Mo

部署MongoDB分片群集

MongoDB分片在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求.当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量.这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据. 分片的优势分片为应对高吞吐量与大数据量提供了方法.使用分片减少了每个分片需要处理的请求数,因此,通过水平扩展,集群可以提高自己的存储容量和吞吐量.举例来说,当插入一条数据时,应用只需要访问存储这条数据的分片.

部署MongoDB分片群集及分片管理

MongoDB分片 在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求. 当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量.这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据. 分片的优势 分片为应对高吞吐量与大数据量提供了方法. 使用分片减少了每个分片需要处理的请求数,因此,通过水平扩展,集群可以提高自己的存储容量和吞吐量.举例来说,当插入一条数据时,应用只需要访问存储这条数据

在CentOS7上部署MongoDB分片群集

概述 MongoDB分片是使用多个服务器存储数据的方法,以支持巨大的数据存储和对数据进行操作.分片技术可以满足MongoDB数据量大量增长的需求,当一台MongoDB服务器不足以存储海量数据或不足以提供可接受的读写吞吐量时,我们就可以在多台服务器上分割数据,使得数据库系统能存储和处理更多的数据. MongoDB分片群集的组成 Shard:分片服务器,用于存储实际的数据块,实际生产环境中一个shard server角色可由几台服务器组成一个Replica Set承担,防止主机单点故障. Confi

【MangoDB分片】配置mongodb分片群集(sharding cluster)

配置mongodb分片群集(sharding cluster) Sharding cluster介绍 这是一种可以水平扩展的模式,在数据量很大时特给力,实际大规模应用一般会采用这种架构去构建monodb系统. 要构建一个 MongoDB Sharding Cluster,需要三种角色: Shard Server: mongod 实例,用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个relica set承担,防止主机单点故障 Config Server: m

MySQL Cluster 与 MongoDB 复制群集分片设计及原理

分布式数据库计算涉及到分布式事务.数据分布.数据收敛计算等等要求 分布式数据库能实现高安全.高性能.高可用等特征,当然也带来了高成本(固定成本及运营成本),我们通过MongoDB及MySQL Cluster从实现上来分析其中的设计思路,用以抽象我们在设计数据库时,可以引用的部分设计方法,应用于我们的生产系统 首先说说关系及非关系数据库的特征 MySQL的Innodb及Cluster拥有完整的ACID属性 A 原子性 整个事务将作为一个整体,要么完成,要么回滚 C 一致性 事务开始之前和事务结束以

mongodb的分布式集群(3、分片)

概述 上面两篇博客都是关于mongodb的集群的配置,没有涉及到分布式,该片博客就是写mongodb的分布式,把一个整体,分成多个片,每个片部署到不同的服务器上,这个就是mongodb的分布式,即:mongodb的分片操作. 部署图 mongos服务器做的是路由服务器,config服务器就是保存相应配置的服务器,shard1和shard2就是分片服务器,这两个服务器合在一起才是一个整体,而mongos服务器就是他们的和点,所以,我们客户端只需要和mongos服务器交互就可以了,后面的,服务器自己

搭建高可用MongoDB集群(四):分片

按照上一节中<搭建高可用mongodb集群(三)-- 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的时候能否做到自动扩展? 在系统早期,数据量还小的时候不会引起太大的问题,但是随着数据量持续增多,后续迟早会出现一台机器硬件瓶颈问题的.而mongodb主打的就是海量数据架构,他不能解决海量数据怎么行!不行!"分片"就用这个来解决这个问题. 传统数据库怎么做海量数据读写?其实一句话概括:分而