1、為什么要主從復制(一主多仆),讀寫分離:redis在作為緩存的時候,隨着數據的不斷增加,是有可能出現宕機的,這時候就出現了“單點故障”,解決方案就是進行主從復制,讀寫分離。
原理圖:Master是主,Slave是從,Master具有讀寫權限,Slave只有讀權限(以下還會介紹redis分布式鎖,即當Master死機之后,利用“sentinel監控”把Slave其中一個提升為Master,讓系統繼續執行,直至原Master重啟后恢復)


2、為了方便測試,把開啟redis服務的四個關鍵文件統一放在單獨的文件夾中 :redis-server、redis-benchmark、redis-cli和redis.conf(redis.conf在redis的文件根目錄下,其余三個在根目錄的/src目錄下)
# mkdir /usr/redis # cp redis-server /usr/redis # cp redis-benchmark /usr/redis # cp redis-cli /usr/redis # cp redis.conf /usr/redis # cd /usr/redis
3、在/usr/redis中把redis-conf進行Copy兩次:redis1-conf、redis2-conf
依次修改redis-conf(主)、redis1-conf(仆)、redis2-conf(仆).
vi redis.conf vi redis1.conf vi redis2.conf
(/'字符串' 可以進行快速Find 查找位置,鍵盤“N”可以Find Next 查找下一個)
redis-conf (daemonize no (守護進程)改為 daemonize yes ):
port 6379 requirepass 123456
redis1-conf -->:
port 6380 slaveof 127.0.0.1 6379 masterauth 123456 requirepass 123456
redis2-conf -->:
port 6381 slaveof 127.0.0.1 6379 masterauth 123456 requirepass 123456
4、保存之后運行相對應的服務和客戶端
注意:當使用 命令:/redis-server redis-conf ,提示redis-conf無效時,只要把redis-conf放在redis-server同一個目錄下即可。
服務:
./redis-server redis.conf ./redis-server redis1.conf ./redis-server redis2.conf
主(Master):
仆1(slave):
仆2(slave):
(slove是不具備寫權限的,會提示:(error) READONLY You can't write against a read only slave.)
可以看到主機執行寫命令,從機能同步主機的值,主從復制,讀寫分離就實現了。
但是萬一主機掛了怎么辦,這是個麻煩事情,所以redis提供了一個sentinel(哨兵),以此來實現主從切換的功能,類似與zookeeper.
5、一般“高可用”我們需要建立三個sentinel(哨兵)構成“sentinel集群”,即三個:sentinel.conf、sentinel1.conf、sentinel2.conf
sentinel.conf:
一般默認的就行,但是我們之前設置了認證密碼,所以需要加一個命令(在對應的位置添加,直接看注釋就知道在哪里添加了):
sentinel auth-pass mymaster 123456
之后Copy兩份:sentinel1.conf、sentinel2.conf,改其端口號即可(我用的:26379、26479、26579)。
6、分別啟動三哨兵:
./redis-sentinel sentinel.conf ./redis-sentinel sentinel1.conf ./redis-sentinel sentinel2.conf
接着啟動三個服務:
./redis-server redis.conf ./redis-server redis1.conf ./redis-server redis2.conf
查詢線程情況:
自此已經完成redis的狀態:“三哨兵”、“一主”、“二從”
7、測試下:
我們kill其中一個主服務:
(注意:sentinel是怎么進行主從切換的呢?就是以下這條命令:
sentinel monitor mymaster 127.0.0.1 6379 2 最后面的2就是當兩個以上的sentinel確定6379端口的“主服務”已經“主觀下線”的時候,就把“從服務“自動切換成主服務
)
其中的sentinel服務產生變化:
自動把端口號6380的服務切換成主服務,當然sentinel會修改我們的配置文件:
sentinel.conf、sentinel1.conf、sentinel2.conf--》(原來的mymaster 由6379 換為了 6380)
此時切換已經完成,但是我們還需要啟動之前的主redis,但是這個時候我們已經進行過插入、刪除等操作,以前的主redis並沒有記錄這些,那么就需要將之前從redis的dump.rdb替換之前redis 的dump.rdb文件。
首先進入redis-master 啟動 ./redis-server redis.conf
在新生成的主master操作(設置為主服務)
127.0.0.1:6380> slaveof no one
然后設置重啟的6379服務為從服務,映射主服務:
127.0.0.1:6379> slaveof 127.0.0.1 6380
順便把6381也重新指向6380為主服務,映射主服務
127.0.0.1:6381> slaveof 127.0.0.1 6380
如果還沒有回到原來的狀態,就關掉sentinel(哨兵)在設置。
8、總結:
1、”主從復制、讀寫分離、主從切換“的原理和步驟和集群
2、擴展:企業一般使用redis都是使用”高可用“的,最基本的就是”三哨兵、二主、三從“,我們這邊博文寫的是”三哨兵、一主、三從“,自己加一個主服務就可以了
3、”高可用”作用:防止“Master主服務宕機”、“sentinel監控宕機”,要知道,數據的丟失是致命的。
4、redis的作用:Redis以內存作為數據存儲介質,所以讀寫數據的效率極高,遠遠超過數據庫。當然,redis也會自動把內存的數據保存到磁盤。