【redis】哨兵模式

Redis主從模式雖然支持數據備份與讀寫分離,但存在三大核心缺陷:1. 故障切換依賴人工(主節點宕機需手動提升從節點);2. 監控能力缺失(無法自動檢測節點異常);3. 腦裂風險(網絡分區可能導致雙主數據沖突)。這些缺陷使得系統可用性難以保障,尤其在分布式場景下隱患顯著。

為此引入Redis哨兵模式:通過獨立部署的哨兵集群(至少3節點)實現:

  • 實時監控:多哨兵協同檢測節點健康狀態
  • 自動故障轉移:主節點宕機時,基于Raft算法選舉新主并同步拓撲
  • 防腦裂機制:客觀下線判斷(需多數哨兵達成共識)避免誤判

哨兵模式將故障恢復時間從人工介入的分鐘級壓縮至秒級,構建了完整的高可用體系。

三大定時監控任務

信息同步任務(10秒/次)

作用:通過INFO命令獲取Redis集群的實時拓撲結構,包括主從節點的角色變化、新增從節點發現等。該任務是哨兵感知集群動態的基礎。

技術實現

  • 每個哨兵節點每10秒向主節點發送INFO命令,主節點返回包含從節點列表的響應
  • 根據響應更新本地拓撲信息,并與從節點建立連接
  • 發現新從節點時,自動將其納入監控范圍

狀態廣播任務(2秒/次)

作用:通過Redis的發布訂閱機制,實現哨兵節點間的狀態同步與協作,具體包括:

  1. 交換節點狀態判斷:廣播當前哨兵對主節點是否下線的判斷結果
  2. 發現新哨兵節點:通過解析__sentinel__:hello頻道的消息,動態加入新哨兵到集群
  3. 觸發Leader選舉:當檢測到主節點異常時,通過消息觸發Raft選舉流程

技術實現

  • 哨兵節點既是發布者(發送自身狀態),也是訂閱者(接收其他哨兵狀態)
  • 使用Redis的PUBLISH/SUBSCRIBE機制,避免直接節點間通信的復雜性

心跳檢測任務(1秒/次)

作用:通過PING命令實現節點存活檢測,觸發主觀下線(SDOWN)判斷流程。

技術實現

  • 每1秒向所有主/從節點及哨兵節點發送PING命令
  • 若節點在down-after-milliseconds(默認30秒)內未響應,標記為主觀下線
  • 當主節點被標記為主觀下線時,啟動客觀下線(ODOWN) 投票

下線流程

Redis Sentinel的下線流程分為主觀下線客觀下線兩個核心階段,最終觸發故障轉移。

主觀下線(SDOWN)

主觀下線:Subjectively Down,簡稱SDOWN。

觸發條件:單個Sentinel節點通過心跳檢測(PING命令)發現主節點或從節點無響應,且超時時間超過配置的down-after-milliseconds閾值(默認30秒)。

技術細節

  • Sentinel每秒向所有主、從節點發送PING命令,若節點在超時時間內未返回有效響應(如PONG),則標記為主觀下線
  • 有效響應包括PONGLOADINGMASTERDOWN;無效響應或無響應則觸發判斷。

特點

  • 僅代表單個Sentinel的局部判斷,可能存在誤判(如網絡抖動)。
  • 從節點被標記為主觀下線后不會觸發后續流程,僅主節點需進入客觀下線階段。

客觀下線(ODOWN)

客觀下線:Objectively Down,簡稱ODOWN。

觸發條件:當足夠數量的Sentinel節點(由quorum參數決定)均認為主節點主觀下線時,主節點被標記為客觀下線,成為故障轉移的觸發條件。

技術細節

  1. 協商機制:首個標記主節點主觀下線的Sentinel會通過SENTINEL is-master-down-by-addr命令向其他Sentinel發起投票請求。
  2. 投票規則:需滿足quorum值(如配置為2,則至少2個Sentinel投票確認主節點下線)。
  3. 防誤判:多數哨兵達成共識可降低因網絡問題導致的誤判概率。

關鍵參數quorum在配置文件中通過sentinel monitor <master> <ip> <port> <quorum>定義,通常建議為哨兵節點數/2 +1

選舉領頭哨兵(Leader Sentinel)

觸發條件:主節點被標記為客觀下線后,Sentinel集群需通過Raft算法選舉一個領頭哨兵來執行故障轉移。

選舉規則

  1. 候選資格:僅發起客觀下線投票的Sentinel可成為候選者。
  2. 投票機制:每個Sentinel僅能投一票(可投給自己或他人)。候選者需同時滿足:獲得半數以上Sentinel的投票和得票數≥quorum值。
  3. 超時重試:若選舉失敗,等待隨機時間后重新發起投票。

is-master-down-by-addr命令說明:

SENTINEL is-master-down-by-addr <ip> <port> <current_epoch> <runid>
  • ip & port:目標主節點地址。
  • current_epoch:當前配置紀元(用于防止舊消息干擾)。
  • runid:
    • runid=*:僅詢問其他哨兵是否同意主節點下線(用于客觀下線判定)。
    • runid=哨兵自身ID:請求其他哨兵投票支持自己成為故障轉移的領導者。

故障轉移流程

執行步驟

  1. 篩選從節點:剔除網絡連接不穩定的從節點(如斷連次數超過down-after-milliseconds*10閾值)。
  2. 打分規則(優先級排序):
  • 第一輪:選擇slave-priority配置值最小的從節點(優先級最高)。
  • 第二輪:選擇復制偏移量(slave_repl_offset)最大的從節點(數據最新)。
  • 第三輪:選擇運行ID(runid)最小的從節點(字典序最小)。
  1. 主從切換
  • 領頭Sentinel向新主節點發送slaveof no one命令。
  • 更新其他從節點指向新主節點,并通知客戶端新拓撲信息。

主從切換成功后,sentinel會在+switch-master頻道發發送主節點切換消息:

$ redis-cli -p 16381 subscribe +switch-master
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "+switch-master"
3) (integer) 1
1) "message"
2) "+switch-master"
3) "mymaster 127.0.0.1 6381 127.0.0.1 6382"

哨兵模式實戰部署

Redis節點規劃如下:

  • Master: 127.0.0.1:6380
  • Slave1: 127.0.0.1:6381(直連Master)
  • Slave2: 127.0.0.1:6382(直連Master)
  • Sentinel1:127.0.0.1:16380
  • Sentinel2:127.0.0.1:16381
  • Sentinel3:127.0.0.1:16382

在/test/目錄分別新建/test/6380、/test/6381、/test/6382三個目錄,用來存放redis的數據文件。然后在/test/目錄分別新建/test/16380、/test/16381、/test/16382三個目錄,用來存放sentinel的數據文件,這三個目錄下都新建redis.conf文件,內容如下:

# /test/16380/redis.conf
port 16380
sentinel monitor mymaster 127.0.0.1 6380 2# /test/16381/redis.conf
port 16381
sentinel monitor mymaster 127.0.0.1 6380 2# /test/16382/redis.conf
port 16382
sentinel monitor mymaster 127.0.0.1 6380 2

三個sentinel數據目錄下的文件內容都差不多,只有端口不一樣,其中mymaster可以為任意的名字,一個sentinel可以對多個集群中的master節點進行監控,最后一個數字2的含義為3個節點中有2個節點(2票)判定master掛了就會開始自動故障轉移。

先啟動Master和2個Slave:

$ redis-server --dir /test/6380 --port 6380$ redis-server --dir /test/6381 --port 6381 --replicaof 127.0.0.1 6380$ redis-server --dir /test/6382 --port 6382 --replicaof 127.0.0.1 6380

然后啟動三臺sentinel(也可以使用單獨的redis-sentinel命令):

$ redis-server /test/16380/redis.conf --sentinel$ redis-server /test/16381/redis.conf --sentinel$ redis-server /test/16382/redis.conf --sentinel

從Sentinel1的日志中能發現,它能根據Master節點找到2個Slave,以及其他兩個Sentinel:

4922:X 16 Apr 2025 16:31:46.120 # Sentinel ID is ddb55a52514d296a3dca1123cfceaa309c134267
4922:X 16 Apr 2025 16:31:46.120 # +monitor master mymaster 127.0.0.1 6380 quorum 2
4922:X 16 Apr 2025 16:31:46.121 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
4922:X 16 Apr 2025 16:31:46.124 * +slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
4922:X 16 Apr 2025 16:31:51.117 * +sentinel sentinel 9cc17be7b7e700d2800751113c5b0dad0944650f 127.0.0.1 16381 @ mymaster 127.0.0.1 6380
4922:X 16 Apr 2025 16:31:53.329 * +sentinel sentinel 950c560895d65451db8b65ebc0a418feef21ba82 127.0.0.1 16382 @ mymaster 127.0.0.1 6380

Sentinel可以通過向Master發送info命令來找到其他Slave:

$ redis-cli -p 6380 info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=5399,lag=0
slave1:ip=127.0.0.1,port=6382,state=online,offset=5399,lag=0
master_failover_state:no-failover
master_replid:1eeb77e6f1d2ca889541314746796ccb6efa4404
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:5399
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:5399

Sentinel是怎么找到其他Sentinel的呢,原來他們都在主節點和所有的從節點上訂閱了同一個頻道,并將自己的信息發送到頻道中,像一個聊天窗口一樣,可以使用下面的命令來查看他們的聊天內容:

$ redis-cli -p 6380 subscribe __sentinel__:hello
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "__sentinel__:hello"
3) (integer) 1
1) "message"
2) "__sentinel__:hello"
3) "127.0.0.1,16381,9cc17be7b7e700d2800751113c5b0dad0944650f,0,mymaster,127.0.0.1,6380,0"
1) "message"
2) "__sentinel__:hello"
3) "127.0.0.1,16382,950c560895d65451db8b65ebc0a418feef21ba82,0,mymaster,127.0.0.1,6380,0"
1) "message"
2) "__sentinel__:hello"
3) "127.0.0.1,16380,ddb55a52514d296a3dca1123cfceaa309c134267,0,mymaster,127.0.0.1,6380,0"
...

現在關閉Master節點,過了大概30s(由參數down-after-milliseconds決定),6381就稱為了master節點,可以從Sentinel的日志中查看自動故障轉移的大概過程。

Sentinel1:

4922:X 16 Apr 2025 16:34:02.955 # +sdown master mymaster 127.0.0.1 6380
4922:X 16 Apr 2025 16:34:03.043 # +new-epoch 1
4922:X 16 Apr 2025 16:34:03.051 # +vote-for-leader 950c560895d65451db8b65ebc0a418feef21ba82 1
4922:X 16 Apr 2025 16:34:03.680 # +config-update-from sentinel 950c560895d65451db8b65ebc0a418feef21ba82 127.0.0.1 16382 @ mymaster 127.0.0.1 6380
4922:X 16 Apr 2025 16:34:03.680 # +switch-master mymaster 127.0.0.1 6380 127.0.0.1 6381
4922:X 16 Apr 2025 16:34:03.680 * +slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6381
4922:X 16 Apr 2025 16:34:03.681 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
4922:X 16 Apr 2025 16:34:33.756 # +sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381

Sentinel2:

4927:X 16 Apr 2025 16:34:02.996 # +sdown master mymaster 127.0.0.1 6380
4927:X 16 Apr 2025 16:34:03.042 # +new-epoch 1
4927:X 16 Apr 2025 16:34:03.050 # +vote-for-leader 950c560895d65451db8b65ebc0a418feef21ba82 1
4927:X 16 Apr 2025 16:34:03.068 # +odown master mymaster 127.0.0.1 6380 #quorum 3/2
4927:X 16 Apr 2025 16:34:03.068 # Next failover delay: I will not start a failover before Wed Apr 16 16:40:03 2025
4927:X 16 Apr 2025 16:34:03.680 # +config-update-from sentinel 950c560895d65451db8b65ebc0a418feef21ba82 127.0.0.1 16382 @ mymaster 127.0.0.1 6380
4927:X 16 Apr 2025 16:34:03.680 # +switch-master mymaster 127.0.0.1 6380 127.0.0.1 6381
4927:X 16 Apr 2025 16:34:03.680 * +slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6381
4927:X 16 Apr 2025 16:34:03.680 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
4927:X 16 Apr 2025 16:34:33.739 # +sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381

Sentinel3:

4932:X 16 Apr 2025 16:34:02.959 # +sdown master mymaster 127.0.0.1 6380
4932:X 16 Apr 2025 16:34:03.022 # +odown master mymaster 127.0.0.1 6380 #quorum 2/2
4932:X 16 Apr 2025 16:34:03.022 # +new-epoch 1
4932:X 16 Apr 2025 16:34:03.022 # +try-failover master mymaster 127.0.0.1 6380
4932:X 16 Apr 2025 16:34:03.037 # +vote-for-leader 950c560895d65451db8b65ebc0a418feef21ba82 1
4932:X 16 Apr 2025 16:34:03.050 # 9cc17be7b7e700d2800751113c5b0dad0944650f voted for 950c560895d65451db8b65ebc0a418feef21ba82 1
4932:X 16 Apr 2025 16:34:03.052 # ddb55a52514d296a3dca1123cfceaa309c134267 voted for 950c560895d65451db8b65ebc0a418feef21ba82 1
4932:X 16 Apr 2025 16:34:03.104 # +elected-leader master mymaster 127.0.0.1 6380
4932:X 16 Apr 2025 16:34:03.105 # +failover-state-select-slave master mymaster 127.0.0.1 6380
4932:X 16 Apr 2025 16:34:03.158 # +selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
4932:X 16 Apr 2025 16:34:03.158 * +failover-state-send-slaveof-noone slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
4932:X 16 Apr 2025 16:34:03.216 * +failover-state-wait-promotion slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
4932:X 16 Apr 2025 16:34:03.625 # +promoted-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
4932:X 16 Apr 2025 16:34:03.625 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6380
4932:X 16 Apr 2025 16:34:03.680 * +slave-reconf-sent slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
4932:X 16 Apr 2025 16:34:04.173 # -odown master mymaster 127.0.0.1 6380
4932:X 16 Apr 2025 16:34:04.686 * +slave-reconf-inprog slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
4932:X 16 Apr 2025 16:34:04.686 * +slave-reconf-done slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
4932:X 16 Apr 2025 16:34:04.738 # +failover-end master mymaster 127.0.0.1 6380
4932:X 16 Apr 2025 16:34:04.738 # +switch-master mymaster 127.0.0.1 6380 127.0.0.1 6381
4932:X 16 Apr 2025 16:34:04.738 * +slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6381
4932:X 16 Apr 2025 16:34:04.738 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
4932:X 16 Apr 2025 16:34:34.752 # +sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381

再去看一下sentinel的數據目錄的redis.conf文件的內容(sentinel會自動更新配置文件):

$ cat /test/16380/redis.conf
port 16380
sentinel monitor mymaster 127.0.0.1 6381 2
# Generated by CONFIG REWRITE
protected-mode no
user default on nopass ~* &* +@all
dir "/test"
sentinel myid ddb55a52514d296a3dca1123cfceaa309c134267
sentinel config-epoch mymaster 1
sentinel leader-epoch mymaster 1
sentinel current-epoch 1
sentinel known-replica mymaster 127.0.0.1 6380
sentinel known-replica mymaster 127.0.0.1 6382
sentinel known-sentinel mymaster 127.0.0.1 16381 9cc17be7b7e700d2800751113c5b0dad0944650f
sentinel known-sentinel mymaster 127.0.0.1 16382 950c560895d65451db8b65ebc0a418feef21ba82

最后再啟動原來關閉的Master節點,它會被sentinel監控到,然后成為6381的從節點。

關鍵配置參數說明

# 定義哨兵監控的主節點信息。
# quorum:觸發主節點客觀下線(ODOWN)所需的最小哨兵投票數。
# quorum通常設置為哨兵節點數的一半加一(如3哨兵時設為2),避免誤判。
sentinel monitor <master-name> <ip> <port> <quorum># 定義節點無響應多久后被標記為主觀下線(SDOWN)
sentinel down-after-milliseconds <master-name> <ms># 故障轉移后,允許同時從新主節點同步數據的從節點數量。 
sentinel parallel-syncs <master-name> <num># 定義故障轉移各階段的最大超時時間
sentinel failover-timeout <master-name> <ms># 設置連接主節點和從節點的密碼
sentinel auth-pass <master-name> <password># 在NAT或Docker環境中,指定哨兵對外通信的IP和端口
sentinel announce-ip <ip>
sentinel announce-port <port> # 顯式聲明從節點地址,避免自動發現延遲
sentinel known-replica <master-name> <ip> <port># 定義故障事件觸發的報警腳本路徑
sentinel notification-script <master-name> <script-path>

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

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

相關文章

Spark-Streaming

找出所有有效數據&#xff0c;要求電話號碼為11位&#xff0c;但只要列中沒有空值就算有效數據。 按地址分類&#xff0c;輸出條數最多的前20個地址及其數據。 代碼講解&#xff1a; 導包和聲明對象&#xff0c;設置Spark配置對象和SparkContext對象。 使用Spark SQL語言進行數…

Sentinel源碼—9.限流算法的實現對比一

大綱 1.漏桶算法的實現對比 (1)普通思路的漏桶算法實現 (2)節省線程的漏桶算法實現 (3)Sentinel中的漏桶算法實現 (4)Sentinel中的漏桶算法與普通漏桶算法的區別 (5)Sentinel中的漏桶算法存在的問題 2.令牌桶算法的實現對比 (1)普通思路的令牌桶算法實現 (2)節省線程的…

Redis 詳解:安裝、數據類型、事務、配置、持久化、訂閱/發布、主從復制、哨兵機制、緩存

目錄 Redis 安裝與數據類型 安裝指南 Windows Linux 性能測試 基本知識 數據類型 String List&#xff08;雙向列表&#xff09; Set&#xff08;集合&#xff09; Hash&#xff08;哈希&#xff09; Zset&#xff08;有序集合&#xff09; 高級功能 地理位置&am…

Docker配置帶證書的遠程訪問監聽

一、生成證書和密鑰 1、準備證書目錄和生成CA證書 # 創建證書目錄 mkdir -p /etc/docker/tls cd /etc/docker/tls # 生成CA密鑰和證書 openssl req -x509 -newkey rsa:4096 -keyout ca-key.pem \ -out ca-cert.pem -days 365 -nodes -subj "/CNDocker CA" 2、為…

MCP接入方式介紹

上一篇文章&#xff0c;我們介紹了MCP是什么以及MCP的使用。 MCP是什么&#xff0c;MCP的使用 接下來&#xff0c;我們來詳細介紹一下MCP的接入 先看官網的架構圖 上圖的MCP 服務 A、MCP 服務 B、MCP 服務 C是可以運行在你的本地計算機&#xff08;本地服務器方式&#xff…

關于Agent的簡單構建和分享

前言&#xff1a;Agent 具備自主性、環境感知能力和決策執行能力&#xff0c;能夠根據環境的變化自動調整行為&#xff0c;以實現特定的目標。 一、Agent 的原理 Agent(智能體)被提出時&#xff0c;具有四大能力 感知、分析、決策和執行。是一種能夠在特定環境中自主行動、感…

Gitlab runner 安裝和注冊

Gitlab Runner GitLab Runner是一個用于運行GitLab CI/CD流水線作業的軟件包&#xff0c;由GitLab官方開發&#xff0c;完全開源。你可以在很多主流的系統環境或平臺上安裝它&#xff0c;如Linux、macOS、Windows和Kubernetes。如果你熟悉Jenkins 的話&#xff0c;你可以把它…

精益數據分析(18/126):權衡數據運用,精準把握創業方向

精益數據分析&#xff08;18/126&#xff09;&#xff1a;權衡數據運用&#xff0c;精準把握創業方向 大家好&#xff01;一直以來&#xff0c;我都希望能和大家在創業與數據分析的領域共同探索、共同進步。今天&#xff0c;我們繼續深入研讀《精益數據分析》&#xff0c;探討…

Git技術詳解:從核心原理到實際應用

Git技術詳解&#xff1a;從核心原理到實際應用 一、Git的本質與核心價值 Git是由Linux之父Linus Torvalds在2005年開發的分布式版本控制系統&#xff0c;其核心功能是通過記錄文件變更歷史&#xff0c;幫助開發者實現以下目標&#xff1a; 版本回溯&#xff1a;隨時恢復到項…

Java從入門到“放棄”(精通)之旅——String類⑩

Java從入門到“放棄”&#xff08;精通&#xff09;之旅&#x1f680;——String類⑩ 前言 在Java編程中&#xff0c;String類是最常用也是最重要的類之一。無論是日常開發還是面試&#xff0c;對String類的深入理解都是必不可少的。 1. String類的重要性 在C語言中&#xf…

抓取淘寶數據RPA--影刀

最近用了一下RPA軟件&#xff0c;挑了影刀&#xff0c;發現很無腦也很簡單&#xff0c;其語法大概是JAVA和PYTHON的混合體&#xff0c;如果懂爬蟲的話&#xff0c;學這個軟件就快的很&#xff0c;看了一下官方的教程&#xff0c;對于有基礎的人來說很有點枯燥&#xff0c;但又不…

docker部署seafile修改默認端口并安裝配置onlyoffice實現在線編輯

背景 有很多場景會用到類似seafile功能的需求&#xff0c;比如&#xff1a; 在內網中傳輸和共享文件個人部署私人網盤文檔協同在線編輯寫筆記… 這些功能seafile均有實現&#xff0c;并且社區版提供的功能基本可以滿足個人或者小型團隊的日常需求 問題 由于主機的80和443端…

計算機視覺cv2入門之視頻處理

在我們進行計算機視覺任務時&#xff0c;經常會對視頻中的圖像進行操作&#xff0c;這里我來給大家分享一下&#xff0c;cv2對視頻文件的操作方法。這里我們主要介紹cv2.VideoCapture函數的基本使用方法。 cv2.VideoCapture函數 當我們在使用cv2.VideoCapture函數時&#xff…

Linux之徹底掌握防火墻-----安全管理詳解

—— 小 峰 編 程 目錄&#xff1a; 一、防火墻作用 二、防火墻分類 1、邏輯上劃分&#xff1a;大體分為 主機防火墻 和 網絡防火墻 2、物理上劃分&#xff1a; 硬件防火墻 和 軟件防火墻 三、硬件防火墻 四、軟件防火墻 五、iptables 1、iptables的介紹 2、netfilter/…

python項目實戰-后端個人博客系統

本文分享一個基于 Flask 框架開發的個人博客系統后端項目&#xff0c;涵蓋用戶注冊登錄、文章發布、分類管理、評論功能等核心模塊。適合初學者學習和中小型博客系統開發。 一、項目結構 blog │ app.py │ forms.py │ models.py │ ├───instance │ blog.d…

Unity 接入阿里的全模態大模型Qwen2.5-Omni

1 參考 根據B站up主陰沉的怪咖 開源的項目的基礎上修改接入 AI二次元老婆開源項目地址(unity-AI-Chat-Toolkit): Github地址&#xff1a;https://github.com/zhangliwei7758/unity-AI-Chat-Toolkit Gitee地址&#xff1a;https://gitee.com/DammonSpace/unity-ai-chat-too…

第十五屆藍橋杯 2024 C/C++組 合法密碼

目錄 題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; 思路&#xff1a; substr函數&#xff1a; 思路詳解&#xff1a; 代碼&#xff1a; 代碼詳解; 題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; P10906 [藍橋杯 2024 國 B] 合法密碼 -…

NoSQL 簡單講解

目錄 1. NoSQL 的背景與意義 1.1 數據庫的演變 1.2 NoSQL 的興起 2. NoSQL 數據庫的分類 2.1 鍵值存儲&#xff08;Key-Value Stores&#xff09; 2.2 文檔數據庫&#xff08;Document Stores&#xff09; 2.3 列族存儲&#xff08;Column-Family Stores&#xff09; 2.…

122.在 Vue3 中使用 OpenLayers 實現圖層層級控制(zIndex)顯示與設置詳解

?? 作者:彭麒 ?? 郵箱:1062470959@qq.com ?? 聲明:本文源碼歸吉檀迦俐所有,歡迎學習借鑒,如用于商業項目請注明出處 ?? ?? 技術棧:Vue 3 + Composition API + OpenLayers 6+ + Element Plus + Tailwind CSS ?? 一、什么是 zIndex(圖層層級)? 在地圖開發中…

車載測試用例開發-如何平衡用例覆蓋度和測試效率的方法論

1 摘要 在進行車載測試用例編寫時&#xff0c;會遇到多個條件導致用例排列組合爆炸的情況&#xff0c;但是為了產品測試質量&#xff0c;我們又不得不保證用例設計的需求覆蓋度&#xff0c;這樣又會使得測試周期非常長。我們如何平衡效率和測試質量&#xff1f;本文進行了一些…