Redis 集羣之主從架構原理及安裝部署

爲什麼需要集羣?

Redis 單機能夠支持的 QPS 大概在 幾萬左右,具體是多少和服務器的配置以及業務的操作有關。但如果你的應用的 需要支撐上十萬的 QPS 時,單機的 Redis 是無法支撐這麼大的 QPS 的,如果卡死在 Redis,那麼系統就無法做到高併發了。這個時候就需要使用集羣。這裏我們先介紹最簡單的一種Redis 集羣架構——主從架構。

什麼是 Redis 主從架構?

Redis 主從架構一般是指定一主一從,或者一主多從。主節點負責寫數據,並且把數據複製到從節點。從節點負責讀。所有的讀請求都使用從節點。主節點我們稱爲 master node 。從節點我們稱爲 slave node。我們如果,要支撐上十萬或更多的 QPS 時,只需求多部署幾個從節點即可,可以非常方便的進行水平擴展。

主從架構的核心原理

當啓動一個從節點的時候,它會發送一個 psync 命令給主節點。如果這個從節點是重新連接主節點的,那麼 master node 只會複製給 slave node 丟失的部分數據。而如果是第一次連接的話,則會解決一次 full resynchronization,即全量複製。

全量複製機制

開始 full resynchronization 操作的時候,master node 會啓動一個後臺進行,開始生成一份 RDB 快照文件,同時還會將客戶端收到的所有寫命令緩存寫入內存中。RDB 文件生成完畢以後,master node 會把這個文件發送給 slave node。slave node 會把這個文件先保存到磁盤,然後加載到內存中去。最後 master node 會把執行 full resynchronization 操作後,生成的內存數據發送給 slave node, slave node 也會同步這部分數據。

RDB 複製有一個超時時間,默認值是 60s ,如果 RDB的複製時間超過了這個設定值,那麼 slave node 就會認爲複製失敗。對於千網網網卡,60s 能夠傳輸的數據在 6G 左右,在生產過程中,可以適當的調整這個值。

在複製 RDB的過程中,master node 會把後面的寫操作緩存到內存中,這其中有一個配置 client-output-buffer-limit slave 256MB 64MB。即如果在複製期間,如果緩衝區的持續消耗 64M 或者一次性超過 256M,那麼也會停止複製,複製失敗。

增量複製機制

如果在複製的過程中,如果 slave node 跟 master node 有網絡故障,斷開了連接,會自動進行重連,觸發增量複製。Redis 支持斷點續傳,即網絡重連後,可以接上上次複製的地方,繼續複製下去,而不是從頭開始複製一份新的數據

那是如果實現斷點續傳功能的呢?

在複製的過程中,master node 會維護一個內存緩存區 backlog。master node 和 slave node 都會維護一個 replica offset 和 master run id。offset 就是保存在 backlog裏面的。當連接斷開以後,slave node 重新連接到 master node,如果二個服務器的 master run id 相同,並且指定的 offerset 在內存中還有效,而複製從上次中斷的地方開始續傳。如果 master run id 不一致,或者未找到 offset ,則會進行全量複製。

無磁化複製

master 直接在內存中生成 RDB快照,不寫入磁盤,直接發送給 slave node,這樣可以減小 IO 操作,提升性能。

過期 key 的處理

slave node 不會主動的刪除過期的key,只會等待 master 過期key。如果 master node 過期了一個 key,或者通過 LRU 淘汰了一個 key ,那麼會模擬一條 del 命令發送給 slave node。

Redis 主從架構安裝部署

Redis 5 的主從架構配置與之前的主從架構配置有所不同。

準備

準備三臺服務器,配置一主二從的架構。其中 IP 映射關係:

192.168.56.101 worker-01        worker-01.joyxj.com
192.168.56.102 worker-02        worker-02.joyxj.com
192.168.56.103 worker-03        worker-03.joyxj.com

其中配置 worker-01 爲主節點,worker-02 和 worker-02 爲從節點。

下載、解壓、編譯

這部分可以參可這篇文章: redis 快速安裝及配置開機自啓動。或者使用以下腳本:

# 進入目錄,redis 安裝包路徑
cd /opt/tools
# 下載
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
# 解壓
tar -zxvf redis-5.0.5.tar.gz
cd redis-5.0.5
REDIS_DIR=`pwd`
# 安裝相關依賴
yum -y install gcc gcc-c++ libstdc++-devel tcl
# 編譯
make MALLOC=libc && make test && make install
# 複製啓動腳本
echo "複製配置腳本"
cp ${REDIS_DIR}/utils/redis_init_script /etc/init.d/
mv /etc/init.d/redis_init_script /etc/init.d/redis_6379
# 創建目錄,用於在放配置腳本和持久化目錄
mkdir -p /etc/redis
mkdir -p /var/redis/6379

# 複製配置文件到 /etc/redis目錄下,並重命名
cp ${REDIS_DIR}/redis.conf /etc/redis
mv /etc/redis/redis.conf /etc/redis/6379.conf

# 配置自啓動
cd /ect/init.d
sed -e '4a  # chkconfig:   2345 90 10' -i redis_6379
sed -e '5a  # description:  Redis is a persistent key-value database' -i redis_6379
chkconfig redis_6379 on

配置文件修改

  • worker-01

    # 本機的 IP 地址,默認的只能本地訪問
    bind worker-1
    # 持久化數據目錄
    dir  /var/redis/6379
    # 後臺運行
    daemonize yes
    
  • worker-02 配置

    # 本機的 IP 地址,默認的只能本地訪問
    bind worker-2
    # 持久化數據目錄
    dir  /var/redis/6379
    # 後臺運行
    daemonize yes
    # 主節點地址和端口
    replicaof worker-01 6379
    # 只讀
    replica-read-only yes
    
  • worker-03 配置

    # 本機的 IP 地址,默認的只能本地訪問
    bind worker-3
    # 持久化數據目錄
    dir  /var/redis/6379
    # 後臺運行
    daemonize yes
    # 主節點地址和端口
    replicaof worker-01 6379
    # 只讀
    replica-read-only yes
    

啓動

分別啓動 三個服務器,先啓動 主節點,再啓動 從節點。

啓動命令:

sh /etc/init.d/redis-6379 start

測試

主節點服務器 worker-01 上新增一個key。

[root@localhost shell]# redis-cli -h worker-01
worker-01:6379> set key1 value1
OK
worker-01:6379> get key1
"value1"
worker-01:6379>

從節點可以看到已經同步過來了。

[root@localhost init.d]# redis-cli -h worker-02
worker-02:6379> get key1
"value1"
worker-02:6379> 

測試成功。

Redis 壓測

通過執行 redis 目錄下的 src/redis-benchmark,可以測本機的Redis 服務進行壓測。其會對各種 redis 的操作進行壓測,通過這個就可以大概知道服務器的性能如何。下面是部分的壓測結果:

====== SET ======
  100000 requests completed in 1.47 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

97.80% <= 1 milliseconds
99.89% <= 2 milliseconds
100.00% <= 2 milliseconds
68212.83 requests per second

====== GET ======
  100000 requests completed in 1.40 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

98.76% <= 1 milliseconds
99.80% <= 2 milliseconds
99.93% <= 3 milliseconds
99.99% <= 4 milliseconds
100.00% <= 4 milliseconds
71633.23 requests per second

可以知道 redis 的 qps 在 6-7 萬左右。需要注意的是:不同操作的 QPS 是不同的,而且差別會很大

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