Redis 支持持久化保證了即使在服務器重啟的情況下也不會丟失(或少量丟失)數據,但是由於數據是存儲在一台服務器上的,如果這台服務器出現故障,比如硬盤壞了,也會導致數據丟失。為了避免單點故障,我們需要將數據復制多份部署在多台不同的服務器上,即使有一台服務器出現故障其他服務器依然可以繼續提供服務。這就要求當一台服務器上的數據更新后,自動將更新的數據同步到其他服務器上,那該怎么實現呢?
一: 主從復制
Redis 提供了復制(replication)功能來自動實現多台 redis 服務器的數據同步(每天19 點新聞聯播,基本從 cctv1-8,各大衛視都會播放)。我們可以通過部署多台 redis,並在配置文件中指定這幾台 redis 之間的主從關系,主負責寫入數據,同時把寫入的數據實時同步到從機器,這種模式叫做主從復制,即master/slave,並且 redis 默認 master 用於寫,slave 用於讀,向 slave 寫數據會導致錯誤。
方式 1:修改配置文件,啟動時,服務器讀取配置文件,並自動成為指定服務器的從服務器,從而構成主從復制的關系。
方式 2: ./redis-server --slaveof <master-ip><master-port>,在啟動 redis 時指定當前服務成為某個主 Redis 服務的從 Slave。(不常用)
方式一操作步驟:
復制三份Redis.conf
編輯 Master 的配置文件 redis6380.conf(另外兩個類似) : 在空文件加入如下內容
include /路徑/redis-版本/redis.conf
daemonize yes
port 6380
pidfile /var/run/redis_6380.pid
logfile 6380.log
dbfilename dump6380.rdb
配置項說明:
include :包含原來的配置文件內容。/路徑/redis-版本/redis.conf 按照自己的目錄設置。
daemonize:yes 后台啟動應用,相當於 ./redis-server & , &的作用。
port : 自定義的端口號
pidfile : 自定義的文件,表示當前程序的 pid ,進程 id。
logfile:日志文件名
dbfilename:持久化的 rdb 文件名
啟動三個Redis服務:
./redis-server ../redis6380.conf
./redis-server ../redis6381.conf
./redis-server ../redis6382.conf
查看他們的復制關系:info replication
redis3680:
redis6381 :
容災處理
當 Master 服務出現故障,需手動將 slave 中的一個提升為 master,剩下的 slave 掛至新的
master 上(冷處理:機器掛掉了,再處理)
手動容災:
①:slaveof no one,將一台 slave 服務器提升為 Master (提升某 slave 為 master)
②:slaveof 127.0.0.1 6381 (將 slave 掛至新的 master 上)
二: 高可用 Sentinel 哨兵
Sentinel 哨兵是 redis 官方提供的高可用方案,可以用它來監控多個 Redis 服務實例的運行情況。Redis Sentinel 是一個運行在特殊模式下的 Redis 服務器。Redis Sentinel 是在多個Sentinel 進程環境下互相協作工作的。Sentinel 系統有三個主要任務:
監控:Sentinel 不斷的檢查主服務和從服務器是否按照預期正常工作。
提醒:被監控的 Redis 出現問題時,Sentinel 會通知管理員或其他應用程序。
自動故障轉移:監控的主 Redis 不能正常工作,Sentinel 會開始進行故障遷移操作。將一個從服務器升級新的主服務器。讓其他從服務器掛到新的主服務器。同時向客戶端提供新的主服務器地址。
復制三分Sentinel.conf 配置文件: 執行復制命令 cp sentinel.conf xxx.conf
1、修改 port 26380、 port 26381、 port 26382
2、修改 sentinel monitor mymaster 127.0.0.1 6380 2
格式:Sentinel monitor <name><masterIP><masterPort><Quorum 投票數>
啟動 Sentinel
執行以下三條命令,將創建三個監視主服務器的Sentinel實例:
./redis-sentinel ../sentinel26380.conf
./redis-sentinel ../sentinel26381.conf
./redis-sentinel ../sentinel26382.conf
主 Redis 不能工作,讓 Master 的 Redis 停止服務,執行 shutdown
先執行 info replication 確認 Master 的 Redis,再執行 shutdown(6380)
重新啟動6380:./redis-server ../redis6380.conf
Sentinel日志:
總結:主從復制,解決了讀請求的分擔,從節點下線,會使得讀請求能力有所下降,Master 下
線,寫請求無法執行,Sentinel 會在 Master 下線后自動執行故障轉移操作,提升一台 Slave 為 Master,並讓其它Slave 成為新 Master 的 Slave。
Redis部署了主從復制和監控哨兵就萬事大吉?當然不是,當redis內存不夠怎么辦,幾台redis內存大小有差別,還容易形成木桶效應,這時候就需要考慮到Redis的分片問題,市面上提供了一些redis的分片技術,比如redis官方推薦的Redis Cluster,豌豆莢開源的codis,Twitter 開發的Twemproxy ,還有自定義客戶端分片等。
分區實現方案:
- 客戶端分區就是在客戶端就已經決定數據會被存儲到哪個redis節點或者從哪個redis節點讀取。大多數客戶端已經實現了客戶端分區。
- 代理分區 意味着客戶端將請求發送給代理,然后代理決定去哪個節點寫數據或者讀數據。代理根據分區規則決定請求哪些Redis實例,然后根據Redis的響應結果返回給客戶端。(Twemproxy)
- 查詢路由(Query routing) 的意思是客戶端隨機地請求任意一個redis實例,然后由Redis將請求轉發給正確的Redis節點。Redis Cluster實現了一種混合形式的查詢路由,但並不是直接將請求從一個redis節點轉發到另一個redis節點,而是在客戶端的幫助下直接redirected到正確的redis節點。(Redis Cluster)
三:Redis安全設置
1.密碼設置
訪問 Redis 默認是沒有密碼的,這樣不安全,任意用戶都可以訪問。可以啟用使用密碼才能訪問 Redis。設置 Redis 的訪問密碼,修改 redis.conf 中這行 requirepass 密碼。密碼要比較復雜,不容易破解,而且需要定期修改。因為 redis 速度相當快,所以在一台比較好的服務器下,一個外部的用戶可以在一秒鍾進行 150K 次的密碼嘗試,需要指定非常非常強大的密碼來防止暴力破解。修改 redis.conf , 使用 vim 命令。找到 requirepass 行去掉注釋,requirepass 空格后就是密碼。
2.綁定 ip
修改 redis.conf 文件,把# bind 127.0.0.1 前面的注釋#號去掉,然后把 127.0.0.1 改成允許訪問你 redis 服務器的 ip 地址,表示只允許該 ip 進行訪問。多個 ip 使用空格分隔。例如 bindIP地址 ip地址。
一致性hash和hash slat:https://www.cnblogs.com/qcblog/p/8886360.html