最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot如何整合Redis哨兵集群?高并發(fā)場(chǎng)景解決方案

 更新時(shí)間:2026年07月25日 09:19:43   作者:程序員一只長(zhǎng)毛橘  
還在為Redis單點(diǎn)故障頭疼?本文手把手教你搭建Redis高可用環(huán)境,從主從復(fù)制原理到哨兵模式配置,再到3主3從集群實(shí)戰(zhàn),讓你輕松實(shí)現(xiàn)數(shù)據(jù)冗余、故障自動(dòng)恢復(fù)和讀寫(xiě)分離,大幅提升系統(tǒng)并發(fā)能力,適合生產(chǎn)環(huán)境部署

redis之高可用環(huán)境搭建

概念:

主從復(fù)制,是指將一臺(tái)Redis服務(wù)器的數(shù)據(jù),復(fù)制到其他的Redis服務(wù)器。前者稱(chēng)為主節(jié)點(diǎn)(master/leader),后者稱(chēng)為從節(jié)點(diǎn)(slave/follower);數(shù)據(jù)的復(fù)制是單向的,只能由主節(jié)點(diǎn)到從節(jié)點(diǎn)。Master以寫(xiě)為主,Slave已讀為主。

默認(rèn)情況下,每臺(tái)Redis服務(wù)器都是主節(jié)點(diǎn);

且一個(gè)主節(jié)點(diǎn)可以有多個(gè)從節(jié)點(diǎn)(或沒(méi)有從節(jié)點(diǎn)),但一個(gè)從節(jié)點(diǎn)只能有一個(gè)主節(jié)點(diǎn)。

主從復(fù)制的作用主要包括:

1,數(shù)據(jù)冗余:主從復(fù)制實(shí)現(xiàn)了數(shù)據(jù)的熱備份,是持久化之外的一種數(shù)據(jù)冗余方式。

2,故障恢復(fù):當(dāng)主節(jié)點(diǎn)出現(xiàn)問(wèn)題時(shí),可以用從節(jié)點(diǎn)提供服務(wù),實(shí)現(xiàn)快速的故障恢復(fù);實(shí)際上是一種服務(wù)的冗余。

3,負(fù)載均衡:在主從復(fù)制的基礎(chǔ)上,配合讀寫(xiě)分離,可以由主節(jié)點(diǎn)提供寫(xiě)服務(wù),由從節(jié)點(diǎn)提供讀服務(wù)(即寫(xiě)Redis數(shù)據(jù)時(shí)應(yīng)用連接主節(jié)點(diǎn),讀Rediss數(shù)據(jù)時(shí)應(yīng)用連接從節(jié)點(diǎn)),分擔(dān)服務(wù)器負(fù)載;尤其是在寫(xiě)少讀多的場(chǎng)景下,通過(guò)多個(gè)從節(jié)點(diǎn)分擔(dān)讀負(fù)載,可以大大提高Redis服務(wù)器的并發(fā)量。

4,高可用(集群)基石:除了上述作用以外,主從復(fù)制還是哨兵和集群能夠?qū)嵤┑幕A(chǔ),因此說(shuō)主從復(fù)制是Redis高可用的基礎(chǔ)。

一般來(lái)說(shuō),要將Redis運(yùn)用于工程項(xiàng)目中,只使用一臺(tái)Redis是萬(wàn)萬(wàn)不能的(宕機(jī)),原因如下:

1,從結(jié)構(gòu)上,單個(gè)Redis服務(wù)器會(huì)發(fā)生單點(diǎn)故障,并且一臺(tái)服務(wù)器需要處理所有的請(qǐng)求負(fù)載,壓力較大;

2,從容量上,單個(gè)Redis服務(wù)器內(nèi)存容量有限,就算一臺(tái)Redis服務(wù)器內(nèi)存容量為256G,也不能將所有內(nèi)存作為Redis存儲(chǔ)內(nèi)存,一般來(lái)說(shuō)單臺(tái)Redis最大使用內(nèi)存不應(yīng)該超過(guò)20G。電商網(wǎng)站上的商品,一般都是一次上傳,無(wú)數(shù)次瀏覽的,就是讀多寫(xiě)少。

主從復(fù)制,讀寫(xiě)分離!80%的情況下都是在進(jìn)行讀操作!減緩服務(wù)器的壓力!架構(gòu)中經(jīng)常使用!最低是一主二從!

環(huán)境配置 

只配置從庫(kù),不用配置主庫(kù)(Redis本身就認(rèn)為自己是主庫(kù))

主從復(fù)制(一主二從) 一臺(tái)服務(wù)器搭建

1,搭建集群建議創(chuàng)建一個(gè)redis-cluster文件夾,方便管理

mkdir redis-cluster

2,上傳redis-6.2.6.tar.gz。

官網(wǎng)下載地址:https://redis.io/download

去官網(wǎng)下載然后上傳到服務(wù)器。

3,解壓,完成單機(jī)安裝

[root@instance-ou4346s0 software]# tar -zxvf redis-6.2.6.tar.gz 

 mv redis-6.2.6 /usr/local/lixiaoxing/redis-cluster/    //移動(dòng)到這個(gè)目錄下
 
 mv redis-6.2.6/ redis-6381  //修改名稱(chēng)
 
 安裝gcc環(huán)境
由于redis是C語(yǔ)言編寫(xiě)的,它的運(yùn)行需要環(huán)境,因此我們需要先安裝gcc,anan,安裝命令如下
yum install gcc-c++

進(jìn)行編譯與安裝
cd /usr/local/lixiaoxing/redis-cluster/redis-6381
make      //對(duì)解壓后的文件進(jìn)行編譯
cd ./src   //進(jìn)入到 redis-5.0.0/src 文件目錄下
make install    //進(jìn)行redis安裝

完成如下

4,為了方便管理,將redis文件中的conf配置文件和常用命令移動(dòng)在統(tǒng)一文件中

(1)創(chuàng)建bin文件夾

mkdir bin

(2) 將安裝好的redis-6.2.4修改為redis-6381方便維護(hù)

將redis-6381目錄下的 redis.conf 移動(dòng)到 redis-6381目錄下的bin文件夾下

將mkreleasehdr.sh、redis-benchmark、redis-check-aof、redis-cli、redis-server 移動(dòng)到 /usr/local/redis-5.0.0/bin/ 目錄下

[root@instance-ou4346s0 redis-6381]# mv redis.conf  bin

[root@instance-ou4346s0 redis-6381]# cd src/        //進(jìn)入redis-5.0.0目錄下的src文件夾下

//將mkreleasehdr.sh、redis-benchmark、redis-check-aof、redis-cli、redis-server 移動(dòng)到/usr/local/lixiaoxing/redis-cluster/redis-6381/bin/
[root@instance-ou4346s0 src]# mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-cli redis-server /usr/local/lixiaoxing/redis-cluster/redis-6381/bin/

修改配置
[root@instance-ou4346s0 redis-6381]# cd bin
[root@instance-ou4346s0 bin]# vim redis.conf   編輯 redis.conf配置文件,設(shè)置后臺(tái)啟動(dòng)redis服務(wù)

(3)把文件中的daemonize屬性改為yes(表明需要在后臺(tái)運(yùn)行)

(4)編輯 redis.conf配置文件,開(kāi)啟redis遠(yuǎn)程訪問(wèn)服務(wù)

(1)把 redis.conf配置文件中的 bind 127.0.0.1 這一行給注釋掉,這里的bind指的是只有指定的網(wǎng)段才能遠(yuǎn)程訪問(wèn)這個(gè)redis,注釋掉后,就沒(méi)有這個(gè)限制了。

(2)把 redis.conf配置文件中的 protected-mode 設(shè)置成no(默認(rèn)是設(shè)置成yes的, 防止了遠(yuǎn)程訪問(wèn),在redis3.2.3版本后)

(3)編輯 redis.conf配置文件,修改Redis默認(rèn)密碼 (默認(rèn)密碼為空)

在配置文件中找到這一行 # requirepass foobared,刪除前面的注釋符號(hào)#,并把foobared修改成自己的密碼 或者 另起一行 requirepass 自己的密碼

(4)端口號(hào)改為6381

5,啟動(dòng)服務(wù)

[root@instance-ou4346s0 bin]# ./redis-server redis.conf 

查看redis是否有進(jìn)程

單機(jī)版完成

安裝完成,查看當(dāng)前的庫(kù)的信息

啟動(dòng)redis服務(wù)
./redis-cli   //連接

服務(wù)端:./redis-server --port 端口號(hào)  如果更換端口號(hào)了就輸入這個(gè)指令
client端:./redis-cli -p 端口號(hào) -h 127.0.0.1  

NOAUTH Authentication required.  //如果連接出現(xiàn)這個(gè)指令這是需要登錄,
 auth 123456


127.0.0.1:6379>clear     //清除一下屏幕
127.0.0.1:6379> info replication    //輸入指令查看當(dāng)前庫(kù)的信息
NOAUTH Authentication required.     //出現(xiàn)報(bào)錯(cuò),輸入redis的當(dāng)前密碼
127.0.0.1:6379> auth 123456         //輸入密碼
OK

127.0.0.1:6379> info replication    //再次啟動(dòng)
# Replication
role:master                        //  主節(jié)點(diǎn)
connected_slaves:0                   //連接的從機(jī)  0
master_failover_state:no-failover
master_replid:fbdfc1384c1ed87a0bf85ffde924714e4ff3a728
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

6,做一下日志的配置,方便以后查看

(1),配置 " logfile “這是日志的存放地方

(2),配置dbfilename 修改db的名稱(chēng)

(3),配置一下” pidfile "

保存!

7,在redis-cluster 目錄中把redis名稱(chēng)修改為 redis-6381 然后復(fù)制兩份,分別修改名稱(chēng)為redis-6382,redis-6383,同時(shí)修改每個(gè)redis.conf下的端口號(hào),為6381,6382,6383。

修改logfile 等配置… 然后啟動(dòng)redis

cp redis-6381/ redis-6382 -r
cp redis-6381/ redis-6383 -r

啟動(dòng)Redis

啟動(dòng)以后,現(xiàn)在就開(kāi)始配置一主二從模式.

./redis.cli     或者 [root@instance-ou4346s0 bin]# ./redis-cli -p 6381  端口號(hào)

127.0.0.1:6381> clear

127.0.0.1:6381> info replication

NOAUTH Authentication required.  從機(jī)登錄授權(quán)
auth 密碼   //用這個(gè)指令

6381

6382

6383

隨意指定其他兩臺(tái)redis服務(wù)器為從機(jī),6381為主機(jī) 在6382和6383上
使用SLAVEOF 127.0.0.1 6381  
配置2臺(tái)從機(jī)器指定127.0.0.1:6381為主機(jī)
當(dāng)然通過(guò)命令行的方式來(lái)配置主機(jī),只是臨時(shí)配置,如果要從Redis啟動(dòng)時(shí)就配置好需連接的主機(jī),就需要修改配置文件,的主從配置中的replicaof即可

6381

127.0.0.1:6381> info replication
# Replication
role:master                                                           //角色 主機(jī)
connected_slaves:2                                                    //兩個(gè)從機(jī)
slave0:ip=127.0.0.1,port=6383,state=online,offset=168,lag=0           //從機(jī)信息
slave1:ip=127.0.0.1,port=6382,state=online,offset=168,lag=0
master_failover_state:no-failover
master_replid:634ba5af8b23268c22bc1a3b39b6d7b215ba5d4a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:168
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:168
127.0.0.1:6381> 

6382

127.0.0.1:6382> info replication
# Replication
role:slave                                                             //角色從機(jī)
master_host:127.0.0.1                                                  //主機(jī)信息
master_port:6381
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:238
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:634ba5af8b23268c22bc1a3b39b6d7b215ba5d4a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:238
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:57
repl_backlog_histlen:182

6383同上 

注意:

這種配置從機(jī)重啟以后會(huì)自動(dòng)變成主機(jī),所以想要永久的就要去從機(jī)配置文件redis.conf

配置文件配置永久(這里需要注意,如果配置了密碼,建議每個(gè)redis這里都要寫(xiě)上密碼,這樣哨兵部分才不會(huì)出錯(cuò))

配置主機(jī)地址,有密碼也要配置密碼

  • replicaof
  • masterauth

主機(jī)密碼這樣寫(xiě)最好

配置成功保存退出,并查看當(dāng)前從機(jī),是否配置成功,并關(guān)閉,重啟,查看是否重啟后從機(jī)角色不變。從機(jī)角色不變,配置成功。

細(xì)節(jié):

主機(jī)可讀可寫(xiě),從機(jī)只能讀!主機(jī)中所有的信息和數(shù)據(jù),都會(huì)自動(dòng)被從機(jī)保存

如果我們嘗試從機(jī)中去存數(shù)據(jù)的話(huà),會(huì)報(bào)錯(cuò)

測(cè)試:

(1)主機(jī)斷開(kāi)連接,從機(jī)依舊連接到主機(jī),但是沒(méi)有寫(xiě)操作,這個(gè)時(shí)候,主機(jī)如果回來(lái)了,從機(jī)依舊可以直接獲取到主機(jī)寫(xiě)的信息

(2)如果是使用命令行,來(lái)配置的主從,重啟以后從機(jī)都會(huì)變成主機(jī)!但是只要變?yōu)閺臋C(jī)以后,立馬就會(huì)從主機(jī)中獲取值!

主從復(fù)制原理

(1)Slave啟動(dòng)成功連接到Master后會(huì)發(fā)送一個(gè)sync同步命令

(2)Master接收到命令,啟動(dòng)后臺(tái)的存盤(pán)進(jìn)程,同時(shí)收集所有接收到用于修改數(shù)據(jù)集命令,在后臺(tái)進(jìn)程執(zhí)行完畢之后整個(gè)數(shù)據(jù)文件到 slave,并完成一次完全同步

(3)全量復(fù)制:而slave服務(wù)在接收到數(shù)據(jù)文件數(shù)據(jù)后,將其存盤(pán)并加載到內(nèi)存中

(4)增量復(fù)制:Master繼續(xù)將新的所有收集的修改命令依次傳給slave,完成同步

(5)只要重新連接master,一次完成同步(全量復(fù)制)將被自動(dòng)執(zhí)行

哨兵模式

哨兵作用

  • 通過(guò)發(fā)送命令,讓Redis服務(wù)器返回監(jiān)控其運(yùn)行狀態(tài),包括主服務(wù)器和從服務(wù)器
  • 當(dāng)哨兵基礎(chǔ)到master宕機(jī),會(huì)自動(dòng)將slave切換成master,然后通過(guò)發(fā)布訂閱模式通知其他從服務(wù)器,修改配置文件讓它們切換主機(jī)

單哨兵

主從切換技術(shù)方法是:當(dāng)主服務(wù)器宕機(jī)后,需要手動(dòng)把一臺(tái)從服務(wù)器切換為主服務(wù)器,這需要人工干預(yù),還會(huì)造成一段時(shí)間內(nèi)服務(wù)不可用,Redis從2.8開(kāi)始正式提供了Sentinel(哨兵模式)來(lái)解決這個(gè)問(wèn)題

1,配置單哨兵模式來(lái)監(jiān)管redis 。

(1)在redis-cluster目錄下創(chuàng)建redis-sentinel方便方便管理哨兵

從一個(gè)redis目錄的src目錄中把redis-sentinel 和 redis目錄下的sentinel.conf 復(fù)制到redis-sentinel

注意:如果主機(jī)此時(shí)回來(lái),只能歸并到新的主機(jī)下,當(dāng)做從機(jī),這就是哨兵模式的規(guī)則!

注意:此報(bào)錯(cuò)是密碼沒(méi)有配置
 Next failover delay: I will not start a failover before Thu Nov 25 21:04:25 2021

按需配置: 一般配置連接,和主密碼,日志位置,daemonize…

# Example sentinel.conf
 
# 哨兵sentinel實(shí)例運(yùn)行的端口 默認(rèn)26379
port 26379
 
# 哨兵sentinel的工作目錄
dir /tmp
 
# 哨兵sentinel監(jiān)控的redis主節(jié)點(diǎn)的 ip port 
# master-name  可以自己命名的主節(jié)點(diǎn)名字 只能由字母A-z、數(shù)字0-9 、這三個(gè)字符".-_"組成。
# quorum 當(dāng)這些quorum個(gè)數(shù)sentinel哨兵認(rèn)為master主節(jié)點(diǎn)失聯(lián) 那么這時(shí) 客觀上認(rèn)為主節(jié)點(diǎn)失聯(lián)了
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
  sentinel monitor mymaster 127.0.0.1 6379 1   //配置連接
 
# 當(dāng)在Redis實(shí)例中開(kāi)啟了requirepass foobared 授權(quán)密碼 這樣所有連接Redis實(shí)例的客戶(hù)端都要提供密碼
# 設(shè)置哨兵sentinel 連接主從的密碼 注意必須為主從設(shè)置一樣的驗(yàn)證密碼
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster 12345678 -主密碼,不設(shè)置的話(huà)不能動(dòng)態(tài)切換 
 
 
# 指定多少毫秒之后 主節(jié)點(diǎn)沒(méi)有應(yīng)答哨兵sentinel 此時(shí) 哨兵主觀上認(rèn)為主節(jié)點(diǎn)下線 默認(rèn)30秒
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000
 
# 這個(gè)配置項(xiàng)指定了在發(fā)生failover主備切換時(shí)最多可以有多少個(gè)slave同時(shí)對(duì)新的master進(jìn)行 同步,
這個(gè)數(shù)字越小,完成failover所需的時(shí)間就越長(zhǎng),
但是如果這個(gè)數(shù)字越大,就意味著越 多的slave因?yàn)閞eplication而不可用。
可以通過(guò)將這個(gè)值設(shè)為 1 來(lái)保證每次只有一個(gè)slave 處于不能處理命令請(qǐng)求的狀態(tài)。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1
 
 
 
# 故障轉(zhuǎn)移的超時(shí)時(shí)間 failover-timeout 可以用在以下這些方面: 
#1. 同一個(gè)sentinel對(duì)同一個(gè)master兩次failover之間的間隔時(shí)間。
#2. 當(dāng)一個(gè)slave從一個(gè)錯(cuò)誤的master那里同步數(shù)據(jù)開(kāi)始計(jì)算時(shí)間。直到slave被糾正為向正確的master那里同步數(shù)據(jù)時(shí)。
#3.當(dāng)想要取消一個(gè)正在進(jìn)行的failover所需要的時(shí)間。  
#4.當(dāng)進(jìn)行failover時(shí),配置所有slaves指向新的master所需的最大時(shí)間。不過(guò),即使過(guò)了這個(gè)超時(shí),slaves依然會(huì)被正確配置為指向master,但是就不按parallel-syncs所配置的規(guī)則來(lái)了
# 默認(rèn)三分鐘
# sentinel failover-timeout <master-name> <milliseconds>
sentinel failover-timeout mymaster 180000
 
# SCRIPTS EXECUTION
 
#配置當(dāng)某一事件發(fā)生時(shí)所需要執(zhí)行的腳本,可以通過(guò)腳本來(lái)通知管理員,例如當(dāng)系統(tǒng)運(yùn)行不正常時(shí)發(fā)郵件通知相關(guān)人員。
#對(duì)于腳本的運(yùn)行結(jié)果有以下規(guī)則:
#若腳本執(zhí)行后返回1,那么該腳本稍后將會(huì)被再次執(zhí)行,重復(fù)次數(shù)目前默認(rèn)為10
#若腳本執(zhí)行后返回2,或者比2更高的一個(gè)返回值,腳本將不會(huì)重復(fù)執(zhí)行。
#如果腳本在執(zhí)行過(guò)程中由于收到系統(tǒng)中斷信號(hào)被終止了,則同返回值為1時(shí)的行為相同。
#一個(gè)腳本的最大執(zhí)行時(shí)間為60s,如果超過(guò)這個(gè)時(shí)間,腳本將會(huì)被一個(gè)SIGKILL信號(hào)終止,之后重新執(zhí)行。
 
#通知型腳本:當(dāng)sentinel有任何警告級(jí)別的事件發(fā)生時(shí)(比如說(shuō)redis實(shí)例的主觀失效和客觀失效等等),將會(huì)去調(diào)用這個(gè)腳本,
這時(shí)這個(gè)腳本應(yīng)該通過(guò)郵件,SMS等方式去通知系統(tǒng)管理員關(guān)于系統(tǒng)不正常運(yùn)行的信息。調(diào)用該腳本時(shí),將傳給腳本兩個(gè)參數(shù),
一個(gè)是事件的類(lèi)型,
一個(gè)是事件的描述。
如果sentinel.conf配置文件中配置了這個(gè)腳本路徑,那么必須保證這個(gè)腳本存在于這個(gè)路徑,并且是可執(zhí)行的,否則sentinel無(wú)法正常啟動(dòng)成功。
#通知腳本
# sentinel notification-script <master-name> <script-path>
  sentinel notification-script mymaster /var/redis/notify.sh
 
# 客戶(hù)端重新配置主節(jié)點(diǎn)參數(shù)腳本
# 當(dāng)一個(gè)master由于failover而發(fā)生改變時(shí),這個(gè)腳本將會(huì)被調(diào)用,通知相關(guān)的客戶(hù)端關(guān)于master地址已經(jīng)發(fā)生改變的信息。
# 以下參數(shù)將會(huì)在調(diào)用腳本時(shí)傳給腳本:
# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
# 目前<state>總是“failover”,
# <role>是“l(fā)eader”或者“observer”中的一個(gè)。 
# 參數(shù) from-ip, from-port, to-ip, to-port是用來(lái)和舊的master和新的master(即舊的slave)通信的
# 這個(gè)腳本應(yīng)該是通用的,能被多次調(diào)用,不是針對(duì)性的。
# sentinel client-reconfig-script <master-name> <script-path>
 sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

測(cè)試:

我們停了6381 sentinel 會(huì)自動(dòng)選取一個(gè)從機(jī)做服務(wù)器,最開(kāi)始的主機(jī)重啟后,只能做配置做從機(jī)

被sentinel選取的從機(jī)做主機(jī)后,配置文件也會(huì)發(fā)生改變,所以不用擔(dān)心。

3882:X 25 Nov 2021 22:58:31.771 # +failover-end master mymaster 127.0.0.1 6381
3882:X 25 Nov 2021 22:58:31.771 # +switch-master mymaster 127.0.0.1 6381 127.0.0.1 6383
3882:X 25 Nov 2021 22:58:31.771 * +slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6383
3882:X 25 Nov 2021 22:58:31.771 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6383

多哨兵

單哨兵存在一個(gè)問(wèn)題,如果最高哨兵死了呢,那么就沒(méi)人進(jìn)行監(jiān)控了,所以在生產(chǎn)機(jī)中通常會(huì)存在多個(gè)哨兵同時(shí)監(jiān)控Redis,并且多個(gè)哨兵也相互監(jiān)控

假設(shè)主服務(wù)器宕機(jī),哨兵1先檢測(cè)到這個(gè)結(jié)果,系統(tǒng)并且不會(huì)馬上進(jìn)行failover過(guò)程,僅僅是哨兵1主觀認(rèn)為主服務(wù)器不可用,這現(xiàn)象稱(chēng)為主觀下線,當(dāng)其它哨兵也檢測(cè)到主服務(wù)不可用,并且數(shù)量達(dá)到一定值,那么這些哨兵之間就會(huì)進(jìn)行一次投票,投票的由一個(gè)哨兵發(fā)起,進(jìn)行failover(故障轉(zhuǎn)移)操作,切換成功后,就會(huì)通過(guò)發(fā)布訂閱模式,讓各哨兵把自己監(jiān)控的從服務(wù)器實(shí)現(xiàn)切換主機(jī)客觀下線。

多哨兵搭建

1,這里為了方便管理建議就在redis-sentinel目錄下創(chuàng)建一個(gè)redis-sentinel-1 把剛才的單機(jī)sentinel配置文件復(fù)制到這個(gè)目錄下,

[root@instance-ou4346s0 redis-sentinel]# mkdir redis-sentinel-1       //創(chuàng)建 mkdir redis-sentinel-1 
[root@instance-ou4346s0 redis-sentinel]# mv redis-sentinel redis-sentinel-1/   //將redis-sentinel 和sentiel.cof 移動(dòng)到redis-sentinel-1中

2,配置sentiel.conf redis-sentinel-2 的端口為26380, redis-sentinel-3為26381 日志文件和pid文件也要更換

分別配置

修改內(nèi)容:
# 添加守護(hù)進(jìn)程模式
daemonize yes

# 添加指明日志文件名
logfile "/opt/redis/6379/sentinel26379.log"

# 修改工作目錄
dir "/opt/redis/6379"

# 修改啟動(dòng)端口
port 26379

# 關(guān)閉保護(hù)模式
protected-mode no

# 修改sentinel monitor
sentinel monitor redis-test-master 192.168.29.128 6379 2

# 將配置文件中mymaster全部替換redis-test-master

依次修改26380,26381配置說(shuō)明:
redis-test-master:監(jiān)控主數(shù)據(jù)的名稱(chēng),自定義即可,可以使用大小寫(xiě)字母和“.-_”符號(hào)
192.168.29.128:監(jiān)控的主數(shù)據(jù)庫(kù)的IP
6379:監(jiān)控的主數(shù)據(jù)庫(kù)的端口
2:最低通過(guò)票數(shù)


//端口默認(rèn)為26379。
port:26379                               
//關(guān)閉保護(hù)模式,可以外部訪問(wèn)。
protected-mode:no
//設(shè)置為后臺(tái)啟動(dòng)。
daemonize:yes
//日志文件。
logfile "/usr/local/lixiaoxing/redis-cluster/redis-sentinel/sentinel.log"
//pid位置
pidfile "/usr/local/lixiaoxing/redis-cluster/redis-sentinel/redis-sentinel.pid"
//指定主機(jī)IP地址和端口,并且指定當(dāng)有2臺(tái)哨兵認(rèn)為主機(jī)掛了,則對(duì)主機(jī)進(jìn)行容災(zāi)切換。
sentinel monitor mymaster 127.0.0.1 6382 2
//當(dāng)在Redis實(shí)例中開(kāi)啟了requirepass,這里就需要提供密碼。
sentinel auth-pass mymaster 12345678 
//這里設(shè)置了主機(jī)多少秒無(wú)響應(yīng),則認(rèn)為掛了。
sentinel down-after-milliseconds mymaster 30000
//主備切換時(shí),最多有多少個(gè)slave同時(shí)對(duì)新的master進(jìn)行同步,這里設(shè)置為默認(rèn)的1。
snetinel parallel-syncs mymaster 1
//故障轉(zhuǎn)移的超時(shí)時(shí)間,這里設(shè)置為三分鐘。
sentinel failover-timeout mymaster 180000

監(jiān)控設(shè)置成兩個(gè)投票就主觀下線

哨兵模式常用命令

1.查看sentinel的基本狀態(tài)信息
127.0.0.1:26379> INFO

2.列出所有被監(jiān)視的主服務(wù)器,以及這些主服務(wù)器的當(dāng)前狀態(tài) 
127.0.0.1:26379> SENTINEL MASTERS redis-test-master

3.列出給定主服務(wù)器的所有從服務(wù)器,以及這些從服務(wù)器的當(dāng)前狀態(tài) 
127.0.0.1:26379> SENTINEL SLAVES redis-test-master

4.返回給定名字的主服務(wù)器的IP地址和端口號(hào)
127.0.0.1:26379> SENTINEL GET-MASTER-ADDR-BY-NAME redis-test-master

5.重置所有名字和給定模式pattern相匹配的主服務(wù)器,重置操作清除主服務(wù)器目前的所有狀態(tài),包括正在執(zhí)行中的故障轉(zhuǎn)移,并移除目
前已經(jīng)發(fā)現(xiàn)和關(guān)聯(lián)的,主服務(wù)器的所有從服務(wù)器和Sentinel
127.0.0.1:26379> SENTINEL RESET redis-test-master 

6.當(dāng)主服務(wù)器失效時(shí),在不詢(xún)問(wèn)其他Sentinel意見(jiàn)的情況下,強(qiáng)制開(kāi)始一次自動(dòng)故障遷移,但是它會(huì)給其他Sentinel發(fā)送一個(gè)最新的配
置,其他sentinel會(huì)根據(jù)這個(gè)配置進(jìn)行更新
127.0.0.1:26379> SENTINEL FAILOVER redis-test-master

7.查看其它哨兵信息
127.0.0.1:26379> SENTINEL sentinels redis-test-master

出現(xiàn)以上以后 sentinel集群配置成功

sentinel的log日志查看

26379日志

26380日志

26381日志

springboot 整合一主二從加哨兵

server:
  port: 8081
# 單節(jié)點(diǎn)+哨兵
spring:
  redis:
    sentinel:
      nodes: 192.168.109.160:26379,192.168.109.163:26379,192.168.109.164:26379
      password: root
      master: mymaster
    password: root
# 單節(jié)點(diǎn)
#spring:
#  redis:
#    host: 192.168.109.160
#    port: 6379
#    timeout: 10000
#    password: root

Redis集群搭建(3主3從)

本文是在一臺(tái)服務(wù)器上搭建的,如果需要分布式部署的,也可參考搭建

1,準(zhǔn)備一臺(tái)服務(wù)器,開(kāi)啟端口號(hào)6381,6382,6383,6384,6385,6386

2,下載解壓安裝一個(gè)redis,具體操作看前面的單機(jī)安裝。然后創(chuàng)建一個(gè)redis-cluster的文件目錄,把單機(jī)redis移動(dòng)到這個(gè)目錄中,并且修改名稱(chēng)為6381

[root@instance-ou4346s0 lixiaoxing]# mv redis-6.2.6/ redis-cluster/   //移動(dòng)
[root@instance-ou4346s0 redis-cluster]# mv redis-6.2.6/ redis-6381   //修改名稱(chēng)

3,開(kāi)始安裝

(1) 如果centos中沒(méi)有g(shù)cc環(huán)境的話(huà),則需要安裝gcc環(huán)境,如果有直接下一步

[root@localhost tools]# yum install -y gcc 

(2)進(jìn)入到redis-6381中,開(kāi)始編譯安裝

[root@localhost tools]# cd redis-6381/
[root@localhost redis-6381]# make
[root@localhost redis-6381]# cd src 
[root@instance-ou4346s0 src]#  make install

[root@instance-ou4346s0 redis-6381]# echo $?  //執(zhí)行這句如果出現(xiàn)0編譯成功
0 

(3)為了方便管理在redis-6381目錄下創(chuàng)建 bin目錄 ,log目錄,data目錄

[root@instance-ou4346s0 redis-6381]# mkdir bin && mkdir data &&mkdir log

(4)將redis-6381/src目錄下的redis-server,redis-check-aof,redis-check-rdb,redis-cli,mkreleasehdr.sh 移動(dòng)到redis-6381/bin目錄下,在將reids-6381下的redis.conf也移動(dòng)到bin

[root@instance-ou4346s0 src]# mv redis-server redis-check-aof redis-check-rdb redis-cli mkreleasehdr.sh /usr/local/lixiaoxing/redis-cluster/redis-6381/bin

[root@instance-ou4346s0 redis-6381]# mv redis.conf bin/

(5)配置master 6381下的redis.conf

[root@instance-ou4346s0 bin]# vim redis.conf 


# 綁定服務(wù)器域名或IP地址
bind redis-166     //這里如果多臺(tái)服務(wù)器部署的話(huà)綁定的ip+端口 如果是單臺(tái)的話(huà)建議注銷(xiāo)掉
# 關(guān)閉遠(yuǎn)程保護(hù)
protected-mode no
# 設(shè)置端口,區(qū)分集群中Redis的實(shí)例
port 6381
# 后臺(tái)運(yùn)行
daemonize yes
# pid進(jìn)程文件名,以端口號(hào)命名
pidfile /usr/local/lixiaoxing/redis-cluster/redis-6381/data/redis_6381.pid
# 日志文件名稱(chēng),以端口號(hào)為目錄來(lái)區(qū)分
logfile "/usr/local/lixiaoxing/redis-cluster/redis-6381/data/redis_6381.log"
# 數(shù)據(jù)文件存放地址,以端口號(hào)為目錄名來(lái)區(qū)分
dir /usr/local/lixiaoxing/redis-cluster/redis-6381/data
# 啟用集群
cluster-enabled yes
# 配置每個(gè)節(jié)點(diǎn)的配置文件,同樣以端口號(hào)為名稱(chēng)
cluster-config-file nodes_7001.conf
# 配置集群節(jié)點(diǎn)的超時(shí)時(shí)間
cluster-node-timeout 15000
# 啟動(dòng)AOF增量持久化策略
appendonly yes
# 保存名稱(chēng)
appendfilename "appendonly-6381.aof"
# 發(fā)生改變,則記錄日志
appendfsync always

配置masterr 6382下的redis.conf (把redis-6381復(fù)制成redis-6382)

[root@instance-ou4346s0 redis-cluster]# cp redis-6381/ redis-6382 -r    //復(fù)制



# 綁定服務(wù)器域名或IP地址
bind redis-166
# 關(guān)閉遠(yuǎn)程保護(hù)
protected-mode no
# 設(shè)置端口,區(qū)分集群中Redis的實(shí)例
port 6382
# 后臺(tái)運(yùn)行
daemonize yes
# pid進(jìn)程文件名,以端口號(hào)命名
pidfile /usr/local/lixiaoxing/redis-cluster/redis-6382/data/redis_6382.pid
# 日志文件名稱(chēng),以端口號(hào)為目錄來(lái)區(qū)分
logfile "/usr/local/lixiaoxing/redis-cluster/redis-6382/log/redis_6382.log"
# 數(shù)據(jù)文件存放地址,以端口號(hào)為目錄名來(lái)區(qū)分
dir /usr/local/lixiaoxing/redis-cluster/redis-6382/data
# 啟用集群
cluster-enabled yes
# 配置每個(gè)節(jié)點(diǎn)的配置文件,同樣以端口號(hào)為名稱(chēng)
cluster-config-file nodes-6382.conf
# 配置集群節(jié)點(diǎn)的超時(shí)時(shí)間
cluster-node-timeout 15000
# 啟動(dòng)AOF增量持久化策略
appendonly yes
# 保存名稱(chēng)
appendfilename "appendonly-6382.aof"
# 發(fā)生改變,則記錄日志
appendfsync always

然后按需復(fù)制,6381 復(fù)制成6383,6385。 6382復(fù)制成6384,6386并修改每個(gè)redis的配置文件。

一個(gè)一個(gè)啟動(dòng)很麻煩,可以寫(xiě)腳本啟動(dòng)使用touch命令創(chuàng)建一個(gè)運(yùn)行腳本

其中redis-cli --cluster create命令是創(chuàng)建集群的命令

[root@instance-ou4346s0 redis-cluster]# touch start-redis-cluster.sh  //創(chuàng)建腳本
[root@instance-ou4346s0 redis-cluster]# chmod +x start-redis-cluster.sh    //變成可執(zhí)行腳本
[root@instance-ou4346s0 redis-cluster]# vim start-redis-cluster.sh   //編輯腳本



//編輯內(nèi)容
cd /usr/local/lixiaoxing/redis-cluster/redis-6381/bin
./redis-server redis.conf
sleep 5

cd /usr/local/lixiaoxing/redis-cluster/redis-6382/bin
./redis-server redis.conf
sleep 5

cd /usr/local/lixiaoxing/redis-cluster/redis-6383/bin
./redis-server redis.conf
sleep 5

cd /usr/local/lixiaoxing/redis-cluster/redis-6384/bin
./redis-server redis.conf
sleep 5

cd /usr/local/lixiaoxing/redis-cluster/redis-6385/bin
./redis-server redis.conf
sleep 5

cd /usr/local/lixiaoxing/redis-cluster/redis-6386/bin
./redis-server redis.conf
sleep 5

cd /usr/local/lixiaoxing/redis-cluster/redis-6386/bin
./redis-cli --cluster create 192.168.16.4:6381 192.168.16.4:6383 192.168.16.4:6385 192.168.16.4:6382 192.168.16.4:6384 192.168.16.4:6386 --cluster-replicas 1

編輯完成保存并退出  wq!
啟動(dòng)
[root@instance-ou4346s0 redis-cluster]# ./start-redis-cluster.sh   //開(kāi)啟了redis集群

yes 同意

命令測(cè)試一下

[root@instance-ou4346s0 bin]# ./redis-cli -c -h 180.76.242.96 -p 6381
180.76.242.96:6381> set 1 hello redis     //輸入以后出現(xiàn)以下數(shù)據(jù)代表成功
-> Redirected to slot [9842] located at 192.168.16.4:6383  
OK

[root@instance-ou4346s0 bin]# ./redis-cli -c -h 180.76.242.96 -p 6386    //取出來(lái)
180.76.242.96:6386> get 1
-> Redirected to slot [9842] located at 192.168.16.4:6383
"li"
成功----------

至此集群搭建完畢!

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Redis高并發(fā)情況下并發(fā)扣減庫(kù)存項(xiàng)目實(shí)戰(zhàn)

    Redis高并發(fā)情況下并發(fā)扣減庫(kù)存項(xiàng)目實(shí)戰(zhàn)

    本文主要介紹了Redis高并發(fā)情況下并發(fā)扣減庫(kù)存項(xiàng)目實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Linux 下redis5.0.0安裝教程詳解

    Linux 下redis5.0.0安裝教程詳解

    這篇文章主要介紹了Linux 下redis5.0.0安裝教程,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Redis節(jié)省內(nèi)存的十個(gè)技巧分享

    Redis節(jié)省內(nèi)存的十個(gè)技巧分享

    你是否在工作中遇到過(guò)Redis的bigkey導(dǎo)致的內(nèi)存占用嚴(yán)重、查詢(xún)耗時(shí)大大增加?同時(shí)bigKey還可能導(dǎo)致Redis實(shí)例的崩潰,因?yàn)閮?nèi)存不夠用了,所以本文給大家介紹了Redis極大節(jié)省內(nèi)存的10個(gè)技巧,需要的朋友可以參考下
    2024-04-04
  • Redis實(shí)現(xiàn)高并發(fā)計(jì)數(shù)器

    Redis實(shí)現(xiàn)高并發(fā)計(jì)數(shù)器

    這篇文章主要為大家詳細(xì)介紹了Redis實(shí)現(xiàn)高并發(fā)計(jì)數(shù)器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • Redis實(shí)現(xiàn)IP限流的2種方式舉例詳解

    Redis實(shí)現(xiàn)IP限流的2種方式舉例詳解

    通俗的說(shuō)限流就是限制一段時(shí)間內(nèi)用戶(hù)訪問(wèn)資源的次數(shù),減輕服務(wù)器壓力,這篇文章主要給大家介紹了關(guān)于Redis實(shí)現(xiàn)IP限流的2種方式,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • 一文搞懂Redis最常用String字符串技能

    一文搞懂Redis最常用String字符串技能

    想要一文搞懂Redis最常用字符串技能?你來(lái)對(duì)地方了,這篇指南將帶你深入淺出,輕松掌握Redis字符串的強(qiáng)大功能,別眨眼,跟我們一起,讓數(shù)據(jù)操作變得前所未有的簡(jiǎn)單,需要的朋友可以參考下
    2024-03-03
  • Redis主從復(fù)制的原理分析

    Redis主從復(fù)制的原理分析

    Redis主從復(fù)制通過(guò)將數(shù)據(jù)鏡像到多個(gè)從節(jié)點(diǎn),實(shí)現(xiàn)高可用性和擴(kuò)展性,主從復(fù)制包括初次全量同步和增量同步兩個(gè)階段,為優(yōu)化復(fù)制性能,可以采用AOF持久化、調(diào)整復(fù)制超時(shí)時(shí)間、優(yōu)化網(wǎng)絡(luò)帶寬等措施,故障轉(zhuǎn)移機(jī)制依賴(lài)于Sentinel或Cluster組件
    2025-01-01
  • Redis哨兵機(jī)制的使用詳解

    Redis哨兵機(jī)制的使用詳解

    文章講解了Redis哨兵機(jī)制的基本原理、主庫(kù)和從庫(kù)自動(dòng)切換的過(guò)程、如何減少誤判、哨兵集群的組成和通信機(jī)制,以及哨兵在故障發(fā)生時(shí)如何選舉Leader進(jìn)行主從切換
    2025-01-01
  • Redis 哨兵機(jī)制及配置實(shí)現(xiàn)

    Redis 哨兵機(jī)制及配置實(shí)現(xiàn)

    本文主要介紹了Redis 哨兵機(jī)制及配置實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Redis延遲雙刪的具體使用

    Redis延遲雙刪的具體使用

    本文主要討論了延時(shí)雙刪策略,用于解決緩存與數(shù)據(jù)庫(kù)數(shù)據(jù)不一致的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-08-08

最新評(píng)論

巨野县| 大同市| 盘锦市| 鹤峰县| 沈丘县| 和林格尔县| 财经| 新建县| 美姑县| 高阳县| 泉州市| 临沂市| 城步| 饶阳县| 伊川县| 西充县| 保靖县| 饶平县| 临西县| 江达县| 惠水县| 东方市| 谷城县| 韶关市| 勃利县| 玉屏| 象州县| 遵义市| 诸暨市| 黔南| 大渡口区| 宜都市| 阜康市| 枞阳县| 临湘市| 饶阳县| 平阴县| 宜良县| 涿鹿县| 龙游县| 长顺县|