一、Master/Slave
Redis對于資料持久化前面介紹過rdb和aof,這兩種方式都是在同一台機器上進行讀寫操作,如果在高并發下對于伺服器将是很大考驗,是以一般都是讀寫分離,一台負責寫,一台負責讀。
Redis的複制(Master/Slave),也就是我們所說的主從複制,主機資料更新後根據配置和政策,自動同步到備機的master/slaver機制,Master以寫為主,Slave以讀為主。通過這種方式實作讀寫分離提高性能,還能很好的備份容災。
二、怎麼實作
主從複制一般都是一個主庫對應多個從庫,配從不配主。這裡在一台主機上模拟主從複制,将redis_conf複制三份,設定不同的端口模拟三個redis,一個主庫,兩個從庫,這其中需要更改的配置項如下:
- 開啟daemonize yes
- Pid檔案名字,便于區分
- 指定端口port
- Log檔案名字,便于區分
- Dump.rdb名字,便于區分
- appendfilename的名字,便于區分
配置好後,啟動這三台機器,通過info replication 檢視目前主機資訊,如下:三台都是master,相當于各自獨立的主機。
下面通過slaverof 指令将6380 6381兩台配置成6379的從機
slaverof 主庫IP 主庫端口
ps:因為是在同一台是以ip127.0.0.1
再檢視三台機器資訊:
6379:
6380:
6381:
此時可以看到6379為master,6380、6381為slave,狀态都為up,表示連接配接狀态,也可産看三台的log檔案
master的:
其中一個slavede:
讀寫測試:
6379存儲一個資料,6380、6381上讀取,能成功擷取。
三、主從複制常見情況
- master主機上已經存在資料了,新連接配接上的slave會将master中先前的資料一并讀取過來
- slave不具備寫資料的權限,不能set,隻能讀資料
- master主機shutdown後,slave從機會原地待命,等待主機的重新開啟,并且- 主機重新開啟後從機依舊能正常複制
- 從機shutdown後再次開啟,資料依舊是主機中中完整的資料
四、slave充當master
如果10000slave連接配接一個master,這個master肯定是吃不消的,就好比如一個公司一個老闆自己親自管理所有員工,那為了減輕壓力就會指定一些中層上司,老闆管理中層上司,忠誠上司管理下面的員工,這樣老闆就會輕松很多。上一個Slave可以是下一個slave的Master,Slave同樣可以接收其他slaves的連接配接和同步請求,那麼該slave作為了鍊條中下一個的master,可以有效減輕master的寫壓力。
加入現在通過slaveof指令将6381設定為6380的從機,其他不變,通過info replication檢視三台機器的資訊:
- 可以看到6379的從機隻有6380了
- 雖然6380是6381的主機,但是其身份還是salve,隻不過相比原來多了連接配接的從機資訊
- 6381的master_port變成了6380
在6379上寫資料,在6380、6381上都能擷取:
注意:中途變更轉向會清除之前的資料,重建立立拷貝最新的
五、主從複制原理
1、Slave啟動成功連接配接到master後會發送一個sync指令;
2、Master接到指令啟動背景的存盤程序,同時收集所有接收到的用于修改資料集指令,在背景程序執行完畢之後,master将傳送整個資料檔案到slave,以完成一次完全同步;
3、而slave服務在接收到資料庫檔案資料後,将其存盤并加載到記憶體中。
後續Master繼續将新的所有收集到的修改指令依次傳給slave,完成同步,但是隻要是重新連接配接master,一次完全同步(全部複制)将被自動執行。
六、哨兵模式
倘若redis運作過程中master突然挂掉了,不能群龍無首,此時可以手動通過在某一台slave上通過指令 SLAVEOF no one ,使目前資料庫停止與其他資料庫的同步,轉成主資料庫,然後然其他slave連接配接新的master。但是這麼做效率太低了,那麼實際上都是采用哨兵模式,簡單來說哨兵模式就是 SLAVEOF no one的自動版,能夠背景監控主機是否故障,如果故障了根據投票數自動将從庫轉換為主庫。
1、配置
- 自定義的/myredis(我的conf檔案都在這個目錄)目錄下建立sentinel.conf檔案,名字絕不能錯。
- 配置哨兵,填寫内容
# sentinel monitor 被監控資料庫名字(自己起名字) 主庫ip 主庫端口 1
sentinel monitor host6379 127.0.0.1 6379 1
上面最後一個數字1,表示主機挂掉後salve投票看讓誰接替成為主機,得票數多少後成為主機
2、啟動
Redis-sentinel /myredis/sentinel.conf
現在讓6379shutdown,在哨兵啟動視窗稍等一會就會看到6381被選為新的master,
此時剩下的slave會自動連接配接到新的master
被關掉的6379如果重新開啟,那此時6379将是一個獨立的主機。