SpringBoot如何整合Redis哨兵集群?高并發(fā)場(chǎng)景解決方案
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: rootRedis集群搭建(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è)參考,也希望大家多多支持腳本之家。
- SpringBoot集成Redis哨兵集群實(shí)現(xiàn)讀寫(xiě)分離的完整教程
- SpringBoot整合Redis的哨兵模式的實(shí)現(xiàn)
- SpringBoot整合Redis哨兵模式的實(shí)現(xiàn)示例
- springboot集成redis哨兵集群的實(shí)現(xiàn)示例
- springboot 集成redis哨兵主從的實(shí)現(xiàn)
- docker搭建redis哨兵集群并且整合springboot的實(shí)現(xiàn)
- SpringBoot+Redis哨兵模式的實(shí)現(xiàn)
- Springboot Redis?哨兵模式的實(shí)現(xiàn)示例
相關(guā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
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ù)器
這篇文章主要為大家詳細(xì)介紹了Redis實(shí)現(xiàn)高并發(fā)計(jì)數(shù)器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10
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 哨兵機(jī)制及配置實(shí)現(xiàn)
本文主要介紹了Redis 哨兵機(jī)制及配置實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

