21.33 mongodb副本集介紹mysql
21.34 mongodb副本集搭建linux
21.35 mongodb副本集測試git
21.33 mongodb副本集介紹sql
像mysql主宕機以後,咱們可讓從成爲新的主,可是須要手動去改的,甚至新的主從關係都是要手動去改。可是mongodb副本集中他徹底都是自動的,主宕機以後,從成爲了新的主,從也能夠自動的識別新的主。這是他更高級的地方,很智能mongodb
1.早期版本使用master-slave,一主一從和MySQL相似,但slave在此架構中爲只讀,當主庫宕機後,從庫不能自動切換爲主數據庫
2.目前已經淘汰master-slave模式,改成副本集,這種模式下有一個主(primary),讀寫,和多個從(secondary),只讀。支持給它們設置權重,當主宕掉後,權重最高的從切換爲主vim
#目的也是實現mongodb的高可用、保證數據的安全。讀寫僅僅是在主上,從不須要提供服務centos
3.在此架構中還能夠創建一個仲裁(arbiter)的角色,它只負責裁決,而不存儲數據安全
#arbiter用來決定你的主宕機以後,很準確的告訴你他的主斷掉了。像keepalived當主掛掉以後是怎麼決定主當掉了,會容易出現腦裂的狀況。因此爲了防止腦裂的狀況就出現了arbiter這樣的角色。數據庫是堅定不容許出現腦裂的狀況架構
4.再此架構中讀寫數據都是在主上,要想實現負載均衡的目的須要手動指定讀庫的目標server
#另外一種方式。在代碼裏面實現讀寫分離,讓讀的時候去其中一個從庫上去讀。這樣也能夠實現負載均衡
在從上也能夠增長一個所謂的lvs這樣的代理,固然從不少的狀況下
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21.34 mongodb副本集搭建
一.
三臺機器: 192.168.133.130(primary) 192.168.133.132(secondary) 192.168.133.133(secondary)
二.
編輯三臺機器的配置文件(/etc/mongod.conf ),更改或增長:
!1replication://把此行前面的#刪除
oplogSizeMB: 20//前面有兩個空格,加上這一行。
#這個日誌相似於mysql的主從的binlog日誌
#oplog大小
replSetName: aminglinux//前面有兩個空格,加上這一行
#定義副本集的名字,如上爲aminglinux
#複製集名稱
!2還要檢查bindIp: 127.0.0.1,192.168.208.128。
bindIp有沒有監聽本身 (內網IP)192.168.xxx.xxx
三.
分別重啓三臺機器
四.
鏈接主,在主上運行命令mongo(!哪臺爲主,就在哪臺上操做!)
!1.>use admin
!2.>config={_id:"aminglinux",members:[{_id:0,host:"192.168.208.128:27017"},{_id:1,host:"192.168.208.130:27017"},{_id:2,host:"192.168.208.133:27017"}]}
#"aminglinux"爲副本集的名字
#members:指定他的成員
!3.>rs.initiate(config)
#顯示ok:1就表明成功了
!4.rs.status() //查看狀態
五.
若是兩個從上的狀態爲"stateStr" : "STARTUP"(表明還沒起來),或者三臺機器都是secondary並無primary。 則須要進行以下操做(從新配置一下)
> var config={_id:"aminglinux",members:[{_id:0,host:"192.168.133.130:27017"},{_id:1,host:"192.168.133.132:27017"},{_id:2,host:"192.168.133.133:27017"}]}
>rs.reconfig(config)
此時再次查看rs.status()會發現從的狀態變爲SECONDARY
實例:
[root@axinlinux-01 ~]# cd /etc/yum.repos.d/ #01咱們已經安裝後mongodb了,把yum源拷貝在0二、03 上便可
[root@axinlinux-01 yum.repos.d]# cat mongo.repo #先cat出來
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
[root@axinlinux-02 ~]# vim /etc/yum.repos.d/mongo.repo #02 03均複製上面一段
[root@axinlinux-03 ~]# vim /etc/yum.repos.d/mongo.repo
[root@axinlinux-02 ~]# yum install -y mongodb-org #02 03yum安裝便可
[root@axinlinux-03 ~]# yum install -y mongodb-org
若是下載速度太慢,到這來下載到linux上,在所有rpm -ivh安裝一下就能夠了
https://coding.net/u/aminglinux/p/yuanke_centos7/git/tree/master/21NOSQL/mongodb_rpm%E5%8C%85
[root@axinlinux-01 yum.repos.d]# vim /etc/mongod.conf #修改配置文件,改動後以下
replication:
oplogSizeMB: 20
replSetName: aminglinux
[root@axinlinux-01 yum.repos.d]# systemctl restart mongod #重啓mongodb
[root@axinlinux-01 yum.repos.d]# ps aux |grep mongod #檢查進程
mongod 4652 38.3 2.6 1018308 49688 ? Sl 14:59 0:08 /usr/bin/mongod -f /etc/mongod.conf
root 4687 0.0 0.0 112720 976 pts/0 S+ 15:00 0:00 grep --color=auto mongod
#此處須要注意,由於以前作過用戶認證(--auth),要把它去掉,操做以下:(
[root@axinlinux-01 yum.repos.d]# vim /usr/lib/systemd/system/mongod.service #編輯他的啓動腳本
Environment="OPTIONS=--auth -f /etc/mongod.conf" #這一行的--auth去掉便可。一旦咱們更改了這個配置文件,他會提示咱們執行daemon reload的命令,複製執行一下便可)
修改配置文件,02 03 上也要如此,直接複製過去便可,還要設置bindIp 也監聽本機內網IP。這裏就不作演練了
[root@axinlinux-02 ~]# systemctl start mongod #02 03均啓動一下
[root@axinlinux-03 ~]# systemctl start mongod
[root@axinlinux-03 ~]# netstat -lntp #01 02 03都要監聽這兩個ip才能夠
tcp 0 0 192.168.208.133:27017 0.0.0.0:* LISTEN 2995/mongod
tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 2995/mongod
三臺均關閉firewalld和selinux
[root@axinlinux-01 yum.repos.d]# mongo #直接鏈接主(本機上直接mongo便可進入)。即01爲主
> use admin
> config={_id:"aminglinux",members:[{_id:0,host:"192.168.208.128:27017"},{_id:1,host:"192.168.208.130:27017"},{_id:2,host:"192.168.208.133:27017"}]}
{
"_id" : "aminglinux",
"members" : [
{
"_id" : 0,
"host" : "192.168.208.128:27017"
},
{
"_id" : 1,
"host" : "192.168.208.130:27017"
},
{
"_id" : 2,
"host" : "192.168.208.133:27017"
}
]
}
> rs.initiate(config)
{ "ok" : 1 }
aminglinux:OTHER> rs.status()
{
"set" : "aminglinux", #集合的名字
。。。。。
"members" : [ #成員
{
"_id" : 0,
"name" : "192.168.208.128:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY", #狀態爲primary,就是主
。。。。。
{
"_id" : 1,
"name" : "192.168.208.130:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY", #狀態爲secondary,就是爲從
。。。。。
{
"_id" : 2,
"name" : "192.168.208.133:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY", #狀態爲secondary,這臺也是從
。。。。。
"ok" : 1
}
aminglinux:PRIMARY> #咱們再次看命令行的前綴就自動變成了主
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21.35 mongodb副本集測試
1.主上建庫,建集合
>use mydb
#mydb庫
>db.acc.insert({AccountID:1,UserName:"123",password:"123456"})
#acc爲測試的集合,而且插入(insert)一些數據
>show dbs
2.從上查看
>show dbs
3.若出現錯誤Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" },須要執行
>rs.slaveOk()
副本集更改權重模擬主宕機
1.默認三臺機器權重都爲1,若是任何一個權重設置爲比其餘的高,則該臺機器立刻切換爲primary角色,因此咱們預設三臺機器的權重分別爲:128:3,130:2,133:1
2.在主上執行
cfg = rs.conf()
cfg.members[0].priority = 3
cfg.members[1].priority = 2
cfg.members[2].priority = 1
rs.reconfig(cfg) #使他生效
3.這樣的話,第二個節點將會成爲候選主節點。
4.主上執行 iptables -I INPUT -p tcp --dport 27017 -j DROP
實例:
測試
aminglinux:PRIMARY> use mydb
switched to db mydb
aminglinux:PRIMARY> db.acc.insert({AccountID:1,UserName:"123",password:"123456"}) #主上寫數據才能夠
WriteResult({ "nInserted" : 1 })
aminglinux:PRIMARY> show dbs
admin 0.000GB
db1 0.000GB
local 0.000GB
mydb 0.000GB
test 0.000GB
aminglinux:PRIMARY> use mydb
switched to db mydb
aminglinux:PRIMARY> show tables
acc
aminglinux:SECONDARY> show dbs #咱們在一個從上查看一下是否有數據
2018-11-20T16:20:00.424+0800 E QUERY [thread1] Error: listDatabases failed:{
"ok" : 0,
"errmsg" : "not master and slaveOk=false", #報錯了是由於不是主。並且slaveok=false
。。。。。
aminglinux:SECONDARY> rs.slaveOk() #根據他的提示這樣執行就能夠了
aminglinux:SECONDARY> show dbs #咱們再來show dbs,就能夠了
admin 0.000GB
db1 0.000GB
local 0.000GB
mydb 0.000GB
test 0.000GB
aminglinux:SECONDARY> use mydb
switched to db mydb
aminglinux:SECONDARY> show tables #查看集合
acc
副本集更改權重模擬主宕機
aminglinux:PRIMARY> rs.config() #rs.config()能夠查看權重
。。。。。
"members" : [
{
"_id" : 0,
"host" : "192.168.208.128:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1, #能夠看到權重都是1
"_id" : 1,
"host" : "192.168.208.130:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
"_id" : 2,
"host" : "192.168.208.133:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
aminglinux:PRIMARY> cfg = rs.conf()
aminglinux:PRIMARY> cfg.members[0].priority = 3
3
aminglinux:PRIMARY> cfg.members[1].priority = 2
2
aminglinux:PRIMARY> cfg.members[2].priority = 1
1
aminglinux:PRIMARY> rs.reconfig(cfg)
{ "ok" : 1 }
aminglinux:SECONDARY> rs.config() #再來查看一下新的權重。此時已經變爲secondary
"_id" : 0,
"host" : "192.168.208.128:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 3,
"_id" : 1,
"host" : "192.168.208.130:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 2,
"_id" : 2,
"host" : "192.168.208.133:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,