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