redis主從複製配置原理redis
經過過持久化功能,Redis保證了即便在服務器重啓狀況下也不會損失數據,但因爲數據存儲在一臺服務器上,服務器的硬盤出現故障也會致使數據丟失。爲了不單點故障,但願將數據庫複製多個副本以部署在不一樣的服務器上,即便有一臺服務器出現故障其餘服務器依然能夠繼續提升服務。要求當一臺服務器上的數據更新後能夠自動將更新的數據同步到其餘區服務器上,Redis提升了複製功能能夠自動實現同步過程。
同步數據庫分爲兩類: 一類是主數據庫,一類是從數據庫。主數據庫能夠進行讀寫操做,當發生寫操做時自動將數據同步給從數據庫。而從數據庫通常只是只讀的,並接受主數據庫同步過來的數據。一個主數據庫能夠擁有多個從數據庫,而一個從數據庫只能擁有一個主數據庫。
在redis中使用複製功能很簡單,只須要在從數據庫的配置文件中加入:
slaveof 主數據庫的IP 主數據庫端口
主數據庫中的任何數據變化都會自動同步到從數據庫。默認狀況下從數據庫是隻讀的,若是直接修改從數據庫的數據會出現錯誤。但能夠設置從數據庫配置文件的slava-read-only爲no使得從數據庫可寫,對從數據庫的任何更改都不會同步給任何其餘數據庫,而且主數據庫更新了對應的數據會覆蓋從數據庫中的改動。
注意:SLAVEOF命令會中止和原來數據庫的同步轉而和新數據庫同步。還可使用SLABEOF NO ONE來使當前數據庫中止接收其餘數據庫的同步轉成主數據庫。 數據庫
操做步驟vim
安裝好redis以後,進行redis的主從配置,在同一臺主機上啓動3個redis服務,master的端口爲6379,兩個slave的端口分別是6380,6381。後端
首先分別配置啓動這3個服務:服務器
1.查找redis 配置文件的目錄測試
$locate 6379.confspa
2.修改6379.conf文件內容3d
$sudo vim 6379.conf日誌
修改內容:blog
#修改端口
port 6379
#開啓爲yes
daemonize yes
#修改pidfile
pidfile /var/run/redis_6379.pid
#修改logfile
logfile /var/log/redis_6379.log
#修改dbfilename
dbfilename dump_6379.rdb
#修改dir 持久化目錄
dir /var/lib/redis/6379
3.複製6379.conf,建立6380.conf和6381.conf文件
4.修改複製出來的文件內容
a.修改6380.conf文件內容:
#修改端口
port 6380
#開啓爲yes
daemonize yes
#修改pidfile
pidfile /var/run/redis_6380.pid
#修改logfile
logfile /var/log/redis_6380.log
#修改dbfilename
dbfilename dump_6380.rdb
#修改dir 持久化目錄
dir /var/lib/redis/6380
b.修改6381.conf文件內容:
#修改端口
port 6381
#開啓爲yes
daemonize yes
#修改pidfile
pidfile /var/run/redis_6381.pid
#修改logfile
logfile /var/log/redis_6381.log
#修改dbfilename
dbfilename dump_6381.rdb
#修改dir 持久化目錄
dir /var/lib/redis/6381
5.在/var/lib/redis/目錄下,分別建立目錄名稱爲6380和6381的文件夾,不然啓動服務會報錯
6.分別啓動637九、6380和6381的redis服務,查看連通性,以下所示6380的啓動:
這樣分別啓動了3個redis服務,目前3個服務都是單獨的,未關聯。
分別查看3個服務的狀態
接着配置主從關係
以端口6379的服務爲master,則其餘兩個端口服務爲slave,分別對6380.conf和6381.conf文件進行配置,步驟以下所示:
1.分別關閉已經啓動的服務
2.分別修改6380.conf和6381.conf的配置文件
#slaveof <masterip> <masterport>
個人修改成:
slaveof 10.60.35.60 6379
3.分別啓動端口爲6380和6381的服務
4.分別啓動客戶端,以下所示:
5.在端口爲6379的客戶端添加一個名稱爲k2的字符串
分別在端口爲6380和6381的客戶端能夠訪問
這樣一個簡單的主從配置就配好了
若是在slave節點添加數據,將會報錯:
由於redis主從默認是讀寫分離,master節點寫數據,slave節點讀數據,所以,slave節點沒法寫入數據。
能夠經過info replication命令查看節點的狀態:
注意:另外redis的slave節點也能夠做爲它的子節點的master節點,其配置方法和上面配置同樣,這樣節點之間能夠層層配置下去,猶如薪火相傳。例如:
端口爲6379的爲master節點,其slave節點爲端口6380的節點,而端口爲6380的節點下面又有一個slave節點爲端口爲6381的節點。這樣能夠薪火相傳,只須要將端口爲6381的節點的配置修改成:slaveof 10.60.35.60 6380,便可。
Redis哨兵模式
Redis Sentinel 模式簡介
Redis-Sentinel是官方推薦的高可用解決方案,當redis在作master-slave的高可用方案時,假如master宕機了,redis自己(以及其不少客戶端)都沒有實現自動進行主備切換,而redis-sentinel自己也是獨立運行的進程,能夠部署在其餘與redis集羣可通信的機器中監控redis集羣。
它的主要功能有一下幾點:
一、不時地監控redis是否按照預期良好地運行;
二、若是發現某個redis節點運行出現情況,可以通知另一個進程(例如它的客戶端);
三、可以進行自動切換。當一個master節點不可用時,可以選舉出master的多個slave(若是有超過一個slave的話)中的一個來做爲新的master,其它的slave節點會將它所追隨的master的地址改成被提高爲master的slave的新地址。
四、哨兵爲客戶端提供服務發現,客戶端連接哨兵,哨兵提供當前master的地址而後提供服務,若是出現切換,也就是master掛了,哨兵會提供客戶端一個新地址。
哨兵(sentinel)自己也是支持集羣的
很顯然,單個哨兵會存在本身掛掉而沒法監控整個集羣的問題,因此哨兵也是支持集羣的,咱們一般用三臺哨兵機器來監控一組redis集羣。
完成主從配置之後,開始配置哨兵模式,步驟以下:
1.在解壓的安裝包中複製sentinel.conf文件到指定的位置,以下所示:
2.修改sentinel.conf文件的內容
a.將配置文件中當前主機名爲mymaster的改成咱們如今的主機名稱
b.修改主要配置
#哨兵的一些日誌路徑
dir "/tmp"
#對應的分別是名稱,ip,端口,投票選舉的次數(那麼咱們哨兵監聽的確定是master的ip而後端口是6379,1說明當master主服務器down機以後,剩下的服務器要進行一個投票選舉出一個主服務器)
sentinel monitor study03 10.60.35.60 6379 1
#配置表明哨兵0.5ms進行一次檢查這個集羣
sentinel down-after-milliseconds study03 5000
#配置表明你的幾個從節點將支持轉換爲主服務器的這個事情
sentinel parallel-syncs study03 2
3.啓動哨兵模式
4.測試
a.中止端口爲6379的服務
b.等待查看哨兵日誌
c.查看端口爲6381的節點的狀態
角色改成master了
d.端口爲6379的節點返回
查看哨兵的日誌:
端口爲6379的節點成爲slave節點
查看端口爲6379的節點的狀態: