MongoDB是一個(gè)非常優(yōu)秀的非關(guān)系型數(shù)據(jù)庫(kù)贱傀,其優(yōu)秀的性能和類SQL兼容一直是非強(qiáng)事務(wù)性存儲(chǔ)的好選擇嗽桩。
當(dāng)數(shù)據(jù)量到一定量級(jí)且需要高可用的時(shí)候纫版,我們需要MongoDB的集群胳挎,本文用3個(gè)實(shí)例做集群搭建演示
1. 基礎(chǔ)環(huán)境準(zhǔn)備
RH/Centos Linux服務(wù)器3臺(tái),在此假設(shè)3臺(tái)服務(wù)器IP/hostname分別為:
- 192.168.10.27 / master
- 192.168.10.28 / cluster1
- 192.168.10.29 / cluster2
MongoDB集群節(jié)點(diǎn)之間默認(rèn)使用
27017
通信迅细,也可自定義設(shè)置修改該端口
請(qǐng)確保集群節(jié)點(diǎn)之間和對(duì)外開放通信端口
2. 下載安裝
分別在3臺(tái)服務(wù)器上進(jìn)行如下安裝操作
-
官網(wǎng)下載安裝包或使用下面的命令下載(請(qǐng)選擇對(duì)應(yīng)的系統(tǒng)版本巫橄,此處使用Community版本演示,Enterprise搭建過程相同):
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.4.10.tgz
解壓安裝包至
/usr/local/mongodb-3.4.10
目錄茵典,該目錄及軟件的安裝目錄(后面會(huì)講到數(shù)據(jù)的存放目錄請(qǐng)注意區(qū)分)-
完成后配置MongoDB的環(huán)境變量:
export MONGO_HOME=/usr/local/mongodb-3.4.10 export PATH=$MONGO_HOME/bin:PATH
使用
source
命令使環(huán)境變量生效
3. 集群初始化及配置
MongoDB使用本地文件作為數(shù)據(jù)庫(kù)存儲(chǔ)湘换,存儲(chǔ)數(shù)據(jù)和Mongo自身使用的配置等全部存儲(chǔ)在文件系統(tǒng),我們需要指定這些文件所用的目錄并使用配置聲明
-
配置實(shí)例
分別在3臺(tái)服務(wù)器執(zhí)行如下操作:
mkdir -p /usr/local/test_data/db/data mkdir -p /usr/local/test_data/db/log cd /usr/local/test_data vi replica.yml systemLog: destination: file path: "/usr/local/test_data/db/log/replica-set.log" processManagement: fork: true net: port: 27017 storage: dbPath: "/usr/local/test_data/db/data/" replication: replSetName: "drive" sharding: clusterRole: shardsvr
-
啟動(dòng)所有節(jié)點(diǎn)
分別在3臺(tái)服務(wù)器使用:
mongod -f /usr/local/test_data/replica.yml
啟動(dòng)Mongo實(shí)例此時(shí)使用
ps
應(yīng)該可以在3臺(tái)服務(wù)器上分別看到一個(gè)Mongo進(jìn)程 -
連接子節(jié)點(diǎn)
注意下面的操作僅在主節(jié)點(diǎn)進(jìn)行
選3臺(tái)服務(wù)器其中一臺(tái)(此處使用 192.168.10.27/master)作為初始主節(jié)點(diǎn)進(jìn)行操作
在此節(jié)點(diǎn)上使用Mongo Shell统阿,鍵入命令
mongo
在出現(xiàn)的Shell當(dāng)中使用如下命令連接各節(jié)點(diǎn)
rs.initiate() //初始化集群主節(jié)點(diǎn)彩倚,使用默認(rèn)初始配置,子節(jié)點(diǎn)隨后添加 rs.status() //查看狀態(tài)扶平。此命令的輸出中members元素應(yīng)該只有此服務(wù)器的信息 rs.add('192.168.10.28:27017') //添加節(jié)點(diǎn)1帆离,未報(bào)錯(cuò)且輸出為1則說明添加成功 rs.add('192.168.10.29:27017') //添加節(jié)點(diǎn)2,未報(bào)錯(cuò)且輸出為1則說明添加成功 rs.status() //查看狀態(tài)结澄。此時(shí)輸出的members元素中應(yīng)該有3個(gè)節(jié)點(diǎn)的信息
-
設(shè)置子節(jié)點(diǎn)為可讀狀態(tài)分擔(dān)主節(jié)點(diǎn)讀取壓力
分別在子節(jié)點(diǎn)使用
mongo
命令打開Shelldb.getMongo().setSlaveOk() //開啟子節(jié)點(diǎn)讀取 show dbs //如果未出現(xiàn)錯(cuò)誤提示則說明成功
4. 建立索引
我們定義演示使用的庫(kù)名為trips
哥谷,假定是用戶跑步過程中的行程及坐標(biāo)記錄數(shù)據(jù)岸夯,使用的集合名稱為coordinates
行程坐標(biāo)數(shù)據(jù)中可以添加索引以提高查詢速度,此處使用列為tripID
和timestamp
们妥。索引選列的依據(jù)和傳統(tǒng)數(shù)據(jù)庫(kù)類似猜扮,選定常作為過濾條件的列或列組合和提高效率
在主節(jié)點(diǎn)使用mongo
呼出Shell
use trips //切換到行程坐標(biāo)庫(kù),初始化時(shí)沒有該庫(kù)并不影響
db.coordinates.getIndexes() //此時(shí)應(yīng)該能看到一個(gè)默認(rèn)的"_id"索引列
db.coordinates.createIndex({"tripID":1})
db.coordinates.createIndex({"timestamp":1})
db.coordinates.getIndexes() //此時(shí)應(yīng)該能"_id","tripID","timestamp"3條索引記錄
5. 驗(yàn)證&測(cè)試
任意節(jié)點(diǎn)使用下面命令應(yīng)該都能看到未報(bào)錯(cuò)的輸出結(jié)果且返回信息包含的節(jié)點(diǎn)信息正確
rs.status()
rs.conf()
show dbs
use trips
show collections
db.coordinates.getIndexes()
6. 配置MongoDB用戶名密碼
首先建立系統(tǒng)管理員賬戶王悍,在主節(jié)點(diǎn)進(jìn)行如下操作:
mongo
use admin
db.createUser({user:"root",pwd:"changeme",roles:[{role:"root",db:"admin"}]}) #數(shù)據(jù)庫(kù)管理員
use trips
db.createUser({user:"trip_owner",pwd:"changeme",roles:[{role:"dbAdmin",db:"trips"},{role:"readWrite",db:"trips"}]}) #行程坐標(biāo)庫(kù)的使用者
show users #檢查是否添加成功
完成之后關(guān)閉所有節(jié)點(diǎn)的Mongo實(shí)例并重新啟動(dòng)破镰,在啟動(dòng)命令后添加--auth
聲明開啟用戶身份認(rèn)證