天天看點

Redis之Master/Slave-主從複制

一、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,相當于各自獨立的主機。

Redis之Master/Slave-主從複制

下面通過slaverof 指令将6380 6381兩台配置成6379的從機

slaverof 主庫IP 主庫端口
           
Redis之Master/Slave-主從複制
Redis之Master/Slave-主從複制

ps:因為是在同一台是以ip127.0.0.1

再檢視三台機器資訊:

6379:

Redis之Master/Slave-主從複制

6380:

Redis之Master/Slave-主從複制

6381:

Redis之Master/Slave-主從複制

此時可以看到6379為master,6380、6381為slave,狀态都為up,表示連接配接狀态,也可産看三台的log檔案

master的:

Redis之Master/Slave-主從複制

其中一個slavede:

Redis之Master/Slave-主從複制

讀寫測試:

6379存儲一個資料,6380、6381上讀取,能成功擷取。

Redis之Master/Slave-主從複制

三、主從複制常見情況

  • master主機上已經存在資料了,新連接配接上的slave會将master中先前的資料一并讀取過來
  • slave不具備寫資料的權限,不能set,隻能讀資料
  • master主機shutdown後,slave從機會原地待命,等待主機的重新開啟,并且- 主機重新開啟後從機依舊能正常複制
    Redis之Master/Slave-主從複制
  • 從機shutdown後再次開啟,資料依舊是主機中中完整的資料

四、slave充當master

如果10000slave連接配接一個master,這個master肯定是吃不消的,就好比如一個公司一個老闆自己親自管理所有員工,那為了減輕壓力就會指定一些中層上司,老闆管理中層上司,忠誠上司管理下面的員工,這樣老闆就會輕松很多。上一個Slave可以是下一個slave的Master,Slave同樣可以接收其他slaves的連接配接和同步請求,那麼該slave作為了鍊條中下一個的master,可以有效減輕master的寫壓力。

加入現在通過slaveof指令将6381設定為6380的從機,其他不變,通過info replication檢視三台機器的資訊:

Redis之Master/Slave-主從複制
  • 可以看到6379的從機隻有6380了
  • 雖然6380是6381的主機,但是其身份還是salve,隻不過相比原來多了連接配接的從機資訊
  • 6381的master_port變成了6380

在6379上寫資料,在6380、6381上都能擷取:

Redis之Master/Slave-主從複制

注意:中途變更轉向會清除之前的資料,重建立立拷貝最新的

五、主從複制原理

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,

Redis之Master/Slave-主從複制

此時剩下的slave會自動連接配接到新的master

Redis之Master/Slave-主從複制

被關掉的6379如果重新開啟,那此時6379将是一個獨立的主機。

繼續閱讀