**本系列為:MySQL資料庫詳解,為千鋒資深教學老師獨家創作** **致力於為大家講解清晰MySQL資料庫相關知識點,含有豐富的代碼案例及講解。如果感覺對大家有幫助的話,可以【關註】持續追更\~** **文末有本文重點總結,技術類問題,也歡迎大家和我們溝通交流!** ![在這裡插入圖片描述](ht ...
淺淺的記錄下Redis安裝、主從、哨兵、集群。搭建筆記
一.Redis下載安裝
系統環境
- redis版本:7.0.11
- linux版本:CentOS Linux release 8.2.2004 (Core)
- 官網下載地址:https://redis.io/download/
一些安裝命令,按照步驟執行
cd /usr/local --redis相關文件將會安裝到此目錄下
mkdir redis7 --創建redis文件目錄
wget wget https://download.redis.io/redis-stable.tar.gz --下載最新穩定版本redis,這裡下載版本為7.0.11
tar -zxvf redis-stable.tar.gz --解壓下載好的redis壓縮包
cd redis-stable --進入到安裝包目錄里
make PREFIX=/usr/local/redis7/redis-stable install --使用make命令進行編譯操作
備註:這裡多了一個關鍵字 PREFIX= 這個關鍵字的作用是編譯的時候用於指定程式存放的路徑。比如我們現在就是指定了redis必須存放在/usr/local/redis7目錄。假設不添加該關鍵字Linux會將可執行文件存放在/usr/local/bin目錄,
庫文件會存放在/usr/local/lib目錄。配置文件會存放在/usr/local/etc目錄。其他的資源文件會存放在usr/local/share目錄。這裡指定號目錄也方便後續的卸載,後續直接rm -rf /usr/local/redis7 即可刪除redis。
設置環境變數
sudo cp /usr/local/redis7/redis-stable/bin/redis-cli /usr/local/bin
sudo cp /usr/local/redis7/redis-stable/bin/redis-server /usr/local/bin
sudo cp /usr/local/redis7/redis-stable/bin/redis-sentinel/usr/local/bin
至此下載安裝完畢,啟動redis
redis-server& /usr/local/redis7/redis-stable/redis.conf --這裡加入& 符號,進行後臺啟動
二.redis.conf文件的一些基本配置
daemonize --表示啟用守護進程,預設是no,開啟時redis將以後臺服務的形式運行。
requirepass --認證密碼
port --監聽埠,預設為6379
database --設置資料庫的db數量
bind --綁定的主機,bind=127.0.0.1只能接受本機的訪問請求,不寫的情況下,無限制接受任何ip地址的訪問
protected-mode --保護模式:可選項值yes或者no。該模式控制外部網是否可以連接redis服務,預設是yes,所以預設我們外網是無法訪問的,如需外網連接rendis服務則需要將此屬性改為no。
maxclient --設置同一時間最大客戶端連接數,預設無限制,Redis 可以同時打開的客戶端連接數為 Redis 進程可以打開的最大文件描述符數,如果設置 maxclients 0,表示不作限制。當客戶端連接數到達限制時,Redis 會關閉新的連接並向客戶端返回 max number of clients reached 錯誤信息。
dir --資料庫rdb文件存放路徑,預設為./ ,即和當前redis.config文件同一目錄下
dbfilename --指定資料庫文件名
刪除預設註釋行後的redis.config 文件
使用命令 sed -i -e '/#/d;/^$/d' redis.conf
#綁定的主機,bind=127.0.0.1只能接受本機的訪問請求,不寫的情況下,無限制接受任何ip地址的訪問 bind * #保護模式:可選項值yes或者no。該模式控制外部網是否可以連接redis服務,預設是yes,所以預設我們外網是無法訪問的,如需外網連接rendis服務則需要將此屬性改為no。 protected-mode yes #指定 Redis 監聽埠,預設埠為 6379 port 6379 #設置tcp的backlog,backlog其實是一個連接隊列,backlog隊列總和=未完成三次握手隊列 + 已經完成三次握手隊列。預設為511 tcp-backlog 511 #一個空閑的客戶端維持多少秒關閉。0表示永不關閉 timeout 0 #對訪問客戶端的心跳檢測,每n秒檢測一次,預設為300 tcp-keepalive 300 #表示啟用守護進程,預設是no,開啟yes時redis將以後臺服務的形式運行。 daemonize yes #當Redis以守護進程方式運行時,Redis預設會把pid寫入/var/run/redis.pid文件,可以通過pidfile指定 pidfile "/var/run/redis_6379.pid" #日誌等級,Redis總共支持四個級別:debug、verbose、notice、warning,預設為notice loglevel notice #日誌名稱,指定日誌文件目錄,預設是logfile"",表示只在標準控制台輸出 logfile "" #資料庫db數量數量,預設為16 databases 16 #是否顯示logo always-show-logo no #預設情況下,Redis 會修改進程標題(如“top”和“ps”所示)以提供一些運行時信息。 可以通過將以下設置為 no 來禁用它並使進程名稱保持為已執行狀態。 set-proc-title yes #在更改進程標題時,Redis 使用以下模板來構造修改後的標題。 #模板變數在大括弧中指定。 支持以下變數: #{title} 父進程執行的進程名稱,或子進程的類型。 #{listen-addr} 綁定地址或 ‘*’ 後跟 TCP 或 TLS 埠偵聽,或 Unix 套接字(如果可用)。 #{server-mode} 特殊模式,即“[sentinel]”或“[cluster]”。 #{port} TCP 埠監聽,或 0。 #{tls-port} TLS 埠監聽,或 0。 #{unixsocket} 監聽的 Unix 域套接字,或 “”。 #{config-file} 使用的配置文件的名稱。 proc-title-template "{title} {listen-addr} {server-mode}" #持久化是出錯了,是否繼續工作 stop-writes-on-bgsave-error yes #是否壓縮rdb文件 rdbcompression yes #保存rdb文件時,是否進行錯誤的校驗 rdbchecksum yes #存的rdb文件名稱 dbfilename "dump.rdb" #Redis主從全量同步時,通過RDB文件傳輸實現。如果沒有開啟持久化,同步完成後,是否要移除主從同步的RDB文件,預設為no。 rdb-del-sync-files no
#存的rdb文件位置 dir "/usr/local/redis7/redis-stable" #當一個slave失去和master的連接,或者同步正在進行中,slave的行為有兩種可能: #1) 如果 replica-serve-stale-data 設置為 "yes" (預設值),slave會繼續響應客戶端請求,可能是正常數據,也可能是還沒獲得值的空數據 #2) 如果 replica-serve-stale-data 設置為 "no",slave會回覆"正在從master同步(SYNC with master in progress)"來處理各種請求,除了 INFO 和 SLAVEOF 命令 replica-serve-stale-data yes #你可以配置salve實例是否接受寫操作。可寫的slave實例可能對存儲臨時數據比較有用(因為寫入salve# 的數據在同master同步之後將很容被刪除),但是如果客戶端由於配置錯誤在寫入時也可能產生一些問題。 #從Redis2.6預設所有的slave為只讀 #註意:只讀的slave不是為了暴露給互聯網上不可信的客戶端而設計的。它只是一個防止實例誤用的保護層 #一個只讀的slave支持所有的管理命令比如config,debug等。為了限制你可以用'rename-command'來隱藏所有的管理和危險命令來增強只讀slave的安全性 replica-read-only yes #同步策略: 磁碟或socket,預設yes磁碟方式 repl-diskless-sync yes #如果非磁碟同步方式開啟,可以配置同步延遲時間,以等待master產生子進程通過socket傳輸RDB數據給slave #預設為5秒,如果配置為0,表示同步無延遲 repl-diskless-sync-delay 5 #非磁碟複製時,可以設置延遲 #當啟用無磁在達到最大延遲之前開始複製期望已連接的副本數。預設值為0表示等待最大延遲 repl-diskless-sync-max-replicas 0 #不使用無磁碟載入 repl-diskless-load disabled #在slave和master同步後(發送psync/sync),後續的同步是否設置成TCP_NODELAY #假如設置成yes,則redis會合併小的TCP包從而節省帶寬,但會增加同步延遲(40ms),造成master與slave數據不一致 #假如設置成no,則redis master會立即發送同步數據,沒有延遲 repl-disable-tcp-nodelay no #主從複製下,優先順序,哨兵模式:主機宕機,從機優先順序數低的優先順序低的,更適合升級為主機,預設為100 replica-priority 100 #acl日誌,用於記錄失敗或者阻塞的命令,定義acl最大表項長度 acllog-max-len 128 #採用UNLINK命令,刪除key時,提供非同步延時釋放,key記憶體的功能 lazyfree-lazy-eviction no #針對設置有TTL的鍵,達到過期後,被redis清理刪除時是否採用lazy free機制 lazyfree-lazy-expire no #針對有些指令在處理已存在的鍵時,會帶有一個隱式的DEL鍵的操作。如rename命令,當目標鍵已存在,redis會先刪除目標鍵,如果這些目標鍵是一個big key,那就會引入阻塞刪除的性能問題。 此參數設置就是解決這類問題,建議可開啟。 lazyfree-lazy-server-del no #針對slave進行全量數據同步,slave在載入master的RDB文件前,會運行flushall來清理自己的數據場景, #參數設置決定是否採用異常flush機制。如果記憶體變動不大,建議可開啟。可減少全量同步耗時,從而減少主庫因輸出緩衝區爆漲引起的記憶體使用增長。 replica-lazy-flush no #修改用戶的del行為操作,像unlink命令一樣 lazyfree-lazy-user-del no #FLUSHDB, FLUSHALL, SCRIPT FLUSH和FUNCTION FLUSH支持非同步和同步,刪除時,delete 將[SYNC|ASYNC]標誌傳遞到相應命令,如果命令都未通過,開啟此命令,用於非同步刪除 lazyfree-lazy-user-flush no #oom-score-adj參數指定Linux內核在記憶體不足時OOM殺死哪些進程,可選值有:yes、no,absolute。 預設值為 no 不更改oom-score-adj的值。 #yes 值是由伺服器啟動時oom-score-agj的初始值定義的,取值範圍為-1000到1000,通常是0。 #absolute 值將oom-score-adj-values參數值寫入到linux內核中,也就是按oom-score-adj-values參數值設定 oom-score-adj no #三個數值分別代表主進程、副本進程、子進程,數值越高代表被殺死的優先順序更高 oom-score-adj-values 0 200 800 #disable-thp參數指定是否禁用透明大頁,預設值為yes,表示禁用透明大頁。 #通常透明大頁預設會被設置為“madvise”或“never”,在這種情況下該參數不會起任何作用。只有當透明大頁設置為“always”時,redis預設會禁用透明大頁,以避免透明大頁帶來的延遲問題。 disable-thp yes #是否開啟aof持久化,如果開啟,在redis啟動時,將載入aof文件 appendonly no #aof持久化後,存儲的文件名稱 appendfilename "appendonly.aof" #aof持久化後,存儲的文件路徑 appenddirname "appendonlydir" #appendfsync參數指定將數據寫入(fsync)到磁碟的方式,取值有以下三種: #no 不同步,讓操作系統在需要時才刷新數據,非常快。 #always 每次寫入AOF日誌後同步,緩慢但是安全。 #everysec 每秒同步一次。 appendfsync everysec #no-appendfsync-on-rewrite參數指定是否在BGSAVE或BGREWRITEAOF階段時調用fsync,預設值為“no”。 #在appendfsync參數設定成“always”或“everysec”,並且後臺保存進程(後臺保存進程和AOF日誌重寫)正在對磁碟執行大量I/O時,redis可能會阻塞很長時間的fsync。 #目前redis是沒有解決此問題的方法的。因此,在遇到延遲問題時,可以將該值設置為“yes”,但這就意味著在最壞的情況下可能會丟失超過30秒的日誌。 no-appendfsync-on-rewrite no #auto-aof-rewrite-percentage參數指定自動重寫AOF文件觸發的百分比,指定百分比為0,則表示禁用自動重寫AOF文件。 #redis能夠在AOF日誌文件增加到指定的百分比時,自動重寫調用BGREWRITEAOF的日誌文件。它的工作原理是這樣:redis會記錄最後一次重寫後AOF文件的大小(如果重啟後沒有發生重寫,則使用啟用時AOF的大小), #此大小與當前的大小比較,如果當前大小大於指定的百分比的話,則觸發重寫。 auto-aof-rewrite-percentage 100 #參數指定觸發重寫AOF文件的最小大小 auto-aof-rewrite-min-size 64mb #aof-load-truncated參數指定redis啟動遇到AOF文件被截斷時是否繼續載入。取值可能為: #yes reids啟動時載入截斷的AOF文件,並會列印日誌通知用戶該事件。 #no redis啟動時因錯誤拒絕啟動,此時就需要用戶手動使用“redis-check-aof”修複AOF文件。 aof-load-truncated yes #參數指定在重寫AOF文件時,是否使用RDB前導碼,以便更快的進行重寫和恢復。啟用後,重寫的AOF文件由兩個不同的部分組成:[RDB 文件] [AOF 尾部]。在載入時,redis會先識別AOF文件以“redis”字元串開頭並載入首碼RDB文件,然後繼續載入AOF尾部。 aof-use-rdb-preamble yes #是否在aof日誌中記錄時間戳 aof-timestamp-enabled no #參數指定命令執行多久會記錄到慢日誌中,以微秒為單位。設置為負數表示禁用慢日誌記錄,設置為0會強制記錄所有命令 slowlog-log-slower-than 10000 #參數指定慢日誌的最大長度,需要註意的是,它會消耗記憶體 slowlog-max-len 128 #參數指定是否開啟延遲監控子系統,預設情況下是禁用的 #通常情況下不需要開啟,只有遇到有延遲問題時,才建議開啟,開啟後會對性能有較小的影響 latency-monitor-threshold 0 notify-keyspace-events "" #指定哈希以記憶體高效的數據結構編碼的最大數量,超過該值就不會再以高效的數據結構進行編碼。 hash-max-listpack-entries 512 #指定以哈希以記憶體高效的數據結構編碼的最大哈希大小,超過該值就不會再以高效的數據結構進行編碼。 hash-max-listpack-value 64 #指定列表以一種特殊的方式編碼,以節省大量空間。該參數可選以下值: #-5 最大大小:64Kb,不推薦用於正常工作負載中 #-4 最大大小:32Kb,不推薦 #-3 最大大小:16Kb,可能不推薦 #-2 最大大小:8Kb,好 #-1 最大大小:4Kb,好 list-max-listpack-size -2 #參數指定列表壓縮的深度,該參數可選以下值: #0 禁用列表壓縮 #1 列表不壓縮頭和尾,壓縮中間部分。例如有這樣一個列表:[head] -> node -> node -> … -> node -> [tail],不會壓縮列表的head和tail,只會壓縮中間node部分。 #2 列表不壓縮頭、下一個、尾和尾的上一個。例如有這樣一個列表:[head] -> [next] -> node -> node -> … ->[prev] -> [tail],不會壓縮head、next、prev和tail,只會壓縮中間node部分。 #3 列表不壓縮頭和尾開始的三個值,例如這樣的列表:[head] -> [next] -> [next] -> node -> node -> … ->[prev] -> [prev] -> [tail] #3 列表不壓縮頭和尾開始的三個值,例如這樣的列表:[head] -> [next] -> [next] -> node -> node -> … ->[prev] -> [prev] -> [tail] list-compress-depth 0 set-max-intset-entries 512 zset-max-listpack-entries 128 zset-max-listpack-value 64 hll-sparse-max-bytes 3000 stream-node-max-bytes 4kb stream-node-max-entries 100 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit replica 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 dynamic-hz yes aof-rewrite-incremental-fsync yes rdb-save-incremental-fsync yes jemalloc-bg-thread yes #認證密碼 requirepass "lin789."
三.主從複製
複製redis.conf,分別取名slave_1.conf、slave_2.conf
cp /usr/local/redis7/redis-stable/redis.conf /usr/local/redis7/redis-stable/slave_1.conf
cp /usr/local/redis7/redis-stable/redis.conf /usr/local/redis7/redis-stable/slave_2.conf
修改slave_1.conf文件,除涉及埠外屬性,其他保持一致。最後一步需要加上同步的主機的ip和埠
#監聽埠
port 6378
#redis認證密碼 requirepass "lin789."
#主機認證密碼 masterauth "lin789."
#工作目錄 dir "/usr/local/redis7/redis-stable"
#rdb文件名稱 dbfilename "slave_1.rdb"
#pidfile文件名稱 pidfile "/var/run/redis_6378.pid"
#需要同步的主機ip、埠
replicaof <主機ip> <埠>
修改slave_2.conf文件,操作步驟同上
分別以配置文件redis.conf、slave_1.conf、slave_2.conf 啟動redis服務
cd /usr/local/redis7/redis-stable
redis-server redis.conf
redis-server slave_1.conf
redis-server slave_2.conf
進入到埠為6379的redis服務里
使用命令 redis-cli -p 6379 -a lin789.
使用命令查看集群狀態 info replicaion
四、哨兵模式
備註:這裡哨兵服務只啟用了一個,所以選舉是1
進入到目錄下
cd /usr/local/redis7/redis-stable
編輯sentinel.conf文件
vim sentienl.conf
如下:
protected-mode no port 26379 daemonize yes pidfile "/var/run/redis-sentinel.pid" logfile "/usr/local/redis7/redis-stable/sentinel.log" # 主節點的ip sentinel announce-ip "127.0.0.1" # 哨兵的埠 sentinel announce-port 23679 # 哨兵的工作目錄 dir "/usr/local/redis7/redis-stable" # 哨兵監聽的master資料庫,1表示選舉數,這裡master ip 為主機外網ip地址 sentinel monitor mymaster <master ip> 6379 1 # 配置master的登錄密碼 sentinel auth-pass mymaster lin789. # 10s內無響應,則認為master掛掉 sentinel down-after-milliseconds mymaster 10000 acllog-max-len 128 #保持預設配置 sentinel deny-scripts-reconfig yes sentinel resolve-hostnames no sentinel announce-hostnames no
編輯完畢後保存退出,使用命令 :wq
使用命令開啟哨兵模式
redis-sentinel sentinel.conf
截止目前開啟 redis 開啟的相關服務
ps -aux|grep redis
根據配置文件的埠號,進入哨兵服務
redis-cli -p 26379 --登錄哨兵
sentinel master mymaster --哨兵監聽的master信息
sentinel replicas mymaster --查看master下的slave 信息
五、集群模式
cd /usr/local/redis7 --進入到redis7目錄
mkdir cluster --新建cluster文件夾
cd cluster --進入到cluster 文件下,創建如下6個文件夾,用於存放redis集群配置文件
回到redis7目錄下,創建redis.sh命令文件,用於複製redis.conf、redis-cli 、redis-server 文件到剛纔創建目錄中。內容如下:
for i in {1..6} do cp /usr/local/redis7/redis-stable/redis.conf /usr/local/redis7/cluster/redis600$i cp /usr/local/redis7/redis-stable/bin/redis-cli /usr/local/redis7/redis-stable/bin/redis-server /usr/local/redis7/cluster/redis600$i done
修改/usr/local/redis7/cluster/redis6001目錄下 redis.conf 文件,如下
#註釋掉bind項或不修改預設監聽所有網卡
bind 10.0.8.12
#修改,關閉保護模式
protected-mode no
#監聽埠
port 6001
#開啟守護進程,以獨立進程啟動
daemonize yes
#開啟集群模式
cluster-enabled yes
#取消註釋,群集名稱文件設置
cluster-config-file nodes-6001.conf
#群集超時時間設置
cluster-node-timeout 15000
#資料庫名稱
dbfilename "dump6001.rdb"
#工作目錄
dir "/usr/local/redis7/cluster/redis6001"
#訪問密碼
requirepass lin789.
#訪問的主機密碼
masterauth lin789.
#聲明的外網ip,這裡註意是外網地址,否則連接集群時拒絕
cluster-announce-ip 外網ip地址
依次修改6002~6006文件夾下的redis.conf文件配置。(除埠屬性外,其他屬性配置相同)
回到redis7目錄下,創建redis.start命令文件,用於啟動 6001~6006 埠的6個redis服務。內容如下:
for d in {1..6} do cd /usr/local/redis7/cluster/redis600$d redis-server redis.conf done
回到redis7目錄下, 使用shell命令,啟動redis集群
sh -x redis_start.sh
啟動後服務如下:
使用命令創建集群
redis-cli --cluster create --cluster-replicas 1 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 -a lin789.
備註:這裡127.0.0.1 實際部署時需要換成外網ip,cluster-replicas 1表示主機器最少需要1從,這裡6個redis服務,3主3從
firewall-cmd --add-port=6001/tcp --add-port=6002/tcp --add-port=6003/tcp --add-port=6004/tcp --add-port=6005/tcp --add-port=6006/tcp --開啟防火牆埠
firewall-cmd --add-port=16001/tcp --add-port=16002/tcp --add-port=16003/tcp --add-port=16004/tcp --add-port=16005/tcp --add-port=16006/tcp --開啟redis匯流排埠
redis-cli -h 10.0.8.12 -p 6001 -c -a lin789. --進入到埠為6001服務里
cluster info --查看集群信息
cluster nodes --查看集群節點信息
六、一些問題記錄
1.哨兵模式開啟,後模擬主機服務宕機,主從無法切換問題,報錯:Next failover delay: I will not start a failover before
解決方案兩種情況:a.如果是單機下搭建的主從模式,可以修改從機conf配置文件,replicaof 127.0.0.1 + 主機埠
b.開放防火牆埠,以及雲伺服器防火牆埠
2.單機搭建的集群模式下,進入redis後臺模式,操作redis命令沒有問題,外網連接集群時,訪問拒絕或超時
解決方案:創建集群時直接用外網ip:redis-cli --cluster create --cluster-replicas 1 <外網ip>:6001 <外網ip>:6002 <外網ip>:6003 <外網ip>:6004 <外網ip>:6005 <外網ip>:6006 -a lin789.
依次打開redis防火牆匯流排埠號16001(6001+10000)
依次修改對應redis節點下的,redis.confg文件中 cluster-announce-ip 屬性為外網ip
七、參考的一些博客鏈接
redis基本安裝和一些配置
https://www.cnblogs.com/AllWjw/p/15771097.html --redis 安裝
https://www.cnblogs.com/AllWjw/p/15771097.html --redis 安裝
https://blog.csdn.net/weixin_45522528/article/details/126636808 --redis.conf一些說明
https://bxbdba.com/archives/redisredisconf%E8%AF%A6%E8%A7%A3 --redis.config 說明
https://blog.csdn.net/weixin_52270081/article/details/120564024 --linux 命令刪除配置行
主從複製
https://blog.csdn.net/weixin_40980639/article/details/125569460 --主從模式
哨兵模式
https://blog.csdn.net/ycx987/article/details/128517285
https://blog.csdn.net/FlyLikeButterfly/article/details/120780277
https://blog.csdn.net/MssGuo/article/details/127163216 --哨兵模式
https://blog.csdn.net/m0_51426055/article/details/129224592 --哨兵模式的啟動與關閉
集群模式
https://www.cnblogs.com/cjsblog/p/9048545.html -- 集群模式
https://www.cnblogs.com/wzh2010/p/15886799.html --集群模式的一些概念原理
https://www.lmlphp.com/user/58834/article/item/815649/
https://blog.csdn.net/m0_59092234/article/details/126596703 --redis集群一些增容和縮容方法,springboot整合redis集群
https://cloud.tencent.com/developer/article/1919678 --哈希槽分配異常