MongoDB分片概述

        在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。

        当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。



为什么使用分片

  • 复制所有的写入操作到主节点

  • 延迟的敏感数据会在主节点查询

  • 单个副本集限制在12个节点

  • 当请求量巨大时会出现内存不足。

  • 本地磁盘不足

  • 垂直扩展价格昂贵


MongoDB原理图示:

image

上图中主要有如下所述三个主要组件:

  • Shard:

    用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障

  • Config Server:

    mongod实例,存储了整个 ClusterMetadata,其中包括 chunk信息。

  • Query Routers:

    前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。


MongoDB分片实验步骤演示:

安装配置MongoDB

yum install openssl-devel -y

tar zxvf mongodb-linux-x86_64-3.2.1.tgz -C /opt/

mv /opt/mongodb-linux-x86_64-3.2.1/ /usr/local/mongodb

优化命令

ln -s /usr/local/mongodb/bin/mongo /usr/bin/mongo                

ln -s /usr/local/mongodb/bin/mongod /usr/bin/mongod

建立四台分片群集日志文件和数据存储路径

mkdir -p /data/mongodb/mongodb{1,2,3,4}

mkdir -p /data/mongodb/logs

touch /data/mongodb/logs/mongodb{1,2,3,4}.log

chmod 777 /data/mongodb/logs/*.log

进程优化

ulimit -u 25000          #用户最大进程数

ulimit -n 25000           #用户可打开最大文件数量

配置三个主要组件

-----------------------配置config server------------------

cd /usr/local/mongodb/bin/

vim mongodb1.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

--------------------------配置shard server----------------------

配置shard1

cp -p mongodb1.conf mongodb2.conf

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     #shard模式

配置shard2

cp -p mongodb2.conf mongodb3.conf

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

启动MongoDB

mongod -f mongodb1.conf

mongod -f mongodb2.conf

mongod -f mongodb3.conf

------------------------开启路由模式-----------------

./mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.218.130:37017 --chunkSize 1

------------------------------启动分片-------------------

mongo

sh.addShard("192.168.218.130:47017")          #添加分片服务器

sh.addShard("192.168.218.130:47018")

mongos> use kgc               #建立数据进行测试

mongos> for(var i=1;i<=10000;i++)db.users.insert({"id":i,"name":"tom"+i})

db.users.find().limit(5)

此时查看状态,分片显示false

sh.status()

          databases:

                { "_id" : "kgc", "primary" : "shard0000", "partitioned" : false }

mongos> sh.enableSharding("kgc")       #开启库分片

          { "ok" : 1 }

此时查看状态,分片显示true

sh.status()

          databases:

                  { "_id" : "kgc", "primary" : "shard0000", "partitioned" : true }

db.users.createIndex({"id":1})               #建立分片索引

            "ok" : 1

sh.shardCollection("kgc.users",{"id":1})         #开启表数据分片

            { "collectionsharded" : "kgc.users", "ok" : 1 }

此时查看状态,可见详细分片信息

sh.status()

          { "id" : { "$minKey" : 1 } } -->> { "id" : 4682 } on : shard0001 Timestamp(2, 0)

          { "id" : 4682 } -->> { "id" : 9364 } on : shard0000 Timestamp(2, 1)

          { "id" : 9364 } -->> { "id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 2)

-------------------------分片管理------------------------

添加标签

mongos> sh.addShardTag("shard0000","shard00")

mongos> sh.addShardTag("shard0001","shard01")

sh.status()

              { "_id" : "shard0000", "host" : "192.168.218.130:47017", "tags" : [ "shard00" ] }

              { "_id" : "shard0001", "host" : "192.168.218.130:57017", "tags" : [ "shard01" ] }

查看分片信息

[root@localhost bin]# mongo --port 37017

use config

configsvr> show collections

db.databases.find() 查看是否分片

db.collections.find() 查看集合

db.chunks.find() 查看分片信息

删除分片节点

use admin

db.runcommand({"removeshard":"192.168.218.130:67017")

sh.status()