mongodb Replica Set 部署

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> 

其他相關操作:

  1. 設置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 }
  2. 增刪節點。
    把25服務加入到副本集中:
    rs.add("172.31.200.25:27017")
  3. 把25服務從副本集中刪除:
    rs.remove("172.31.200.25:27017")
  4. 查看複製的情況
    db.printSlaveReplicationInfo()
  5. 查看副本集的狀態
    rs.status()
  6. 副本集的配置
    rs.conf()/rs.config()
  7. 當前節點情況

    db.isMaster() 
  8. 添加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 權限管理

  9. 創建管理員賬號

    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
  10. 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()  #查看數據庫服務器的狀態
  1. 修改用戶密碼
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')
  1. 內建的角色

數據庫用戶角色:read、readWrite;
數據庫管理角色:dbAdmin、dbOwner、userAdmin;
集羣管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
備份恢復角色:backup、restore;
所有數據庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
超級用戶角色:root
// 這裏還有幾個角色間接或直接提供了系統超級用戶的訪問(dbOwner 、userAdmin、userAdminAnyDatabase)
內部角色:__system
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章