[MongoDB] 安裝MongoDB配置Replica Set


MongoDB的環境主要包括StandAlone,Replication和Sharding。

  • StandAlone:單機環境,一般開發測試的時候用。
  • Replication:主從結構,一個Primary,多個Secondary,可能會有Arbitry。
    • Primary掛掉之后,會選舉出一個Secondary作為Primary,與zookeeper類似。
    • Arbitry上面不存數據,只是為了湊數。選舉算法要求節點數必須是奇數個,如果Primary+Secondary不是奇數個,就要用Arbitry湊數。
    • 寫數據只能在Primary,讀數據默認也在Primary,可以配置成從Secondary讀,可以選最近的節點。
    • 數據在Primary上寫成功之后,會將操作記錄在oplog中,Secondary將oplog拷貝過去,然后照着操作一遍,就有數據了。
    • Primary和Secondary上面的數據保證最終一致性,可以為寫操作配置write concern,有幾個級別:在Primary上寫完就認為寫成功;寫到oplog后認為寫成功;寫到一個/多個/某個/某幾個Secondary之后認為寫成功,等等。
  • Sharding:share nothing的結構,每台機器只存一部分數據。mongod服務器存數據,mongos服務器負責路由讀寫請求,元數據存在config數據庫中。

因為數據量和機器量的原因,項目最終用了一個Primary,一個Secondary,一個Arbitry。我自己的開發環境是Ubuntu,測試環境是CentOS。安裝的是64位的MongoDB。

Ubuntu上的安裝

sudo apt-get install mongodb

CentOS上的安裝

配置yum源,創建文件:/etc/yum.repos.d/mongodb.repo

[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1

安裝命令:

yum install mongo-10gen mongo-10gen-server

配置

每台機器上面的配置文件/etc/mongod.conf修改成下面的:

#數據庫文件所在位置(默認)
dbpath=/var/lib/mongo
#日志所在位置(默認)
logpath=/var/log/mongo/mongod.log
#pid所在位置(默認)
pidfilepath = /var/run/mongodb/mongod.pid
#keyFile所在位置,生成方式在后面(添加)
keyFile=/var/lib/mongo/key

#端口(默認)
port=27017

#每次啟動后日志追加在后面,不會新建日志文件(默認)
logappend=true
#用deamon方式啟動(添加)
fork=true
#打開操作日志,用於故障恢復和持久化(默認)
journal=true

#replica set的名字(添加)
replSet=test-set

在每台機器上運行:

sudo mongod -f /etc/mongod.conf

我的環境里面,Primary ip: 192.168.1.1,Secondary ip: 192.168.1.2,Arbitary ip: 192.168.1.3。在單機上可以將多個mongodb設置成不同端口,我測試了一下也是可以的。

在Primary上運行“mongo”,打開命令行,設置Replica Set:

rs.initiate(
    {"_id" : "test-set",
     "members" : [
        {"_id" : 1, "host" : "192.168.1.1"},
        {"_id" : 2, "host" : "192.168.1.2"},
        {"_id" : 3, "host" : "192.168.1.3", "arbiterOnly" : true}
    ]
});

{ 
"info" : "Config now saved locally. Should come online in about a minute.", 
"ok" : 1 
}

歷史成功后需要等一段時間,他會選舉Primary,然后查看Replica Set的狀態:

test-set:PRIMARY> rs.status()
{
        "set" : "test-set",
        "date" : ISODate("2014-02-21T10:28:55Z"),
        "myState" : 7,
        "members" : [
                {
                        "_id" : 1,
                        "name" : "192.168.1.1:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 4086,
                        "optime" : Timestamp(1392972480, 1),
                        "optimeDate" : ISODate("2014-02-21T08:48:00Z"),
                        "lastHeartbeat" : ISODate("2014-02-21T10:28:54Z"),
                        "lastHeartbeatRecv" : ISODate("2014-02-21T10:28:53Z"),
                        "pingMs" : 0
                },
                {
                        "_id" : 2,
                        "name" : "192.168.1.2:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 3997,
                        "optime" : Timestamp(1392972480, 1),
                        "optimeDate" : ISODate("2014-02-21T08:48:00Z"),
                        "lastHeartbeat" : ISODate("2014-02-21T10:28:54Z"),
                        "lastHeartbeatRecv" : ISODate("2014-02-21T10:28:55Z"),
                        "pingMs" : 0,
                        "syncingTo" : "192.168.131.15:27017"
                },
                {
                        "_id" : 3,
                        "name" : "192.168.1.3:27017",
                        "health" : 1,
                        "state" : 7,
                        "stateStr" : "ARBITER",
                        "uptime" : 5781,
                        "self" : true
                }
        ],
        "ok" : 1
}

這樣整個replica set就配置成功了,還是比較簡單的。

KeyFile的設置

KeyFile是機器間用來進行權限認證的,如果沒有設置KeyFile,在rs.initiate()的時候,會提示有其他機器沒有ready,大概這個意思記不清了,反正有個error...

網上搜了一下這個錯誤,很多解釋都是說,服務器異常關閉或者mongodb異常退出的時候,會留下一個鎖文件"/var/lib/mongo/mongo.lock",需要把這個鎖文件刪除之后重啟mongodb。我試了一下這個方法對我無效。

查看了一台機器上的log文件,發現里面說,有其他機器給他發送消息,但是需要在每台機器上配置key file。大概是這個意思,忘記截圖了。

創建Key File用下面的語句:

openssl rand -base64 741

產生的字符串存到一個文本文件中,然后把這個文件的權限chmod成600(如果權限過高不行,log里面會告訴你權限過高),然后在配置里面加上“keyFile=keyfile的路徑”,重啟mongodb就行了。

NUMA的問題

測試機的CPU是NUMA的,於是在運行mongod的時候命令行和log里面會有下面的提示:

WARNING: You are running on a NUMA machine.
We suggest launching mongod like this to avoid performance problems:
numactl –-interleave=all mongod [other options]

於是要把啟動命令改成:

sudo numactl --interleave=all mongod -f /etc/mongod.conf

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM