MongoDB複製集搭建(3.4.17版)

==版本==

mongodb-linux-x86_64-rhel70-3.4.17.tgzjava

 

==準備==

3個節點,我這裏的IP及hostname分別是:linux

10.11.2.52 dscn49

10.11.2.53 dscn50

10.11.2.54 dscn51

 

同時節點須要完成:git

一、關閉防火牆github

二、SSH互信mongodb

 

==節點規劃==

dscn49:PRIMARY數據庫

dscn50:SECONDARYvim

dscn51:ARBITERapp

 

==安裝步驟==

一、上傳壓縮包

使用ftp工具上傳mongodb安裝包並解壓縮至工具

/home/hadmin/mongodb測試

 

二、建立文件夾

配置文件存放路徑:mkdir /home/hadmin/mongodb/conf

數據文件存儲目錄:mkdir /home/hadmin/data/mongodb

日誌文件存儲路徑:mkdir /home/hadmin/data/mongodb/log

 

三、建立MongoDB啓動配置文件

配置文件: 

/home/hadmin/mongodb/conf/mongo.conf

 

配置文件內容:

#端口號
port=27017

#數據文件存儲路徑
dbpath=/home/hadmin/data/mongodb

#日誌文件存儲路徑
logpath=/home/hadmin/data/mongodb/log/mongodb.log

#使用追加的方式寫日誌
logappend=true

#以守護進程的方式啓動,即在後臺運行
fork=true

#最大鏈接數
maxConns=5000

#是否啓用身份驗證
auth=false

#複製集名稱
replSet=repl1

 

配置文件截圖:

注意:複製名稱的replSet的「S」須要大寫。

 

四、配置Linux系統環境變量

vim /etc/profile

source /etc/profile

 

五、一樣的配置在其餘兩個節點完成。

能夠經過scp命令,把配置好的mongodb文件夾拷貝到其餘兩個節點。

scp -r /home/hadmin/mongodb dscn50:/home/hadmin

scp -r /home/hadmin/mongodb dscn51:/home/hadmin

 

==啓動==

在dscn49上運行命令:mongod --config /home/hadmin/mongodb/conf/mongodb.conf

在dscn50上運行命令:mongod --config /home/hadmin/mongodb/conf/mongodb.conf

在dscn51上運行命令:mongod --config /home/hadmin/mongodb/conf/mongodb.conf

 

啓動成功是能夠看到以下日誌:

about to fork child process, waiting until server is ready for connections.
forked process: 220682
child process started successfully, parent exiting

 

能夠用ps -ef  | grep mongo來查看進程ID。

好,經過上面一頓猛如虎的操做以後,MongoDB集羣就啓動起來了。

 

==初始化複製集==

啓動三個節點的mongodb服務後,開始把他們初始化爲副本集。

在想設置primary的節點上運行客戶端mongo

 

複製集初始化命令:

config_repl1={_id:"repl1", members:[{_id:0, host:"dscn49:27017", priority:1}, {_id:1, host:"dscn50:27017"}, {_id:2, host:"dscn51:27017", arbiterOnly:true}]}
rs.initiate(config_repl1);

 

正常初始化複製集以後,能夠看到

第一個節點變動爲PRIMARY。

第二個節點變動爲SECONDARY。

第三個節點變動爲ARBITER。(仲裁幾點)

 

==數據同步測試==

首先向PRIMRY(主節點)寫入一條數據,

use qch
db.say.insert({"text":"Hello World"})

插入後可使用db.say.find()查看一下插入結果。

 

進入SECONDARY(副節點)查看數據是否同步。

默認狀況下SECONDARY節點不能讀寫,要設定slaveOK爲true才能夠從SECONDARY節點讀取數據。

replSet裏只能有一個Primary節點,只能在Primary寫數據,不能在SECONDARY寫數據

若是爲設置slaveOK爲true,會看到報錯信息:

repl1:SECONDARY> db.say.find()
Error: error: {
    "ok" : 0,
    "errmsg" : "not master and slaveOk=false",
    "code" : 13435,
    "codeName" : "NotMasterNoSlaveOk"
}
repl1:SECONDARY>

 

 設置slaveOk以後,查看結果,能夠看到數據已經正常同步。

 

==故障切換測試==

副本集還有個重要的功能就是故障切換,

若是把主節點關閉,看看副節點是否能接替主節點進行工做。

 

一、關閉主節點

命令:

use admin
db.shutdownServer()

 

二、去副節點查看狀態

repl1:PRIMARY> rs.status()
{
    "set" : "repl1",
    "date" : ISODate("2018-09-26T03:16:42.857Z"),
    "myState" : 1,
    "term" : NumberLong(2),
    "syncingTo" : "",
    "syncSourceHost" : "",
    "syncSourceId" : -1,
    "heartbeatIntervalMillis" : NumberLong(2000),
    "optimes" : {
        "lastCommittedOpTime" : {
            "ts" : Timestamp(1537931731, 1),
            "t" : NumberLong(1)
        },
        "appliedOpTime" : {
            "ts" : Timestamp(1537931793, 1),
            "t" : NumberLong(2)
        },
        "durableOpTime" : {
            "ts" : Timestamp(1537931793, 1),
            "t" : NumberLong(2)
        }
    },
    "members" : [
        {
            "_id" : 0,
            "name" : "dscn49:27017",
            "health" : 0,
            "state" : 8,
            "stateStr" : "(not reachable/healthy)",
            "uptime" : 0,
            "optime" : {
                "ts" : Timestamp(0, 0),
                "t" : NumberLong(-1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(0, 0),
                "t" : NumberLong(-1)
            },
            "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
            "optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"),
            "lastHeartbeat" : ISODate("2018-09-26T03:16:42.484Z"),
            "lastHeartbeatRecv" : ISODate("2018-09-26T03:15:32.439Z"),
            "pingMs" : NumberLong(0),
            "lastHeartbeatMessage" : "Connection refused",
            "syncingTo" : "",
            "syncSourceHost" : "",
            "syncSourceId" : -1,
            "infoMessage" : "",
            "configVersion" : -1
        },
        {
            "_id" : 1,
            "name" : "dscn50:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 1105,
            "optime" : {
                "ts" : Timestamp(1537931793, 1),
                "t" : NumberLong(2)
            },
            "optimeDate" : ISODate("2018-09-26T03:16:33Z"),
            "syncingTo" : "",
            "syncSourceHost" : "",
            "syncSourceId" : -1,
            "infoMessage" : "could not find member to sync from",
            "electionTime" : Timestamp(1537931742, 1),
            "electionDate" : ISODate("2018-09-26T03:15:42Z"),
            "configVersion" : 1,
            "self" : true,
            "lastHeartbeatMessage" : ""
        },
        {
            "_id" : 2,
            "name" : "dscn51:27017",
            "health" : 1,
            "state" : 7,
            "stateStr" : "ARBITER",
            "uptime" : 941,
            "lastHeartbeat" : ISODate("2018-09-26T03:16:42.465Z"),
            "lastHeartbeatRecv" : ISODate("2018-09-26T03:16:40.992Z"),
            "pingMs" : NumberLong(0),
            "lastHeartbeatMessage" : "",
            "syncingTo" : "",
            "syncSourceHost" : "",
            "syncSourceId" : -1,
            "infoMessage" : "",
            "configVersion" : 1
        }
    ],
    "ok" : 1
}
repl1:PRIMARY>

能夠看到

dscn49變爲:not reachable/healthy

dscn50變爲:PRIMARY

 

==Java程序鏈接MongoDB副本集測試==

程序以下:

Github路徑:https://github.com/quchunhui/tod-train-1.0/blob/master/mongodb/src/main/java/examples/TextMongoDBReplSet.java

public class TextMongoDBReplSet {
    public static void main(String[] args) {
        List<ServerAddress> addresses = new ArrayList<>();
        ServerAddress address1 = new ServerAddress("10.11.2.52", 27017);
        ServerAddress address2 = new ServerAddress("10.11.2.53", 27017);
        ServerAddress address3 = new ServerAddress("10.11.2.54", 27017);
        addresses.add(address1);
        addresses.add(address2);
        addresses.add(address3);

        MongoClient client = new MongoClient(addresses);
        MongoDatabase db = client.getDatabase("qch");
        MongoCollection<Document> coll = db.getCollection("say");

        Document doc = new Document();
        doc.append("morning", "Good Morning");
        coll.insertOne(doc);

        FindIterable<Document> fi = coll.find();
        for (Document rs : fi) {
            System.out.println(rs.toString());
        }
    }
}

 

運行代碼,能夠看到以下運行結果

 

進入數據庫,查看插入結果,也能夠看到正常插入。

 

==可能遇到的問題==

一、Connection refused

在初始化集羣的時候,可能出現Connection refused的拒絕訪問的錯誤,以下圖:

 

解決辦法

在配置文件中增長bind_ip=0.0.0.0

bind_ip標識容許鏈接的客戶端IP地址,此處設爲0.0.0.0,表示容許全部機器鏈接。也可設置特定機器的IP。

 

--END--

相關文章
相關標籤/搜索