跟燕青學Redis-Redis主從複製

安裝Redis3.0

yum -y install cpp binutils glibc glibc-kernheaders glibc-common glibc-devel gcc make gcc-c++ libstdc+±devel tcl

mkdir -p /usr/local/src/redis
cd /usr/local/src/redis
wget http://download.redis.io/releases/redis-3.0.2.tar.gz 或者 rz 上傳
tar -xvf redis-3.0.2.tar.gz
cd redis-3.0.2
make
make test #這個就不要執行了,需要很長時間
make install

cp redis.conf /etc/
vi /etc/redis.conf
#修改如下,默認爲no
daemonize yes

#啓動
redis-server /etc/redis.conf
#測試
redis-cli

主從複製

主從複製的好處

主從複製的好處有2點:
1、 避免redis單點故障
2、 構建讀寫分離架構,滿足讀多寫少的應用場景

主從架構

在這裏插入圖片描述

啓動實例

創建6379、6380、6381目錄,分別將安裝目錄下的redis.conf拷貝到這三個目錄下。
在這裏插入圖片描述
分別進入這三個目錄,分別修改配置文件,將端口分別設置爲:6379(Master)、6380(Slave)、6381(Slave)。同時要設置pidfile文件爲不同的路徑。

分別啓動三個redis實例:
在這裏插入圖片描述

設置主從

在redis中設置主從有2種方式:

1、 在redis.conf中設置slaveof
a) slaveof
2、 使用redis-cli客戶端連接到redis服務,執行slaveof命令
a) slaveof

第二種方式在重啓後將失去主從複製關係。

查看主從信息:INFO replication

主:
在這裏插入圖片描述
role:角色
connected_slaves:從庫數量
slave0:從庫信息

從:
在這裏插入圖片描述

測試

在主庫寫入數據:
在這裏插入圖片描述
在從庫讀取數據:
在這裏插入圖片描述

主從從架構

在這裏插入圖片描述

啓動實例

在這裏插入圖片描述
設置主從:
在這裏插入圖片描述
設置從從:
在這裏插入圖片描述

測試

在主庫設置數據:
在這裏插入圖片描述
在6380獲取數據:
在這裏插入圖片描述
在6381獲取數據:
在這裏插入圖片描述

從庫只讀

默認情況下redis數據庫充當slave角色時是隻讀的不能進行寫操作。
可以在配置文件中開啓非只讀:slave-read-only no
在這裏插入圖片描述

複製原理

1、 當從庫和主庫建立MS關係後,會向主數據庫發送SYNC命令;
2、 主庫接收到SYNC命令後會開始在後臺保存快照(RDB持久化過程),並將期間接收到的寫命令緩存起來;
3、 當快照完成後,主Redis會將快照文件和所有緩存的寫命令發送給從Redis;
4、 從Redis接收到後,會載入快照文件並且執行收到的緩存的命令;
5、 之後,主Redis每當接收到寫命令時就會將命令發送從Redis,從而保證數據的一致;

無磁盤複製

通過前面的複製過程我們瞭解到,主庫接收到SYNC的命令時會執行RDB過程,即使在配置文件中禁用RDB持久化也會生成,那麼如果主庫所在的服務器磁盤IO性能較差,那麼這個複製過程就會出現瓶頸,慶幸的是,Redis在2.8.18版本開始實現了無磁盤複製功能(不過該功能還是處於試驗階段)。

原理:
Redis在與從數據庫進行復制初始化時將不會將快照存儲到磁盤,而是直接通過網絡發送給從數據庫,避免了IO性能差問題。

開啓無磁盤複製:repl-diskless-sync yes

複製架構中出現宕機情況,怎麼辦?

如果在主從複製架構中出現宕機的情況,需要分情況看:
1、 從Redis宕機
a) 這個相對而言比較簡單,在Redis中從庫重新啓動後會自動加入到主從架構中,自動完成同步數據;
b) 問題? 如果從庫在斷開期間,主庫的變化不大,從庫再次啓動後,主庫依然會將所有的數據做RDB操作嗎?還是增量更新?(從庫有做持久化的前提下)
i. 不會的,因爲在Redis2.8版本後就實現了,主從斷線後恢復的情況下實現增量複製。
2、 主Redis宕機
a) 這個相對而言就會複雜一些,需要以下2步才能完成
i. 第一步,在從數據庫中執行SLAVEOF NO ONE命令,斷開主從關係並且提升爲主庫繼續服務;
ii. 第二步,將主庫重新啓動後,執行SLAVEOF命令,將其設置爲其他庫的從庫,這時數據就能更新回來;
b) 這個手動完成恢復的過程其實是比較麻煩的並且容易出錯,有沒有好辦法解決呢?當前有的,Redis提供的哨兵(sentinel)的功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章