Redis05-進階-主從

零、文章目錄

Redis05-進階-主從

1、搭建主從架構

(1)概述
  • 單節點Redis的并發能力是有上限的,要進一步提高Redis的并發能力,就需要搭建主從集群,實現讀寫分離。

(2)集群概況
  • 我們搭建的主從集群共包含三個節點,一個主節點,兩個從節點。操作系統是 CentOS7.9。
  • 這里我們會在同一臺虛擬機中開啟3個redis實例,模擬主從集群,信息如下:
IP配置文件路徑PORT角色
192.168.119.171/etc/redis/7001/redis.conf7001master
192.168.119.171/etc/redis/7002/redis.conf7002slave
192.168.119.171/etc/redis/7003/redis.conf7003slave
(3)準備實例配置
  • **創建目錄:**要在同一臺虛擬機開啟3個實例,必須準備三份不同的配置文件和目錄,配置文件所在目錄也就是工作目錄。我們創建三個文件夾,名字分別叫7001、7002、7003。
# 進入/tmp目錄
cd /etc/redis/
# 創建目錄
mkdir 7001 7002 7003
  • 配置文件/etc/redis/7001/redis.conf 配置如下,這個是 master 節點的配置
# 允許所有 IP 連接
bind 0.0.0.0# 關閉保護模式 
protected-mode no# 以守護進程啟動
daemonize yes# 開啟RDB
# save ""
save 3600 1
save 300 100
save 60 10000# 關閉AOF
appendonly no# redis實例的聲明 IP
replica-announce-ip 192.168.119.171# 端口改成7001
port 7001
# rdb文件存儲路徑改成當前路徑
dir /etc/redis/7001/
  • 配置文件/etc/redis/7002/redis.conf 配置如下,這個是 slave 節點的配置
# 允許所有 IP 連接
bind 0.0.0.0# 關閉保護模式 
protected-mode no# 以守護進程啟動
daemonize yes# 開啟RDB
# save ""
save 3600 1
save 300 100
save 60 10000# 關閉AOF
appendonly no# redis實例的聲明 IP
replica-announce-ip 192.168.119.171# 端口改成7002
port 7002
# rdb文件存儲路徑改成當前路徑
dir /etc/redis/7002/# 開啟主從關系
slaveof 192.168.119.171 7001
  • 配置文件/etc/redis/7003/redis.conf 配置如下,這個是 slave 節點的配置
# 允許所有 IP 連接
bind 0.0.0.0# 關閉保護模式 
protected-mode no# 以守護進程啟動
daemonize yes# 開啟RDB
# save ""
save 3600 1
save 300 100
save 60 10000# 關閉AOF
appendonly no# redis實例的聲明 IP
replica-announce-ip 192.168.119.171# 端口改成7003
port 7003
# rdb文件存儲路徑改成當前路徑
dir /etc/redis/7003/# 開啟主從關系
slaveof 192.168.119.171 7001
  • 配置說明:
    • **持久化配置:**持久化模式改為默認的RDB模式,AOF保持關閉狀態。
    • 修改**bind**** 參數:** bind 0.0.0.0 允許所有 IP 連接。
    • **修改實例的聲明IP:**虛擬機本身有多個IP,為了避免混亂,我們需要指定每一個實例的 IP 信息。
    • **修改每個實例的端口、工作目錄:**修改每個文件夾內的配置文件,將端口分別修改為7001、7002、7003,將rdb文件保存位置都修改為自己所在目錄。
    • **為每個slave 節點開啟主從關系:**slaveof 192.168.119.171 7001
(4)啟動實例
  • 防止端口的問題,先將防火墻關閉
# 關閉防火墻
sudo systemctl stop firewalld
# 關閉防火墻開機啟動
sudo systemctl disable firewalld
  • 我們打開3個ssh窗口,分別啟動3個redis實例,啟動命令:
# 第1個
redis-server /etc/redis/7001/redis.conf
# 第2個
redis-server /etc/redis/7002/redis.conf
# 第3個
redis-server /etc/redis/7003/redis.conf
  • 如果要一鍵停止,可以運行下面命令:
printf '%s\n' 7001 7002 7003 | xargs -I{} -t redis-cli -p {} shutdown
(5)開啟主從關系
  • 要配置主從可以使用replicaof 或者slaveof(5.0以前)命令。
  • 有臨時和永久兩種模式:
    • 永久:修改配置文件,在redis.conf中添加一行配置:slaveof <masterip> <masterport>
    • 臨時:使用redis-cli客戶端連接到redis服務,執行slaveof命令(重啟后失效)。
    • 注意:在5.0以后新增命令replicaof,與salveof效果一致。
  • 上面已經用配置文件實現了主從關系,現在演示命令方式。
# 連接 7002
redis-cli -p 7002
# 執行slaveof
slaveof 192.168.119.171 7001# 連接 7003
redis-cli -p 7003
# 執行slaveof
slaveof 192.168.119.171 7001# 連接 7001
redis-cli -p 7001
# 查看狀態
info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.119.171,port=7002,state=online,offset=56,lag=1
slave1:ip=192.168.119.171,port=7003,state=online,offset=56,lag=1
master_failover_state:no-failover
master_replid:9416e12727f8b889f6293c3eedcb9f07de1670d6
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:56
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:56
(6)測試
  • 利用redis-cli連接7001,執行set num 123
  • 利用redis-cli連接7002,執行get num,再執行set num 666
127.0.0.1:7002> get num
"123"
127.0.0.1:7002> set num 666
(error) READONLY You can't write against a read only replica.
  • 利用redis-cli連接7003,執行get num,再執行set num 888
127.0.0.1:7003> get num
"123"
127.0.0.1:7003> set num 888
(error) READONLY You can't write against a read only replica.
  • 可以發現,只有在7001這個master節點上可以執行寫操作,7002和7003這兩個slave節點只能執行讀操作。
(7)設置開機啟動
  • 為了使 Redis 在系統啟動時自動運行,可以創建一個 systemd 服務文件:
# master節點服務文件
vi /etc/systemd/system/redismaster.service[Unit]
Description=redismaster
After=network.target[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /tmp/7001/redis.conf
PrivateTmp=true[Install]
WantedBy=multi-user.target
  • 保存并退出后,重新加載 systemd 配置:
systemctl daemon-reload
  • 可以用下面這組命令來操作redis:
# 啟動
systemctl start redismaster
# 停止
systemctl stop redismaster
# 重啟
systemctl restart redismaster
# 查看狀態
systemctl status redismaster
# 開機自啟
systemctl enable redismaster
  • 同樣配置 redisslave01 節點
# slave01節點服務文件
vi /etc/systemd/system/redisslave01.service[Unit]
Description=redisslave01
After=network.target[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /tmp/7002/redis.conf
PrivateTmp=true[Install]
WantedBy=multi-user.target
  • 同樣配置 redisslave02 節點
# slave02節點服務文件
vi /etc/systemd/system/redisslave02.service[Unit]
Description=redisslave02
After=network.target[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /tmp/7003/redis.conf
PrivateTmp=true[Install]
WantedBy=multi-user.target

2、數據同步原理

(1)主從第一次執行全量同步
  • slave節點請求增量同步
  • master節點判斷replid,發現不一致,拒絕增量同步
  • master將完整內存數據生成RDB,發送RDB到slave
  • slave清空本地數據,加載master的RDB
  • master將RDB期間的命令記錄在repl_baklog,并持續將log中的命令發送給slave
  • slave執行接收到的命令,保持與master之間的同步

(2)如何判斷是第一次同步數據
  • Replication Id:簡稱replid,是數據集的標記,id一致則說明是同一數據集。每一個master都有唯一的replid,slave則會繼承master節點的replid
  • offset:偏移量,隨著記錄在repl_baklog中的數據增多而逐漸增大。slave完成同步時也會記錄當前同步的offset。如果slave的offset小于master的offset,說明slave數據落后于master,需要更新。
  • 因此slave做數據同步,必須向master聲明自己的replication id 和offset,master才可以判斷到底需要同步哪些數據。
(3)slave重啟后執行增量同步

  • repl_baklog大小有上限,寫滿后會覆蓋最早的數據。如果slave斷開時間過久,導致尚未備份的數據被覆蓋,則無法基于log做增量同步,只能再次全量同步。
(4)主從集群優化
  • 在master中配置repl-diskless-sync yes啟用無磁盤復制,避免全量同步時的磁盤IO。
  • Redis單節點上的內存占用不要太大,減少RDB導致的過多磁盤IO
  • 適當提高repl_baklog的大小,發現slave宕機時盡快實現故障恢復,盡可能避免全量同步
  • 限制一個master上的slave節點數量,如果實在是太多slave,則可以采用主-從-從鏈式結構,減少master壓力

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81200.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81200.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81200.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

小結:ipsec-ike

IPSec 手動配置與自動配置&#xff08;IKE動態協商&#xff09; 手動配置IPSec 邏輯圖 #mermaid-svg-eNMnNEwnoTjF8fkV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-eNMnNEwnoTjF8fkV .error-icon{fill:#552222;}…

瀟灑郎: 100% 成功搭建Docker私有鏡像倉庫并管理、刪除鏡像

1、Registry Web管理界面 2、拉取Registry-Web鏡像 創建配置文件 tee /opt/zwx-registry/web-config.yml <<-EOF registry:url: http://172.28.73.90:8010/v2name: registryreadonly: falseauth:enabled: false EOF 拉取docker-registry-web鏡像并綁定Registry倉庫 …

《機器學習中的過擬合與模型復雜性:理解與應對策略》

《機器學習中的過擬合與模型復雜性&#xff1a;理解與應對策略》 摘要 在機器學習中&#xff0c;過擬合是模型在訓練數據上表現良好但在新數據上泛化能力差的現象。本文深入探討了過擬合與模型復雜性之間的關系&#xff0c;分析了復雜模型導致過擬合的原因&#xff0c;并介紹…

linux中sigint和sigterm的區別

SIGINT 和 SIGTERM 是在 Unix 及類 Unix 系統&#xff08;包括 Linux&#xff09;中用于進程間通信的信號&#xff0c;它們都可以用于請求進程終止&#xff0c;區別如下&#xff1a; 1、信號編號與定義 在信號機制里&#xff0c;每個信號都有對應的編號&#xff0c;這便于系統…

一套SaaS ERP管理系統源碼,支持項目二開商用,SpringBoot+Vue+ElementUI+UniAPP

ERP管理系統源碼&#xff0c;一款適用于小微企業的SaaS ERP管理系統源碼, 采用最新的技術棧開發(SpringBootVueElementUIUniAPP)&#xff0c;讓企業簡單上云。 專注于小微企業的應用需求&#xff0c;如企業基本的進銷存、詢價&#xff0c;報價, 采購、銷售、MRP生產制造、品質…

2025 新生 DL-FWI 培訓

摘要: 本貼給出 8 次討論式培訓的提綱, 每次培訓 1 小時. 1. Basic concepts 主動學習: 提問, 理解, 繼續追問. 通過不斷迭代, 逐步提升問題的質量, 加深理解. 1.1 Seismic exploration 問 DeepSeek (下同): 為什么進行地震勘探? 問: 地震勘探一般的深度是多少? 1.2 Sesmi…

mac電腦pytest生成測試報告

時隔了好久再寫代碼&#xff0c;感覺我之前的積累都白費了&#xff0c;全部忘記了&#xff0c;看來每一步都有記錄對于我來說才是最好的。 最近又要重新搞接口自動化&#xff0c;然而是在mac電腦&#xff0c;對于我長期使用windows的人來說真的是個考驗&#xff0c;對此次過程…

神經輻射場(NeRF)技術解析:3D重建與虛擬世界的未來

神經輻射場&#xff08;NeRF&#xff09;技術解析&#xff1a;3D重建與虛擬世界的未來 ——從算法突破到元宇宙基礎設施的演進之路 摘要 本文通過算法演進圖譜、訓練流程解析、PyTorch代碼實戰及產業應用洞察&#xff0c;構建從學術創新到工程落地的完整技術框架。實驗數據顯…

ES搜索知識

GET /categories/1/10?name手機 // 按名稱過濾 GET /categories/1/10?type電子產品 // 按類型過濾 GET /categories/1/10?name手機&type電子產品 // 組合過濾 查詢參數 ApiOperation(value "獲取商品分類分頁列表")GetMapping("{page}/{limit}")…

【Docker】Docker拉取部分常用中間件

一、拉取MySQL 這里以Docker拉取MySQL5.7為例 #拉取鏡像 docker pull mysql:5.7 docker run -d --name oj-mysql -p 3306:3306 -e "TZAsia/Shanghai" -e "MYSQL_ROOT_PASSWORD123456" mysql:5.7 -e 參數用于設置容器內的環境變量。TZ 是用于設置時區的環…

在 Ubuntu 上離線安裝 ClickHouse

在 Ubuntu 上離線安裝 ClickHouse 的步驟如下: 一.安裝驗證 # 檢查服務狀態 sudo systemctl status clickhouse-server #刪除默認文件 sudo rm /etc/clickhouse-server/users.d/default-password.xml # 使用客戶端連接 clickhouse-client --password

Linux 部署以paddle Serving 的方式部署 PaddleOCR CPU版本

強烈建議您在Docker內構建Paddle Serving&#xff0c;更多鏡像請查看Docker鏡像列表。 提示-1&#xff1a;Paddle Serving項目僅支持Python3.6/3.7/3.8/3.9&#xff0c;接下來所有的與Python/Pip相關的操作都需要選擇正確的Python版本。 提示-2&#xff1a;以下示例中GPU環境均…

AOSP Android14 Launcher3——Launcher的狀態介紹LauncherState類

Launcher3中有一個跟Launcher狀態相關的類&#xff0c;叫LauncherState LauncherState 是 Launcher3 中定義各種用戶界面狀態的抽象基類。你可以把它想象成一個狀態機&#xff0c;定義了 Launcher 可能處于的不同視覺和交互模式&#xff0c;例如主屏幕、所有應用列表、最近任務…

鴻蒙NEXT開發動畫(方塊動畫旋轉)

1.創建空白項目 2.Page文件夾下面新建Spin.ets文件&#xff0c;代碼如下&#xff1a; /*** SpinKit 風格的旋轉加載動畫組件。** component* param spinSize - 動畫容器大小&#xff08;必須為正數&#xff09;* param spinColor - 動畫顏色&#xff08;支持資源引用&#xf…

深入解析Java架構師面試:從核心技術到AI應用

深入解析Java架構師面試&#xff1a;從核心技術到AI應用 在互聯網大廠的Java求職者面試中&#xff0c;技術深度和項目經驗是成功的關鍵。本文以嚴肅的面試官與資深Java架構師馬架構&#xff08;擁有十年研發及架構設計經驗&#xff09;之間的對話為背景&#xff0c;詳細展示了…

Qt窗口關閉特效:自底而上逐漸消失

廢話不多說&#xff0c;直接上代碼&#xff1a; 構造函數&#xff1a; MyWidget(QWidget *parent nullptr) {// 設置窗口屬性&#xff1a;支持透明背景setAttribute(Qt::WA_TranslucentBackground);// 移除窗口邊框setWindowFlags(Qt::FramelessWindowHint);} closeEvent函數…

AI對IT行業的重塑:挑戰與機遇并存的技術革命

一、必要性&#xff1a;AI成為IT行業的基礎設施 在云計算、大數據和物聯網構成的數字生態中&#xff0c;AI技術已成為IT行業的"水電煤"。以微軟Azure為例&#xff0c;其AI云服務支撐著全球超過85%的《財富》500強企業&#xff0c;通過機器學習模型自動優化服務器集群…

[論文梳理] 足式機器人規劃控制流程 - 接觸碰撞的控制 - 模型誤差 - 自動駕駛車的安全合規(4個課堂討論問題)

目錄 問題 1&#xff1a;足式機器人運動規劃 & 控制的典型流程 (pipline) 1.1 問題 1.2 目標 1.3 典型流程&#xff08;Pipeline&#xff09; 1.3.1 環境感知&#xff08;Perception&#xff09; 1.3.2 高層規劃&#xff08;High-Level Planning&#xff09; 1.3.3 …

阿里云短信接入實現示例

1&#xff09;構建Springboot項目 2) 添加依賴 <!--阿里云短信--> <dependency><groupId>com.aliyun</groupId><artifactId>alibabacloud-dysmsapi20170525</artifactId><version>3.0.0</version> </dependency><…

邏輯回歸之參數選擇:從理論到實踐

一、邏輯回歸概述 邏輯回歸雖然名字中帶有“回歸”&#xff0c;但它是一種用于處理二分類或多分類問題的算法。其核心思想是通過構建一個線性模型&#xff0c;將輸入特征進行線性組合&#xff0c;再利用邏輯函數&#xff08;如Sigmoid函數&#xff09;將線性組合的結果映射到0…