一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

云服務(wù)器|WEB服務(wù)器|FTP服務(wù)器|郵件服務(wù)器|虛擬主機(jī)|服務(wù)器安全|DNS服務(wù)器|服務(wù)器知識(shí)|Nginx|IIS|Tomcat|

服務(wù)器之家 - 服務(wù)器技術(shù) - 服務(wù)器知識(shí) - 使用Docker搭建Redis主從復(fù)制的集群

使用Docker搭建Redis主從復(fù)制的集群

2021-05-06 17:18hsm_computer 服務(wù)器知識(shí)

這篇文章主要介紹了使用Docker搭建Redis主從復(fù)制的集群,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

在主從復(fù)制模式的集群里,主節(jié)點(diǎn)一般是一個(gè),從節(jié)點(diǎn)一般是兩個(gè)或多個(gè),寫入主節(jié)點(diǎn)的數(shù)據(jù)會(huì)被復(fù)制到從節(jié)點(diǎn)上,這樣一旦主節(jié)點(diǎn)出現(xiàn)故障,應(yīng)用系統(tǒng)能切換到從節(jié)點(diǎn)去讀寫數(shù)據(jù),這樣能提升系統(tǒng)的可用性。而且如果再采用主從復(fù)制模式里默認(rèn)的讀寫分離的機(jī)制,更能提升系統(tǒng)的緩存讀寫性能。所以對性能和實(shí)時(shí)性不高的系統(tǒng)而言,主從復(fù)制模式足以滿足一般的性能和安全性方面的需求。

1 概述主從復(fù)制模式

在實(shí)際應(yīng)用中,如果有相應(yīng)的設(shè)置,在向一臺(tái)redis服務(wù)器里寫數(shù)據(jù)后,這個(gè)數(shù)據(jù)可以復(fù)制到另外一臺(tái)(或多臺(tái))redis服務(wù)器,這里數(shù)據(jù)源服務(wù)器叫主服務(wù)器(master server),而復(fù)制數(shù)據(jù)目的地所在的服務(wù)器叫從服務(wù)器(slave server)。

這種主從復(fù)制模式能帶來兩個(gè)好處,第一,可以把寫操作集中在主服務(wù)器上,把讀操作集中到從服務(wù)器上,這樣能提升讀寫性能;第二,由于出現(xiàn)了數(shù)據(jù)備份,所以能提升數(shù)據(jù)安全性,比如當(dāng)主redis服務(wù)器失效后,能很快切換到從服務(wù)器上讀數(shù)據(jù)。

如果在項(xiàng)目,并發(fā)要求不高,或者說哪怕從redis緩存里讀不到數(shù)據(jù)對性能也不會(huì)有太大的損害,那么可以用一主一從的復(fù)制模式,效果圖如下圖所示。

使用Docker搭建Redis主從復(fù)制的集群

也可以設(shè)置一主多從的復(fù)制效果,在下圖里,給出對應(yīng)的效果圖,即寫到主節(jié)點(diǎn)的數(shù)據(jù)會(huì)同步到兩個(gè)從節(jié)點(diǎn)上,其它一主多從的模式和這很相似。

使用Docker搭建Redis主從復(fù)制的集群

關(guān)于主從復(fù)制模式,請大家注意如下的要點(diǎn)。

第一, 一個(gè)主服務(wù)器可以帶一個(gè)或多個(gè)從服務(wù)器,甚至從服務(wù)器也可以再帶從服務(wù)器,但在復(fù)制數(shù)據(jù)時(shí),只能把主服務(wù)器的數(shù)據(jù)復(fù)制到從服務(wù)器上,反之不能。

第二, 一臺(tái)從服務(wù)器只能跟隨一臺(tái)主服務(wù)器,而不能出現(xiàn)一從多主的模式。

第三, 在 redis 2.8以后的版本里,是采用異步的復(fù)制模式,即進(jìn)行主從復(fù)制時(shí),不會(huì)影響主服務(wù)器上的讀寫數(shù)據(jù)操作。

2 用命令搭建主從集群

這里將用docker容器來搭建一主二從模式的集群,在配置主從關(guān)系時(shí),需要在從節(jié)點(diǎn)上使用slaveof命令,具體的步驟如下。

第一步,打開一個(gè)命令窗口,在其中運(yùn)行如下命令創(chuàng)建一個(gè)名為redis-master的redis容器,請注意它的端口是6379。

?
1
docker run -itd --name redis-master -p 6379:6379 redis:latest

第二步,再新開一個(gè)命令窗口,在其中運(yùn)行如下命令創(chuàng)建一個(gè)名為redis-slave1的容器,請注意它的端口是6380。請注意這里是在一臺(tái)電腦上運(yùn)行,所以用端口號(hào)來區(qū)別一臺(tái)主redis容器和另外兩臺(tái)從redis容器。如果在真實(shí)項(xiàng)目里,多臺(tái)redis會(huì)部署在不同的服務(wù)器上,所以可以都用6379端口。

?
1
docker run -itd --name redis-slave1 -p 6380:6380 redis:latest

第三步,回到包含redis-master容器的命令窗口,在其中運(yùn)行docker inspect redis-master命令,查看redis-master容器的信息,在其中能通過ipaddress項(xiàng)看到改容器的ip地址,這里是172.17.0.2。如果在真實(shí)項(xiàng)目里,redis服務(wù)器所在的ip地址是固定的,而通過docker容器啟動(dòng)的redis服務(wù)器的ip地址是動(dòng)態(tài)的,所以這里要用上述命令來獲取ip地址。

第四步,在redis-master容器的命令窗口里,運(yùn)行docker exec -it redis-master /bin/bash命令,進(jìn)入到命令行窗口,在其中用redis-cli命令進(jìn)入到redis客戶端命令行后,再通過info replication命令查看當(dāng)前的主從模式的狀態(tài),能看到如下所示的部分結(jié)果。

?
1
2
3
4
5
6
c:\work>docker exec -it redis-master /bin/bash
root@9433cd584d80:/data# redis-cli
127.0.0.1:6379> info replication
# replication
role:master
connected_slaves:0

從第5行的輸出里能看到,當(dāng)前reids-master容器在主從模式里的角色是“主服務(wù)器”,從第6行的輸出里能看到,當(dāng)前該主服務(wù)器沒有攜帶從服務(wù)器。

同樣再到redis-slave1容器的命令窗口里,通過docker exec -it redis-slave1 /bin/bash命令進(jìn)入容器的命令行窗口,也通過redis-cli命令進(jìn)入客戶端命令行,也再通過info replication命令查看該redis服務(wù)器的主從模式的狀態(tài),部分結(jié)果如下所示。

?
1
2
3
4
5
6
c:\work>docker exec -it redis-slave1 /bin/bash
root@2e3237c60211:/data# redis-cli
127.0.0.1:6379> info replication
# replication
role:master
connected_slaves:0

由于此時(shí)還沒有通過命令行設(shè)置主從模式,所以從第5行和第6行的輸出結(jié)果里,依然看到當(dāng)前服務(wù)器是“主服務(wù)器”,同時(shí)沒有攜帶從服務(wù)器。

第五步,在redis-slave1容器的命令窗口里,運(yùn)行如下的slaveof命令,指定當(dāng)前redis服務(wù)器為從服務(wù)器。該命令的格式是slaveof ip地址 端口號(hào),這里是指向172.17.0.2:6379所在的主服務(wù)器。

slaveof 172.17.0.2 6379

運(yùn)行完該命令后,還是在redis-slave1客戶端里,再次運(yùn)行info replication,會(huì)看到如下所示的部分結(jié)果。從第3行的結(jié)果里能看到,該redis-slave1服務(wù)器已經(jīng)成為從服務(wù)器,并能從第4行和第5行的輸出里能確認(rèn),該從服務(wù)器是從屬于172.17.0.2:6379所在的redis主服務(wù)器。

?
1
2
3
4
5
127.0.0.1:6379> info replication
 # replication
 role:slave
 master_host:172.17.0.2
 master_port:6379

此時(shí)再回到redis-master容器的命令窗口里,在redis客戶端里再次運(yùn)行info replication命令查看主從狀態(tài),能看到如下所示的部分結(jié)果。從第4行的輸出里能看到,該redis主服務(wù)器已經(jīng)攜帶了一個(gè)從服務(wù)器。

?
1
2
3
4
127.0.0.1:6379> info replication
# replication
role:master
connected_slaves:1

第六步,再打開一個(gè)新的命令窗口,在其中運(yùn)行如下命令,開啟一個(gè)新的名為redis-slave2的redis容器,請注意它的端口是6381。

?
1
docker run -itd --name redis-slave2 -p 6381:6381 redis:latest

隨后再運(yùn)行docker exec -it redis-slave2 /bin/bash命令進(jìn)入該容器的命令行窗口,再通過redis-cli命令進(jìn)入客戶端,運(yùn)行slaveof 172.17.0.2 6379命令,把這個(gè)redis服務(wù)器也設(shè)為從服務(wù)器,并連到redis-master這個(gè)容器所在的主redis服務(wù)器上。

連接完成后,再回到redis-master容器所在的命令行窗口,再運(yùn)行info replication命令,此時(shí)能看到如下的部分輸出,從第4行的輸出里能看到,當(dāng)前該主服務(wù)器連接著兩臺(tái)從服務(wù)器。

?
1
2
3
4
127.0.0.1:6379> info replication
 # replication
 role:master
 connected_slaves:2

至此配置完成一主兩從模式的主從模式,此時(shí)如果到兩臺(tái)從服務(wù)器里運(yùn)行g(shù)et name命令,返回是空,如果到redis-master容器所在的命令行窗口,在其中運(yùn)行set name peter后,再到兩臺(tái)從服務(wù)器里運(yùn)行g(shù)et name命令,就能看到返回值。這說明主從模式配置成功,主服務(wù)器里的數(shù)據(jù)會(huì)自動(dòng)同步到各從服務(wù)器上。

3 通過配置搭建主從集群

在項(xiàng)目里可以用slaveof命令搭建主從模式的集群外,還可以用配置參數(shù)的方式來搭建,具體的步驟如下。

第一步,搭建主服務(wù)器redis-master的命令不變,依然用如下的命令,這里還是用6379端口。

?
1
docker run -itd --name redis-master -p 6379:6379 redis:latest

用docker inspect redis-master命令確認(rèn)該redis服務(wù)器所在容器的ip地址依然是172.17.0.2。

第二步,到c:\work\redis\redisconf目錄里,創(chuàng)建配置文件redisslave1.conf,并在其中編寫如下內(nèi)容。

port 6380

slaveof 172.17.0.2 6379

通過第1行的命令,設(shè)置該redis的端口為6380,通過第2行的slaveof配置,把該redis服務(wù)器設(shè)置成“從模式”,并連接到redis-master所在的主服務(wù)器上。

第三步,在新的命令窗口里運(yùn)行如下的命令,創(chuàng)建名為redids-slave1的redis服務(wù)器。該服務(wù)器的工作端口是6380,并且用redis-server后的參數(shù)指定在啟動(dòng)redis服務(wù)器時(shí)加載redisslave1.conf配置文件,

?
1
docker run -itd --name redis-slave1 -v c:\work\redis\redisconf:/redisconfig:rw -p 6380:6380 redis:latest redis-server /redisconfig/redisslave1.conf

隨后再通過docker exec -it redis-slave1 /bin/bash命令進(jìn)入到該容器的命令行,由于這里redis工作端口已經(jīng)變成6380,所以需要通過redis-cli -h 127.0.0.1 -p 6380命令來進(jìn)入redis客戶端,如果在其中運(yùn)行info replication命令,能看到如下的部分結(jié)果,由此能進(jìn)一步確認(rèn)redis-slave1服務(wù)器已經(jīng)從屬于redis-master服務(wù)器。

?
1
2
3
4
5
6
root@80e7ae14a322:/data# redis-cli -h 127.0.0.1 -p 6380
127.0.0.1:6380> info replication
# replication
role:slave
master_host:172.17.0.2
master_port:6379

第四步,到c:\work\redis\redisconf目錄里,創(chuàng)建配置文件redisslave2.conf,并在其中編寫如下內(nèi)容。

port 6381

slaveof 172.17.0.2 6379

這里用到了6381端口,同樣也通過slaveof命令連接到redis-master服務(wù)器上。隨后在新的命令窗口里運(yùn)行如下的命令,創(chuàng)建名為redids-slave2的redis服務(wù)器。該服務(wù)器的工作端口是6381,并且用redis-server后的參數(shù)指定在啟動(dòng)redis服務(wù)器時(shí)加載redisslave2.conf配置文件,

?
1
docker run -itd --name redis-slave2 -v c:\work\redis\redisconf:/redisconfig:rw -p 6381:6381 redis:latest redis-server /redisconfig/redisslave2.conf

隨后再通過docker exec -it redis-slave2 /bin/bash命令進(jìn)入到該容器的命令行,由于這里redis工作端口已經(jīng)變成6381,所以需要通過redis-cli -h 127.0.0.1 -p 6381命令來進(jìn)入redis客戶端,這里可以再通過info replication命令確認(rèn)配置效果,部分運(yùn)行結(jié)果如下所示。

?
1
2
3
4
5
6
root@6017108b97c4:/data# redis-cli -h 127.0.0.1 -p 6381
 127.0.0.1:6381> info replication
 # replication
 role:slave
 master_host:172.17.0.2
 master_port:6379

至此完成了以配置文件設(shè)置主從復(fù)制集群的設(shè)置,此時(shí)如果到主服務(wù)器redis-master所在的客戶端里運(yùn)行set age 18命令,再到redis-slave1和redis-slave2這兩臺(tái)從服務(wù)器里運(yùn)行g(shù)et age命令,能看到age的值,由此能再次確認(rèn)主從服務(wù)器之間能同步數(shù)據(jù)。

4 配置讀寫分離效果

如果在上文里配置的redis-slave1和redis-slave2這兩臺(tái)從服務(wù)器里,運(yùn)行info replication命令,還能看到“slave_read_only:1”這項(xiàng)配置,說明從服務(wù)器默認(rèn)是“只讀”的,如果到redis-slave1的redis客戶端命令行里輸入set val 1,會(huì)看到如下第2行所示的錯(cuò)誤,從而能進(jìn)一步驗(yàn)證該redis服務(wù)器的“只讀”屬性。

127.0.0.1:6380> set val 1

(error) readonly you can't write against a read only replica.

對于redis從服務(wù)器而言,建議采用默認(rèn)的“只讀”配置,因?yàn)樵陧?xiàng)目里,一般不會(huì)向作為數(shù)據(jù)同步目的地的“從服務(wù)器”上寫數(shù)據(jù)。如果業(yè)務(wù)上確實(shí)需要,可以通過如下的步驟設(shè)置“可讀可寫”的效果。

第一步,在上文提到的redisslave2.conf配置文件里再加入一行“slave-read-only no”的配置,指定該服務(wù)器可讀可寫。

第二步,如果上文提到的redis-slave2容器還處于活動(dòng)狀態(tài),則需要先用docker stop redis-slave2停止該容器,隨后再用docker rm redis-slave2命令刪除該容器,之后可以再用如下的命令再次創(chuàng)建redis-slave2容器。

?
1
docker run -itd --name redis-slave2 -v c:\work\redis\redisconf:/redisconfig:rw -p 6381:6381 redis:latest redis-server /redisconfig/redisslave2.conf

在redis-server命令后所帶的redisslave2.conf配置文件里,已經(jīng)用“slave-read-only no”配置項(xiàng)設(shè)置了“可讀可寫”的模式。

第三步,再通過docker exec -it redis-slave2 /bin/bash命令進(jìn)入到該容器的命令行,再通過redis-cli -h 127.0.0.1 -p 6381命令進(jìn)入redis客戶端, 此時(shí)如果再運(yùn)行set val 1命令,就能成功寫入數(shù)據(jù)。

5 用心跳機(jī)制提升主從復(fù)制可靠性

在redis主從復(fù)制模式里,如果主從服務(wù)器之間有數(shù)據(jù)同步的情況,那么從服務(wù)器會(huì)默認(rèn)以一秒一次的頻率,向主服務(wù)器發(fā)送replconf ack命令,依次來確保兩者間連接通暢。這種定時(shí)交互命令確保連接的機(jī)制就叫“心跳”機(jī)制。在上文開啟的redis-master這個(gè)主服務(wù)器的命令行里,如果運(yùn)行info replication命令,能看到它從屬服務(wù)器的“心跳”狀況。

?
1
2
3
4
5
6
127.0.0.1:6379> info replication
2 # replication
3 role:master
4 connected_slaves:2
5 slave0:ip=172.17.0.3,port=6380,state=online,offset=16185,lag=1
6 slave1:ip=172.17.0.4,port=6381,state=online,offset=16185,lag=1

其中在第5行和第6行里,能通過lag表示該從屬服務(wù)器發(fā)送replconf ack命令的時(shí)間,這里均是1秒,這表示兩臺(tái)從服務(wù)器和主服務(wù)器的連接均屬通暢。

這里大家可以想象下,如果從服務(wù)器宕機(jī),那么主從復(fù)制就沒有意義了。對此,可以通過如下的步驟來關(guān)聯(lián)心跳機(jī)制和主動(dòng)復(fù)制的動(dòng)作。

第一步,在c:\work\redis\redisconf目錄里新建redismaster.conf文件,在其中編寫如下的代碼。

?
1
2
3
min-slaves-to-write 2
 
min-slaves-max-lag 15

第1行的參數(shù)表示實(shí)現(xiàn)主從復(fù)制的從服務(wù)器個(gè)數(shù)最少是2臺(tái),第2行的參數(shù)表示,如果有第1行參數(shù)指定的從服務(wù)器個(gè)數(shù)(這里是2臺(tái))的心跳延遲時(shí)間(即lag值)大于15秒,不執(zhí)行主從復(fù)制。

這兩個(gè)條件是“或者”的關(guān)系,即只要出現(xiàn)從服務(wù)器個(gè)數(shù)小于2,或者2臺(tái)從服務(wù)器的心跳延遲時(shí)間大于15秒,主服務(wù)器即停止主從復(fù)制的操作。

第二步,通過如下的命令啟動(dòng)redis-master容器,由于此時(shí)啟動(dòng)redis服務(wù)器時(shí)已經(jīng)加載了上述配置,所以該redis主服務(wù)器在執(zhí)行主從復(fù)制時(shí),會(huì)檢測第一步所設(shè)置的條件。從而能提升主從復(fù)制的可靠性。

?
1
docker run -itd --name redis-master -v c:\work\redis\redisconf:/redisconfig:rw -p 6379:6379 redis:latest redis-server /redisconfig/redismaster.conf

6 用偏移量檢查數(shù)據(jù)是否一致

在上文開啟的redis-master主服務(wù)器的命令行里,如果運(yùn)行info replication命令,還能看到表示復(fù)制數(shù)據(jù)偏移量的master_repl_offset數(shù)據(jù),效果如下第6行所示。這里數(shù)據(jù)是276,表示主服務(wù)器向從服務(wù)器發(fā)送數(shù)據(jù)的字節(jié)數(shù)。

?
1
2
3
4
5
6
127.0.0.1:6379> info replication
 # replication
 role:master
 connected_slaves:1
 
 master_repl_offset:276

同樣如果到redis-slave1從服務(wù)器的命令行里,也能通過info replication查看該偏移量,效果如下第7行所示。

?
1
2
3
4
5
6
7
127.0.0.1:6380> info replication
 # replication
 role:slave
 master_host:172.17.0.2
 master_port:6379
 
 slave_repl_offset:276

在從服務(wù)器里,該數(shù)據(jù)表示從主服務(wù)器中接收到的數(shù)據(jù)字節(jié)數(shù),如果主從服務(wù)器中兩者數(shù)據(jù)一致,這說明主從服務(wù)器間的數(shù)據(jù)是同步的。

當(dāng)在主服務(wù)器redis-master里運(yùn)行set nextval 1命令后,再用info replication查看master_repl_offset數(shù)值,會(huì)發(fā)現(xiàn)有變化,而此時(shí)再到redis-slave1從服務(wù)器運(yùn)行info replication命令,會(huì)發(fā)現(xiàn)從服務(wù)器的master_repl_offset數(shù)值依然和主服務(wù)器一致,這說明用set nextval 1命令在主服務(wù)器里增加的數(shù)據(jù)已經(jīng)成功同步到從服務(wù)器。也就是說,如果出現(xiàn)redis問題,可以通過master_repl_offset數(shù)值來檢查同步數(shù)據(jù)是否正確,由此再進(jìn)一步排查問題。

總結(jié)

到此這篇關(guān)于使用docker搭建redis主從復(fù)制的集群的文章就介紹到這了,更多相關(guān)docker搭建redis主從復(fù)制的集群內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://www.cnblogs.com/JavaArchitect/p/13410197.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 羲义嫁密着中出交尾gvg794 | 日韩欧美一区黑人vs日本人 | 四虎影院精品在线观看 | 日本老妇乱子伦中文视频 | 91精品综合 | 国产色拍| 九九成人免费视频 | www.99精品| 国产精品露脸国语对白手机视频 | 国产精品极品美女自在线 | 国产综合成人亚洲区 | 欧美日韩精品一区二区三区视频播放 | 出差被灌醉绝伦的上司日本 | 调教处男| 很黄的孕妇a级黄毛片 | www.9p234.com| 5月色婷婷 | 欧洲第一区第二区第三区 | 色婷婷综合久久久中文字幕 | 国产在线精品亚洲第一区香蕉 | 亚洲精品卡1卡二卡3卡四卡 | 99免费视频 | 999久久久免费精品国产牛牛 | 午夜影院网站 | 美女张开下身让男人桶 | 被老头操 | 男人摸女人下面 | 国产精品九九久久一区hh | 和两个男人玩3p好爽视频 | 羞羞视频污 | 极品主播的慰在线播放 | 亚洲高清在线精品一区 | 91短视频破解版 | 九九精品国产亚洲A片无码 九九99热久久999精品 | 日本中文字幕黑人借宿影片 | 国产欧美国产综合第一区 | 亚洲高清影院 | 肥奶丰熟肥妇 | 99re7在线精品免费视频 | 成人日批视频 | 美尻在线 |