基於CentOS7的mongodb分片群集
簡介
高數據量和吞吐量的數據庫應用會對單機的性能造成較大的壓力,大的查詢量會將單機的CPU耗盡,大的數據量對單機的存儲壓力較大,最終會耗盡系統的內存而將壓力轉移到磁盤IO上。
mongodb分片是使用多個服務器存儲數據的方法,以支持巨大的數據存儲和對數據進行操作。分片技術可以滿足Mongodb數據量大量增長的需求。,當一臺mongodb服務器不足以存儲海量數據或不足以提供可接受的讀寫吞吐量時,就可以通過在多臺服務器上分割數據,使得數據庫系統能存儲和處理更多的數據。
分片的優勢
-
使用分片減少了每個分片需要處理的請求數,通過水平擴展,群集可以提高自己的存儲容量和吞吐量。
- 使用分片減少了每個分片存儲的數據
分片群集的組成
- Shard:分片服務器,用於存儲實際的數據塊
- configserver:配置服務器,存儲整個分片群集的配置信息
- routers:路由服務器
分片群集管理的實驗
實驗配置圖如上
下面開始實驗,這裏我在一臺機器上開啟多個實例來代替多臺服務器
安裝mongodb3.2版本(手工編譯安裝)
- 安裝軟件環境包
yum -y install openssl-devel
- 解壓縮mongodb軟件包
tar zxvf mongodb-linux-x86_64-3.2.1.tgz -C /opt
- 移動軟件包至系統識別的目錄下
mv mongodb-linux-x86_64-3.2.1/ /usr/local/mongodb
- 創建mongodb的數據存儲(/data/mongodb1、2、3、4、)和日誌存儲目錄(/data/logs)
mkdir -p /data/mongodb/mongodb{1,2,3,4}
mkdir /data/mongodb/logs
touch /data/mongodb/logs/mongodb{1,2,3,4}.log
chmod -R 777 /data/mongodb/logs/*.log
- 設置ulimit -n和ulimit -u 的值
當mongodb處於頻繁訪問的狀態,如果shell啟動進程所占用的資源設置過低,將會產生錯誤導致無法連接mongodb實例,所以這裏需要設置ulimit -n和ulimit -u 的值大於20000
ulimit -n 25000
ulimit -u 25000
- 創建配置服務器的配置文件
cd /usr/local/mongodb/bin/
vim mongodb1.conf
port=37017 #端口
dbpath=/data/mongodb/mongodb1 #數據存儲位置
logpath=/data/mongodb/logs/mongodb1.log #日誌存儲位置
logappend=true #錯誤日誌采用追加模式,配置這個選項後mongodb的日誌會追加到現有的日誌文件,而不是從新創建一個新文件
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
- 創建軟鏈接,方便管理
ln -s /usr/local/mongodb/bin/mongo /usr/bin/mongo
ln -s /usr/local/mongodb/bin/mongod /usr/bin/mongod
- 開啟第一個實例(配置服務器)
-
配置分片服務器的實例
復制生成配置文件cp -p mongodb1.conf mongodb2.conf #復制配置服務器的配置文件生成實例2的配置文件
cp -p mongodb1.conf mongodb3.conf #復制配置服務器的配置文件生成實例2的配置文件 - 修改實例2、3的配置文件
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 #指定分片服務器的模式
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
- 開啟兩個分片服務器的實例
mongod -f mongodb2.conf
mongod -f mongodb3.conf
- 啟動路由服務器
./mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.234.177:37017 --chunkSize 1
這裏關於mongos命令不知道該怎麽使用,可以查看幫助信息
- 啟用分片服務器
mongo
- 添加分片服務器
sh.addShard("192.168.234.177:47017")
sh.addShard("192.168.234.177:47018")
添加分片服務器之後再次查看
-
測試分片功能
mongos> show dbs
config 0.031GB
mongos> use kgc #進入並創建一個use的集合
switched to db kgc
mongos> db.users.insert({"id":1,"name":"zhangsan"}) #添加一條數據
WriteResult({ "nInserted" : 1 })
mongos> for(var i=2;i<=20000;i++)db.users.insert({"id":i,"name":"zyc"+i}) #使用for循環添加20000條數據
WriteResult({ "nInserted" : 1 })
mongos> show dbs #查看表空間就會有一個kgc
config 0.031GB
kgc 0.078GB
mongos> show tables #查看表信息也可以看到users表
system.indexes
users
- 開啟分片功能
sh.enableSharding("kgc")
- 對數據庫中的集合開啟分片
db.users.createIndex({"id":1}) #對users表創建索引
sh.shardCollection("kgc.users",{"id":1}) #表分片
sh.status() #此時再次查看,就可以已經進行分片處理了
到這裏mongodb分片群集管理的介紹就全部完成了,如果覺得有幫助記得點贊、打賞下小弟哦!!!
基於CentOS7的mongodb分片群集