高併發概述 |Redis-Cluster集羣搭建與測試


一、單臺Redis服務器不可行的原因

如果將Redis運用於工程項目中,只使用一臺Redis是不可以的,原因如下:

  • 從結構上看:單個Redis服務器會發生單點故障,並且一臺服務器需要處理所有的請求負載,壓力較大。 (容錯性低)
  • 從容量上看:單個Redis服務器內存容量有限,就算一臺Redis服務器內存容量爲256G,也不能將所有內容用作Redis存儲內存,一般情況下,單臺Redis最大使用內存不應該超過20G。

二、高併發概述

高可用
高可用性(High Availability)指一個系統經過專門的設計,可以減少停工時間,從而保持其服務的高度可用性。(一直都能用)

高性能
高性能(High Performance)指程序處理速度快,所佔內存少,cpu低。

高併發
高併發(High Concurrency)指通過設計,保證系統能夠同時並行處理很多請求。高併發是互聯網分佈式系統架構設計中必須考慮的因素之一。

高併發相關常用的一些指標有下面幾個:

  • 響應時間(Response Time)
    系統對請求做出響應的時間。
  • 吞吐量(Throughput)
    單位時間內處理的請求數量。
  • 每秒查詢率QPS(Query Per Second)
    每秒響應請求數。在互聯網領域,這個指標和吞吐量區分的沒有這麼明顯。
  • 併發用戶數
    同時承載正常使用系統功能的用戶數量。例如一個即時通訊系統,同時在線量一定程度上代表了系統的併發用戶數。

提高系統併發能力的兩種方法

垂直擴展(Scale Up)

提升單機處理能力,垂直擴展的方式又有兩種:

(1)增強單機硬件性能
例如:增加CPU核數如32核,升級更好的網卡如萬兆,升級更好的硬盤如SSD,擴充硬盤容量如2T,擴充系統內存如128G。

(2)提升單機架構性能
例如:使用Cache來減少IO次數,使用異步來增加單服務吞吐量,使用無鎖數據結構來減少響應時間。

在互聯網業務發展非常迅猛的早期,如果預算不是問題,強烈建議使用“增強單機硬件性能”的方式提升系統併發能力,因爲這個階段,公司的戰略往往是發展業務搶時間,而“增強單機硬件性能”往往是最快的方法。但是,無論是提升單機硬件性能,還是提升單機架構性能,都有一個致命的不足:單機性能總是有極限的。所以互聯網分佈式架構設計高併發終極解決方案還是水平擴展。

水平擴展(Scale Out)

只要增加服務器數量,就能線性擴充系統性能。水平擴展對系統架構設計是有要求的,難點在於:如何在架構各層進行可水平擴展的設計。

三、Redis主從複製

應用場景:
電子商務網站上的商品,一般都是一次上傳,無數次瀏覽的,即”多讀少寫”。

主從複製:
一個Redis服務可以有多個該服務的複製品,這個Redis服務稱爲Master(主),其它複製稱爲Slaves(從)。

在這裏插入圖片描述
如圖中所示,將一臺Redis服務器作主庫(Matser),其他三臺作爲從庫(Slave),主庫只負責寫數據,每次有數據更新都將更新的數據同步到它所有的從庫,而從庫只負責讀數據。這樣一來,就有了兩個好處:

  • 讀寫分離,不僅可以提高服務器的負載能力,並且可以根據讀請求的規模自由增加或者減少從庫的數量。(方便了水平擴展)
  • 數據被複製成了了好幾份,就算有一臺機器出現故障,也可以使用其他機器的數據快速恢復。(提高了容災性)

需要注意的是:在Redis主從模式中,一臺主庫可以擁有多個從庫,但是一個從庫只能隸屬於一個主庫。

Redis主從複製配置

在Redis中實現主從複製架構只需要在從數據庫的配置文件中加上如下命令即可:

1、主數據庫不需要任務配置,創建一個從數據庫

將主數據庫的redis.conf文件複製到從庫中,如下指定port端口,並添加slaveof指向主數據庫即可。

port 6380  //從服務的端口號 
slaveof 127.0.0.1 6379 //指定主服務器 

./bin/redis-server ./redis.conf --port 6380 --slaveof 127.0.0.1 6379 加上slaveof參數啓動另一個Redis實例作爲從庫,並且監聽6380端口

2、登錄到從服務客戶端:
./bin/redis-cli -p 6380 -a 密碼
登錄從庫只能進行讀操作,如果需要增刪改需要轉換爲主庫:

變回主庫: slaveof on one
變回從庫: slaveof ip地址 端口號

四、Redis-Cluster概述

RedisCluster集羣,實際上實就是前面說的用來提供高可用、高併發的解決方案中的水平擴展方案。

爲什麼使用redis-cluster?

  • 爲了在大流量訪問下提供穩定的業務,集羣化是存儲的必然形態
  • 未來的發展趨勢一定是雲計算和大數據的緊密結合
  • 只有分佈式架構能滿足要求

Redis集羣搭建方案:

(1)Twitter開發的twemproxy

(2)豌豆莢開發的codis

(3)redis官方的redis-cluster

Redis集羣搭建的方式有多種,但從redis 3.0之後版本支持redis-cluster集羣,至少需要3(Master)+3(Slave)才能建立集羣。Redis-Cluster採用無中心結構,每個節點保存數據和整個集羣狀態,每個節點都和其他所有節點連接。其redis-cluster架構圖如下:
在這裏插入圖片描述

Redis-Cluster集羣的特點

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

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

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

4、redis-cluster把所有的物理節點映射到[0-16383]slot上(不一定是平均分配),cluster 負責維護

5、Redis集羣預分好16384個哈希槽,當需要在 Redis 集羣中放置一個 key-value 時, redis 先對key 使用 crc16 算法算出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編號在 0-16383 之間的哈希槽,redis 會根據節點數量大致均等的將哈希槽映射到不同的節點。

Redis-Cluster容錯性

容錯性,是指軟件檢測應用程序所運行的軟件或硬件中發生的錯誤並從錯誤中恢復的能力,通常可以從系統的可靠性、可用性、可測性等幾個方面來衡量。

容錯投票
投票過程是集羣中所有master參與,如果半數以上master節點與master節點通信超時(cluster-node-timeout),認爲當前master節點是掛掉的。

什麼時候整個集羣不可用(cluster_state:fail)?
如果集羣任意master掛掉,且當前master沒有slave,集羣進入fail狀態,也可以理解成集羣的slot映射[0-16383]不完整時進入fail狀態。如果集羣超過半數以上master掛掉,無論是否有slave,集羣進入fail狀態。

Redis-Cluster節點分配

Redis官方推薦:三個主節點分別是:A、B、C 三個節點,它們可以是一臺機器上的三個端口,也可以是三臺不同的服務器。那麼,採用哈希槽 (hash slot)的方式來分配16384個slot的話,它們三個節點分別承擔的slot區間是:

  • 節點A覆蓋0-5460
  • 節點B覆蓋5461-10922
  • 節點C覆蓋10923-16383
    在這裏插入圖片描述

Redis-Cluster主從模式

Redis-Cluster爲了保證數據的高可用性,加入了主從模式,一個主節點對應一個或多個從節點,主節點提供數據存取,從節點則是從主節點拉取數據備份,當這個主節點掛掉後,就會有這個從節點選取一個來充當主節點,從而保證集羣不會掛掉。

集羣有ABC三個主節點, 如果這3個節點都沒有加入從節點,如果B掛掉了,我們就無法訪問整個集羣了。A和C的slot也無法訪問。 所以我們在集羣建立的時候,一定要爲每個主節點都添加了從節點, 比如像這樣, 集羣包含主節點A、B、C, 以及從節點A1、B1、C1, 那麼即使B掛掉系統也可以繼續正確工作。

B1節點替代了B節點,所以Redis集羣將會選擇B1節點作爲新的主節點,集羣將會繼續正確地提供服務。 當B重新開啓後,它就會變成B1的從節點。

不過需要注意,如果節點B和B1同時掛了,Redis集羣就無法繼續正確地提供服務了。

Redis Cluster總結:
將數據自動切分split到多個節點的能力。當集羣中的一部分節點失效或者無法進行通訊時, 仍然可以繼續處理命令請求的能力。

五、Redis-Cluster集羣搭建

集羣中至少應該有奇數個節點,所以搭建集羣最少需要3臺主機。同時每個節點至少有一個備份節點,所以下面最少需要創建使用6臺機器,才能完成Redis Cluster集羣(主節點、備份節點由redis-cluster集羣確定)。

真集羣: 準備6臺服務器
6個不同的ip地址,都是訪問6379端口。

假集羣:一臺服務器存在6個redis服務
一個ip地址 6個不同的端口。

由於真集羣模擬需要虛擬機開啓6個CentOS,個人電腦可能帶不動,所以下面演示搭建假集羣:

搭建流程

(1)創建Redis節點安裝目錄
mkdir /usr/local/redis_cluster
在指定目錄/usr/local下創建 redis_cluster集羣文件夾。

(2)在redis_cluster目錄下,創建6個文件夾,名爲7001-7006
mkdir 7001 7002 7003 7004 7005 7006

(3)將redis-conf分別拷貝到7001-7006文件夾
cp /root/redis-4.0.1/redis.conf ./7001

(4)修改各個配置文件
主要修改端口並啓用集羣。
在這裏插入圖片描述
注意: 如果redis設置的有密碼,一定要在masterauth後面加上密碼,還有一個protected-mode 是爲了禁止公網訪問redis cache,加強redis安全的。

protected-mode啓用的條件,有兩個:1.沒有bind IP ;2.沒有設置訪問密碼

由於Linux上的redis處於安全保護模式,這就讓你無法從虛擬機外部去輕鬆建立連接。
如果外部訪問:redis.conf中設置保護模式爲 protected-mode no(redis如果沒有密碼,此項也需要設置爲no)。

(5)啓動各個redis節點
將安裝的redis下的src文件分別拷貝到6個文件夾下。
cd /opt/redis-5.0.8               進入redis解壓目錄下
cp -r ./src /usr/local/redis_cluster/7001   進行拷貝 依次複製到6個文件夾中

啓動各個Redis節點:
cd /usr/local/redis_cluster/          進入redis集羣配置文件目錄下
./7001/src/redis-server ./7001/redis.conf    依次啓動 7001-7006各節點服務

(6)檢查Redis啓動情況
ps -ef | grep -i redis

(7)創建集羣
Redis5.0以後不再支持ruby,而是使用自帶的redis-cli命令就可以創建集羣了。

redis-cli --cluster create 192.168.217.130:7001 192.168.217.130:7002 192.168.217.130:7003 192.168.217.130:7004 192.168.217.130:7005  192.168.217.130:7006 --cluster-replicas 1 -a 123456

注意:這裏的格式是redis-cli --cluster create ip:port ... ip:port --cluster-replicas 1 -a 123456

在彈出的頁面輸入yes,出現[OK] All 16384 slots covered.說明集羣從創建成功。

可以登錄驗證一下,成功。
在這裏插入圖片描述

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

測試集羣

爲方便進羣測試,可將redis-cli 客戶端命令放到/usr/local/bin目錄下。
cd /opt/redis-5.0.8/src
cp redis-cli /usr/local/bin

登錄7001服務器,執行info replication命令,可以查看基礎信息。

在這裏插入圖片描述

cluster nodes命令,查看所有的節點信息:
在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述

開啓端口權限

如果希望使用Java代碼連接Redis服務器,就需要開啓所有的端口號,以下命令只針對Centos7以上:

查看已經開放的端口 firewall-cmd --list-ports

開啓端口      firewall-cmd --zone=public --add-port=7001/tcp --permanent

重啓防火牆     firewall-cmd --reload

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章