Mongodb 3.6 副本集測試及添加刪除節點等操作


下載tar包並安裝
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.6.8.tgz

[root@mysqlt1 soft]# tar -zxvf mongodb-linux-x86_64-rhel62-3.6.3.tgz -C /usr/local/
[root@mysqlt1 soft]# cd /usr/local/
[root@mysqlt1 local]# ln -s /usr/local/mongodb-linux-x86_64-rhel62-3.6.3 mongodb
export PATH=/usr/local/mongodb/bin:$PATH
[root@mysqlt1 local]# export PATH=/usr/local/mongodb/bin:$PATH
[root@mysqlt1 local]# groupadd mongodb
[root@mysqlt1 local]# useradd -g mongodb mongodb
[root@mysqlt1 local]# chown -R mongodb:mongodb /usr/local/mongodb/
[root@mysqlt1 local]# mkdir -p /data/mongodb
[root@mysqlt1 local]# chown -R mongodb:mongodb /data/mongodb/
[root@mysqlt1 ~]# ll /usr/local/mongodb/bin/

[root@hongquan1 data]# mkdir data conf log
[root@hongquan1 data]# mkdir 28001 28002 28003
[root@hongquan1 data]# chown -R mongodb:mongodb data/ conf/ log/ 2800*
1 配置文件
port=28001
bind_ip=192.168.20.118
logpath=/data/log/28001.log
dbpath=/data/28001/
logappend=true
pidfilepath=/data/28001/28001.pid
fork=true
oplogSize=1024
replSet=MyMongo

2 啟動實例
/usr/local/mongodb/bin/mongod -f /data/conf/28001.conf
[mongodb@hongquan1 bin]$ ps -ef|grep mongodb
/usr/local/mongodb/bin/mongod -f /data/conf/28002.conf
/usr/local/mongodb/bin/mongod -f /data/conf/28003.conf

登錄
/usr/local/mongodb/bin/mongo 192.168.20.118:28001/admin
> db
admin
> use admin
switched to db admin
>config = {
"_id":"MyMongo",
members:[
{"_id":0,host:"192.168.20.118:28001"},
{"_id":1,host:"192.168.20.118:28002"},
{"_id":2,host:"192.168.20.118:28003"}]
}
> config.members
> config.members[2] ={"_id":2,"host":"192.168.20.118:28003",arbiterOnly:true}
> rs.initiate(config)
> rs.status();
MyMongo:PRIMARY> db.isMaster()

/usr/local/mongodb/bin/mongo 192.168.20.118:28002/admin
MyMongo:SECONDARY> show dbs
MyMongo:SECONDARY> rs.slaveOk(true)
/usr/local/mongodb/bin/mongo 192.168.20.118:28003/admin
MyMongo:ARBITER> rs.slaveOk(true)
MyMongo:ARBITER> show dbs
local 0.000GB
--
MyMongo:PRIMARY> show users;
db.createUser(
{
user: "dba",
pwd: "dba",
roles: [ { role: "root", db: "admin" } ]
}
)
MyMongo:PRIMARY>db.auth('dba','dba')
MyMongo:SECONDARY> show users;
{
"_id" : "admin.dba",
"user" : "dba",
"db" : "admin",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
MyMongo:ARBITER> show users
--
MyMongo:PRIMARY> use test;
switched to db test
MyMongo:PRIMARY> for(var i=1;i<=1000;i++) db.table1.save({id:i,"test1":"testval1"});
WriteResult({ "nInserted" : 1 })
MyMongo:PRIMARY> db.table1.find().count()
1000
MyMongo:PRIMARY> show collections
table1

MyMongo:SECONDARY> use test;
switched to db test
MyMongo:SECONDARY> db.table1.find().count()
1000
--
MyMongo:PRIMARY> show collections
system.keys
system.users
system.version
MyMongo:PRIMARY> db.system.users.find().pretty()
{
"_id" : "admin.dba",
"user" : "dba",
"db" : "admin",
"credentials" : {
"SCRAM-SHA-1" : {
"iterationCount" : 10000,
"salt" : "ZbsCePqGIpsp492RvVB3cg==",
"storedKey" : "GczfCAfP0yNUUrMOjVatzZnWisw=",
"serverKey" : "i0CDYveRNXcQ8F3HFthQGSyqbFM="
}
},
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
MyMongo:PRIMARY> db.system.indexes.find();
MyMongo:PRIMARY> db.system.version.find();
{ "_id" : "featureCompatibilityVersion", "version" : "3.6" }
{ "_id" : "authSchema", "currentVersion" : 5 }

==3個節點,添加2個節點
[root@mysqlt1 data]# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/28004.conf
[root@mysqlt1 data]# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/28005.conf
此時在primary上插入數據
MyMongo:PRIMARY> db.books.find()
MyMongo:SECONDARY> db.books.find() //28002上查看是否存在
MyMongo:PRIMARY> rs.add( { host: "10.15.7.114:28004"} )
登錄28004節點並查看
[root@mysqlt1 ~]# /usr/local/mongodb/bin/mongo 10.15.7.114:28004/admin
MyMongo:SECONDARY> db.getMongo().setSlaveOk()
MyMongo:SECONDARY> db.books.find()//數據已經存在
再添加一個仲裁節點28005
MyMongo:PRIMARY> rs.add( { host: "10.15.7.114:28005", arbiterOnly: true } )
MyMongo:PRIMARY> rs.status()
MyMongo:PRIMARY> db.isMaster()
{
"hosts" : [
"10.15.7.114:28001",
"10.15.7.114:28002",
"10.15.7.114:28004"
],
"arbiters" : [
"10.15.7.114:28003",
"10.15.7.114:28005"
],
現在5個節點,1個primary,2個secondary,2個arbiterOnly
現在測試宕機掉28001primary節點
MyMongo:PRIMARY> use admin
MyMongo:PRIMARY> db.shutdownServer();
//"errmsg" : "shutdown must run from localhost when running db without auth"
[root@mysqlt1 ~]# /usr/local/mongodb/bin/mongo localhost:28001/admin
[root@mysqlt1 ~]# /usr/local/mongodb/bin/mongo 127.0.0.1:28001/admin
[root@mysqlt1 ~]# cat /etc/hosts
[root@mysqlt1 ~]# /usr/local/mongodb/bin/mongo mysqlt1:28001/admin
[root@mysqlt1 ~]# /usr/local/mongodb/bin/mongod --shutdown -f /data/mongodb/conf/28001.conf
關閉28001后,28002成為primary節點
[root@mysqlt1 ~]# /usr/local/mongodb/bin/mongo 10.15.7.114:28002/admin
MyMongo:PRIMARY> rs.status()
MyMongo:PRIMARY> use test;//加入測試數據
switched to db test
MyMongo:PRIMARY> for(var i=1;i<=1000;i++) db.table1.save({id:i,"test1":"testval1"});
WriteResult({ "nInserted" : 1 })
MyMongo:PRIMARY> db.table1.find().count()
1000
現在宕機掉28002節點,28003成為primary節點,現在剩下1個primary和2個仲裁節點
MyMongo:PRIMARY> use test;
switched to db test
MyMongo:PRIMARY> db.table1.find().count()
1000
MyMongo:PRIMARY> for(var i=1;i<=1000;i++) db.table1.save({id:i,"test22":"testval22"}); //插入數據
WriteResult({ "nInserted" : 1 })
MyMongo:PRIMARY> db.table1.count()
2000
現在啟動28001,28002節點,自動加入副本集,並成為secondry節點
MyMongo:SECONDARY> db.getMongo().setSlaveOk()
MyMongo:SECONDARY> db.table1.find().count() //數據已經同步
2000
這里測試,5個節點,剩余3個節點,不管是secondry還是仲裁節點,即使最后剩下primary+2個仲裁,primary節點還是可以支持讀寫

==添加備份節點
MyMongo:PRIMARY> rs.remove("10.15.7.114:28005"); #刪除原來的第二個仲裁節點
MyMongo:PRIMARY> rs.add({host:"10.15.7.114:28005","priority":0,"hidden":true}) #設置為備份節點
"_id" : 4,
"name" : "10.15.7.114:28005",
"health" : 1,
"state" : 5,
"stateStr" : "STARTUP2",
MyMongo:STARTUP2> rs.slaveOk()
MyMongo:STARTUP2> db.table1.find().count() #不能進行讀寫操作
2018-10-15T01:42:38.593+0800 E QUERY [thread1] Error: count failed: {
"ok" : 0,
"errmsg" : "node is not in primary or recovering state",
"code" : 13436,
"codeName" : "NotMasterOrSecondary"
} :

添加延遲節點
Delayed(成員用於支持專用功能):可以指定一個時間延遲從primary節點同步數據。主要用於處理誤刪除數據馬上同步到從節點導致的不一致問題
MyMongo:PRIMARY> rs.add({host:"10.15.7.114:28005","priority":0,"hidden":true,"slaveDelay":60})

Secondary-Only:不能成為primary節點,只能作為secondary副本節點,防止一些性能不高的節點成為主節點。
Non-Voting:沒有選舉權的secondary節點,純粹的備份數據節點

連續寫入數據,測試選舉
== 選舉期間會丟失數據(嚴格意義上不叫丟失,因為這個時候本來mongo就不可用,在等待切換,程序可以把這部分數據存入消息隊列,等待選舉成功在寫入)
======
import time
from pymongo import MongoClient
conn= MongoClient('mongodb://10.15.7.114:28001,10.15.7.114:28002,10.15.7.114:28004/?replicaSet=MyMongo')

for i in xrange(100):
try:
conn.test.tt1.insert({"name":"test" + str(i)})
time.sleep(1)
print conn.primary
print conn.secondaries
except:
pass
======
測試5個節點,宕機掉3個,然后剩余2個節點,將一個可用節點以單節點啟動並使用,使用一段時間后,在以副本集啟動,讓其他4個節點加入副本集
[root@mysqlt1 ~]# /usr/local/mongodb/bin/mongod --shutdown -f /data/mongodb/conf/28004.conf
[root@mysqlt1 ~]# /usr/local/mongodb/bin/mongod --shutdown -f /data/mongodb/conf/28001.conf
[root@mysqlt1 ~]# /usr/local/mongodb/bin/mongod --shutdown -f /data/mongodb/conf/28003.conf
MyMongo:SECONDARY> #還剩下2個節點,自動變為secondry
[root@mysqlt1 ~]# /usr/local/mongodb/bin/mongod --shutdown -f /data/mongodb/conf/28002.conf
[root@mysqlt1 ~]# /usr/local/mongodb/bin/mongod --shutdown -f /data/mongodb/conf/28005.conf
整個副本集全部宕機,把28002作為單節點啟動並使用
[root@mysqlt1 conf]# vim 28002.conf
[root@mysqlt1 conf]# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/28002.conf
[root@mysqlt1 ~]# /usr/local/mongodb/bin/mongo 10.15.7.114:28002/admin
> show dbs;
admin 0.000GB
bookstore 0.000GB
config 0.000GB
local 0.002GB
test 0.000GB
> rs.status()
{
"ok" : 0,
"errmsg" : "not running with --replSet",
"code" : 76,
"codeName" : "NoReplicationEnabled"
}
> use test;
switched to db test
> db.tt2.find().count()
10
再插入10條數據
> db.tt2.find().count()
20
[root@mysqlt1 conf]# vim 28002.conf#這里注意,不能修改之前的副本集的名稱,修改了會報錯
[root@mysqlt1 conf]# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/28002.conf
[root@mysqlt1 ~]# /usr/local/mongodb/bin/mongo 10.15.7.114:28002/admin
MyMongo:OTHER> rs.add( { host: "10.15.7.114:28001"} )
{
"ok" : 0,
"errmsg" : "replSetReconfig should only be run on PRIMARY, but my state is REMOVED; use the \"force\" argument to override",
"code" : 10107,
"codeName" : "NotMaster",
[root@mysqlt1 conf]# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/28001.conf
[root@mysqlt1 conf]# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/28003.conf

config = {
"_id":"MyMongo1",
members:[
{"_id":0,host:"10.15.7.114:28001"},
{"_id":1,host:"10.15.7.114:28002"},
{"_id":2,host:"10.15.7.114:28003"}]
}
config.members
config.members[1].priority = 2;
rs.reconfig(config);
#MyMongo:OTHER> rs.initiate(config);
==不修改副本集名稱啟動3個節點,自動加入副本集
MyMongo:PRIMARY> use test;
switched to db test
MyMongo:PRIMARY> db.tt2.find().count()
20
==登錄其他secondry節點查看數據,只有副本集之前的數據,作為單節點的數據沒有同步,應為寫入oplog的問題?
==修正,這里作為單節點啟動,要顯示指定oplog參數(根本沒有oplog這個參數)所以,意思測試不成立
分析,因為oplog的存在的時間和空間都有限制,是循環寫,所有如果點節點的存在,就不能保證所有的寫入都會在oplog

MyMongo:SECONDARY> db.getMongo().setSlaveOk()
MyMongo:SECONDARY> db.tt2.find().count()
10
MyMongo:SECONDARY> db.tt2.find().sort({"name":1})

[root@mysqlt1 conf]# cat 28002.conf
port=28002
bind_ip=10.15.7.114
logpath=/data/mongodb/log/28002.log
dbpath=/data/mongodb/data/28002/
logappend=true
pidfilepath=/data/mongodb/28002.pid
fork=true
oplogSize=1024
replSet=MyMongo

MyMongo:PRIMARY> rs.printReplicationInfo()
configured oplog size: 1024MB #oplog文件大小
log length start to end: 430037secs (119.45hrs)
oplog first event time: Thu Oct 11 2018 03:45:19 GMT+0800 (CST)
oplog last event time: Tue Oct 16 2018 03:12:36 GMT+0800 (CST)
now: Tue Oct 16 2018 03:12:40 GMT+0800 (CST)
MyMongo:PRIMARY> db.getReplicationInfo() #用來查看oplog的狀態、大小、存儲的時間范圍
{
"logSizeMB" : 1024,
"usedMB" : 4.97,
"timeDiff" : 430086,
"timeDiffHours" : 119.47,
===在secondry節點,重新配置副本集,加入幾個仲裁節點
MyMongo:SECONDARY> use admin
MyMongo:SECONDARY> config = {
"_id":"MyMongo",
members:[
{"_id":0,host:"10.15.7.114:28001"},
{"_id":1,host:"10.15.7.114:28002"},
{"_id":2,host:"10.15.7.114:28003", arbiterOnly: true},
{"_id":3,host:"10.15.7.114:28004"},
{"_id":4,host:"10.15.7.114:28005", arbiterOnly: true},
{"_id":5,host:"10.15.7.114:28006", arbiterOnly: true},
{"_id":6,host:"10.15.7.114:28007", arbiterOnly: true}]
}
MyMongo:SECONDARY> rs.reconfig(config,{force:true});
測試插入數據
MyMongo:PRIMARY> db.tt3.find().count()
100
啟動另外3個節點
[root@mysqlt1 conf]# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/28001.conf
[root@mysqlt1 conf]# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/28002.conf
[root@mysqlt1 conf]# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/28003.conf
[root@mysqlt1 ~]# /usr/local/mongodb/bin/mongo 10.15.7.114:28002/admin
MyMongo:SECONDARY> rs.slaveOk(true)
MyMongo:SECONDARY> use test;
switched to db test
MyMongo:SECONDARY> db.tt3.find().count() #數據同步成功
100
之前的5個節點,現在變成了7個節點,刪除新加的2個仲裁節點
rs.remove("10.15.7.114:28007");
rs.remove("10.15.7.114:28006");
MyMongo:PRIMARY> db.isMaster() #變回之前的5個節點,1主,2secondry,2仲裁
{
"hosts" : [
"10.15.7.114:28001",
"10.15.7.114:28002",
"10.15.7.114:28004"
],
"arbiters" : [
"10.15.7.114:28003",
"10.15.7.114:28005"


免責聲明!

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



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