实战MongoDB 分片原理概述 + 部署 MongoDB 分片群集 +源码包

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实战MongoDB 分片原理概述 + 部署 MongoDB 分片群集 +源码包相关的知识,希望对你有一定的参考价值。

目录:

1· MongoDB 分片概述
2· 部署 MongoDB 分片群集
3· MongoDB 分片管理
4· 推荐 MongoDB 、mysql 基础文章
5· 文章总结


MongoDB 分片概述

1)什么是分片:

1·不用专业的术语说,从字面的意思讲解,就是把一块东西分成很多很多块。


2·稍微专业术语:分片是一种技术,它是使用多个服务器来存放数据,不再是只用一台服务器。这样就可以满足大量的数据写入,如果没有分片技术,使用其他方法那么随着数据量的增加,磁盘空间、服务器压力总会产生问题


3·分片技术是一种将海量数据水平扩展的数据库群集系统,数据分布存储在分片(sharding)的各个节点上,管理者通过简单的配置就可以方便的构建一个分布式 MongoDB 分片群集


2).分片的条件

1:服务器磁盘不够的时候


2:服务器出现写瓶颈的时候


3:想将大量数据放在内存中提高性能


3)MongoDB 分片群集的组成

1· Shard: 分片服务器,用于存储实际的数据,在生产环境中一个 shard server 角色可以由几台服务器组成一个 Replica Set 承担,防止单点故障


2· Config Server :配置服务器,存储了整个分片群集的配置信息,其中包括chunk信息


3· Routers :前端路由,客户端是由它来接入,且让整个群集看上去像单一数据库,前端应用可以透明使用


MongoDB 分片群集的组成如下图


技术分享图片


部署 MongoDB 分片群集

部署前说明

1· 部署环境: CenOS 7.4


2· MongoDB 的安装这里不再演示,需要的朋友请点击:MongoDB 安装详解


3· 需要源码包的请点击:MongoDB 源码包点击下载密码:tpkt


1)部署开始
1·解压源码包、优化

[[email protected] ~]# tar xvf mongodb-linux-x86_64-3.2.1.tgz -C /opt/
[[email protected] ~]# cd /opt/
[[email protected] opt]# mv mongodb-linux-x86_64-3.2.1 /usr/local/mongodb


[[email protected] opt]# ln -s /usr/local/mongodb/bin/mongo /usr/bin/mongo
[[email protected] opt]# ln -s /usr/local/mongodb/bin/mongod /usr/bin/mongod


2·创建日志文件和存储文件的路径

[[email protected] opt]# mkdir -p /data/mongodb/mongodb{1,2,3,4} ----(可以连续创建4个数据储存目录


[[email protected] opt]# cd /data/mongodb/
[[email protected] mongodb]# mkdir logs


[[email protected] mongodb]# touch mongodb{1,2,3,4}.log ----(创建日志文件
[[email protected] mongodb]# chmod 777 .log ---(赋予权限


[[email protected] mongodb]# ulimit -n 25000 ----(调高shell系统所暂用的资源比例)
[[email protected] mongodb]# ulimit -u 25000 ----(放大文件数量)


3·添加配置文件

[[email protected] mongodb]# vim /usr/local/mongodb/bin/mongodb1.conf ---(添加配置文件)


添加内容如下:

  1. > port=37017 ----(配置服务器端口
  2. > dbpath=/data/mongodb/mongodb1 ----(数据存储目录
  3. > logpath=/data/mongodb/logs/mongodb1.log ----(指定日志文件存储目录
  4. > logappend=true -----(使用追加方式写日志
  5. > maxConns=5000 -----(最大链接数
  6. > fork=true -----(后台运行
  7. > storageEngine=mmapv1 -----(指定存储引擎为内存映射文件
  8. > configsvr=true -----(模式为配置服务器模式)

当一个节点可用内存不足时,系统会从其他几点分配内存

[[email protected] mongodb]# sysctl -w vm.zone_reclaim_mode=0


[[email protected] mongodb]# echo never > /sys/kernel/mm/transparent_hugepage/enabled


[[email protected] mongodb]# echo never > /sys/kernel/mm/transparent_hugepage/defrag


到这里配置服务器已经配置完毕,接下来会配置第一个分片服务器:

[[email protected] mongodb]# cd /usr/local/mongodb/bin/
[[email protected] bin]# cp -p mongodb1.conf mongodb2.conf ---(把配置文件复制一份出来,稍作修改)
[[email protected] bin]# vim mongodb2.conf ---(修改内容如下


加粗内容需要注意与修改:

  1. > port=47017 ---(这里的端口号需要修改
  2. > dbpath=/data/mongodb/mongodb2 ---(数据存储路径修改
  3. > logpath=/data/mongodb/logs/mongodb2.log ----(日志存储路径修改
  4. > logappend=true
  5. > maxConns=5000
  6. > fork=true
  7. > storageEngine=mmapv1
  8. > shardsvr=true ----(这里是最重要的,这里的模式就是代表分片模式

配置第二个分片服务器,方法如下:

[[email protected] bin]# cp -p mongodb2.conf mongodb3.conf ---(在复制一份配置文件)


[[email protected] bin]# vim mongodb3.conf ---(修改内容如下)


修改内容如下:

  1. > port=47018 ----(端口号需要修改
  2. > dbpath=/data/mongodb/mongodb3 ----(数据存储路径
  3. > logpath=/data/mongodb/logs/mongodb3.log ---(日志文件
  4. > logappend=true
  5. > maxConns=5000
  6. > fork=true
  7. > storageEngine=mmapv1
  8. > shardsvr=true

开启3台实例服务:


开启前端路由模式,这里不明白的可以看看上面的组成图:

  1. > [[email protected] ~]# cd /usr/local/mongodb/bin/
  2. > [[email protected] bin]# ./mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.106.154:37017 --chunkSize 1

显示如下字符,开启成功
2018-09-18T16:03:49.695+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: 41001
child process started successfully, parent exiting


现在可以进入 MongoDB 服务器

[[email protected] bin]# mongo


添加两台分片服务器:

mongos> sh.addShard("192.168.106.154:47017") ---(这里注意把端口号写正确)
{ "shardAdded" : "shard0000", "ok" : 1 }


mongos> sh.addShard("192.168.106.154:47018")
{ "shardAdded" : "shard0001", "ok" : 1 }


查看分片服务器状态信息:

mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5ba0b1655ba2e21d63505818")
}
shards:
> { "_id" : "shard0000", "host" : "192.168.106.154:47017" }
> { "_id" : "shard0001", "host" : "192.168.106.154:47018" }
active mongoses:
"3.2.1" : 1
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
No recent migrations
databases:


写入五万条数据,等待测验

mongos> for(var i=1;i<=50000;i++)db.school.insert({"id":i,"name":"tpm"+i})
WriteResult({ "nInserted" : 1 }) ----(利用 for 循环添加,只是为了验证后面分片存储)


查看信息是否写入,就看前五条即可,因为数据太多。

mongos> db.school.find().limit(5)
{ "_id" : ObjectId("5ba0b3c6dcdebde5a87ce165"), "id" : 1, "name" : "tpm1" }
{ "_id" : ObjectId("5ba0b3c6dcdebde5a87ce166"), "id" : 2, "name" : "tpm2" }
{ "_id" : ObjectId("5ba0b3c6dcdebde5a87ce167"), "id" : 3, "name" : "tpm3" }
{ "_id" : ObjectId("5ba0b3c6dcdebde5a87ce168"), "id" : 4, "name" : "tpm4" }
{ "_id" : ObjectId("5ba0b3c6dcdebde5a87ce169"), "id" : 5, "name" : "tpm5" }


对 test 这个库进行分片处理,默认写入数据就是写入 test

mongos> sh.enableSharding("test")
{ "ok" : 1 }


对集合建立索引

mongos> db.school.createIndex({"id":1}) ----(建立索引以 id 为列)
{
"raw" : {
"192.168.106.154:47017" : {
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
},
"ok" : 1
}


对test.shcool这个数据库中的这个school集合进行分片,指定索引为 id:1

mongos> sh.shardCollection("test.school",{"id":1}) ----(开始分片
{ "collectionsharded" : "test.school", "ok" : 1 }


查看分片状态:

mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5ba0b1655ba2e21d63505818")
}
shards:
{ "_id" : "shard0000", "host" : "192.168.106.154:47017" }
{ "_id" : "shard0001", "host" : "192.168.106.154:47018" }

active mongoses:
"3.2.1" : 1
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
5 : Success
databases:
{ "_id" : "test", "primary" : "shard0000", "partitioned" : true }
test.school
shard key: { "id" : 1 }
unique: false
balancing: true
chunks:
shard0000 6
shard0001 5
-----(两个分片)
以下是把五万条数据分片存储

      { "id" : { "$minKey" : 1 } } --&gt;&gt; { "id" : 4682 } on : shard0001 Timestamp(2, 0) 
      { "id" : 4682 } --&gt;&gt; { "id" : 9364 } on : shard0001 Timestamp(3, 0) 
      { "id" : 9364 } --&gt;&gt; { "id" : 14046 } on : shard0001 Timestamp(4, 0) 
      { "id" : 14046 } --&gt;&gt; { "id" : 18728 } on : shard0001 Timestamp(5, 0) 
      { "id" : 18728 } --&gt;&gt; { "id" : 23410 } on : shard0001 Timestamp(6, 0) 
      { "id" : 23410 } --&gt;&gt; { "id" : 28092 } on : shard0000 Timestamp(6, 1) 
      { "id" : 28092 } --&gt;&gt; { "id" : 32774 } on : shard0000 Timestamp(1, 6) 
      { "id" : 32774 } --&gt;&gt; { "id" : 37456 } on : shard0000 Timestamp(1, 7) 
      { "id" : 37456 } --&gt;&gt; { "id" : 42138 } on : shard0000 Timestamp(1, 8) 
      { "id" : 42138 } --&gt;&gt; { "id" : 46820 } on : shard0000 Timestamp(1, 9) 
      { "id" : 46820 } --&gt;&gt; { "id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 10

现在来模拟,由于大量的数据,导致空间不足,这时我们需要添加分片服务器:

[[email protected] bin]# cp mongodb3.conf mongodb4.conf --(复制配置文件)
[[email protected] bin]# vim mongodb4.conf ---(做如下修改)


修改内容如下:
port=47019
dbpath=/data/mongodb/mongodb4
logpath=/data/mongodb/logs/mongodb4.log
logappend=true
maxConns=5000
fork=true
storageEngine=mmapv1
shardsvr=true


[[email protected] bin]# mongod -f mongodb4.conf ---(启动第4个实例)


[[email protected] bin]# mongo ----(进入mongo)


mongos> sh.addShard("192.168.106.154:47019")
{ "shardAdded" : "shard0002", "ok" : 1 } ---(再次添加一台分片服务器)


再次查看状态, 我们会发现会自动重新分片到新的服务器中
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5ba0b1655ba2e21d63505818")
}
shards:
{ "_id" : "shard0000", "host" : "192.168.106.154:47017" }
{ "_id" : "shard0001", "host" : "192.168.106.154:47018" }
{ "_id" : "shard0002", "host" : "192.168.106.154:47019" }

active mongoses:
"3.2.1" : 1
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
8 : Success
databases:
{ "_id" : "test", "primary" : "shard0000", "partitioned" : true }
test.school
shard key: { "id" : 1 }
unique: false
balancing: true
chunks:
shard0000 4 ------(又加入一个分片服务器)
shard0001 4
shard0002 3

{ "id" : { "$minKey" : 1 } } -->> { "id" : 4682 } on : shard0002 Timestamp(9, 0)
{ "id" : 4682 } -->> { "id" : 9364 } on : shard0001 Timestamp(9, 1)
{ "id" : 9364 } -->> { "id" : 14046 } on : shard0001 Timestamp(4, 0)
{ "id" : 14046 } -->> { "id" : 18728 } on : shard0001 Timestamp(5, 0)
{ "id" : 18728 } -->> { "id" : 23410 } on : shard0001 Timestamp(6, 0)
{ "id" : 23410 } -->> { "id" : 28092 } on : shard0002 Timestamp(7, 0)
{ "id" : 28092 } -->> { "id" : 32774 } on : shard0002 Timestamp(8, 0)
{ "id" : 32774 } -->> { "id" : 37456 } on : shard0000 Timestamp(8, 1)
{ "id" : 37456 } -->> { "id" : 42138 } on : shard0000 Timestamp(1, 8)
{ "id" : 42138 } -->> { "id" : 46820 } on : shard0000 Timestamp(1, 9)
{ "id" : 46820 } -->> { "id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 10)


结论:我们可以知道,重新添加分片服务器会让数据进行重新分片,并不会影响什么,同理,删除一台分片服务器,那么数据一样会重新重整数据,进行分片。这样的话,我们几乎就不需要在做分片服务器的集群,因为分片服务器本来就可以添加多台,无论是否挂掉都不会影响什么。


还可以给分片服务器贴上自己容易记住的标签:

mongos> sh.addShardTag("shard0000","abc00")
mongos> sh.addShardTag("shard0001","abc01")
mongos> sh.addShardTag("shard0002","abc02")


可以再次查看分片服务器:

shards:
{ "_id" : "shard0000", "host" : "192.168.106.154:47017", "tags" : [ "abc00" ] }
{ "_id" : "shard0001", "host" : "192.168.106.154:47018", "tags" : [ "abc01" ] }
{ "_id" : "shard0002", "host" : "192.168.106.154:47019", "tags" : [ "abc02" ] }


下图是数据分片的截图,让效果更加直观,重点会又标记:
技术分享图片


关联知识点文章推荐:

MongoDB 数据库安装:http://blog.51cto.com/13746824/2174874


MongoDB 复制集 + 选举原理:http://blog.51cto.com/13746824/2175720


详解 MySQL 高可用群集,MMM搭建高可用:http://blog.51cto.com/13746824/2173073


Amoeba 代理 MySQL 主从复制 + 读写分离:http://blog.51cto.com/13746824/2172139


总结:

MongoDB 分片通过在多台服务器上分割数据,使得数据库系统能存储和处理更多的数据


MongoDB 分片群集主要如下三个组件:可以参考文章第一张图:Shard 分片服务器、Config Server 配置服务器、Routers 前端路由


重新添加分片服务器会让数据进行重新分片,并不会影响什么,同理,删除一台分片服务器,那么数据一样会重新重整数据,进行分片!

以上是关于实战MongoDB 分片原理概述 + 部署 MongoDB 分片群集 +源码包的主要内容,如果未能解决你的问题,请参考以下文章

部署MongoDB分片群集

2020年MongoDB 企业应用实战 基础 复制集 分片集群

2020年MongoDB 企业应用实战 基础 复制集 分片集群

2020年MongoDB 企业应用实战 基础 复制集 分片集群

2020年MongoDB 企业应用实战 基础 复制集 分片集群

图解MongoDB集群部署原理