如果只有一臺redis的話,這臺redis掛掉了怎麼辦,難道只能等待他修好嗎?這樣會對用戶的訪問造成很大的印象,所以redis的高可用也很關鍵。下面就是redis高可用的兩種實現方案
文章目錄
Redis的哨兵機制
1.什麼是哨兵
Sentinel(哨兵)是用於監控Redis集羣中Master狀態的工具,是 Redis 高可用解決方案,哨兵可以監視一個或者多個redis master服務,以及這些master服務的所有從服務;當某個master服務宕機後,會把這個master下的某個從服務升級爲master來替代已宕機的master繼續工作。
2.哨兵機制詳解
2.1 哨兵監控
當我們啓動哨兵之後,哨兵會檢測我們的所有redis節點,我們的哨兵也不只是一個,可以是多個做成一個哨兵集羣,同時檢測redis集羣。
2.2 故障轉移觸發條件
當我們的master因爲一些原因掉線之後,哨兵檢測到就會開始故障轉移工作,但不是有一個哨兵檢測到master宕機就可以進行故障轉移,如果只有一個哨兵檢測到master宕機被稱爲主觀下線,並不會達成故障轉移的條件,多個哨兵都檢測到master異常被稱爲客觀下線。只有是客觀下線狀態纔會觸發故障轉移,多少個哨兵檢測到Mastr異常纔算作客觀下線在配置文件中可以配置,配置項名稱叫做quorun
。
2.3 選舉leader
當滿足客觀下線狀態後就開始了故障轉移工作,故障轉移工作是由哨兵來操作的,這個時候哨兵們會進行一個選舉,票數最多的人會來執行故障轉移工作,這個哨兵會在其他從節點中選擇一個作爲master,再由這個master去同步數據到從節點,同時同步從節點個數可以配置,配置項爲:sentinel parallel-syncs mymaster 1
,該配置項是幾,就會有幾個從節點一起同步。當同步完成後,哨兵就會繼續監控這個redis集羣.
2.4 原master恢復
當原master從故障中恢復之後,會再次加入整個redis集羣中,但是這個時候原master只能當做從節點了,如果新master故障之後,原master會和其他的master在一起競爭。
3.redis哨兵方式的配置
在redis的安裝目錄下有一個叫sentinel.conf
的配置文件,哨兵方式的配置都在這個下面
修改配置文件:
1.protected-mode
是否開啓公網保護
yes 開啓保護,只有配置的ip可以訪問
no 不開啓,所以ip都可以訪問
2.port
哨兵的端口號
3.daemonize
是否後臺啓動
yes 開啓
no 不開啓
4.pidfile
進程的pid
5.logfile
哨兵日誌存儲位置
6.dir
工作目錄
7.sentinel monitor
:哨兵核心配置
# ‘mymaster’ 哨兵名稱
# ‘127.0.0.1’ 監控的redis master ip
# ‘6379’redis的端口
# ‘2’表示幾臺哨兵監聽不到msater,才標記master爲宕機狀態
sentinel monitor mymaster 127.0.0.1 6379 2
8.sentinel auth-pass
redis的密碼
9.sentinel down-after-milliseconds
設定宕機多少毫秒後失效
啓動哨兵:redis-sentinel sentinel.conf
啓動後如果在ps-ef |grep redis
中存在哨兵進程,則爲啓動成功
4.哨兵信息檢查
# 查看哨兵下的master節點信息 sentinel master mymaster
# 查看哨兵下的slaves節點信息 sentinel slaves mymaster
# 查看哨兵下的哨兵節點信息 sentinel sentinels mymaster
Redis的集羣
1.什麼是Redis集羣
主從複製以及哨兵,他們可以提高讀的併發,但是單個master容量有限,數據達到一定程度會有瓶頸,這個時候可以通過水平擴展爲多master-slave成爲集羣。
redis-cluster:他可以支撐多個master-slave,支持海量數據,實現高可用與高併發。
2.Redis集羣配置
1.修改redis配置文件,所有的配置項都在REDIS CLUSTER
這個下面
# 開啓集羣模式
cluster-enabled yes
# 每一個節點需要有一個配置文件,每個節點處於集羣的角色都需要告知其他所有節點,彼此知道,這個文件用於存儲集羣模式下的集羣狀態等信息,這個文件是由redis自己維護,我們不用管。如果你要重新創建集羣,那麼把這個文件刪了就行
cluster-config-file nodes-201.conf
# 超時時間,超時則認爲master宕機,隨後主備切換
cluster-node-timeout 5000
# 開啓AOF
appendonly yes
2.啓動redis
3.創建集羣
##### # 注意1:如果你使用的是redis3.x版本,需要使用redis-trib.rb來構建集羣,最新版使用C語言來構建了,這個要注意
# 注意2:以下爲新版的redis構建方式 #####
# 創建集羣,主節點和從節點比例爲1,1-3爲主,4-6爲從,1和4,2和5,3和6分別對應爲主從關係,這也是最經典用的最多的集羣模式
redis-cli --cluster create ip1:port1 ip2:port2 ip3:port3 ip4:port4 ip5:port5 ip6:port6 --cluster-replicas 1
4.檢查集羣信息
redis-cli --cluster check 192.168.25.64:6380
3.slot槽節點
在redis集羣中數據都是存放的槽節點中,槽節點是所有redis主節點平均分配,每個數據進來之後會經過hash算法之後存放到不同的槽中,而不同的槽又在不同的redis主節點上,所以數據就會存放到不同的redis節點中,比如集羣中有三個redis節點,三個節點會均分所有的槽節點,當一個key進來以後,通過hash假如分配到了5000這個槽中,5000這個槽假假如在A節點中,那麼這個數據就會存放到A節點上
總結
哨兵模式:其實也是一種集羣,他能夠提高讀請求的併發,但是容錯方面可能會有一些問題,比如master同步數據給slave的時候,這其實是異步複製吧,這個時候master掛了,那麼slave上的數據就沒有master新,數據同步需要時間的,1-2秒的數據會丟失。master恢復並轉換成slave後,新數據則丟失。
集羣模式:
- 每個節點知道彼此之間的關係,也會知道自己的角色,當然他們也會知道自己存在與一個集羣環境中,他們彼此之間可以交互和通信,比如ping pong。那麼這些關係都會保存到某個配置文件中,每個節點都有,這個我們在搭建的時候會做配置的。
- 客戶端要和集羣建立連接的話,只需要和其中一個建立關係就行。
- 某個節點掛了,也是通過超過半數的節點來進行的檢測,客觀下線後主從切換,和我們之前在哨兵模式中提到的是一個道理。
- Redis中存在很多的插槽,又可以稱之爲槽節點,用於存儲數據。