1. 程式人生 > >MongoDB分片管理

MongoDB分片管理

副本 linu 分享圖片 mmapv1 limit 配置服務 節點 mongod nag

目錄
  1. 概念
  2. 基本思想
  3. 適用場景
  4. 角色介紹
  5. 實驗環境
  6. 實驗過程
    一、概念
    分片(sharding)是指將數據庫拆分,將其分散在不同的機器上的過程。將數據分散到不同的機器上,不需要功能強大的服務器就可以存儲更多的數據和處理更大的負載。
    二、基本思想
    將集合切成小塊,這些塊分散到若幹片裏,每個片只負責總數據的一部分,最後通過一個均衡器來對各個分片進行均衡(數據遷移)。通過一個名為mongos的路由進程進行操作,mongos知道數據和片的對應關系(通過配置服務器)。大部分使用場景都是解決磁盤空間的問題,對於寫入有可能會變差,查詢則盡量避免跨分片查詢。
    三、適用場景

    ① 使用分片解決磁盤空間的問題。
    ②通過分片讓寫壓力分散到各個分片上面,使用分片服務器自身的資源。

    ③想把大量數據放到內存裏提高性能。和上面一樣,通過分片使用分片服務器自身的資源。

四、角色介紹
① 配置服務器。是一個獨立的mongod進程,保存集群和分片的元數據,即各分片包含了哪些數據的信息。最先開始建立,啟用日誌功能。像啟動普通的mongod一樣啟動配置服務器,指定configsvr選項。當服務不可用,則變成只讀,無法分塊、遷移數據。
② 路由服務器。即mongos,起到一個路由的功能,供程序連接。本身不保存數據,在啟動時從配置服務器加載集群信息,開啟mongos進程需要知道配置服務器的地址,指定configdb選項。
③ 分片服務器。是一個獨立普通的mongod進程,保存數據信息。可以是一個副本集也可以是單獨的一臺服務器。

原理拓撲圖
技術分享圖片
實驗環境:
版本:MongoDB 3.2.1
安裝包:鏈接:https://pan.baidu.com/s/1Dfy6Ria49Dc_oMKOBUNY1g 密碼:fnwv

主機 虛擬機 IP地址 端口
配置服務器 CentOS-7-x86_64 192.168.37.128 實例1 37017
路由服務器 CentOS-7-x86_64 192.168.37.128 實例1 37017
分片服務器1 CentOS-7-x86_64 192.168.37.128 實例2 47017
分片服務器2 CentOS-7-x86_64 192.168.37.128 實例3 47018

實驗過程:
1、解壓mongodb安裝包

mkdir /opt/abc
mount.cifs //192.168.37.1/SHARE /opt/abc
cd /opt/abc
tar zxvf mongodb-linux-x86_64-3.2.1.tgz -C /opt

2、將mongodb文件移動到/usr/local目錄下

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

技術分享圖片
3、將mongo、mongod做快捷引用

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

4、創建實例(4個實例:驗3個,1個備用)的數據存放目錄及日誌存放目錄

mkdir -p /data/mongodb/mongodb{1,2,3,4} #數據存放目錄
cd /data/mongodb/
mkdir logs
touch logs/mongodb{1,2,3,4}.log #日誌存放文件
chmod 777 logs/*.log

技術分享圖片
5、優化

ulimit -u 25000 #放大進程數
ulimit -n 25000 #放大打開文件數

配置服務器
6、編輯配置服務器文件

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            ** #配置服務器模式**

7、節點內存不足時,從其他節點分配內存

sysctl -w vm.zone_reclaim_mode=0
echo never > /sys/kernel/mm/transparent_hugepage/enabled #禁止大頁面內存出現
echo never > /sys/kernel/mm/transparent_hugepage/defrag

8、開啟配置服務器

mongod -f mongodb.conf
mongo --port 37017

技術分享圖片
片服務器
9、復制實例1配置文件(實例2)

cp -p mongodb.conf mongodb2.conf

10、修改配置文件(實例2)

vim mongodb2.conf

port=47017
dbpath=/data/mongodb/mongodb2
logpath=/data/mongodb/logs/mongodb2.log
shardsvr=true             #分片服務器模式

11、復制實例2配置文件(實例3)
cp -p mongodb2.conf mongodb3.conf

10、修改配置文件(實例3)

vim mongodb3.conf

port=47018
dbpath=/data/mongodb/mongodb3
logpath=/data/mongodb/logs/mongodb3.log

11、開啟分片服務器

mongod -f mongodb2.conf
mongo --port 47017
mongod -f mongodb3.conf
mongo --port 47018

技術分享圖片
路由服務器
12、開啟路由服務

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

--port 27017:路由配置服務器入口
--fork:後臺運行
logpath:日誌文件存儲路徑
--configdb:指定真正處理請求的服務器(配置服務器)
--chunkSize 1 :不加也可,默認200MB

技術分享圖片
啟用分片服務
13、登錄數據庫

mongo

技術分享圖片
14、查看分片服務器是否存在

sh.status() #shards下為空,無分片服務器

技術分享圖片
15、添加分片服務器

sh.addShard("192.168.37.128:47017")
sh.addShard("192.168.37.128:47018")

技術分享圖片
驗證分片服務功能
16、創建數據庫kgc---集合users---添加數據

use kgc
for(var i=1;i<=10000;i++)db.users.insert({"id":1,"name":"tom"+i}) #寫入數據
mongos> show dbs

config  0.031GB
kgc     0.078GB

技術分享圖片
17、查看是否進行分片處理

sh.status()

技術分享圖片
18、啟用數據庫分片

sh.enableSharding("kgc")
sh.status()

技術分享圖片

19、創建索引,根據索引進行分片

db.users.createIndex({"id":1}) #對user表創建索引
sh.shardCollection("kgc.users",{"id":1}) #表分片
sh.status()

技術分享圖片

20、到此,實驗已完成。另外,可依照上述步驟添加實例4,又會重新進行分片處理。

MongoDB分片管理