1. 安裝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. 主從複製(讀寫分離)
主從複製的好處有2點:
1、 避免redis單點故障
2、 構建讀寫分離架構,滿足讀多寫少的應用情境 2.1. 主從架構
2.1.1. 啟動執行個體
建立6379、6380、6381目錄,分別將安裝目錄下的redis.conf拷貝到這三個目錄下。
分別進入這三個目錄,分別修改設定檔,將連接埠分別設定為:6379(Master)、6380(Slave)、6381(Slave)。同時要設定pidfile檔案為不同的路徑。
分別啟動三個redis執行個體:
2.1.2. 設定主從
在redis中設定主從有2種方式:
1、 在redis.conf中設定slaveof
a) slaveof <masterip> <masterport>
2、 使用redis-cli用戶端串連到redis服務,執行slaveof命令
a) slaveof <masterip> <masterport>
第二種方式在重啟後將失去主從複製關係。
查看主從資訊:INFO replication
主:
role:角色
connected_slaves:從庫數量
slave0:從庫資訊
從:
2.1.3. 測試
在主庫寫入資料:
在從庫讀取資料:
2.2. 主從從架構
2.2.1. 啟動執行個體
設定主從:
設定從從:
2.2.2. 測試
在主庫設定資料:
在6380擷取資料:
在6381擷取資料:
2.3. 從庫唯讀
預設情況下redis資料庫充當slave角色時是唯讀不能進行寫操作。
可以在設定檔中開啟非唯讀:slave-read-only no 2.4. 複製的過程原理
1、 當從庫和主庫建立MS關係後,會向主要資料庫發送SYNC命令;
2、 主庫接收到SYNC命令後會開始在後台儲存快照(RDB持久化過程),並將期間接收到的寫命令緩衝起來;
3、 當快照完成後,主Redis會將快照檔案和所有緩衝的寫命令發送給從Redis;
4、 從Redis接收到後,會載入快照檔案並且執行收到的緩衝的命令;
5、 之後,主Redis每當接收到寫命令時就會將命令發送從Redis,從而保證資料的一致; 2.5. 無磁碟複製
通過前面的複製過程我們瞭解到,主庫接收到SYNC的命令時會執行RDB過程,即使在設定檔中禁用RDB持久化也會產生,那麼如果主庫所在的伺服器磁碟IO效能較差,那麼這個複製過程就會出現瓶頸,慶幸的是,Redis在2.8.18版本開始實現了無磁碟複製功能(不過該功能還是處於實驗階段)。
原理:
Redis在與從資料庫進行複製初始化時將不會將快照儲存到磁碟,而是直接通過網路發送給從資料庫,避免了IO效能差問題。
開啟無磁碟複製:repl-diskless-sync yes
2.6. 複製架構中出現宕機情況,怎麼辦。
如果在主從複製架構中出現宕機的情況,需要分情況看:
1、 從Redis宕機
a) 這個相對而言比較簡單,在Redis中從庫重新啟動後會自動加入到主從架構中,自動完成同步資料;
b) 問題。 如果從庫在斷開期間,主庫的變化不大,從庫再次啟動後,主庫依然會將所有的資料做RDB操作嗎。還是累加式更新。(從庫有做持久化的前提下)
i. 不會的,因為在Redis2.8版本後就實現了,主從斷線後恢複的情況下實現差異複寫。
2、 主Redis宕機
a) 這個相對而言就會複雜一些,需要以下2步才能完成
i. 第一步,在從資料庫中執行SLAVEOF NO ONE命令,斷開主從關係並且提升為主庫繼續服務;
ii. 第二步,將主庫重新啟動後,執行SLAVEOF命令,將其設定為其他庫的從庫,這時資料就能更新回來;
b) 這個手動完成恢複的過程其實是比較麻煩的並且容易出錯,有沒有好辦法解決呢。當前有的,Redis提高的哨兵(sentinel)的功能。
3. 哨兵(sentinel) 3.1. 什麼是哨兵
顧名思義,哨兵的作用就是對Redis的系統的運行情況的監控,它是一個獨立進程。它的功能有2個:
1、 監控主要資料庫和從資料庫是否運行正常;
2、 主要資料出現故障後自動將從資料庫轉化為主要資料庫; 3.2. 原理
單個哨兵的架構:
多個哨兵的架構:
多個哨兵,不僅同時監控主從資料庫,而且哨兵之間互為監控。 3.3. 環境
當前處於一主多從的環境中:
3.4. 配置哨兵
啟動哨兵進程首先需要建立哨兵設定檔:
vim sentinel.conf
輸入內容:
sentinel monitor taotaoMaster 127.0.0.1 6379 1
說明:
taotaoMaster:監控主要資料的名稱,自訂即可,可以使用大小寫字母和“.-_”符號
127.0.0.1:監控的主要資料庫的IP
6379:監控的主要資料庫的連接埠
1:最低通過票數
啟動哨兵進程:
redis-sentinel ./sentinel.conf
由上圖可以看到:
1、 哨兵已經啟動,它的id為9059917216012421e8e89a4aa02f15b75346d2b7
2、 為master資料庫添加了一個監控
3、 發現了2個slave(由此可以看出,哨兵無需配置slave,只需要指定master,哨兵會自動探索slave) 3.5. 從資料庫宕機
kill掉2826進程後,30秒後哨兵的控制台輸出:
2989:X 05 Jun 20:09:33.509 # +sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ taotaoMaster 127.0.0.1 6379
說明已經監控到slave宕機了,那麼,如果我們將3380連接埠的redis執行個體啟動後,會自動加入到主從複製嗎。
2989:X 05 Jun 20:13:22.716 * +reboot slave 127.0.0.1:6380 127.0.0.1 6380 @ taotaoMaster 127.0.0.1 6379
2989:X 05 Jun 20:13:22.788 # -sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ taotaoMaster 127.0.0.1 6379
可以看出,slave從新加入到了主從複製中。-sdown:說明是恢複服務。
3.6. 主庫宕機
哨兵控制台列印出如下資訊:
2989:X 05 Jun 20:16:50.300 # +sdown master taotaoMaster 127.0.0.1 6379 說明master服務已經宕機
2989:X 05 Jun 20:16:50.300 # +odown master taotaoMaster 127.0.0.1 6379 #quorum 1/1
2989:X 05 Jun 20:16:50.300 # +new-epoch 1
2989:X 05 Jun 20:16:50.300 # +try-failover master taotaoMaster 127.0.0.1 6379 開始恢複故障
2989:X 05 Jun 20:16:50.304 # +vote-for-leader 9059917216012421e8e89a4aa02f15b75346d2b7 1 投票選舉哨兵leader,現在就一個哨兵所以leader就自己
2989:X 05 Jun 20:16:50.304 # +elected-leader master taotaoMaster 127.0.0.1 6379 選中leader
2989:X 05 Jun 20:16:50.304 # +failover-state-select-slave master taotaoMaster 127.0.0.1 6379 選中其中的一個slave當做master
2989:X 05 Jun 20:16:50.357 # +selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ taotaoMaster 127.0.0.1 6379 選中6381
2989:X 05 Jun 20:16:50.357 * +failover-state-send-slaveof-noone slave 127.0.0.1:6381 127.0.0.1 6381 @ taotaoMaster 127.0.0.1 6379 發送slaveof no one命令
2989:X 05 Jun 20:16:50.420 * +failover-state-wait-promotion slave 127.0.0.1:6381 127.0.0.1 6381 @ taotaoMaster 127.0.0.1 6379 等待升級master
2989:X 05 Jun 20:16:50.515 # +promoted-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ taotaoMaster 127.0.0.1 6379 升級6381為master
2989:X 05 Jun 20:16:50.515 # +failover-state-reconf-slaves master taotaoMaster 127.0.0.1 6379
2989:X 05 Jun 20:16:50.566 * +slave-reconf-sent slave 127.0.0.1:6380 127.0.0.1 6380 @ taotaoMaster 127.0.0.1 6379
2989:X 05 Jun 20:16:51.333 * +slave-reconf-inprog slave 127.0.0.1:6380 127.0.0.1 6380 @ taotaoMaster 127.0.0.1 6379
2989:X 05 Jun 20:16:52.382 * +slave-reconf-done slave 127.0.0.1:6380 127.0.0.1 6380 @ taotaoMaster 127.0.0.1 6379
2989:X 05 Jun 20:16:52.438 # +failover-end master taotaoMaster 127.0.0.1 6379 故障恢複完成
2989:X 05 Jun 20:16:52.438 # +switch-master taotaoMaster 127.0.0.1 6379 127.0.0.1 6381 主要資料庫從6379轉變為6381
2989:X 05 Jun 20:16:52.438 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ taotaoMaster 127.0.0.1 6381 添加6380為6381的從庫
2989:X 05 Jun 20:16:52.438 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ taotaoMaster 127.0.0.1 6381 添加6379為6381的從庫
2989:X 05 Jun 20:17:22.463 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ taotaoMaster 127.0.0.1 6381 發現6379已經宕機,等待6379的恢複
可以看出,目前,6381位master,擁有一個slave為6380.
接下來,我們恢複6379查看狀態:
2989:X 05 Jun 20:35:32.172 # -sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ taotaoMaster 127.0.0.1 6381 6379已經恢複服務
2989:X 05 Jun 20:35:42.137 * +convert-to-slave slave 127.0.0.1:6379 127.0.0.1 6379 @ taotaoMaster 127.0.0.1 6381 將6379設定為6381的slave
3.7. 配置多個哨兵
vim sentinel.conf
輸入內容:
sentinel monitor taotaoMaster 127.0.0.1 6381 2
sentinel monitor taotaoMaster2 127.0.0.1 6381 1
3451:X 05 Jun 21:05:56.083 # +sdown master taotaoMaster2 127.0.0.1 6381
3451:X 05 Jun 21:05:56.083 # +odown master taotaoMaster2 127.0.0.1 6381 #quorum 1/1
3451:X 05 Jun 21:05:56.083 # +new-epoch 1
3451:X 05 Jun 21:05:56.083 # +try-failover master taotaoMaster2 127.0.0.1 6381
3451:X 05 Jun 21:05:56.086 # +vote-for-leader 3f020a35c9878a12d2b44904f570dc0d4015c2ba 1
3451:X 05 Jun 21:05:56.086 # +elected-leader master taotaoMaster2 127.0.0.1 6381
3451:X 05 Jun 21:05:56.086 # +failover-state-select-slave master taotaoMaster2 127.0.0.1 6381
3451:X 05 Jun 21:05:56.087 # +sdown master taotaoMaster 127.0.0.1 6381
3451:X 05 Jun 21:05:56.189 # +selected-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ taotaoMaster2 127.0.0.1 6381
3451:X 05 Jun 21:05:56.189 * +failover-state-send-slaveof-noone slave 127.0.0.1:6380 127.0.0.1 6380 @ taotaoMaster2 127.0.0.1 6381
3451:X 05 Jun 21:05:56.252 * +failover-state-wait-promotion slave 127.0.0.1:6380 127.0.0.1 6380 @ taotaoMaster2 127.0.0.1 6381
3451:X 05 Jun 21:05:57.145 # +promoted-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ taotaoMaster2 127.0.0.1 6381
3451:X 05 Jun 21:05:57.145 # +failover-state-reconf-slaves master taotaoMaster2 127.0.0.1 6381
3451:X 05 Jun 21:05:57.234 * +slave-reconf-sent slave 127.0.0.1:6379 127.0.0.1 6379 @ taotaoMaster2 127.0.0.1 6381
3451:X 05 Jun 21:05:58.149 * +slave-reconf-inprog slave 127.0.0.1:6379 127.0.0.1 6379 @ taotaoMaster2 127.0.0.1 6381
3451:X 05 Jun 21:05:58.149 * +slave-reconf-done slave 127.0.0.1:6379 127.0.0.1 6379 @ taotaoMaster2 127.0.0.1 6381
3451:X 05 Jun 21:05:58.203 # +failover-end master taotaoMaster2 127.0.0.1 6381
3451:X 05 Jun 21:05:58.203 # +switch-master taotaoMaster2 127.0.0.1 6381 127.0.0.1 6380
3451:X 05 Jun 21:05:58.203 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ taotaoMaster2 127.0.0.1 6380
3451:X 05 Jun 21:05:58.203 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ taotaoMaster2 127.0.0.1 6380 4. 叢集
即使有了主從複製,每個資料庫都要儲存整個叢集中的所有資料,容易形成木桶效應。
使用Jedis實現了分區叢集,是由用戶端控制哪些key資料儲存到哪個資料庫中,如果在水平擴容時就必須手動進行資料移轉,而且需要將整個叢集停止服務,這樣做非常不好的。
Redis3.0版本的一大特性就是叢集(Cluster),接下來我們一起學習叢集。 4.1. 架構
(1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位協議最佳化傳輸速度和頻寬.
(2)節點的fail是通過叢集中超過半數的節點檢測失效時才生效.
(3)用戶端與redis節點直連,不需要中間proxy層.用戶端不需要串連叢集所有節點,串連叢集中任何一個可用節點即可
(4)redis-cluster把所有的物理節點映射到[0-16383]slot(插槽)上,cluster 負責維護node<->slot<->value 4.2. 修改設定檔
1、 設定不同的連接埠,6379、6380、6381
2、 開啟叢集,cluster-enabled yes
3、 指定叢集的設定檔,cluster-config-file "nodes-xxxx.conf"
4.3. 建立叢集 4.3.1. 安裝ruby環境
因為redis-trib.rb是有ruby語言編寫的所以需要安裝ruby環境。
yum -y install zlib ruby rubygems
gem install redis
手動安裝:
rz上傳redis-3.2.1.gem
gem install -l redis-3.2.1.gem 4.3.2. 建立叢集
首先,進入redis的安裝包路徑下:
cd /usr/local/src/redis/redis-3.0.1/src/
執行命令:
./redis-trib.rb create --replicas 0 192.168.56.102:6379 192.168.56.102:6380 192.168.56.102:6381
--replicas 0:指定了從資料的數量為0