分布式專題——1.1 Redis單機、主從、哨兵、集群部署

1 Redis 部署

  • 下面演示在 Linux 環境下部署 Redis7。

1.1 單機部署

1.1.1 檢查安裝 gcc 環境

  • Redis 是由 C 語言編寫的,它的運行需要 C 環境,因此我們需要先安裝 gcc;

    # 關閉防?墻
    systemctl stop firewalld.service
    # 查看防火墻狀態
    firewall-cmd --state
    # 卸載防?墻
    yum remove firewalld
    # 檢查版本
    gcc --version
    # 安裝 gcc
    yum install gcc
    

    在這里插入圖片描述

1.1.2 下載安裝 Redis

# 安裝應?養成良好習慣,?件歸類
mkdir -p /opt/software/redis# 進?redis?件夾,使?wget下載
cd /opt/software/redis
wget https://download.redis.io/redis-stable.tar.gz# 解壓下載的redis包
tar -xzf redis-stable.tar.gz
# 進?redis-stable?錄
cd redis-stable
# 使? make install 編譯并安裝
make install
# 安裝完成后 /usr/local/bin 會?成相應的服務,檢查是否成功?成
ll /usr/local/bin

在這里插入圖片描述

  • redis-benchmark:性能測試?具
  • redis-check-aof:修復有問題的 AOF 文件
  • redis-check-rdb:修復有問題的 RDB 文件
  • redis-sentinel:Redis 集群使用
  • redis-server:Redis 服務器啟動命令
  • redis-cli:客戶端,操作入口

1.1.3 啟動 Redis

  • 接下來就可以用/opt/software/redis/redis-stable/src/usr/local/bin目錄下的redis-server啟動 Redis 服務了:

    # Redis 源碼路徑下啟動
    ./src/redis-server
    # 或者在 usr/local/bin 路徑下啟動
    redis-server
    

    在這里插入圖片描述

1.1.4 配置 Redis

  • 前面的啟動方式無法再后臺運行,退出之后會直接關閉 Redis 服務,所以還需要針對 Redis 做一些設置:

    # 修改當前?錄下的 reids.conf ?件
    vim redis.conf
    
    • 如果使用vim指令打開后沒有行號,可以在打開后輸入:set number
  • 需要修改的內容如下:

    # 87?,修改bin,* -::*表示?持遠程連接
    bind * -::*
    # 309?,開啟守護進程,后臺運?
    daemonize yes
    # 355?,指定?志?件?錄
    logfile /opt/software/redis/redis-stable/redis.log
    # 510?,指定?作?錄
    dir /opt/software/redis
    # 1044?,給默認?戶設置密碼,主要是使? redis-cli 連接 redis-server 時,需要通過密碼校驗
    requirepass 13shi@San
    # 111?,允許遠程連接 如果不設置密碼必須將此設置關閉
    protected-mode no
    
  • 修改完成后,使用配置文件啟動 Redis,并使用redis-cli指令測試連接,由于在配置文件中配置了安全密碼,所以連接后需要先驗證密碼,否則會報錯;

    redis-server redis.conf
    redis-cli
    auth 13shi@San
    

1.1.5 退出或關閉 Redis

# 退出Redis
quit
# 關閉Redis
redis-cli shutdown

1.2 主從部署(Master-Slave Replication)

1.2.1 簡介

  • 主從復制,是指將?臺 Redis 服務器的數據,復制到其他的 Redis 服務器;

    • 前者稱為主節點(Master),后者稱為從節點(Slave);
    • 數據的復制是單向的,只能由主節點到從節點;
    • ?個主節點可以有多個從節點(或沒有從節點),但?個從節點只能有?個主節點;

    在這里插入圖片描述

  • 作用:

    • 數據冗余:主從復制實現了數據的熱備份,是持久化之外的?種數據冗余方式;
    • 故障恢復:當主節點出現問題時,可以由從節點提供服務,實現快速的故障恢復;
    • 負載均衡:在主從復制的基礎上,配合讀寫分離,可以由主節點提供寫服務,由從節點提供讀服務(即寫 Redis 數據時應用去連接主節點,讀 Redis 數據時應用去連接從節點),分擔服務器負載。尤其是在寫少讀多的場景下,通過多個從節點分擔讀負載,可以大大提高 Redis 服務器的并發量;
    • 高可用基石:除了上述作用以外,主從復制還是哨兵和集群能夠實施的基礎,因此說主從復制是 Redis 高可用的基礎。

1.2.2 部署實現

  • 整體架構圖:

    在這里插入圖片描述

  • 主節點不需要做任何改變,從節點都需要修改配置加上主節點信息;

    # 添加主節點信息
    replicaof 192.168.75.129 6379
    

    在這里插入圖片描述

  • 配置完成后,可以從主節點查看從節點信息;

    # 主節點查看從節點信息
    info Replication
    

    在這里插入圖片描述

1.2.3 缺點

  • 復制延時,信號衰減。由于所有的寫操作都是先在 master 上操作,然后同步更新到 slave 上,所以從 master 同步到 slave 機器上有?定的延遲,當系統很繁忙的時候,延遲問題會更加嚴重,slave 機器數量的增加也會使這個問題更加嚴重;
  • **master掛了如何辦?**默認情況下,需要人工干預。

1.3 哨兵部署(Sentinel)

  • Redis 的主從復制主要用于實現數據的冗余備份和讀分擔,并沒有提供高可用性。因此在系統高可用方面,單純的主從架構無法很好地保證整個系統高可用。

1.3.1 原理

  • Redis 哨兵模式是通過在獨立的哨兵節點上運行特定的哨兵進程來實現的。這些哨兵進程監控主從節點的狀態,并在發現故障時自動完成故障發現和轉移,并通知應用方,實現高可用性;

    在這里插入圖片描述

1.3.2 哨兵

  • 在啟動時,每個哨兵節點會執行選舉過程,其中?個哨兵節點被選為領導者(leader),負責協調其他哨兵節點;
  • Leader 選舉過程
    • 每個在線的哨兵節點都可以成為領導者,每個哨兵節點會向其它哨兵發is-master-down-by-addr命令,征求判斷并要求將自己設置為領導者;
    • 當其它哨兵收到此命令時,可以同意或者拒絕它成為領導者;如果哨兵發現自己的得票數>= num(sentinels)/2+1時,將成為領導者,如果沒有超過,繼續選舉;
  • 監控主從節點:哨兵節點通過發送命令周期性地檢查主從節點的健康狀態,包括主節點是否在線、從節點是否同步等。如果哨兵節點發現主節點不可用,它會觸發?次故障轉移;
  • 故障轉移:?旦主節點被判定為不可用,哨兵節點會執行故障轉移操作。它會從當前的從節點中選出一個新的主節點,并將其他從節點切換到新的主節點。這樣,系統可以繼續提供服務而無需人工介入;
  • 故障轉移過程:由 Sentinel 節點定期監控發現主節點是否出現了故障,Sentinel 會向 master 發送心跳 PING 來確認 master 是否存活,如果 master 在“?定時間范圍”內不回應 PONG 或者是回復了?個錯誤消息,那么這個 Sentinel 節點會主觀地(單方面地)認為這個 master 已經不可用了;
  • 確認主節點
    • 過濾掉不健康的(下線或斷線)
    • 沒有回復哨兵 PING 響應的從節點
    • 選擇從節點優先級最高的
    • 選擇復制偏移量最大,偏移量大代表該從節點的數據與主節點同步得最完整
    • 當主節點出現故障, 由領導者負責處理主節點的故障轉移
  • 客戶端重定向:哨兵節點會通知客戶端新主節點的位置,使其能夠與新的主節點建立連接并發送請求。這確保了客戶端可以無縫切換到新的主節點,繼續進行操作;
  • 此外,哨兵節點還負責監控從節點的狀態。如果從節點出現故障,哨兵節點可以將其下線,并在從節點恢復正常后重新將其加入集群。

1.3.3 主觀下線 VS 可觀下線

  • 當一個主節點下線被其監控的哨兵節點發現時,該哨兵節點會主觀認為該主節點下線了,這就是主觀下線了;

  • 隨后哨兵節點會通過指令sentinel is-masterdown-by-addr尋求其它哨兵節點對該主節點的判斷(即“詢問其它哨兵節點是否檢測到該主節點下線了”),若認為該主節點下線的哨兵節點超過quorum(選舉)個數,此時就可以認為該主節點確實有問題,這就是客觀下線

1.3.4 部署實現&故障模擬

  • 整體架構圖:

    在這里插入圖片描述

  • 3 個機器都需要修改sentinel.conf配置,配置完成之后先從主節點開始啟動哨兵;

    # 6?,關閉保護模式
    protected-mode no
    # 15?,指定sentinel為后臺啟動
    daemonize yes
    # 34?,指定?志存放路徑
    logfile /opt/software/redis/redis-stable/sentinel.log# 73?,指定數據庫存放路徑
    dir /opt/software/redis 
    # 93?,指定該哨兵節點監控192.168.75.129:6379這個主節點,該主節點的名稱是mymaster,2表示?少需要2個哨兵節點同意,才能判定主節點故障并進?故障轉移
    sentinel monitor mymaster 192.168.75.129 6379 2
    # 134?,判定服務器下線的時間周期,默認30000毫秒(30秒)
    sentinel down-after-milliseconds mymaster 30000
    # 234?,故障節點的最?超時時間為180000(180秒)
    sentinel failover-timeout mymaster 180000 
    
  • 啟動后檢查哨兵狀態:

    redis-cli -p 26379 info sentinel
    
  • 故障模擬:

    # 在ip地址結尾為129的機器上殺掉主節點的進程
    ps aux | grep redis
    # 也可以用 redis-cli shutdown 直接停掉主節點服務
    
    # 觀察哨兵?志,129 主節點下線,重新選舉131為主節點
    tail -f sentinel.log
    

    在這里插入圖片描述

    # 重新啟動 129 服務 并觀察?志:129 加?主從,此時主節點為131服務
    redis-server redis.conf
    tail -f sentinel.log
    redis-cli -p 26379 info sentinel
    # 觀察哨兵?志
    tail -f sentinel.log
    

    在這里插入圖片描述

    # 在ip地址結尾為131的機器上查看Redis狀態,可以發現其已經成為了主節點
    redis-cli info replication
    

    在這里插入圖片描述

  • 當觸發了哨兵選舉之后,其會在后臺更改redis.confsentinel.conf,可以檢查每臺機器的文件末尾的數據:

    cat redis.conf
    cat sentinel.conf
    

    在這里插入圖片描述

    在這里插入圖片描述

1.3.5 使用建議

  • 哨兵節點的數量應為多個,哨兵本身應該集群,保證?可?
  • 哨兵節點數應該是奇數
  • 各個哨兵結點的配置應?致
  • 如果哨兵節點部署在 Docker 等容器里面,尤其要注意端口號的正確映射

1.3.6 缺點:無法保證數據零丟失

  • 復制延遲:在主從復制中,從節點的數據是從主節點異步復制過來的。這意味著在主節點故障時,從節點可能還沒有完全同步導最新的數據,從而導致數據丟失;

  • 故障檢測和轉移時間:Sentinel 檢測到主節點故障并執行故障轉移需要?定的時間。在這段時間內,主節點可能已經接收了?些寫操作,但這些操作尚未被復制到從節點;

  • 網絡分區:在發生網絡分區(網絡分裂)的情況下,一部分從節點可能與主節點失去聯系。如果此時主節點繼續處理寫操作,那么在網絡恢復之前,這些操作可能不會被復制到從節點;

  • 多個從節點同時故障:如果所有的從節點同時故障或在故障轉移之前與主節點失聯,那么在主節點故障時,將沒有可用的從節點來提升為主節點。

1.4 集群部署(Cluster)

1.4.1 簡介

  • Redis 集群是 Redis 的?種分布式運行模式,它通過分片(sharding)來提供數據的自動分區和管理,從而實現數據的高可用性和可擴展性;

  • 在集群模式下,數據被分割成多個部分(稱為或 Slots),分布在多個 Redis 節點上;

  • 集群中的節點分為主節點和從節點:主節點負責讀寫請求和集群信息的維護,從節點只進行主節點數據和狀態信息的復制;

  • 數據分區

    • 數據分區(或稱數據分片)是集群最核心的功能。 集群將數據分散到多個節點,一方面突破了 Redis 單機內存大小的限制,存儲容量大大增加;

    • 另?方面每個主節點都可以對外提供讀服務和寫服務,大大提高了集群的響應能力;

    • 例如:

      • 如果單機內存太大,bgsavebgrewriteaof的 fork 操作可能導致主進程阻塞;

        Redis 的主工作線程是單線程的。這意味著任何阻塞主線程的操作都會導致整個實例暫時無法處理請求;

        • bgsave:用于在后臺創建當前數據的 RDB 快照(持久化到磁盤);
        • bgrewriteaof:用于在后臺重寫 AOF 日志文件,以優化和壓縮它;

        這兩個命令都帶有 bg (background) 前綴,意味著 Redis 會嘗試在后臺執行它們,以避免阻塞主線程。其工作流程是:

        1. 主進程調用 fork() 系統調用,創建一個子進程
        2. 這個子進程擁有主進程此時刻內存數據的完整副本;
        3. 子進程負責將數據寫入磁盤(RDB或AOF),而主進程繼續處理客戶端請求;

        問題出在 fork() 這一步:

        • 在操作系統中,fork() 系統調用在正常情況下是高效的,因為它使用了寫時復制(Copy-On-Write, COW) 機制。子進程與父進程共享內存頁,只有當父進程(Redis主進程)或子進程修改了某一塊數據時,操作系統才會真正復制那一塊內存;
        • 但是,當單機內存非常大時(例如幾百GB),fork() 操作本身可能會非常耗時。因為即使有寫時復制,內核也需要為子進程創建完整的頁表(page tables)來映射所有這些內存。這是一個與總內存量相關的 O(n) 操作;
        • 這個創建頁表的過程會阻塞 Redis 的主進程。內存越大,阻塞的時間就越長(可能達到秒級甚至更久)。在這期間,Redis 無法處理任何請求,導致服務中斷;
      • 主從環境下,進行主機切換時可能導致從節點長時間無法提供服務;

        假設主節點(Master)宕機了,哨兵(Sentinel)或集群模式會自動將一個從節點(Slave)提升為新的主節點,其他從節點需要轉而從這個新的主節點進行數據同步;

        問題在于第一次同步(全量復制):當一個從節點需要與新的主節點同步時,如果它本身沒有數據或者數據差距太大,它需要執行一次全量復制

        1. 新的主節點會為自己當前的數據創建一個 RDB 快照(這就會觸發一次 bgsave);
        2. 正如第一個問題所述,如果新主節點的內存很大,這次 fork 可能耗時很長,導致新主節點自身在創建RDB期間服務不穩定
        3. 更重要的是,從節點在接收和加載這個巨大的 RDB 文件時,整個過程是阻塞的。它會先清空自身舊數據,然后將 RDB 文件全部加載到內存。這個過程非常耗時,且在此期間從節點無法對外提供任何讀服務(因為它的數據是舊的且不一致的);

        所以,“從節點長時間無法提供服務”指的是它在全量同步新數據的過程中處于不可用狀態;

      • 在全量復制場景下主節點的復制可能會造成緩沖區溢出;

        主節點在通過 bgsave 生成 RDB 文件并將其發送給從節點的同時,主節點自身還在持續不斷地處理新的客戶端寫請求

        為了保證數據一致性,從節點在加載 RDB 文件期間,主節點需要將這段時間內產生的所有新寫命令都緩存起來。這個緩存區域就是復制緩沖區(Replication Buffer)

        當從節點加載完 RDB 文件后,主節點會再將復制緩沖區里積壓的命令發送給從節點,從節點執行這些命令后,就能追趕上主節點的最新狀態;

        問題在于:

        • 如果 RDB 文件非常大(因為內存大),傳輸和加載耗時就很長;
        • 在這段漫長的時間里,如果主節點的寫請求非常頻繁(高寫入負載),復制緩沖區可能會被迅速填滿;
        • 一旦復制緩沖區被寫滿,主節點會斷開與從節點的復制連接。這將導致全量復制失敗,從節點可能需要重新嘗試連接并再次開始全量復制過程,從而陷入一個惡性循環;
  • 高可用:集群支持主從復制和主節點的自動故障轉移(與哨兵類似),當任?節點發生故障時,集群仍然可以對外提供服務。

1.4.2 哈希槽

  • Redis 集群引入了哈希槽的概念;
  • Redis 集群有16384 個哈希槽(編號0-16383),集群的每個節點負責?部分哈希槽;
  • 每個 Key 通過 CRC16 校驗后對 16384 取余,會得到一個值,根據該值來決定這個 Key 會被放置到哪個哈希槽。也可以通過這個值,找到對應的插槽所對應的節點,然后直接自動跳轉到這個對應的節點上進行存取操作;
  • 以 3 個節點組成的集群為例:
    • 節點 A 包含 0 到 5460 號哈希槽節點,B 包含 5461 到 10922 號哈希槽節點,C 包含 10923 到 16383 號哈希槽;
    • Redis 集群的主從復制模型集群中有上面這 A、B、C 三個節點,如果節點 B 下線了,整個集群就會因缺少 5461-10922 這個范圍的槽而不可使用;
    • 為每個節點各添加?個從節點 A1、B1、C1,此時整個集群便有三個 master 節點和三個 slave 節點;
    • 節點 B 下線后,集群選舉 B1 為主節點繼續服務。當 B 和 B1 都下線后,集群將不可用。

1.4.3 部署實現

1.4.3.1 環境簡述
  • Redis Cluster 被配置為三主三從模式。這意味著每臺服務器上的兩個 Redis 節點中,?個節點作為主庫(master),另?個作為從庫(slave);

    在這里插入圖片描述

1.4.3.2 Redis 集群配置準備
# 創建集群配置文件夾(3臺機器都是一樣的操作)
mkdir -p /opt/software/redis/redis-stable/cluster
mkdir -p /opt/software/redis/cluster
vim ./cluster/redis_6379.conf
vim ./cluster/redis_6380.conf# 啟動 Redis 服務相關
redis-server ./cluster/redis_6379.conf
redis-server ./cluster/redis_6380.conf# 檢查服務
ps aux | grep redis# 創建三主三從集群模式,每一個主節點帶一個從節點
redis-cli --cluster create --cluster-replicas 1 192.168.75.129:6379 192.168.75.129:6380 192.168.75.131:6379 192.168.75.131:6380 192.168.75.132:6379 192.168.75.132:6380# 查看集群信息
redis-cli cluster info# 查看單個節點信息
redis-cli info replication# 查看集群節點身份信息
redis-cli cluster nodes# 停止redis服務
redis-cli -p 6379 shutdown
redis-cli -p 6380 shutdown
  • 6379(即每臺機器的主節點)配置:

    # 允許所有的IP地址
    bind * -::*
    # 后臺運行
    daemonize yes
    # 允許遠程連接
    protected-mode no
    # 開啟集群模式
    cluster-enabled yes
    # 集群節點超時時間
    cluster-node-timeout 5000
    # 配置數據存儲目錄
    dir "/opt/software/redis/cluster"
    # 開啟AOF持久化
    appendonly yes# 端口
    port 6379
    # log日志
    logfile "/opt/software/redis/redis-stable/cluster/redis6379.log"
    # 集群配置文件
    cluster-config-file nodes-6379.conf
    # AOF文件名
    appendfilename "appendonly6379.aof"
    # RBD文件名
    dbfilename "dump6379.rdb"
    
  • 6380(即每臺機器的從節點)配置:

    # 允許所有的IP地址
    bind * -::*
    # 后臺運行
    daemonize yes
    # 允許遠程連接
    protected-mode no
    # 開啟集群模式
    cluster-enabled yes
    # 集群節點超時時間
    cluster-node-timeout 5000
    # 配置數據存儲目錄
    dir "/opt/software/redis/cluster"
    # 開啟AOF持久化
    appendonly yes# 端口
    port 6380
    # log日志
    logfile "/opt/software/redis/redis-stable/cluster/redis6380.log"
    # 集群配置文件
    cluster-config-file nodes-6380.conf
    # AOF文件名
    appendfilename "appendonly6380.aof"
    # RBD文件名
    dbfilename "dump6380.rdb"
    
  • 每臺重啟 Redis:

    在這里插入圖片描述

  • 再次執行創建三主三從集群模式:

    在這里插入圖片描述

1.4.3.3 Redis 集群數據讀寫
  • 在 131:6379 的主節點進行寫數據。直接連接讀寫可能會出現以下問題,因為不同節點的槽位不同,返回的結果就提示我們要去 132:6379 進行寫入數據;

    在這里插入圖片描述

  • 不過也可以開啟路由規則,給redis-cli加上-c

    在這里插入圖片描述

1.4.3.4 模擬故障轉移
# 將 129 機器的主節點下線
redis-cli -p 6379 shutdown
# 查看 129 機器從節點的?作?志,131:6380節點被選舉為主節點
cat redis6380.log

在這里插入圖片描述

# 再切換到132機器上查看當前集群節點信息,131:6380已經升為主節點
redis-cli cluster nodes

在這里插入圖片描述

# 再重新啟動129.6379服務
redis-server ./cluster/redis_6379.conf
# 查看129.6379的節點信息,其變為了從節點
redis-cli -p 6379 info replication

在這里插入圖片描述

# 再到131.6380機器上查看?志,129.6379重新加?集群
cat redis6380.log

在這里插入圖片描述

2 文件目錄

  • 手動創建:

    # Redis應?
    /opt/software/redis/
    # Redis應?根?錄
    /opt/software/redis/redis-stable
    # Redis集群應??件?錄(?志,快照等信息)
    /opt/software/redis/cluster
    # Redis集群配置?件存放路徑
    /opt/software/redis/redis-stable/cluster
    

    在這里插入圖片描述

3 配置文件

3.1 單機部署配置

  • 所在目錄:/opt/software/redis/redis-stable

    # 綁定所有可用網絡接口(IPv4和IPv6),允許來自任何地址的連接
    bind * -::*# 禁用保護模式,允許遠程連接(生產環境建議啟用并配置密碼)
    protected-mode no# 設置Redis服務監聽端口為6379(默認端口)
    port 6379# TCP連接隊列長度,高并發場景可適當調高
    tcp-backlog 511# 客戶端空閑超時時間(秒),0表示永不超時
    timeout 0# TCP keepalive間隔時間(秒),用于檢測死連接
    tcp-keepalive 300# 以守護進程方式運行(后臺運行)
    daemonize yes# 進程ID文件存儲路徑
    pidfile /var/run/redis_6379.pid# 日志級別:notice(生產環境推薦)
    loglevel notice# 日志文件輸出路徑
    logfile /opt/software/redis/redis-stable/redis.log# 設置數據庫數量(默認16個,編號0-15)
    databases 16# 啟動時不顯示Redis logo
    always-show-logo no# 啟用進程標題設置
    set-proc-title yes# 進程標題格式:包含服務名、監聽地址和模式
    proc-title-template "{title} {listen-addr} {server-mode}"# 設置空字符串使用默認字節比較排序
    locale-collate ""# RDB保存失敗時停止寫入操作(確保數據一致性)
    stop-writes-on-bgsave-error yes# RDB文件啟用壓縮(節省磁盤空間)
    rdbcompression yes# RDB文件啟用CRC64校驗和(數據完整性檢查)
    rdbchecksum yes# RDB持久化數據文件名
    dbfilename dump.rdb# 主從同步時不刪除RDB文件
    rdb-del-sync-files no# 工作目錄(持久化文件和日志存放路徑)
    dir /opt/software/redis# 從節點在與主節點失聯時繼續響應舊數據
    replica-serve-stale-data yes# 從節點默認只讀(防止數據不一致)
    replica-read-only yes# 啟用無盤復制(主節點直接通過socket發送RDB到從節點)
    repl-diskless-sync yes# 無盤復制等待時間(秒),等待更多從節點連接
    repl-diskless-sync-delay 5# 無盤復制最大從節點數量(0表示無限制)
    repl-diskless-sync-max-replicas 0# 禁用TCP_NODELAY(啟用后減少復制延遲但增加帶寬)
    repl-disable-tcp-nodelay no# 從節點優先級(哨兵選主時使用,值越小優先級越高)
    replica-priority 100# ACL日志最大長度(記錄認證相關事件)
    acllog-max-len 128# 內存滿時是否異步驅逐Key(避免阻塞)
    lazyfree-lazy-eviction no# 過期Key是否異步刪除
    lazyfree-lazy-expire no# 服務刪除Key時是否異步處理(如RENAME命令)
    lazyfree-lazy-server-del no# 從節點加載RDB時是否異步清空數據
    replica-lazy-flush no# 用戶DEL命令是否異步處理
    lazyfree-lazy-user-del no# FLUSHDB/FLUSHALL是否異步執行
    lazyfree-lazy-user-flush no# 是否調整Redis進程的OOM評分(避免被系統殺死)
    oom-score-adj no# OOM評分調整值(不同角色配置)
    oom-score-adj-values 0 200 800# 禁用透明大頁(避免延遲波動)
    disable-thp yes# 禁用AOF持久化(僅使用RDB)
    appendonly no# AOF文件名(當啟用AOF時有效)
    appendfilename "appendonly.aof"# AOF文件目錄名(當啟用AOF時有效)
    appenddirname "appendonlydir"# AOF同步策略:每秒同步(性能與安全折中)
    appendfsync everysec# AOF重寫期間是否禁止fsync(避免磁盤IO競爭)
    no-appendfsync-on-rewrite no# AOF重寫觸發條件:當前AOF文件比上次重寫后增大100%
    auto-aof-rewrite-percentage 100# AOF重寫最小文件大小:64MB
    auto-aof-rewrite-min-size 64mb# 是否加載被截斷的AOF文件(服務器崩潰時可能產生)
    aof-load-truncated yes# 啟用AOF重寫時使用RDB preamble(結合RDB和AOF優勢)
    aof-use-rdb-preamble yes# 是否在AOF中記錄時間戳(兼容性考慮)
    aof-timestamp-enabled no# 慢查詢日志閾值(微秒),10000表示10毫秒
    slowlog-log-slower-than 10000# 慢查詢日志最大記錄條數
    slowlog-max-len 128# 延遲監控閾值(微秒),0表示禁用
    latency-monitor-threshold 0# 鍵空間通知配置(空表示禁用)
    notify-keyspace-events ""# Hash類型使用listpack的最大元素數量
    hash-max-listpack-entries 512# Hash類型使用listpack的最大元素值長度
    hash-max-listpack-value 64# List類型使用listpack的最大大小(-2表示默認值)
    list-max-listpack-size -2# List類型壓縮深度(0表示不壓縮)
    list-compress-depth 0# Set類型使用listpack的最大元素數量
    set-max-listpack-entries 128# Set類型使用listpack的最大元素值長度
    set-max-listpack-value 64# Zset類型使用listpack的最大元素數量
    zset-max-listpack-entries 128# Zset類型使用listpack的最大元素值長度
    zset-max-listpack-value 64# HyperLogLog稀疏結構最大字節數
    hll-sparse-max-bytes 3000# Stream類型單個節點最大字節數
    stream-node-max-bytes 4096# Stream類型單個節點最大條目數
    stream-node-max-entries 100# 啟用主動rehashing(降低內存使用但增加CPU開銷)
    activerehashing yes# 普通客戶端輸出緩沖區限制(0表示無限制)
    client-output-buffer-limit normal 0 0 0# 從節點客戶端輸出緩沖區限制(256MB硬限制,60秒軟限制)
    client-output-buffer-limit replica 256mb 64mb 60# Pub/Sub客戶端輸出緩沖區限制(32MB硬限制,60秒軟限制)
    client-output-buffer-limit pubsub 32mb 8mb 60# 后臺任務執行頻率基準值(1-500)
    hz 10# 動態調整hz值(根據客戶端數量自適應)
    dynamic-hz yes# AOF重寫期間增量同步fsync(減少磁盤壓力)
    aof-rewrite-incremental-fsync yes# RDB保存期間增量同步fsync
    rdb-save-incremental-fsync yes# 啟用jemalloc后臺線程進行內存整理
    jemalloc-bg-thread yes
    

3.2 主從部署配置

  • 所在目錄:/opt/software/redis/redis-stable

  • 129:6379 主節點配置:同2.2.1 單機 Redis 配置文件

  • 131:6379 從節點配置:

    # 綁定所有可用網絡接口(IPv4和IPv6),允許來自任何地址的連接
    bind * -::*# 禁用保護模式,允許遠程連接(生產環境建議啟用并配置密碼)
    protected-mode no# 設置Redis服務監聽端口為6379(默認端口)
    port 6379# TCP連接隊列長度,高并發場景可適當調高
    tcp-backlog 511# 客戶端空閑超時時間(秒),0表示永不超時
    timeout 0# TCP keepalive間隔時間(秒),用于檢測死連接
    tcp-keepalive 300# 以守護進程方式運行(后臺運行)
    daemonize yes# 進程ID文件存儲路徑
    pidfile /var/run/redis_6379.pid# 日志級別:notice(生產環境推薦)
    loglevel notice# 日志文件輸出路徑
    logfile /opt/software/redis/redis-stable/redis.log# 設置數據庫數量(默認16個,編號0-15)
    databases 16# 啟動時不顯示Redis logo
    always-show-logo no# 啟用進程標題設置
    set-proc-title yes# 進程標題格式:包含服務名、監聽地址和模式
    proc-title-template "{title} {listen-addr} {server-mode}"# 設置空字符串使用默認字節比較排序
    locale-collate ""# RDB保存失敗時停止寫入操作(確保數據一致性)
    stop-writes-on-bgsave-error yes# RDB文件啟用壓縮(節省磁盤空間)
    rdbcompression yes# RDB文件啟用CRC64校驗和(數據完整性檢查)
    rdbchecksum yes# RDB持久化數據文件名
    dbfilename dump.rdb# 主從同步時不刪除RDB文件
    rdb-del-sync-files no# 工作目錄(持久化文件和日志存放路徑)
    dir /opt/software/redis# 指定主節點復制配置(從節點配置,IP為192.168.75.129,端口6379)
    replicaof 192.168.75.129 6379# 從節點在與主節點失聯時繼續響應舊數據
    replica-serve-stale-data yes# 從節點默認只讀(防止數據不一致)
    replica-read-only yes# 啟用無盤復制(主節點直接通過socket發送RDB到從節點)
    repl-diskless-sync yes# 無盤復制等待時間(秒),等待更多從節點連接
    repl-diskless-sync-delay 5# 無盤復制最大從節點數量(0表示無限制)
    repl-diskless-sync-max-replicas 0# 從節點加載RDB方式:disabled表示完全下載后再加載(避免數據不一致)
    repl-diskless-load disabled# 禁用TCP_NODELAY(啟用后減少復制延遲但增加帶寬)
    repl-disable-tcp-nodelay no# 從節點優先級(哨兵選主時使用,值越小優先級越高)
    replica-priority 100# ACL日志最大長度(記錄認證相關事件)
    acllog-max-len 128# 內存滿時是否異步驅逐Key(避免阻塞)
    lazyfree-lazy-eviction no# 過期Key是否異步刪除
    lazyfree-lazy-expire no# 服務刪除Key時是否異步處理(如RENAME命令)
    lazyfree-lazy-server-del no# 從節點加載RDB時是否異步清空數據
    replica-lazy-flush no# 用戶DEL命令是否異步處理
    lazyfree-lazy-user-del no# FLUSHDB/FLUSHALL是否異步執行
    lazyfree-lazy-user-flush no# 是否調整Redis進程的OOM評分(避免被系統殺死)
    oom-score-adj no# OOM評分調整值(不同角色配置)
    oom-score-adj-values 0 200 800# 禁用透明大頁(避免延遲波動)
    disable-thp yes# 禁用AOF持久化(僅使用RDB)
    appendonly no# AOF文件名(當啟用AOF時有效)
    appendfilename "appendonly.aof"# AOF文件目錄名(當啟用AOF時有效)
    appenddirname "appendonlydir"# AOF同步策略:每秒同步(性能與安全折中)
    appendfsync everysec# AOF重寫期間是否禁止fsync(避免磁盤IO競爭)
    no-appendfsync-on-rewrite no# AOF重寫觸發條件:當前AOF文件比上次重寫后增大100%
    auto-aof-rewrite-percentage 100# AOF重寫最小文件大小:64MB
    auto-aof-rewrite-min-size 64mb# 是否加載被截斷的AOF文件(服務器崩潰時可能產生)
    aof-load-truncated yes# 啟用AOF重寫時使用RDB preamble(結合RDB和AOF優勢)
    aof-use-rdb-preamble yes# 是否在AOF中記錄時間戳(兼容性考慮)
    aof-timestamp-enabled no# 慢查詢日志閾值(微秒),10000表示10毫秒
    slowlog-log-slower-than 10000# 慢查詢日志最大記錄條數
    slowlog-max-len 128# 延遲監控閾值(微秒),0表示禁用
    latency-monitor-threshold 0# 鍵空間通知配置(空表示禁用)
    notify-keyspace-events ""# Hash類型使用listpack的最大元素數量
    hash-max-listpack-entries 512# Hash類型使用listpack的最大元素值長度
    hash-max-listpack-value 64# List類型使用listpack的最大大小(-2表示默認值)
    list-max-listpack-size -2# Set類型使用intset編碼的最大元素數量(僅限整數集合)
    set-max-intset-entries 512# Set類型使用listpack的最大元素數量
    set-max-listpack-entries 128# Set類型使用listpack的最大元素值長度
    set-max-listpack-value 64# Zset類型使用listpack的最大元素數量
    zset-max-listpack-entries 128# Zset類型使用listpack的最大元素值長度
    zset-max-listpack-value 64# HyperLogLog稀疏結構最大字節數
    hll-sparse-max-bytes 3000# Stream類型單個節點最大字節數
    stream-node-max-bytes 4096# Stream類型單個節點最大條目數
    stream-node-max-entries 100# 啟用主動rehashing(降低內存使用但增加CPU開銷)
    activerehashing yes# 普通客戶端輸出緩沖區限制(0表示無限制)
    client-output-buffer-limit normal 0 0 0# 從節點客戶端輸出緩沖區限制(256MB硬限制,60秒軟限制)
    client-output-buffer-limit replica 256mb 64mb 60# Pub/Sub客戶端輸出緩沖區限制(32MB硬限制,60秒軟限制)
    client-output-buffer-limit pubsub 32mb 8mb 60# 后臺任務執行頻率基準值(1-500)
    hz 10# 動態調整hz值(根據客戶端數量自適應)
    dynamic-hz yes# AOF重寫期間增量同步fsync(減少磁盤壓力)
    aof-rewrite-incremental-fsync yes# RDB保存期間增量同步fsync
    rdb-save-incremental-fsync yes# 啟用jemalloc后臺線程進行內存整理
    jemalloc-bg-thread yes
    
  • 132:6379 從節點配置:同上。

3.3 哨兵部署配置

  • 所在目錄:/opt/software/redis/redis-stable

  • 主從配置無需修改,直接配置 Sentinel 文件,3 個機器配置相同:

    # 禁用保護模式,允許遠程連接Sentinel(生產環境建議配合防火墻使用)
    protected-mode no# Sentinel監聽端口,默認26379
    port 26379# 以守護進程方式運行(后臺運行)
    daemonize yes# Sentinel進程ID文件存儲路徑
    pidfile /var/run/redis-sentinel.pid# 日志級別:notice(生產環境推薦)
    loglevel notice# Sentinel日志文件輸出路徑
    logfile /opt/software/redis/redis-stable/sentinel.log# 工作目錄(存儲運行時文件)
    dir /opt/software/redis# 監控名為mymaster的主節點,IP為192.168.75.129,端口6379,法定人數為2
    sentinel monitor mymaster 192.168.75.129 6379 2# 主節點無響應30000毫秒(30秒)后判定為下線
    sentinel down-after-milliseconds mymaster 30000# ACL日志最大長度(記錄認證相關事件)
    acllog-max-len 128# 故障轉移時同時同步的新從節點數量(1表示逐個同步)
    sentinel parallel-syncs mymaster 1# 故障轉移超時時間(毫秒),180000表示3分鐘
    sentinel failover-timeout mymaster 180000# 禁止通過SENTINEL SET命令修改腳本相關配置(增強安全性)
    sentinel deny-scripts-reconfig yes# 禁用主機名解析(直接使用IP地址,避免DNS解析問題)
    SENTINEL resolve-hostnames no# 禁用主機名公告(使用IP地址進行通信)
    SENTINEL announce-hostnames no# 主節點重啟后立即判定為下線(0表示不等待)
    SENTINEL master-reboot-down-after-period mymaster 0
    

3.4 集群部署配置

  • 所在目錄:/opt/software/redis/redis-stable/cluster

  • 6379 主節點:

    # 允許所有的IP地址
    bind * -::*
    # 后臺運行
    daemonize yes
    # 允許遠程連接
    protected-mode no
    # 開啟集群模式
    cluster-enabled yes
    # 集群節點超時時間
    cluster-node-timeout 5000
    # 配置數據存儲目錄
    dir "/opt/software/redis/cluster"
    # 開啟AOF持久化
    appendonly yes# 端口
    port 6379
    # log日志
    logfile "/opt/software/redis/redis-stable/cluster/redis6379.log"
    # 集群配置文件
    cluster-config-file nodes-6379.conf
    # AOF文件名
    appendfilename "appendonly6379.aof"
    # RBD文件名
    dbfilename "dump6379.rdb"
    
  • 6380 從節點:

    # 允許所有的IP地址
    bind * -::*
    # 后臺運行
    daemonize yes
    # 允許遠程連接
    protected-mode no
    # 開啟集群模式
    cluster-enabled yes
    # 集群節點超時時間
    cluster-node-timeout 5000
    # 配置數據存儲目錄
    dir "/opt/software/redis/cluster"
    # 開啟AOF持久化
    appendonly yes# 端口
    port 6380
    # log日志
    logfile "/opt/software/redis/redis-stable/cluster/redis6380.log"
    # 集群配置文件
    cluster-config-file nodes-6380.conf
    # AOF文件名
    appendfilename "appendonly6380.aof"
    # RBD文件名
    dbfilename "dump6380.rdb"
    

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

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

相關文章

2025年滲透測試面試題總結-54(題目+回答)

安全領域各種資源,學習文檔,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具,歡迎關注。1、SQL注入的防護方法有哪些? 2、永恒之藍的漏洞原理是什么?怎么做到的? 3、命令…

安卓學習 之 按鈕點擊事件

今天學習安卓應用中的按鈕點擊事件:總結下來在安卓應用中的Button注冊點擊事件的方法主要是以下4種方法,稍后會逐個介紹: 第一種方法:自定義內部類的方法 第二種方法:匿名內部類的方法 第三種方法:當前Acti…

鴻蒙NEXT主題設置指南:應用級與頁面級主題定制詳解

在鴻蒙應用開發中,靈活的主題設置能力是實現個性化用戶體驗的關鍵技術,HarmonyOS NEXT提供了強大而靈活的主題設置功能,讓開發者能夠輕松實現應用級和頁面級的主題定制。在當今追求個性化的時代,用戶希望應用能夠根據自己的喜好呈…

全球汽車氮化鎵技術市場規模將于2031年增長至180.5億美元,2025-2031年復合增長率達94.3%,由Infineon和Navitas驅動

全球汽車氮化鎵技術市場規模將于2031年增長至180.5億美元,2025-2031年復合增長率達94.3%,由Infineon和Navitas驅動汽車氮化鎵技術正從一個有前景的細分市場加速進入主流電力電子領域。根據QYResearch(恒州博智)的《全球汽車GaN技術…

xftp斷網后提示錯誤如何繼續下載?

問題:xftp斷網后提示錯誤如何繼續下載?解決方法:斷網后,先連接上網,然后繼續雙擊右側的那兩個要傳輸的文件,然后會彈出一個覆蓋還是繼續下載(如下圖)的選擇框,選擇繼續下…

Day22_【機器學習—集成學習(4)—Boosting—GBDT算法】

提升樹 (Boosting Decision Tree )每一個弱學習器通過擬合殘差來構建強學習器梯度提升樹 (Gradient Boosting Decision Tree)每一個弱學習器通過擬合負梯度來構建強學習器一、提升樹殘差數學公式為:殘差真實值?預測值…

前綴和、子矩陣的和;差分、差分矩陣

一、前綴和數組要稍微注意前綴和數組從1開始#include <iostream>using namespace std;const int N 100010;int n, m; int a[N], s[N];int main() {scanf("%d%d", &n, &m);for (int i 1; i < n; i ) scanf("%d", &a[i]);for (int i…

啟用BBR擁塞控制算法

目錄 &#x1f4cb; 先決條件 &#x1f527; 啟用步驟 &#x1f4dd; 額外檢查與說明 ?? 注意事項 BBR&#xff08;Bottleneck Bandwidth and Round-trip time&#xff09;是谷歌開發的一種TCP擁塞控制算法&#xff0c;它能有效提升網絡傳輸速度和性能&#xff0c;尤其在…

Python:AI開發第一語言的全面剖析

文章目錄引言1. Python的歷史與AI開發的契合1.1 Python的誕生與設計哲學1.2 Python與AI發展的歷史交匯2. 語言特性如何支持AI開發2.1 動態類型與交互式編程2.2 簡潔優雅的語法2.3 高級數據結構的原生支持2.4 函數式編程特性2.5 強大的元編程能力3. 豐富的AI生態系統和庫支持3.1…

Nikto 漏洞掃描工具使用指南

目錄 ? 核心功能一覽 &#x1f680; 基本使用方法 1. 掃描單個目標 2. 指定端口掃描 3. 掃描 HTTPS 目標 使用 -ssl 參數主要有兩個核心原因 ?? 高級使用技巧 1. 使用代理掃描 2. 保存掃描結果 3. 使用特定插件 4.交互命令 ? 核心功能一覽 Nikto 是一款開源的 W…

FunASR的Java實現Paraformer實時語音識別 | 一款無需聯網的本地實時字幕軟件

0. 開發背景 我們在看直播時&#xff0c;沒有視頻字幕&#xff0c;可能看慣了視頻字幕&#xff0c;來到直播中缺少字幕會感覺不習慣&#xff0c;特別是對于聽力障礙的人群&#xff0c;只能依賴于字幕&#xff0c;那么這個軟件可以解決直播&#xff0c;在線會議等場景中無字幕的…

從機器學習的角度實現 excel 中趨勢線:揭秘梯度下降過程

1. 引言&#xff1a;Excel 的“一鍵魔法”背后藏著什么智慧&#xff1f;在 Excel 中&#xff0c;我們只需右鍵 → 添加趨勢線&#xff0c;一條完美的直線就出現了。它快得像魔法&#xff0c;但魔法背后&#xff0c;是數學的嚴謹。今天&#xff0c;我們不關心 Excel 內部用了什么…

關于上拉電阻

上拉電阻的作用&#xff1a;輔助浮空狀態輸出高電平 其實就是確定這根線的電平&#xff0c;不能讓他處于一種未知的狀態。 其次也可以起到限制電流的作用&#xff0c;防止損壞原件 那么上拉電阻如何取值&#xff1f; 首先來看一下驅動能力。 因為線上是一定有寄生電容的&am…

PiscCode構建Mediapipe 手勢識別“剪刀石頭布”小游戲

在計算機視覺與人機交互領域&#xff0c;手勢識別是一個非常有趣的應用場景。本文將帶你用 Mediapipe 和 Python 實現一個基于攝像頭的手勢識別“剪刀石頭布”小游戲&#xff0c;并展示實時手勢與游戲結果。 1. 項目概述 該小游戲能夠實現&#xff1a; 實時檢測手勢&#xff0…

【VoNR】VoNR 不等于 VoLTE on 5G

博主未授權任何人或組織機構轉載博主任何原創文章&#xff0c;感謝各位對原創的支持&#xff01; 博主鏈接 本人就職于國際知名終端廠商&#xff0c;負責modem芯片研發。 在5G早期負責終端數據業務層、核心網相關的開發工作&#xff0c;目前牽頭6G技術研究。 博客內容主要圍繞…

計算機網絡:網絡設備在OSI七層模型中的工作層次和傳輸協議

OSI七層模型&#xff08;物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層&#xff09;中&#xff0c;不同網絡設備因功能不同&#xff0c;工作在不同層次。以下是典型網絡設備的工作層次及核心功能&#xff1a;1. 物理層&#xff08;第1層&#xff09; 核心功能&a…

RSA-e和phi不互素

1.題目import gmpy2 import libnum p 1656713884642828937525841253265560295123546793973683682208576533764344166170780019002774068042673556637515136828403375582169041170690082676778939857272304925933251736030429644277439899845034340194709105071151095131704526…

基于單片機蒸汽壓力檢測/蒸汽余熱回收

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;單片機作品題目速選一覽表&#x1f680; &#x1f449;&#x1f449;&#x1f449;&#x1f449;單片機作品題目功能速覽&#x1f680; &#x1f525;更多文章戳&#x1f449;小新單片機-CSDN博客&#x1f68…

https 協議與 wss 協議有什么不同

HTTPS 是用于網頁數據傳輸的安全協議&#xff0c;而 WSS 是用于實時雙向通信&#xff08;如聊天、直播&#xff09;的安全協議&#xff0c;二者的設計目標、應用場景、底層邏輯均存在本質區別。以下從 7 個核心維度展開對比&#xff0c;并補充關鍵關聯知識&#xff0c;幫助徹底…

主流分布式數據庫集群選型指南

以下是關于主流分布式可擴展數據庫集群的詳細解析&#xff0c;涵蓋技術分類、代表產品及適用場景&#xff0c;幫助您高效選型&#xff1a;一、分布式數據庫核心分類 1. NewSQL 數據庫&#xff08;強一致性 分布式事務&#xff09;產品開發方核心特性適用場景TiDBPingCAPHTAP架…