redis讀寫(xiě)分離 -- 主從架構(gòu)
- slave啟動(dòng)后永品,ping通master節(jié)點(diǎn)缤骨。master節(jié)點(diǎn)給slave一個(gè)數(shù)據(jù)復(fù)制任務(wù)公黑,RDB全量數(shù)據(jù)同步。slave先將rdb文件下載到本地磁盤(pán)再讀仍科健贞远; ----- 全量復(fù)制
- master將修改的執(zhí)行命令賦值給slave蛋褥,進(jìn)行數(shù)據(jù)的持續(xù)同步彼宠。slave會(huì)在替換完成后再使用新的數(shù)據(jù),沒(méi)有同步完成之前讀取時(shí)使用老的數(shù)據(jù)诗力; ----- 增量傳遞
備注:master須開(kāi)啟持久化凰浮,否則master掛掉重啟后不能恢復(fù)數(shù)據(jù),slave會(huì)因?yàn)橥蕉蹇?/p>
缺點(diǎn):主從架構(gòu)在master節(jié)點(diǎn)掛掉之后苇本,slave節(jié)點(diǎn)雖然存活袜茧,但是無(wú)法增刪改數(shù)據(jù),只能提供查詢(xún)用圈澈。如果想要基礎(chǔ)可寫(xiě)入惫周,需人工干預(yù)。
哨兵模式應(yīng)運(yùn)而生康栈,哨兵可以在主發(fā)生故障后递递,自動(dòng)進(jìn)行故障轉(zhuǎn)移,從從機(jī)里選出一臺(tái)升級(jí)為主機(jī)啥么,并持續(xù)監(jiān)聽(tīng)著原來(lái)的主機(jī)登舞,當(dāng)原來(lái)的主機(jī)恢復(fù)后,會(huì)將其作為新主的從機(jī)悬荣。
redis主從搭建
我本地準(zhǔn)備了兩臺(tái)服務(wù)器192.168.0.170
和 192.168.0.171
1菠秒、分別在兩臺(tái)服務(wù)器上執(zhí)行
拉取鏡像
docker pull redis
啟動(dòng)容器
docker run -d -p 6379:6379 --name myredis redis:latest
進(jìn)入容器
docker exec -it [容器ID] /bin/bash
打開(kāi)redis客戶(hù)端
redis-cli
2、此時(shí)兩個(gè)服務(wù)器的redis客戶(hù)端還是相互獨(dú)立的單應(yīng)用氯迂,我將170的服務(wù)作為171的備份關(guān)聯(lián)起來(lái)
在170的客戶(hù)端命令中執(zhí)行
slaveof 192.168.0.171 6379
完成后践叠,在171 節(jié)點(diǎn)指向 info replication
看到的信息如下, 可以看出171在集群中的角色是master,并且它有一個(gè)已連接的從節(jié)點(diǎn)是170
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.0.170,port=6379,state=online,offset=1141,lag=1
master_replid:8954d7b8aaa855e5c465c24d2fe000501c82711a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1141
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1141
從節(jié)點(diǎn)170的信息如下
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.0.171
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:1707
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:8954d7b8aaa855e5c465c24d2fe000501c82711a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1707
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1707
redis哨兵搭建
下載并配置一個(gè)哨兵配置文件如下嚼蚀,兩個(gè)文件都用這個(gè)文件即可
port 26379
daemonize yes
pidfile "/var/run/redis-sentinel.pid"
logfile "/var/log/sentinel.log"
dir "/tmp"
sentinel myid 14156cf20bb543add7cdce6665b4bc5e16eb82dd
sentinel monitor mymaster 192.168.0.171 6379 1
sentinel config-epoch mymaster 1
sentinel leader-epoch mymaster 1
bind 127.0.0.1 xx.xx.xx.xx 暴露在公網(wǎng)時(shí)禁灼,綁定IP表示只能由這些機(jī)器訪問(wèn)
protected-mode no 關(guān)閉保護(hù)模式,公網(wǎng)時(shí)可開(kāi)啟
port 23679
daenibize yes 改成后臺(tái)運(yùn)行
pidfile /var/run/redis-sentinel.pid 進(jìn)程文件
logfile /xxxxx 哨兵的日志
dir /url/local/sentinel 工作目錄
sentinel monitor mymater 192.168.0.170 6379 2 核心配置:
mymaster:自定義給master命名的昵稱(chēng)轿曙,不能由特殊文字和空格等
ip值表示master節(jié)點(diǎn)所在的內(nèi)網(wǎng)的IP
2(quorum):表示如果有兩臺(tái)哨兵發(fā)現(xiàn)了master故障弄捕,就由一個(gè)或者兩個(gè)執(zhí)行故障轉(zhuǎn)移,重新選舉master
sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
mymaster 上面的master 后面是密碼 sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000(毫秒) 被哨兵認(rèn)為掛掉的時(shí)間段
sentinel parallel-syncs mymaster 1 選舉新的master导帝,其他slave同步數(shù)據(jù)并行的個(gè)數(shù)守谓,為1就是1個(gè)接一個(gè)
sentinel failover-timeout mymaster 180000 準(zhǔn)備切換的超時(shí)時(shí)間,默認(rèn)3分鐘
接下來(lái)您单,可以啟動(dòng)哨兵了(兩臺(tái)服務(wù)器都要執(zhí)行)
開(kāi)啟哨兵容器斋荞,/root/sentinel.conf 掛載自己的數(shù)據(jù)卷
docker run --name sentinel -p 26379:26379 -v /root/sentinel.conf:/usr/local/etc/redis/sentinel.conf -d redis
隨后進(jìn)入容器
docker exec -it 【容器ID】 /bin/bash
啟動(dòng)哨兵
redis-sentinel /use/local/etc/redis/sentinel.conf
兩臺(tái)服務(wù)器執(zhí)行完成之后,哨兵就可用的虐秦,master節(jié)點(diǎn)掛掉之后譬猫,slave節(jié)點(diǎn)會(huì)被選舉為新的master節(jié)點(diǎn)接管工作(這個(gè)過(guò)程需要一定時(shí)間)
整合SpringBoot
修改前
spring:
redis:
database: 0
password:
host: localhost
port: 6379
修改后
spring:
redis:
database: 0
password:
sentinel:
master: mymaster
nodes: 192.168.0.170:26379,192.168.0.171:26379 # 哨兵的地址