redis-5.0.4集羣部署

redis-5.0.4 集羣搭建

redis-cluster介紹

​ 1:redis是一個開源的key value存儲系統,受到了廣大互聯網公司的青睞。
​ 2:redis集羣採用P2P模式,是完全去中心化的,不存在中心節點或者代理節點;
​ 3:redis集羣是沒有統一的入口的,客戶端(client)連接集羣的時候連接集羣中的任意節點(node)即可,集羣內部的節點是相互通信的(PING-PONG機制),每個節點都是一個redis實例;
​ 4:爲了實現集羣的高可用,即判斷節點是否健康(能否正常使用),redis-cluster有這麼一個投票容錯機制:如果集羣中超過半數的節點投票認爲某個節點掛了,那麼這個節點就掛了(fail)。這是判斷節點是否掛了的方法;
那麼如何判斷集羣是否掛了呢? -> 如果集羣中任意一個節點掛了,而且該節點沒有從節點(備份節點),那麼這個集羣就掛了。這是判斷集羣是否掛了的方法;
​ 5:那麼爲什麼任意一個節點掛了(沒有從節點)這個集羣就掛了呢? -> 因爲集羣內置了16384個slot(哈希槽),並且把所有的物理節點映射到了這16384[0-16383]個slot上,或者說把這些slot均等的分配給了各個節點。當需要在Redis集羣存放一個數據(key-value)時,redis會先對這個key進行crc16算法,然後得到一個結果。再把這個結果對16384進行求餘,這個餘數會對應[0-16383]其中一個槽,進而決定key-value存儲到哪個節點中。所以一旦某個節點掛了,該節點對應的slot就無法使用,那麼就會導致集羣無法正常工作。
​ 綜上所述,每個Redis集羣理論上最多可以有16384個節點。

redis-cluster的現狀

  目前redis支持的cluster特性:

  1):節點自動發現

  2):slave->master 選舉,集羣容錯

  3):Hot resharding:在線分片

  4):進羣管理:cluster xxx

  5):基於配置(nodes-port.conf)的集羣管理

  6):ASK 轉向/MOVED 轉向機制。

redis-cluster 架構

  1)redis-cluster架構圖
redis-5.0.4集羣部署

架構細節:

  (1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬.

  (2)節點的fail是通過集羣中超過半數的節點檢測失效時才生效.

  (3)客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連接集羣所有節點,連接集羣中任何一個可用節點即可

  (4)redis-cluster把所有的物理節點映射到[0-16383]slot上,cluster 負責維護node<->slot<->value

2) redis-cluster選舉:容錯

(1)領着選舉過程是集羣中所有master參與,如果半數以上master節點與master節點通信超過(cluster-node-timeout),認爲當前master節點掛掉。

(2):什麼時候整個集羣不可用(cluster_state:fail),當集羣不可用時,所有對集羣的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)錯誤

​  如果集羣任意master掛掉,且當前master沒有slave.集羣進入fail狀態,也可以理解成進羣的slot映射[0-16383]不完成時進入fail狀態。

​ 那麼爲什麼任意一個節點掛了(沒有從節點)這個集羣就掛了呢? -> 因爲集羣內置了16384個slot(哈希槽),並且把所有的物理節點映射到了這16384[0-16383]個slot上,或者說把這些slot均等的分配給了各個節點。當需要在Redis集羣存放一個數據(key-value)時,redis會先對這個key進行crc16算法,然後得到一個結果。再把這個結果對16384進行求餘,這個餘數會對應[0-16383]其中一個槽,進而決定key-value存儲到哪個節點中。所以一旦某個節點掛了,該節點對應的slot就無法使用,那麼就會導致集羣無法正常工作。

綜上所述,每個Redis集羣理論上最多可以有16384個節點。

​  如果進羣超過半數以上master掛掉,無論是否有slave集羣進入fail狀態.

(3) Redis集羣至少需要3個節點,因爲投票容錯機制要求超過半數節點認爲某個節點掛了該節點纔是掛了,所以2個節點無法構成集羣。

要保證集羣的高可用,需要每個節點都有從節點,也就是備份節點,所以Redis集羣至少需要6臺服務器。因爲我沒有那麼多服務器,也啓動不了那麼多虛擬機,所在這裏搭建的是僞分佈式集羣,即一臺服務器虛擬運行6個redis實例,修改端口號爲(7000-7005),當然實際生產環境的Redis集羣搭建和這裏是一樣的。

redis集羣環境描述:redis集羣至少需要三個主節點才能構成集羣,因爲這是redis集羣的投票機制決定的。正常情況下每個主節點都應該至少有一個從節點 所以Redis集羣至少需要6臺服務器。所以這裏使用的是僞集羣的構建方式,但是最新的版本的redis支持docker容器集羣部署(可以嘗試)

準備工作
用兩臺虛擬機模擬6個節點,一臺機器3個節點,創建出3 master、3 salve 環境。

redis 採用 redis-5.0.4 版本。

兩臺虛擬機都是 CentOS ,一臺 CentOS7(IP:192.168.11.12),一臺 CentOS7(IP:192.168.11.13) 。

環境描述
操作系統 :centos7
gcc版本 :gcc-c++
redis版本 :redis-5.0.4

官網文檔參考:https://redis.io/topics/cluster-tutorial

安裝過程

1、安裝支持的庫文件:(注:可以只安裝 gcc-c++)

 yum -y install gcc automake autoconf libtool make

2、下載redis安裝包 :wget http://download.redis.io/releases/redis-5.0.4.tar.gz

3、解壓文件:

cd /usr/local/
tar xvzf redis-5.0.4.tar.gz

3、編譯與安裝

cd /usr/local/redis-5.0.4
make
make install PREFIX=/usr/local/redis 

4、將 redis-trib.rb 複製到 /usr/local/bin 目錄下

cd src 
cp redis-trib.rb /usr/local/bin/ 

5、 創建 Redis 節點,

首先在 192.168.11.12 機器上 創建 redis_cluster 目錄;

mkdir redis_cluster 

在 redis_cluster 目錄下,創建名爲7000、7001、7002的目錄,並將 redis.conf 拷貝到這三個目錄中

mkdir 7000 7001 7002

cp redis.conf redis-cluster/7000 
cp redis.conf redis-cluster/7001 
cp redis.conf redis-cluster/7002 

分別修改這三個配置文件,修改如下內容

port 7000 //端口7000,7002,7003 
bind 本機ip //默認ip爲127.0.0.1 需要改爲其他節點機器可訪問的ip 否則創建集羣時無法訪問對應的端口,無法創建集羣 
daemonize yes //redis後臺運行 
pidfile /var/run/redis_7000.pid //pidfile文件對應7000,7001,7002 
cluster-enabled yes //開啓集羣 把註釋#去掉 
cluster-config-file nodes_7000.conf //集羣的配置 配置文件首次啓動自動生成 7000,7001,7002 把註釋#去掉 
cluster-node-timeout 15000 //請求超時 默認15秒,可自行設置  把註釋#去掉 
appendonly yes //aof日誌開啓 有需要就開啓,它會每次寫操作都記錄一條日誌 

接着在另外一臺機器上(192.168.11.13),的操作重複以上三步,只是把目錄改爲7003、7004、7005,對應的配置文件也按照這個規則修改即可

6、啓動redis各個節點

第一臺12機器上執行

cd /usr/local/redis-5.0.4/src
./redis-server /usr/local/redis-cluster/7000/redis.conf 
./redis-server /usr/local/redis-cluster/7001/redis.conf 
./redis-server /usr/local/redis-cluster/7002/redis.conf

redis-5.0.4集羣部署

13機器上執行

cd /usr/local/redis-5.0.4/src
./redis-server /usr/local/redis-cluster/7003/redis.conf 
./redis-server /usr/local/redis-cluster/7004/redis.conf 
./redis-server /usr/local/redis-cluster/7005/redis.conf

redis-5.0.4集羣部署
相關命令

啓動 redis 命令

./redis-server redis.conf

查看redis是否啓動

ps aux|grep redis

連接redis 命令爲:

./redis-cli -h host -p port host爲服務器host port 爲redis.conf中的port

退出redis 命令:exit

關閉redis

./redis-cli -h 192.168.11.12 -p 7000 shutdown

7、檢查 redis 啓動情況

ps -ef | grep redis //查看redis啓動情況
netstat -tnlp | grep redis//查看redis端口開啓情況

redis-5.0.4集羣部署
redis-5.0.4集羣部署

8、開啓兩臺機器的防火牆(選做)

firewall-cmd --zone=public --add-port=7000-7002/tcp --permanent
firewall-cmd --zone=public --add-port=17000-17002/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports

9、創建集羣

原命令 redis-trib.rb 這個工具目前已經廢棄,使用redis-cli

./redis-cli --cluster create --cluster-replicas 1 192.168.11.12:7000 192.168.11.12:7001 192.168.11.12:7002 192.168.11.13:7003 192.168.11.13:7004 192.168.11.13:7005

redis-5.0.4集羣部署
其中,前三個 ip:port 爲第一臺機器的節點,剩下三個爲第二臺機器

輸入 yes 即可,然後出現如下內容,說明安裝成功

redis-5.0.4集羣部署
10、集羣驗證

在第一臺機器上連接集羣的7000端口的節點,在另外一臺連接7003節點,連接方式爲

./redis-cli -h 192.168.11.13 -c -p 7000

在7000節點執行命令 set hello world ,執行結果如下:

redis-5.0.4集羣部署
然後在另外一臺7003端口,查看 key 爲 hello 的內容, get hello ,執行結果如下:

redis-5.0.4集羣部署
說明集羣運作正常。

簡單說一下原理

redis cluster在設計的時候,就考慮到了去中心化,去中間件,也就是說,集羣中的每個節點都是平等的關係,都是對等的,每個節點都保存各自的數據和整個集羣的狀態。每個節點都和其他所有節點連接,而且這些連接保持活躍,這樣就保證了我們只需要連接集羣中的任意一個節點,就可以獲取到其他節點的數據。

Redis 集羣沒有並使用傳統的一致性哈希來分配數據,而是採用另外一種叫做哈希槽 (hash slot)的方式來分配的。redis cluster 默認分配了 16384 個slot,當我們set一個key 時,會用CRC16算法來取模得到所屬的slot,然後將這個key 分到哈希槽區間的節點上,具體算法就是:CRC16(key) % 16384。所以我們在測試的時候看到set 和 get 的時候,直接跳轉到了7000端口的節點。

Redis 集羣會把數據存在一個 master 節點,然後在這個 master 和其對應的salve 之間進行數據同步。當讀取數據時,也根據一致性哈希算法到對應的 master 節點獲取數據。只有當一個master 掛掉之後,纔會啓動一個對應的 salve 節點,充當 master 。

需要注意的是:必須要3個或以上的主節點,否則在創建集羣時會失敗,並且當存活的主節點數小於總節點數的一半時,整個集羣就無法提供服務了。

安裝過程中的問題點彙總

1.關於啓動集羣時候出現一直等待 Waiting for the cluster to join 很久都沒有反應的問題

Redis集羣不僅需要開通redis客戶端連接的端口,而且需要開通集羣總線端口,集羣總線端口爲redis客戶端連接的端口 + 10000,如redis端口爲7000,則集羣總線端口爲17000,因此所有服務器的點需要開通redis的客戶端連接端口和集羣總線端口

2.關於集羣連接驗證時候連接失敗,可以先關閉redis ./redis-cli -h 192.168.11.12 -p 7000 shutdown 再開啓 ./redis-server redis.conf

Redis 集羣模式下連接需要已-h ip地址方式連接,命令應爲./redis-cli -h 192.168.11.12 -c -p 7000
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章