Redis3.0的主從、叢集高可用__工具使用

來源:互聯網
上載者:User
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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.