一:概念
通俗的講複本集就是用多台機器進行同一資料的非同步同步,從而使多台機器擁有同一資料的多個副本,並且當主庫當掉時在不需要使用者幹預的情況下自動切換其他備份伺服器做主庫。而且還可以利用複本伺服器做唯讀伺服器,實現讀寫分離,提高負載。
二:實驗環境
三:實驗步驟
3.1 下載
下載地址:
https://www.mongodb.org/
下載完成後傳到三台機器的/download下。
#3.2-3.5在三台機器上都要執行。
這裡以192.168.6.51為例:
3.2 解壓
[root@ser6-51 download]# tar xvf mongodb-linux-x86_64-2.6.9.tgz mongodb-linux-x86_64-2.6.9/READMEmongodb-linux-x86_64-2.6.9/THIRD-PARTY-NOTICESmongodb-linux-x86_64-2.6.9/GNU-AGPL-3.0mongodb-linux-x86_64-2.6.9/bin/mongodumpmongodb-linux-x86_64-2.6.9/bin/mongorestoremongodb-linux-x86_64-2.6.9/bin/mongoexport mongodb-linux-x86_64-2.6.9/bin/mongoimportmongodb-linux-x86_64-2.6.9/bin/mongostat mongodb-linux-x86_64-2.6.9/bin/mongotopmongodb-linux-x86_64-2.6.9/bin/mongooplogmongodb-linux-x86_64-2.6.9/bin/mongofilesmongodb-linux-x86_64-2.6.9/bin/bsondumpmongodb-linux-x86_64-2.6.9/bin/mongoperfmongodb-linux-x86_64-2.6.9/bin/mongodmongodb-linux-x86_64-2.6.9/bin/mongosmongodb-linux-x86_64-2.6.9/bin/mongo
#為了方便管理,把安裝檔案移動到/data下
[root@ser6-51 download]# mv mongodb-linux-x86_64-2.6.9 /data/mongodb
3.3 建立相關目錄
為mongodb建立資料庫存放的位置和記錄檔
[root@ser6-51 mongodb]# cd /data/mongodb/ [root@ser6-51 mongodb]# mkdir data[root@ser6-51 mongodb]# touch logs[root@ser6-51 mongodb]# ls -ltrtotal 68-rw-r--r-- 1 1046 1046 1359 Mar 23 22:49 README-rw-r--r-- 1 1046 1046 34520 Mar 23 22:49 GNU-AGPL-3.0-rw-r--r-- 1 1046 1046 17793 Mar 23 22:49 THIRD-PARTY-NOTICESdrwxr-xr-x 2 root root 4096 Jul 15 13:26 bindrwxr-xr-x 2 root root 4096 Jul 15 13:34 data-rw-r--r-- 1 root root 0 Jul 15 13:34 logs
3.4 建立Linux使用者
[root@ser6-51 mongodb]# groupadd mongodb[root@ser6-51 mongodb]# useradd -g mongodb mongodb[root@ser6-51 mongodb]# chown -R mongodb:mongodb /data/mongodb[root@ser6-51 ~]# passwd mongodbChanging password for user mongodb.New password: BAD PASSWORD: it is based on a dictionary wordBAD PASSWORD: is too simpleRetype new password: passwd: all authentication tokens updated successfully.
3.5 配置PATH
#mongodb使用者:
在PATH末尾添加Mongodb 安裝檔案/bin路徑:
[root@ser6-51 init.d]# su - mongodb
[mongodb@ser6-51 ~]$ vi .bash_profile
PATH=$PATH:$HOME/bin:/data/mongodb/bin/
[mongodb@ser6-51 ~]$ source .bash_profile
這樣就可以不用進入到/data/mongodb/bin/路徑下使用mongo命令了,直接輸入mongo命令即可。
#root使用者省略
3.6 啟動mongodb
#192.168.6.51:[root@ser6-51 ~]# mongod --dbpath=/data/mongodb/data --logpath=/data/mongodb/logs --fork --replSet MyReplset/192.168.6.51:27017about to fork child process, waiting until server is ready for connections.forked process: 4936child process started successfully, parent exiting #192.168.6.52:[root@ser6-52 bin]# mongod --dbpath=/data/mongodb/data --logpath=/data/mongodb/logs --fork --replSet MyReplset/192.168.6.52:27017about to fork child process, waiting until server is ready for connections.forked process: 19649child process started successfully, parent exiting #192.168.6.70 [mongodb@ser6-70 ~]$ mongod --dbpath=/data/mongodb/data --logpath=/data/mongodb/logs --fork --replSet MyReplset/192.168.6.70:27017about to fork child process, waiting until server is ready for connections.forked process: 9782child process started successfully, parent exiting #注意:MyReplset是自訂的複本集名稱
3.7 開放防火牆連接埠
#三台機器都需要開放連接埠。
為了讓其他伺服器可以遠端連線該mongodb伺服器,如果已經開啟了防火牆,需要開放其連接埠。
vi /etc/sysconfig/iptables
直接在設定檔裡已有的-A INPUT那些命令下面
添加一行:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 27017 -j ACCEPT
重啟防火牆
[root@ser6-52 mongodb]# /etc/init.d/iptables restart
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
iptables: Applying firewall rules: [ OK ]
3.8 初始化複本集
串連其中一個節點,初始化命令只能執行一次。
[root@ser6-51 ~]# mongoMongoDB shell version: 2.6.9connecting to: test> use admin;switched to db admin > config = { _id:"MyReplset", members:[... {_id:0,host:"192.168.6.51:27017"},... {_id:1,host:"192.168.6.52:27017"},... {_id:2,host:"192.168.6.70:27017"}]... }{"_id" : "MyReplset","members" : [{"_id" : 0,"host" : "192.168.6.51:27017"},{"_id" : 1,"host" : "192.168.6.52:27017"},{"_id" : 2,"host" : "192.168.6.70:27017"}]}> rs.initiate(config);{"info" : "Config now saved locally. Should come online in about a minute.","ok" : 1}
/*
config = { _id:"MyReplset", members:[ {_id:0,host:"192.168.6.51:27017"},
{_id:1,host:"192.168.6.52:27017"}, {_id:2,host:"192.168.6.70:27017"}] }
*/
--注意,假如開啟使用者認證之後,初始化複本集時報錯:"errmsg" : "not authorized on admin to execute command { replSetInitiate: { _id: \"MyReplset\", members。需要賦予使用者clusterManager角色。如:db.grantRolesToUser( "admin" , [ { role: "clusterManager", db: "admin" } ]); 3.9 查看狀態
MyReplset:PRIMARY> db.printSlaveReplicationInfo();source: 192.168.6.52:27017syncedTo: Wed Jul 15 2015 16:04:52 GMT+0800 (CST)0 secs (0 hrs) behind the primary source: 192.168.6.70:27017syncedTo: Wed Jul 15 2015 16:04:52 GMT+0800 (CST)0 secs (0 hrs) behind the primary
顯示的是從節點的資料來源列表,其中有資料延隔時間。
3.10 設定副本節點可讀
#mongodb預設是從主節點讀寫資料的,副本節點上不允許讀,需要設定副本節點可以讀。
#在所有節點上進行設定
修改root使用者,mongodb使用者家目錄下的.mongorc.js檔案
如:
vi /root/.mongorc.js
vi /home/mongodb/.mongorc.js
添加一行:rs.slaveOk();
修改完成後,重新登入mongo,發現副本節點可讀了(當前會話不生效,需要重新登入才行)。
3.11 驗證是否同步成功
在主庫上建個表,看其他副本是否同步成功。#主節點MyReplset:PRIMARY> use dba;switched to db dbaMyReplset:PRIMARY> show tables;MyReplset:PRIMARY> db.createCollection("a");{ "ok" : 1 }MyReplset:PRIMARY> show tables;asystem.indexes #副本節點MyReplset:SECONDARY> use dba;switched to db dbaMyReplset:SECONDARY> show tables;asystem.indexes 說明同步成功,複本集配置成功。
3.12 認證使用者
3.12.1 簡單介紹
預設,mongodb無需認證,便可訪問,十分不安全。故需要進行認證。
在叢集及複本集環境中必須使用keyFile參數,只使用--auth參數將無法工作。
用戶端在叢集中進行認證與在單伺服器環境中的認證是一樣的,唯一的區別是叢集中伺服器使用密鑰檔案進行內部溝通。
密鑰檔案基本上是一個明文的檔案,hash計算後被當做叢集的內部密碼。
設定複本集 and/or 分區的驗證:
a,建立key檔案並複製到集合的每個伺服器中。密鑰檔案是字元的base64集,加上空格與分行符號。
b,修改密鑰檔案許可權為只能被目前使用者讀取。
c,啟動叢集中的伺服器時使用命令列參數 --keyFile /path/to/file
d,用戶端都必須驗證才能使用
啟動時可以不使用 --auth參數,因為使用了 --keyFile就必須驗證,也就是隱含了 --auth。但是--auth並不隱含 --keyFile。
如果不建密碼檔案,只建資料庫使用者,則不用認證,可以直接登入訪問,即auth失效。
故複本集這種模式必須建密碼檔案。
3.12.2 建資料庫使用者
#在三台機器上建使用者:
MyReplset:PRIMARY> db.createUser({user:"root",pwd:"123456",roles:[{role:"root",db:"admin"}]}); Successfully added user: {"user" : "root","roles" : [{"role" : "root","db" : "admin"}]}
3.12.3 關庫
#關庫(這裡以主節點為例)
MyReplset:PRIMARY> db.shutdownServer();2015-07-15T17:22:56.673+0800 DBClientCursor::init call() failedserver should be down...2015-07-15T17:22:56.675+0800 trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed2015-07-15T17:22:56.675+0800 warning: Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused2015-07-15T17:22:56.675+0800 reconnect 127.0.0.1:27017 (127.0.0.1) failed failed couldn't connect to server 127.0.0.1:27017 (127.0.0.1), connection attempt failed
3.12.4 產生密碼檔案
#在192.168.6.51上產生密碼檔案[root@ser6-51 ~]# openssl rand -base64 741 > /data/mongodb/mongodb-keyfile賦予許可權600,檔案才能被調用chmod 600 /data/mongodb/mongodb-keyfile #將密碼檔案拷貝到其他節點[root@ser6-51 ~]# scp /data/mongodb/mongodb-keyfile 192.168.6.52:/data/mongodb/root@192.168.6.52's password: mongodb-keyfile 100% 1004 1.0KB/s 00:00 [root@ser6-51 ~]# scp /data/mongodb/mongodb-keyfile 192.168.6.70:/data/mongodb/root@192.168.6.70's password: mongodb-keyfile 100% 1004 1.0KB/s 00:00
3.12.5 以認證的方式登入
#192.168.6.51[root@ser6-51 ~]# mongod --dbpath=/data/mongodb/data --logpath=/data/mongodb/logs --fork --replSet MyReplset/192.168.6.51:27017 --keyFile=/data/mongodb/mongodb-keyfileabout to fork child process, waiting until server is ready for connections.forked process: 8472child process started successfully, parent exiting #192.168.6.52[root@ser6-51 ~]# mongod --dbpath=/data/mongodb/data --logpath=/data/mongodb/logs --fork --replSet MyReplset/192.168.6.52:27017 --keyFile=/data/mongodb/mongodb-keyfileabout to fork child process, waiting until server is ready for connections.forked process: 8472child process started successfully, parent exiting #192.168.6.70[root@ser6-51 ~]# mongod --dbpath=/data/mongodb/data --logpath=/data/mongodb/logs --fork --replSet MyReplset/192.168.6.70:27017 --keyFile=/data/mongodb/mongodb-keyfileabout to fork child process, waiting until server is ready for connections.forked process: 8472child process started successfully, parent exiting
3.13 建設定檔
每次啟動Mongodb,都要指定資料檔案路徑,日誌路徑等參數,太麻煩。
所以建一個設定檔,啟動mongodb的時候以設定檔的方式啟動,可以方便些。
Mongodb預設沒有設定檔,需要手動建立。
這裡以192.168.6.51為例:
cd /data/mongodb/
vi mongod.conf
添加:
logpath=/data/mongodb/logslogappend=true #fork and run in backgroundfork=trueauth=trueport=27017dbpath=/data/mongodb/data#location of pidfilepidfilepath=/data/mongodb/mongod.pid keyFile=/data/mongodb/mongodb-keyfilereplSet=MyReplset/192.168.6.51:27017
#注意:在192.168.6.52/192.168.6.70上修改設定檔時,記得把replSet那行的IP改為對應的IP.
#關庫
[root@ser6-51 ~]# ps -ef | grep mongo
root 608 1 0 11:02 ? 00:00:01 mongod --dbpath=/data/mongodb/data --logpath=/data/mongodb/logs --fork --replSet =MyReplset/192.168.6.51:27017 --keyFile=/data/mongodb/mongodb-keyfile
root 794 579 0 11:06 pts/0 00:00:00 grep mongo
root 32347 32274 0 10:36 pts/1 00:00:00 su - mongodb
mongodb 32348 32347 0 10:36 pts/1 00:00:00 -bash
[root@ser6-51 ~]# kill -2 608
#以設定檔的方式啟動
[root@ser6-51 ~]# mongod --config=/data/mongodb/mongod.conf
3.14 設定開機自動啟動
vi /etc/rc.d/rc.local
添加:
#開機啟動mongodb
/data/mongodb/bin/mongod --config /data/mongodb/mongod.conf
#重啟機器,檢測是否生效
[root@ser6-70 ~]# ps -ef | grep mongo
root 1596 1 1 11:27 ? 00:00:00 /data/mongodb/bin/mongod --config /data/mongodb/mongod.conf
root 1735 1691 0 11:27 pts/1 00:00:00 grep mongo
說明啟動成功了。
--本篇文章參考:MongoDB-安全與認證,Mongodb2.6複本集驗證部署和認證。