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.conf
與sentinel.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 單機內存大小的限制,存儲容量大大增加;
-
另?方面每個主節點都可以對外提供讀服務和寫服務,大大提高了集群的響應能力;
-
例如:
-
如果單機內存太大,
bgsave
和bgrewriteaof
的 fork 操作可能導致主進程阻塞;Redis 的主工作線程是單線程的。這意味著任何阻塞主線程的操作都會導致整個實例暫時無法處理請求;
- bgsave:用于在后臺創建當前數據的 RDB 快照(持久化到磁盤);
- bgrewriteaof:用于在后臺重寫 AOF 日志文件,以優化和壓縮它;
這兩個命令都帶有
bg
(background) 前綴,意味著 Redis 會嘗試在后臺執行它們,以避免阻塞主線程。其工作流程是:- 主進程調用
fork()
系統調用,創建一個子進程; - 這個子進程擁有主進程此時刻內存數據的完整副本;
- 子進程負責將數據寫入磁盤(RDB或AOF),而主進程繼續處理客戶端請求;
問題出在
fork()
這一步:- 在操作系統中,
fork()
系統調用在正常情況下是高效的,因為它使用了寫時復制(Copy-On-Write, COW) 機制。子進程與父進程共享內存頁,只有當父進程(Redis主進程)或子進程修改了某一塊數據時,操作系統才會真正復制那一塊內存; - 但是,當單機內存非常大時(例如幾百GB),
fork()
操作本身可能會非常耗時。因為即使有寫時復制,內核也需要為子進程創建完整的頁表(page tables)來映射所有這些內存。這是一個與總內存量相關的 O(n) 操作; - 這個創建頁表的過程會阻塞 Redis 的主進程。內存越大,阻塞的時間就越長(可能達到秒級甚至更久)。在這期間,Redis 無法處理任何請求,導致服務中斷;
-
主從環境下,進行主機切換時可能導致從節點長時間無法提供服務;
假設主節點(Master)宕機了,哨兵(Sentinel)或集群模式會自動將一個從節點(Slave)提升為新的主節點,其他從節點需要轉而從這個新的主節點進行數據同步;
問題在于第一次同步(全量復制):當一個從節點需要與新的主節點同步時,如果它本身沒有數據或者數據差距太大,它需要執行一次全量復制:
- 新的主節點會為自己當前的數據創建一個 RDB 快照(這就會觸發一次
bgsave
); - 正如第一個問題所述,如果新主節點的內存很大,這次
fork
可能耗時很長,導致新主節點自身在創建RDB期間服務不穩定; - 更重要的是,從節點在接收和加載這個巨大的 RDB 文件時,整個過程是阻塞的。它會先清空自身舊數據,然后將 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"