Replica Set
## 參考:http://blog.csdn.net/luonanqin/article/details/8497860 ,https://www.cnblogs.com/zhoujinyi/p/3554010.html
## 不同版本 mongodb 下載地址https://www.mongodb.org/dl/linux/x86_64
下面實驗使用的是ubuntu1404-3.5.13 版本
在ubuntu1404上安裝
Replica Set
中文翻譯叫做副本集,不過我並不喜歡把英文翻譯成中文,總是感覺怪怪的。其實簡單來說就是集羣當中包含了多份數據,保證主節點掛掉了,備節點能繼續提供數據服務,提供的前提就是數據需要和主節點一致
Mongodb(M)表示主節點,Mongodb(S)表示備節點,Mongodb(A)表示仲裁節點。主備節點存儲數據,仲裁節點不存儲數據。客戶端同時連接主節點與備節點,不連接仲裁節點。
默認設置下,主節點提供所有增刪查改服務,備節點不提供任何服務。但是可以通過設置使備節點提供查詢服務,這樣就可以減少主節點的壓力,當客戶端進行數據查詢時,請求自動轉到備節點上。這個設置叫做Read Preference Modes,同時Java客戶端提供了簡單的配置方式,可以不必直接對數據庫進行操作。
仲裁節點是一種特殊的節點,它本身並不存儲數據,主要的作用是決定哪一個備節點在主節點掛掉之後提升爲主節點,所以客戶端不需要連接此節點。這裏雖然只有一個備節點,但是仍然需要一個仲裁節點來提升備節點級別。我開始也不相信必須要有仲裁節點,但是自己也試過沒仲裁節點的話,主節點掛了備節點還是備節點,所以咱們還是需要它的。
介紹完了集羣方案,那麼現在就開始搭建了。
集羣節點:
master:172.31.14.255
slave: 172.31.15.180
arbiter:172.31.2.34
master 安裝
mkdir -p /work/{source,opt}
cd /work/source
wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1404-latest.tgz
tar xf mongodb-linux-x86_64-ubuntu1404-3.5.13.tgz
mv mongodb-linux-x86_64-ubuntu1404-3.5.13 ../opt/
cd ../opt/
ln -s mongodb-linux-x86_64-ubuntu1404-3.5.13/ mongodb
export PATH=$PATH:/work/opt/mongodb/bin
echo ###mongodb >> /etc/profile
echo export PATH=$PATH:/work/opt/mongodb/bin >> /etc/profile
mkdir -p /work/opt/mongodb/conf
cd /work/opt/mongodb/conf
cat >>/work/opt/mongodb/conf/mongodb.conf <<EOF
dbpath=/data/mongodb/master
logpath=/data/logs/mongodb/master.log
pidfilepath=/data/logs/mongodb/master.pid
directoryperdb=true
logappend=true
replSet=rela-mongodb
bind_ip=172.31.14.255
port=27017
oplogSize=10000
#fork=true
noprealloc=true
EOF
使用supervisor管理mongodb
apt-get install supervisor -y
supervisord
cd /etc/supervisor/conf.d
cat >> /etc/supervisor/conf.d/sup_mongodb.conf <<EOF
[program:mongodb]
command=/work/opt/mongodb/bin/mongod -f /work/opt/mongodb/conf/mongodb.conf
;process_name=%(process_num)02d
numprocs=1
#user=rela
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/data/logs/mongodb/sup_mongodb.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=5
EOF
mkdir -p /data/logs/mongodb/ /data/logs/mongodb/ /data/mongodb/master
supervisorctl update
supervisorctl status
netstat -lntup |grep mon
slave 安裝
mkdir -p /work/{source,opt}
cd /work/source
wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1404-latest.tgz
tar xf mongodb-linux-x86_64-ubuntu1404-3.5.13.tgz
mv mongodb-linux-x86_64-ubuntu1404-3.5.13 ../opt/
cd ../opt/
ln -s mongodb-linux-x86_64-ubuntu1404-3.5.13/ mongodb
export PATH=$PATH:/work/opt/mongodb/bin
echo ###mongodb >> /etc/profile
echo export PATH=$PATH:/work/opt/mongodb/bin >> /etc/profile
mkdir -p /work/opt/mongodb/conf
cd /work/opt/mongodb/conf
cat >>/work/opt/mongodb/conf/mongodb.conf <<EOF
dbpath=/data/mongodb/slave
logpath=/data/logs/mongodb/slave.log
pidfilepath=/data/logs/mongodb/slave.pid
directoryperdb=true
logappend=true
replSet=rela-mongodb
bind_ip=172.31.15.180
port=27017
oplogSize=10000
#fork=true
noprealloc=true
EOF
使用supervisor管理mongodb
apt-get install supervisor -y
supervisord
cd /etc/supervisor/conf.d
cat >> /etc/supervisor/conf.d/sup_mongodb.conf <<EOF
[program:mongodb]
command=/work/opt/mongodb/bin/mongod -f /work/opt/mongodb/conf/mongodb.conf
;process_name=%(process_num)02d
numprocs=1
#user=rela
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/data/logs/mongodb/sup_mongodb.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=5
EOF
mkdir -p /data/logs/mongodb/ /data/logs/mongodb/ /data/mongodb/slave
supervisorctl update
supervisorctl status
netstat -lntup |grep mon
arbiter 安裝
mkdir -p /work/{source,opt}
cd /work/source
wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1404-latest.tgz
tar xf mongodb-linux-x86_64-ubuntu1404-3.5.13.tgz
mv mongodb-linux-x86_64-ubuntu1404-3.5.13 ../opt/
cd ../opt/
ln -s mongodb-linux-x86_64-ubuntu1404-3.5.13/ mongodb
export PATH=$PATH:/work/opt/mongodb/bin
echo ###mongodb >> /etc/profile
echo export PATH=$PATH:/work/opt/mongodb/bin >> /etc/profile
mkdir -p /work/opt/mongodb/conf
cd /work/opt/mongodb/conf
cat >>/work/opt/mongodb/conf/mongodb.conf << EOF
dbpath=/data/mongodb/arbiter
logpath=/data/logs/mongodb/arbiter.log
pidfilepath=/data/logs/mongodb/arbiter.pid
directoryperdb=true
logappend=true
replSet=rela-mongodb
bind_ip=172.31.2.34
port=27017
oplogSize=10000
#fork=true
noprealloc=true
EOF
使用supervisor管理mongodb
apt-get install supervisor -y
supervisord
cd /etc/supervisor/conf.d
cat >> /etc/supervisor/conf.d/sup_mongodb.conf <<EOF
[program:mongodb]
command=/work/opt/mongodb/bin/mongod -f /work/opt/mongodb/conf/mongodb.conf
;process_name=%(process_num)02d
numprocs=1
#user=rela
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/data/logs/mongodb/sup_mongodb.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=5
EOF
mkdir -p /data/logs/mongodb/ /data/logs/mongodb/ /data/mongodb/arbiter
supervisorctl update
supervisorctl status
netstat -lntup |grep mon
參數解釋:
dbpath:數據存放目錄
logpath:日誌存放路徑
pidfilepath:進程文件,方便停止mongodb
directoryperdb:爲每一個數據庫按照數據庫名建立文件夾存放
logappend:以追加的方式記錄日誌
replSet:replica set的名字
bind_ip:mongodb所綁定的ip地址
port:mongodb進程所使用的端口號,默認爲27017
oplogSize:mongodb操作日誌文件的最大大小。單位爲Mb,默認爲硬盤剩餘空間的5%
fork:以後臺方式運行進程
noprealloc:不預先分配存儲
4.配置主,備,仲裁節點
可以通過客戶端連接mongodb,也可以直接在主或被兩個節點中選擇一個連接mongodb。
mongo 172.31.14.255:27017 #ip和port是某個節點的地址
>use admin
>cfg={ _id:"rela-mongodb", members:[ {_id:0,host:'172.31.14.255:27017',priority:2}, {_id:1,host:'172.31.15.180:27017',priority:1},{_id:2,host:'172.31.7.138:27017',arbiterOnly:true}] };
>rs.initiate(cfg) #使配置生效
cfg是可以任意的名字,當然最好不要是mongodb的關鍵字,conf,config都可以。最外層的_id表示replica set的名字,members裏包含的是所有節點的地址以及優先級。優先級最高的即成爲主節點,即這裏的10.10.148.130:27017。特別注意的是,對於仲裁節點,需要有個特別的配置——arbiterOnly:true。這個千萬不能少了,不然主備模式就不能生效。
配置的生效時間根據不同的機器配置會有長有短,配置不錯的話基本上十幾秒內就能生效,有的配置需要一兩分鐘。如果生效了,執行rs.status()命令會看到如下信息:
rela-mongodb:SECONDARY> rs.status() ## 生效會看到下面內容
{
"set" : "rela-mongodb",
"date" : ISODate("2017-11-27T07:02:48.848Z"),
"myState" : 7,
"term" : NumberLong(2),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1511766165, 1),
"t" : NumberLong(2)
},
"appliedOpTime" : {
"ts" : Timestamp(1511766165, 1),
"t" : NumberLong(2)
},
"durableOpTime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
}
},
"members" : [
{
"_id" : 0,
"name" : "172.31.14.255:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 126,
"optime" : {
"ts" : Timestamp(1511766165, 1),
"t" : NumberLong(2)
},
"optimeDurable" : {
"ts" : Timestamp(1511766165, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2017-11-27T07:02:45Z"),
"optimeDurableDate" : ISODate("2017-11-27T07:02:45Z"),
"lastHeartbeat" : ISODate("2017-11-27T07:02:47.639Z"),
"lastHeartbeatRecv" : ISODate("2017-11-27T07:02:47.803Z"),
"pingMs" : NumberLong(0),
"electionTime" : Timestamp(1511766063, 1),
"electionDate" : ISODate("2017-11-27T07:01:03Z"),
"configVersion" : 1
},
{
"_id" : 1,
"name" : "172.31.15.180:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 126,
"optime" : {
"ts" : Timestamp(1511766165, 1),
"t" : NumberLong(2)
},
"optimeDurable" : {
"ts" : Timestamp(1511766165, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2017-11-27T07:02:45Z"),
"optimeDurableDate" : ISODate("2017-11-27T07:02:45Z"),
"lastHeartbeat" : ISODate("2017-11-27T07:02:47.639Z"),
"lastHeartbeatRecv" : ISODate("2017-11-27T07:02:48.793Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "172.31.14.255:27017",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "172.31.2.34:27017",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 745,
"configVersion" : 1,
"self" : true
}
],
"ok" : 1
}
rela-mongodb:ARBITER>
其他相關操作:
- 設置slave可讀
mmm:SECONDARY> db.test.find() error: { "$err" : "not master and slaveOk=false", "code" : 13435 } mmm:SECONDARY> rs.slaveOk() mmm:SECONDARY> db.test.find() { "_id" : ObjectId("5302edfa8c9151a5013b978e"), "a" : 1 }
- 增刪節點。
把25服務加入到副本集中:rs.add("172.31.200.25:27017")
- 把25服務從副本集中刪除:
rs.remove("172.31.200.25:27017")
- 查看複製的情況
db.printSlaveReplicationInfo()
- 查看副本集的狀態
rs.status()
- 副本集的配置
rs.conf()/rs.config()
-
當前節點情況
db.isMaster()
-
添加Arbiter
連接Primary.rs.addArb(“192.168.1.50:10001″) rs.addArb(“192.168.1.50:10002″) rs.addArb(“192.168.1.50:10003″)
權限管理
參考http://blog.csdn.net/kk185800961/article/details/45619863
mongodb 權限管理 -
創建管理員賬號
db.createUser( { user:"myadmin", pwd:"secret", roles:[{role:"root",db:"admin"}] } );
重啓mongodb db,並且在配置文件中加入啓用認證功能
/work/opt/mongodb/bin/mongod -f /work/opt/mongodb/conf/mongodb.conf
在配置文件 /work/opt/mongodb/conf/mongodb.conf中加入auth=true 參數,重啓mongodb
dbpath=/data/mongodb/arbiter logpath=/data/logs/mongodb/arbiter.log pidfilepath=/data/logs/mongodb/arbiter.pid directoryperdb=true logappend=true replSet=rela-mongodb bind_ip=172.31.7.138 port=27017 oplogSize=10000 #fork=true noprealloc=true
- mongo 常用命令
[root@snails ~]# mongo --host=127.0.0.1 --port=27017
MongoDB shell version: 3.2.7
connecting to: 127.0.0.1:27017/test
> show dbs #顯示數據庫列表
> show collections #顯示當前數據庫中的集合(類似關係數據庫中的表)
> show users #顯示用戶
> use <db name> #切換當前數據庫,如果數據庫不存在則創建數據庫。
> db.help() #顯示數據庫操作命令,裏面有很多的命令
> db.foo.help() #顯示集合操作命令,同樣有很多的命令,foo指的是當前數據庫下,一個叫foo的集合,並非真正意義上的命令
> db.foo.find() #對於當前數據庫中的foo集合進行數據查找(由於沒有條件,會列出所有數據)
> db.foo.find( { a : 1 } ) #對於當前數據庫中的foo集合進行查找,條件是數據中有一個屬性叫a,且a的值爲1
> db.dropDatabase() #刪除當前使用數據庫
> db.cloneDatabase("127.0.0.1") #將指定機器上的數據庫的數據克隆到當前數據庫
> db.copyDatabase("mydb", "temp", "127.0.0.1") #將本機的mydb的數據複製到temp數據庫中
> db.repairDatabase() #修復當前數據庫
> db.getName() #查看當前使用的數據庫,也可以直接用db
> db.stats() #顯示當前db狀態
> db.version() #當前db版本
> db.getMongo() #查看當前db的鏈接機器地址
> db.serverStatus() #查看數據庫服務器的狀態
- 修改用戶密碼
db.changeUserPassword('myadmin','8e8f5a4a21438');
4.添加普通庫讀用戶
1.登錄到mongo數據庫後,切換到admin庫,使用管理員賬號進行認證,之後切換到目標數據庫中,進行創建用戶。
use datadb ;
db.createUser(
{
user: "datadbread",
pwd: "8e8f5a4a21438",
roles: [ { role: "read", db: "datadb" } ]
}
) ;
5.添加普通庫讀寫用戶
1.登錄到mongo數據庫後,切換到admin庫,使用管理員賬號進行認證,之後切換到目標數據庫中,進行創建用戶。
use datadb ;
db.createUser(
{
user: "datadb",
pwd: "8e8f5a4a21438",
roles: [ { role: "readWrite", db: "datadb" } ]
}
) ;
5.重新授權,已經以及登錄
db.grantRolesToUser( "datadb", [ { role: "readWrite,dbAdmin",db:"datadb"} ] )
db.auth('datadb','8e8f5a4a21438')
- 內建的角色
數據庫用戶角色:read、readWrite;
數據庫管理角色:dbAdmin、dbOwner、userAdmin;
集羣管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
備份恢復角色:backup、restore;
所有數據庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
超級用戶角色:root
// 這裏還有幾個角色間接或直接提供了系統超級用戶的訪問(dbOwner 、userAdmin、userAdminAnyDatabase)
內部角色:__system