您的位置:首页 > 数据库 > Mongodb

在CentOS7上部署MongoDB分片群集

2018-09-19 15:53 621 查看

MongoDB分片概述

        在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。
        当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。


为什么使用分片

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

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

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

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

本地磁盘不足

垂直扩展价格昂贵

MongoDB原理图示:



上图中主要有如下所述三个主要组件:
Shard:用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障

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

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

MongoDB分片实验步骤演示:
[b]安装配置MongoDB[/b]
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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库 其他