Redis主從復(fù)制的實(shí)現(xiàn)示例
Redis 主從復(fù)制
主從復(fù)制是高可用Redis的基礎(chǔ),哨兵和集群都是在主從復(fù)制基礎(chǔ)上實(shí)現(xiàn)高可用的。主從復(fù)制主要實(shí)現(xiàn)了數(shù)據(jù)的多機(jī)備份,以及對于讀操作的負(fù)載均衡和簡單的故障恢復(fù)。
缺陷:故障恢復(fù)無法自動化;寫操作無法負(fù)載均衡;存儲能力受到單機(jī)的限制。
首次同步(全量復(fù)制)
- 發(fā)送SYNC命令:
- 當(dāng)從節(jié)點(diǎn)(Slave)決定成為某個主節(jié)點(diǎn)(Master)的從節(jié)點(diǎn)時,它會向主節(jié)點(diǎn)發(fā)送一個
SYNC
命令。
- 當(dāng)從節(jié)點(diǎn)(Slave)決定成為某個主節(jié)點(diǎn)(Master)的從節(jié)點(diǎn)時,它會向主節(jié)點(diǎn)發(fā)送一個
- BGSAVE生成RDB快照:
- 主節(jié)點(diǎn)接收到
SYNC
命令后,會執(zhí)行BGSAVE
命令。BGSAVE
命令會在后臺生成一個 RDB 快照文件,同時主節(jié)點(diǎn)繼續(xù)處理其他命令。 - 在生成 RDB 快照的過程中,主節(jié)點(diǎn)會將所有新的寫操作記錄到一個緩沖區(qū)中。
- 主節(jié)點(diǎn)接收到
- 快照文件傳輸:
- 一旦 RDB 快照文件生成完畢,主節(jié)點(diǎn)會將這個快照文件發(fā)送給從節(jié)點(diǎn)。
- 在發(fā)送快照文件的過程中,主節(jié)點(diǎn)會繼續(xù)接收并處理新的命令,這些命令會被記錄到緩沖區(qū)中。
- 加載快照文件:
- 從節(jié)點(diǎn)接收到 RDB 快照文件后,會加載這個文件,將其內(nèi)容應(yīng)用到自己的數(shù)據(jù)集中。
- 追趕復(fù)制:
- 加載完快照文件后,從節(jié)點(diǎn)會向主節(jié)點(diǎn)發(fā)送一個
PSYNC
命令,請求獲取主節(jié)點(diǎn)緩沖區(qū)中未發(fā)送的寫操作。 - 主節(jié)點(diǎn)收到
PSYNC
命令后,會將緩沖區(qū)中的寫操作發(fā)送給從節(jié)點(diǎn)。
- 加載完快照文件后,從節(jié)點(diǎn)會向主節(jié)點(diǎn)發(fā)送一個
增量復(fù)制
- 命令傳播:
- 在完成首次同步后,從節(jié)點(diǎn)會進(jìn)入命令傳播階段。在這個階段,主節(jié)點(diǎn)會將其接收到的所有寫操作(例如,SET、DEL等)實(shí)時地發(fā)送給從節(jié)點(diǎn)。
- 從節(jié)點(diǎn)會執(zhí)行這些寫操作,以保持與主節(jié)點(diǎn)的數(shù)據(jù)一致性。
- 心跳檢測:
- 在命令傳播階段,主從節(jié)點(diǎn)之間會定期發(fā)送心跳包(通常是PING和PONG命令)來檢測連接狀態(tài)。
- 如果從節(jié)點(diǎn)在一定時間內(nèi)沒有收到主節(jié)點(diǎn)的心跳包或命令,它會認(rèn)為連接已經(jīng)斷開,并嘗試重新與主節(jié)點(diǎn)建立連接。
- 重新同步:
- 如果從節(jié)點(diǎn)與主節(jié)點(diǎn)之間的連接斷開,或者從節(jié)點(diǎn)的數(shù)據(jù)與主節(jié)點(diǎn)不一致(例如,由于網(wǎng)絡(luò)分區(qū)或磁盤故障),從節(jié)點(diǎn)會嘗試重新與主節(jié)點(diǎn)進(jìn)行同步。
- 在重新同步的過程中,從節(jié)點(diǎn)會發(fā)送一個
PSYNC
命令給主節(jié)點(diǎn),請求獲取最新的數(shù)據(jù)。 - 主節(jié)點(diǎn)會根據(jù)從節(jié)點(diǎn)提供的復(fù)制偏移量(replication offset)來決定是進(jìn)行全量復(fù)制還是部分復(fù)制(增量復(fù)制)。
注意
- 復(fù)制偏移量:
- 主從節(jié)點(diǎn)在復(fù)制過程中會維護(hù)一個復(fù)制偏移量,用于記錄已經(jīng)復(fù)制的數(shù)據(jù)位置。
- 復(fù)制偏移量有助于從節(jié)點(diǎn)在重新同步時確定需要從主節(jié)點(diǎn)獲取哪些數(shù)據(jù)。
- 從節(jié)點(diǎn)只讀:
- 默認(rèn)情況下,從節(jié)點(diǎn)是只讀的。這意味著你不能在從節(jié)點(diǎn)上執(zhí)行寫操作(例如,SET命令)。
- 如果需要在從節(jié)點(diǎn)上執(zhí)行寫操作,可以將其配置為可寫模式(但通常不推薦這樣做,因?yàn)檫@可能會破壞數(shù)據(jù)一致性)。
- 延遲問題:
- 由于網(wǎng)絡(luò)延遲和命令傳播時間的影響,從節(jié)點(diǎn)的數(shù)據(jù)可能會比主節(jié)點(diǎn)稍微落后一些。
- 在某些情況下(例如,寫操作非常頻繁時),這種延遲可能會變得比較明顯。
- 故障切換:
- 當(dāng)主節(jié)點(diǎn)出現(xiàn)故障時,需要手動或自動地將一個從節(jié)點(diǎn)提升為主節(jié)點(diǎn)(例如,使用哨兵或集群機(jī)制)。
- 在提升從節(jié)點(diǎn)為主節(jié)點(diǎn)之前,需要確保該從節(jié)點(diǎn)的數(shù)據(jù)與主節(jié)點(diǎn)一致(或者盡可能一致)。
搭建Redis主從復(fù)制
環(huán)境準(zhǔn)備:
- Master節(jié)點(diǎn):192.168.80.10
- Slave1節(jié)點(diǎn):192.168.80.11
- Slave2節(jié)點(diǎn):192.168.80.12
安裝Redis
環(huán)境準(zhǔn)備:
systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i 's/enforcing/disabled/' /etc/selinux/config
修改內(nèi)核參數(shù):
vim /etc/sysctl.conf # 添加以下內(nèi)容 vm.overcommit_memory = 1 net.core.somaxconn = 2048 sysctl -p
安裝Redis:
yum install -y gcc gcc-c++ make tar zxvf /opt/redis-7.0.9.tar.gz -C /opt/ cd /opt/redis-7.0.9 make make PREFIX=/usr/local/redis install
創(chuàng)建Redis工作目錄并設(shè)置用戶:
mkdir /usr/local/redis/{conf,log,data} cp /opt/redis-7.0.9/redis.conf /usr/local/redis/conf/ useradd -M -s /sbin/nologin redis chown -R redis.redis /usr/local/redis/
設(shè)置環(huán)境變量:
vim /etc/profile # 添加以下內(nèi)容 PATH=$PATH:/usr/local/redis/bin source /etc/profile
定義systemd服務(wù)管理腳本:
vim /usr/lib/systemd/system/redis-server.service # 添加以下內(nèi)容 [Unit] Description=Redis Server After=network.target [Service] User=redis Group=redis Type=forking TimeoutSec=0 PIDFile=/usr/local/redis/log/redis_6379.pid ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target
修改Redis配置文件
Master節(jié)點(diǎn)配置:
vim /usr/local/redis/conf/redis.conf # 修改以下內(nèi)容 bind 0.0.0.0 protected-mode no port 6379 daemonize yes pidfile /usr/local/redis/log/redis_6379.pid logfile "/usr/local/redis/log/redis_6379.log" dir /usr/local/redis/data appendonly yes # requirepass abc123 # 可選,設(shè)置redis密碼 systemctl restart redis-server.service
Slave節(jié)點(diǎn)配置:
vim /usr/local/redis/conf/redis.conf # 修改以下內(nèi)容 bind 0.0.0.0 protected-mode no port 6379 daemonize yes pidfile /usr/local/redis/log/redis_6379.pid logfile "/usr/local/redis/log/redis_6379.log" dir /usr/local/redis/data appendonly yes replicaof 192.168.80.10 6379 # masterauth abc123 # 可選,設(shè)置Master節(jié)點(diǎn)的密碼,僅在Master節(jié)點(diǎn)設(shè)置了requirepass systemctl restart redis-server.service
驗(yàn)證主從效果
在Master節(jié)點(diǎn)上看日志:
tail -f /usr/local/redis/log/redis_6379.log # 應(yīng)顯示類似以下內(nèi)容 Replica 192.168.80.11:6379 asks for synchronization Replica 192.168.80.12:6379 asks for synchronization Synchronization with replica 192.168.80.11:6379 succeeded Synchronization with replica 192.168.80.12:6379 succeeded
在Master節(jié)點(diǎn)上驗(yàn)證從節(jié)點(diǎn):
redis-cli info replication # 應(yīng)顯示類似以下內(nèi)容 # Replication role:master connected_slaves:2 slave0:ip=192.168.80.11,port=6379,state=online,offset=1246,lag=0 slave1:ip=192.168.80.12,port=6379,state=online,offset=1246,lag=1
到此這篇關(guān)于Redis主從復(fù)制的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Redis主從復(fù)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis配合SSDB實(shí)現(xiàn)持久化存儲代碼示例
這篇文章主要介紹了Redis配合SSDB實(shí)現(xiàn)持久化存儲代碼示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11Redis中有序集合的內(nèi)部實(shí)現(xiàn)方式的詳細(xì)介紹
本文主要介紹了Redis中有序集合的內(nèi)部實(shí)現(xiàn)方式的詳細(xì)介紹,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03Redis消息隊列、阻塞隊列、延時隊列的實(shí)現(xiàn)
Redis是一種常用的內(nèi)存數(shù)據(jù)庫,它提供了豐富的功能,通常用于數(shù)據(jù)緩存和分布式隊列,本文主要介紹了Redis消息隊列、阻塞隊列、延時隊列的實(shí)現(xiàn),感興趣的可以了解一下2023-11-11redis集群搭建_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了redis集群搭建,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08redis底層數(shù)據(jù)結(jié)構(gòu)之skiplist實(shí)現(xiàn)示例
這篇文章主要為大家介紹了redis底層數(shù)據(jù)結(jié)構(gòu)之skiplist實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12Redis?的內(nèi)存淘汰策略和過期刪除策略的區(qū)別
這篇文章主要介紹了Redis?的內(nèi)存淘汰策略和過期刪除策略的區(qū)別,Redis?是可以對?key?設(shè)置過期時間的,因此需要有相應(yīng)的機(jī)制將已過期的鍵值對刪除,而做這個工作的就是過期鍵值刪除策略2022-07-07