溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

mongodb 副本集

發(fā)布時(shí)間:2020-07-10 04:00:46 來源:網(wǎng)絡(luò) 閱讀:882 作者:charlie_cen 欄目:MongoDB數(shù)據(jù)庫

系統(tǒng):centos6.5


IP:10.19.21.244 主節(jié)點(diǎn)

10.19.21.245 備節(jié)點(diǎn)

10.19.21.248 仲裁點(diǎn)


不只是主節(jié)點(diǎn)、副本節(jié)點(diǎn)、仲裁節(jié)點(diǎn),還有Secondary-Only、Hidden、Delayed、Non-Voting。

Secondary-Only:不能成為primary節(jié)點(diǎn),只能作為secondary副本節(jié)點(diǎn),防止一些性能不高的節(jié)點(diǎn)成為主節(jié)點(diǎn)。

Hidden:這類節(jié)點(diǎn)是不能夠被客戶端制定IP引用,也不能被設(shè)置為主節(jié)點(diǎn),但是可以投票,一般用于備份數(shù)據(jù)。

Delayed:可以指定一個(gè)時(shí)間延遲從primary節(jié)點(diǎn)同步數(shù)據(jù)。主要用于備份數(shù)據(jù),如果實(shí)時(shí)同步,誤刪除數(shù)據(jù)馬上同步到從節(jié)點(diǎn),恢復(fù)又恢復(fù)不了。

Non-Voting:沒有選舉權(quán)的secondary節(jié)點(diǎn),純粹的備份數(shù)據(jù)節(jié)點(diǎn)。



三臺(tái)主機(jī)安裝mongodb

下載mongodb
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.6.9.tgz
解壓到目錄
tar xf mongodb-linux-x86_64-2.6.9.tgz -C /usr/local/src
更改名
mv mongodb-linux-x86_64-2.6.9 /usr/local/mongodb

cd /usr/local/mongodb/
創(chuàng)建數(shù)據(jù)目錄和日志目錄
mkdir -p data log
創(chuàng)建用戶
useradd mongodb -s /sbin/nologin
更改目錄屬主屬組
chown mongod:mongodb /usr/local/mongodb -R
更改環(huán)境變量
vim ~/.bash_profile

PATH=$PATH:/usr/local/mongodb/bin

source ~/.bash_profile
配置文件
vim /etc/mongodb.conf
port = 27017
fork = true
logpath = /usr/local/mongodb/log/mongodb.log
dbpath =/usr/local/mongodb/data/
journal = true
#以目錄的形式存數(shù)據(jù),如果已經(jīng)存在,修改此配置會(huì)導(dǎo)致原始數(shù)據(jù)消失(注釋次參數(shù)會(huì)回來),除非遷移現(xiàn)有數(shù)據(jù)文件到directoryperdb所產(chǎn)生的數(shù)據(jù)目錄中。
directoryperdb=true
#日志增加形式寫入
logappend=true
#配置副本集,指定副本名稱作為參數(shù),所有主機(jī)都必須有相同名稱作為同一個(gè)副本集
replSet=testrs
#使用預(yù)分配方式來保證寫入性能的穩(wěn)定,預(yù)分配在后臺(tái)進(jìn)行,并且每個(gè)預(yù)分配的文件都用0進(jìn)行填充。這會(huì)讓MongoDB始終保持額外的空間和空余的數(shù)據(jù)文件,從而避免了數(shù)據(jù)增長(zhǎng)過快而帶來的分配磁盤空間引起的阻塞。設(shè)置noprealloc= true來禁用預(yù)分配的數(shù)據(jù)文件,會(huì)縮短啟動(dòng)時(shí)間,但在正常操作過程中,可能會(huì)導(dǎo)致性能顯著下降。
noprealloc=true
啟動(dòng)服務(wù)
mongod -f /etc/mongodb.conf
首先連接主節(jié)點(diǎn)
mongo
> use admin
> conf = {_id:"testrs",members:[{_id:0,host:"10.19.21.244:27017",priority:2},{_id:1,host:"10.19.21.245:27017",priority:1},{_id:2,host:"10.19.21.248:27017",arbiterOnly:true}]};

{
	"_id" : "testrs",
	"version" : 1,
	"members" : [
		{
			"_id" : 0,
			"host" : "10.19.21.244:27017",
			"priority" : 2
		},
		{
			"_id" : 1,
			"host" : "10.19.21.245:27017"
		},
		{
			"_id" : 2,
			"host" : "10.19.21.248:27017",
			"arbiterOnly" : true
		}
	]
}
注意最初的_id的值就是我們配置文件中設(shè)定的replSet的值,arbiterOnly是大寫的O,配置完成后進(jìn)行初始化:
> rs.initiate(conf)
{
	"info" : "Config now saved locally.  Should come online in about a minute.",
	"ok" : 1
}
此步驟必須備節(jié)點(diǎn)和仲裁節(jié)點(diǎn)的mongo啟動(dòng),不然無法執(zhí)行此步驟。
> rs.status()
{
	"set" : "testrs",
	"date" : ISODate("2015-05-07T11:55:17Z"),
	"myState" : 1,
	"members" : [
		{
			"_id" : 0,
			"name" : "10.19.21.244:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 5737,
			"optime" : Timestamp(1430995665, 1),
			"optimeDate" : ISODate("2015-05-07T10:47:45Z"),
			"electionTime" : Timestamp(1430993992, 1),
			"electionDate" : ISODate("2015-05-07T10:19:52Z"),
			"self" : true
		},
		{
			"_id" : 1,
			"name" : "10.19.21.245:27017",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 3077,
			"optime" : Timestamp(1430995665, 1),
			"optimeDate" : ISODate("2015-05-07T10:47:45Z"),
			"lastHeartbeat" : ISODate("2015-05-07T11:55:17Z"),
			"lastHeartbeatRecv" : ISODate("2015-05-07T11:55:17Z"),
			"pingMs" : 0,
			"syncingTo" : "10.19.21.244:27017"
		},
		{
			"_id" : 2,
			"name" : "10.19.21.248:27017",
			"health" : 1,
			"state" : 7,
			"stateStr" : "ARBITER",
			"uptime" : 5735,
			"lastHeartbeat" : ISODate("2015-05-07T11:55:17Z"),
			"lastHeartbeatRecv" : ISODate("2015-05-07T11:55:17Z"),
			"pingMs" : 0
		}
	],
	"ok" : 1
}
> use test
插入數(shù)據(jù)
> db.testdb.insert({"tset1":"i'm master"})
然后到備份節(jié)點(diǎn)查看數(shù)據(jù)是否有
mongo 10.19.21.245
testrs:SECONDARY> use test
switched to db test
testrs:SECONDARY> show tables;
2015-05-07T19:57:29.670+0800 error: { "$err" : "not master and slaveOk=false", "code" : 13435 } at src/mongo/shell/query.js:131
需要進(jìn)行配置
testrs:SECONDARY> db.setSlaveOk()
testrs:SECONDARY> show tables;
system.indexes
testdb
testrs:SECONDARY> db.testdb.find()
{ "_id" : ObjectId("554a4ee4eb804a0f1b6ec347"), "test1" : "i'm master" }
停止主節(jié)點(diǎn),查看整個(gè)集群狀態(tài)
testrs:PRIMARY> rs.status()
{
	"set" : "testrs",
	"date" : ISODate("2015-05-07T11:59:42Z"),
	"myState" : 1,
	"members" : [
		{
			"_id" : 0,
			"name" : "10.19.21.244:27017",
			"health" : 0,
			"state" : 8,
			"stateStr" : "(not reachable/healthy)",
			"uptime" : 0,
			"optime" : Timestamp(1430995665, 1),
			"optimeDate" : ISODate("2015-05-07T10:47:45Z"),
			"lastHeartbeat" : ISODate("2015-05-07T11:59:40Z"),
			"lastHeartbeatRecv" : ISODate("2015-05-07T11:59:32Z"),
			"pingMs" : 0
		},
		{
			"_id" : 1,
			"name" : "10.19.21.245:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 3342,
			"optime" : Timestamp(1430995665, 1),
			"optimeDate" : ISODate("2015-05-07T10:47:45Z"),
			"electionTime" : Timestamp(1430999976, 1),
			"electionDate" : ISODate("2015-05-07T11:59:36Z"),
			"self" : true
		},
		{
			"_id" : 2,
			"name" : "10.19.21.248:27017",
			"health" : 1,
			"state" : 7,
			"stateStr" : "ARBITER",
			"uptime" : 3340,
			"lastHeartbeat" : ISODate("2015-05-07T11:59:42Z"),
			"lastHeartbeatRecv" : ISODate("2015-05-07T11:59:41Z"),
			"pingMs" : 0
		}
	],
	"ok" : 1
}
主節(jié)點(diǎn)已切換過來,此時(shí)備節(jié)點(diǎn)已經(jīng)變成了主節(jié)點(diǎn)。再插入一條數(shù)據(jù)
testrs:PRIMARY> db.testdb.insert({"test2":"i'm new master"})
testrs:PRIMARY> db.testdb.find();
{ "_id" : ObjectId("554a4ee4eb804a0f1b6ec347"), "test1" : "i'm master" }
{ "_id" : ObjectId("554a505d494f70c600422b41"), "test2" : "i'm new master" }
重啟原來的主節(jié)點(diǎn)查看狀態(tài)
testrs:SECONDARY> rs.status()
{
	"set" : "testrs",
	"date" : ISODate("2015-05-07T14:00:33Z"),
	"myState" : 1,
	"members" : [
		{
			"_id" : 0,
			"name" : "10.19.21.244:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 15,
			"optime" : Timestamp(1430995665, 1),
			"optimeDate" : ISODate("2015-05-07T10:47:45Z"),
			"electionTime" : Timestamp(1431007222, 1),
			"electionDate" : ISODate("2015-05-07T14:00:22Z"),
			"self" : true
		},
		{
			"_id" : 1,
			"name" : "10.19.21.245:27017",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 13,
			"optime" : Timestamp(1430995665, 1),
			"optimeDate" : ISODate("2015-05-07T10:47:45Z"),
			"lastHeartbeat" : ISODate("2015-05-07T14:00:32Z"),
			"lastHeartbeatRecv" : ISODate("2015-05-07T14:00:33Z"),
			"pingMs" : 0,
			"lastHeartbeatMessage" : "syncing to: 10.19.21.244:27017",
			"syncingTo" : "10.19.21.244:27017"
		},
		{
			"_id" : 2,
			"name" : "10.19.21.248:27017",
			"health" : 1,
			"state" : 7,
			"stateStr" : "ARBITER",
			"uptime" : 13,
			"lastHeartbeat" : ISODate("2015-05-07T14:00:32Z"),
			"lastHeartbeatRecv" : ISODate("2015-05-07T14:00:33Z"),
			"pingMs" : 0
		}
	],
	"ok" : 1
}
查看數(shù)據(jù)是否同步過來
testrs:PRIMARY> use test
switched to db test
testrs:PRIMARY> db.testdb.find()
{ "_id" : ObjectId("554a4ee4eb804a0f1b6ec347"), "test1" : "i'm master" }
{ "_id" : ObjectId("554a505d494f70c600422b41"), "test2" : "i'm new master" }
向集群中增加節(jié)點(diǎn)
cfg = rs.conf()
cfg.members[3] = {_id:3,host:"10.19.21.246:27017",priority:0.5}
rs.reconfig(cfg)

如果備份節(jié)點(diǎn)無法讀取數(shù)據(jù),需要設(shè)置db.setSlaveOK()。如果備份節(jié)點(diǎn)可讀但不可寫,修改優(yōu)先級(jí)
cfg = rs.conf()
cfg.members[0].priority = 0.5
cfg.members[1].priority = 2
cfg.members[2].priority = 2
rs.reconfig(cfg)
需要 reconfig后配置才能生效。
php與mongodb連接
<?php
$options = array(
        'replicaSet' => 'testrs',
        'readPreference' => 'secondaryPreferred',
);
$m = new MongoClient("mongodb://10.19.21.244:27017,10.19.21.245:27017/", $options);
foreach ( $m->getConnections() as $c )
{
    echo $c['hash'], ":\n",
    " - {$c['connection']['connection_type_desc']}, ",
    "{$c['connection']['ping_ms']} ms\n";
}
?>

primary:默認(rèn)參數(shù),只從主節(jié)點(diǎn)上進(jìn)行讀取操作;

primaryPreferred:大部分從主節(jié)點(diǎn)上讀取數(shù)據(jù),只有主節(jié)點(diǎn)不可用時(shí)從secondary節(jié)點(diǎn)讀取數(shù)據(jù)。

secondary:只從secondary節(jié)點(diǎn)上進(jìn)行讀取操作,存在的問題是secondary節(jié)點(diǎn)的數(shù)據(jù)會(huì)比primary節(jié)點(diǎn)數(shù)據(jù)“舊”。

secondaryPreferred:優(yōu)先從secondary節(jié)點(diǎn)進(jìn)行讀取操作,secondary節(jié)點(diǎn)不可用時(shí)從主節(jié)點(diǎn)讀取數(shù)據(jù);

nearest:不管是主節(jié)點(diǎn)、secondary節(jié)點(diǎn),從網(wǎng)絡(luò)延遲最低的節(jié)點(diǎn)上讀取數(shù)據(jù)。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI