天天看點

跟燕青學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、 建構讀寫分離架構,滿足讀多寫少的應用場景

主從架構

跟燕青學Redis-Redis主從複制

啟動執行個體

建立6379、6380、6381目錄,分别将安裝目錄下的redis.conf拷貝到這三個目錄下。

跟燕青學Redis-Redis主從複制

分别進入這三個目錄,分别修改配置檔案,将端口分别設定為:6379(Master)、6380(Slave)、6381(Slave)。同時要設定pidfile檔案為不同的路徑。

分别啟動三個redis執行個體:

跟燕青學Redis-Redis主從複制

設定主從

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

1、 在redis.conf中設定slaveof

a) slaveof

2、 使用redis-cli用戶端連接配接到redis服務,執行slaveof指令

a) slaveof

第二種方式在重新開機後将失去主從複制關系。

檢視主從資訊:INFO replication

主:

跟燕青學Redis-Redis主從複制

role:角色

connected_slaves:從庫數量

slave0:從庫資訊

從:

跟燕青學Redis-Redis主從複制

測試

在主庫寫入資料:

跟燕青學Redis-Redis主從複制

在從庫讀取資料:

跟燕青學Redis-Redis主從複制

主從從架構

跟燕青學Redis-Redis主從複制

啟動執行個體

跟燕青學Redis-Redis主從複制

設定主從:

跟燕青學Redis-Redis主從複制

設定從從:

跟燕青學Redis-Redis主從複制

測試

在主庫設定資料:

跟燕青學Redis-Redis主從複制

在6380擷取資料:

跟燕青學Redis-Redis主從複制

在6381擷取資料:

跟燕青學Redis-Redis主從複制

從庫隻讀

預設情況下redis資料庫充當slave角色時是隻讀的不能進行寫操作。

可以在配置檔案中開啟非隻讀:slave-read-only no

跟燕青學Redis-Redis主從複制

複制原理

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)的功能。

繼續閱讀