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
配置文件:
/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
程序以下:
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--