redis哨兵
部署方式
redis配置
首先需要區分的是主從redis,主機也就是用來寫的機器,從機是從來讀的,為主機分擔壓力,與叢集不同的是redis哨兵不可通過從機寫入資料同步到主機,但是也可以配置引數實現從機可寫
你可以配置salve例項是否接受寫操作。可寫的slave例項可能對儲存臨時資料比較有用(因為寫入salve的資料在同master同步之後將很容易被刪除)
slave-read-only yes
redis主機還是和正常的redis配置一樣
redis從機需要配置一下引數(192.168.6.136 16379是主redis地址)
slaveof 192.168.6.136 16379 # redis舊版本使用
replicaof 192.168.6.136 16379 # redis 5.x版本往後更新
slave-priority 數值
值必須滿足>0 ,預設100,就是使用哨兵時,當主master,哨兵會優先選擇slave-priority數值小的當主機
redis不用多說,主從機器配置好後就可以正常執行了,這時候從機就會主動同步主機的內容
哨兵配置
首先說下哨兵是幹啥的
如果沒有哨兵,當主機失聯之後,人為的知道了他失聯了,需要手動把一臺redis切換為主redis,這就需要人工干預,費事費力,而且還會導致服務一段時間不可用
哨兵切換:你配置的哨兵都是獨立執行的程式,它們都是自己獨立執行,不用依賴於redis,實現切換主從的原理就是,首先主機當機了,哨兵會定時向主節點傳送ping命令,然後哨兵中可以配置一個引數down-after-milliseconds,如果超過down-after-milliseconds還未收到某節點回復,則認為該節點下線,僅僅一個哨兵發現主機下線並不會對主機進行操作,需要等一定的哨兵認定他下線後(哨兵配置的主機地址後面的數值引數),哨兵之間會互相檢測(每兩秒交換一次資料)才進行操作,當哨兵檢測滿足了切換主機的條件後,將會進行一次投票,投票通過得主機獲得了主機許可權,並且哨兵會自動更改redis與哨兵的配置檔案,死掉的主機恢復後,也會自動切換到此機器下成為此機器的從機,哨兵配置http://wiki.sdnetwan.net/pages/viewpage.action?pageId=28610094
注意的點,哨兵配置引數down-after-milliseconds的預設值是30000,即30s,可以根據不同的網路環境和應用要求來調整:值越大,對主觀下線的判定會越寬鬆,好處是誤判的可能性小,壞處是故障發現和故障轉移的時間變長,客戶端等待的時間也會變長。例如,如果應用對可用性要求較高,則可以將值適當調小,當故障發生時儘快完成轉移;如果網路環境相對較差,可以適當提高該閾值,避免頻繁誤判。
sentinel failover-timeout與故障轉移超時的判斷有關,但是該引數不是用來判斷整個故障轉移階段的超時,而是其幾個子階段的超時,例如如果主節點晉升從節點時間超過這個時間,或從節點向新的主節點發起復制操作的時間(不包括複製資料的時間)超過這個時間,都會導致故障轉移超時失敗。
failover-timeout的預設值是180000,即180s;如果超時,則下一次該值會變為原來的2倍。
哨兵坑:配置下面的引數時與哨兵切換主從投票的坑
sentinel monitor
注意!!!! 此處的quorum只是代表了客觀上主節點失聯,選舉主redis時還需要通過半數以上的投票才可
配置:
protected-mode no
bind 0.0.0.0
port 16380
daemonize yes
sentinel monitor master 192.168.6.136 16379 2
sentinel down-after-milliseconds master 5000
sentinel failover-timeout master 180000
sentinel parallel-syncs master 1
sentinel auth-pass master 123456
logfile /var/log/redis/sentinel-16380.log
配置完生成:增加的配置地址為自動獲取的從機地址
protected-mode no
bind 0.0.0.0
port 26380
daemonize yes
sentinel myid 2f296b552047f4f3a51e76807b5242d816303afd
sentinel deny-scripts-reconfig yes
sentinel monitor master 192.168.6.136 16379 2
sentinel down-after-milliseconds master 15000
logfile "/var/log/redis/sentinel-26380.log"
# Generated by CONFIG REWRITE
dir "/usr/local/redis-sentinel"
sentinel auth-pass master 123456
sentinel config-epoch master 437
sentinel leader-epoch master 437
sentinel known-replica master 192.168.6.137 16379
sentinel known-replica master 192.168.6.136 26379
sentinel known-sentinel master 192.168.6.136 26380 16b5148c5b96e169f1a4f3023a26d1df0c8abf81
sentinel known-sentinel master 192.168.6.137 16380 918a0c444822bbf5612fed5d181a14d203b9f2df
sentinel current-epoch 437
哨兵的三個定時任務
-
定時任務一:每個哨兵節點每10 秒會向主節點和從節點傳送info 命令獲取最拓撲結構圖,哨兵配置時只要配置對主節點的監控即可,通過向主節點傳送info,獲取從節點的資訊,並當有新的從節點加入時可以馬上感知到 。
-
定時任務二:每個哨兵節點每隔2 秒會向redis 資料節點的指定頻道上傳送該哨兵節點對於主節點的判斷以及當前哨兵節點的資訊,同時每個哨兵節點也會訂閱該頻道,來了解其它哨兵節點的資訊及對主節點的判斷,其實就是通過訊息publish 和subscribe 來完成的。
-
定時任務三:每隔1 秒每個哨兵會向主節點、從節點及其餘哨兵節點傳送一次ping 命令做一次心跳檢測,這個也是哨兵用來判斷節點是否正常的重要依據
想法:使用redis不改變單例的模式時可使用一個函式函式是一個生成器,每次都返回連線主機
哨兵實現故障轉移選舉新master的步驟
-
步驟一:在從節點中選擇新的主節點:選擇的原則是,首先過濾掉不健康的從節點;然後選擇優先順序最高的從節點(由redis中的引數slave-priority指定);如果優先順序無法區分,則選擇複製偏移量最大的從節點;如果仍無法區分,則選擇runid最小的從節點。
-
步驟二:更新主從狀態:通過slaveof no one命令,讓選出來的從節點成為主節點;並通過slaveof命令讓其他節點成為其從節點。
-
步驟三:將已經下線的主節點(即6379)設定為新的主節點的從節點,當6379重新上線後,它會成為新的主節點的從節點。
-
走完上邊三步驟後Redis的故障轉移才算完整結束
redis叢集
Redis Cluster 叢集模式具有 高可用、可擴充套件性、分散式、容錯 等特性,用的CRC16演算法,這是是一種迴圈校驗演算法
部署方式
redis配置
cluster-enabled yes(啟動叢集模式)
cluster-config-file nodes.conf 叢集中各個redis都有這個檔案,儲存的是所有node資訊
cluster-node-timeout 15000 超時時限,就是叢集中的redis互相檢測,進行ping命令時超過這個時間就認定他失效了,預設15000
啟動叢集模式時,需要開啟這幾項的註釋,其餘是可不變
建立叢集
redis-cli --cluster create 183.2.212.156:7001 183.2.212.156:7002 183.2.212.156:7006 172.30.10.46:7001 172.30.10.46:7002 172.30.10.46:7006 --cluster-replicas 1
--cluster-replicas 1 這個指定一主一從模式,前面的三個地址是主機,後面的三個地址是從機
叢集fail認定條件
- 當一半以上的主機同時當機,叢集fail了,不可用了
- 當一個主機死掉,並且這個主機下面沒有從節點來代替他的位置,則叢集fail了,不可用了
叢集切換主從
與哨兵差不多,不過不是哨兵進行故障的切換操作,是redis相互之間每一秒會進行通訊,如果返回pong或者超過我們們設定的cluster-node-timeout引數後,則認定此主機當機了,他也會有一個投票機制,當一個認為他當機時,並不會進行故障轉移,只有當認定他當機的主機超過總主機的一半後,才進行故障轉移,會找此主機下面的活躍的slave代替主機位置,將主機槽位轉移到此機器上
叢集底層命令
坑:redis叢集的主從節點,不要在同一伺服器上,這會導致一套伺服器當機,所有的機器都不可用!!
叢集
# 叢集
cluster info 印表機群資訊
cluster nodes 列出叢集當前已知的所有節點,以及這些節點的相關資訊
節點操作
cluster meet <ip> <port> 將這個ip和port指定的節點增加到我們們的叢集中
cluster forget <node_id> 將這個node移除(經過測試,假移除,只是假刪除了1分鐘,1分鐘後,如果這個節點是可用的,則恢復),可用於切換主從
cluster replicate <node_id> 將此節點設定為該node記得從節點(注意,此節點必須為空節點,或者從節點)
cluster failover 可理解為切換主從的,人工判定主機的死亡,將此機器切換為主機
鍵操作
cluster keyslot <key> 計算鍵 key 應該被放置在哪個槽上
cluster countkeysinslot <slot> 返回槽 slot 目前包含的鍵值對數量
cluster getkeysinslot <slot> <count> 返回 count 個 slot 槽中的鍵
redis-cli叢集命令
新增節點
# 新增節點
redis-cli --cluster add-node 172.30.12.46:7003 172.30.12.46:7004
前面的地址為叢集中任意節點,後面是新增的節點地址
# 新增節點並且設定為某節點的從機
redis-cli --cluster add-node 172.30.12.46:7003 172.30.12.46:7004 --cluster-slave --cluster-master-id <node_id>
第一個地址為叢集中任意節點,後面地址為新增的節點地址 最後node_id為需要繫結到主機的nodeid
移除節點
redis-cli --cluster del-node 172.30.12.46:7003 <node_id>
前面的地址為叢集中任意節點,後面是需要刪除的node的node_id
叢集
redis-cli --cluster check host:port # 檢查叢集
redis-cli --cluster info host:port # 檢視叢集狀態
redis-cli --cluster fix host:port #修復叢集
redis-cli --cluster fix host:port --cluster-search-multiple-owners #修復槽的重複分配問題
redis-cli --cluster reshard host:post # 槽位分配
redis-cli --cluster reshard $cluster_ip --cluster-from $in_node --cluster-to $to_node --cluster-slots $slots --cluster-yes # 分配槽位簡單命令
docker_name=$1 # docker名
cluster_ip=$2 # 叢集中的節點ip
to_node=$3 # 獲取槽位的主機地址
in_node=$4 # 分配槽位的主機地址
slots=$5 # 槽位個數
redis-cli import host:port #將外部redis資料匯入叢集
--cluster-from <arg> #將指定例項的資料匯入到叢集
--cluster-copy #migrate時指定copy
--cluster-replace #migrate時指定replace
坑:當一個節點沒有槽位時,無法轉換主從,不能用failover轉換主從!!!!!!!!!