redis集羣之主從複製+哨兵模式+cluster羣集(理論+實戰,收穫滿滿!!!)

一、redis集羣類型

  • redis集羣模式主要有以下幾種方式:
    • 1、 主從複製(redis2.8版本之前的模式)
    • 2、Redis Sentinel 哨兵模式(redis2.8及之後的模式)
    • 3、Redis Cluster集羣模式(客戶端sharding)(redis3.0版本之後)
    • 4、Jedis sharding集羣(客戶端sharding)
    • 5、利用中間件代理

在這裏主要講述主從複製、哨兵模式、Redis Cluster集羣這三種方式。

二、主從複製

2.1、主從複製概念

主從複製,是指將一臺Redis服務器的數據,複製到其他的Redis服務器。前者稱爲主節點(master),後者稱爲從節點(slave),數據的複製是單向的,只能由主節點到從節點。

默認情況下,每臺Redis服務器都是主節點;且一個主節點可以有多個從節點(或沒有從節點),但一個從節點只能有一個主節點。

如果Master和Slave之間的鏈接出現斷連現象,Slave可以自動重連Master,但是在連接成功之後,一次完全同步將被自動執行。

主從複製架構圖:
在這裏插入圖片描述

2.2、工作原理

  • 從服務器連接主服務器,發送SYNC命令;
  • 主服務器接收到SYNC命名後,開始執行BGSAVE命令生成RDB文件並使用緩衝區記錄此後執行的所有寫命令;
  • 主服務器BGSAVE執行完後,向所有從服務器發送快照文件,並在發送期間繼續記錄被執行的寫命令;
  • 從服務器收到快照文件後丟棄所有舊數據,載入收到的快照;
  • 主服務器快照發送完畢後開始向從服務器發送緩衝區中的寫命令;
  • 從服務器完成對快照的載入,開始接收命令請求,並執行來自主服務器緩衝區的寫命令;(從服務器初始化完成)
  • 主服務器每執行一個寫命令就會向從服務器發送相同的寫命令,從服務器接收並執行收到的寫命令 (從服務器初始化完成後的操作)

工作原理圖:
在這裏插入圖片描述

2.3、主從複製啓用

從節點開啓主從複製,有3種方式:

配置文件: 在從服務器的配置文件中加入:slaveof

啓動命令: redis-server啓動命令後加入 --slaveof

客戶端命令: Redis服務器啓動後,直接通過客戶端執行命令:slaveof
,則該Redis實例成爲從節點。

通過 info replication 命令可以看到複製的一些信息

2.4、主從複製優缺點

2.4.1、優點

  • 支持主從複製,可以進行讀寫分離
  • 爲了分載Master的讀操作壓力,Slave服務器可以爲客戶端提供只讀操作的服務,寫服務仍然必須由Master來完成
  • Slave同樣可以接受其它Slaves的連接和同步請求,這樣可以有效的分載Master的同步壓力。
  • Master Server是以非阻塞的方式爲Slaves提供服務。所以在Master-Slave同步期間,客戶端仍然可以提交查詢或修改請求。
  • Slave Server同樣是以非阻塞的方式完成數據同步。在同步期間,如果有客戶端提交查詢請求,Redis則返回同步之前的數據

2.4.2、缺點

  • Redis不具備自動容錯和恢復功能,主機從機的宕機都會導致前端部分讀寫請求失敗,需要等待機器重啓或者手動切換前端的IP才能恢復。
  • 主機宕機,宕機前有部分數據未能及時同步到從機,切換IP後還會引入數據不一致的問題,降低了系統的可用性。
  • Redis較難支持在線擴容,在集羣容量達到上限時在線擴容會變得很複雜。

三、哨兵模式

3.1、基本概念

當主服務器中斷服務後,可以將一個從服務器升級爲主服務器,以便繼續提供服務,但是這個過程需要人工手動來操作。 爲此,Redis 2.8中提供了哨兵工具來實現自動化的系統監控和故障恢復功能。

它的功能包括以下兩個:

  • 1、監控主服務器和從服務器是否正常運行。
  • 2、主服務器出現故障時自動將從服務器轉換爲主服務器。

架構圖:
在這裏插入圖片描述

3.2、哨兵模式的優缺點

3.2.1、優點

  • 哨兵模式是基於主從模式的,所有主從模式的優點,哨兵模式都具有。
  • 主從可以自動切換,進行故障轉移,系統更健壯,可用性更高。

3.2.2、缺點

  • Redis較難支持在線擴容,在集羣容量達到上限時在線擴容會變得很複雜。

四、Redis-Cluster集羣

4.1、cluster集羣概述

在 Redis 3.0 之前,使用 哨兵(sentinel)機制來監控各個節點之間的狀態,基本已經可以實現高可用,讀寫分離。
而Redis Cluster 是 Redis 的分佈式解決方案,在 3.0 版本正式推出,有效地解決了 Redis 在 分佈式 方面的需求。當遇到 單機內存、併發、流量 等瓶頸時,可以採用 Cluster 架構方案達到 負載均衡 的目的。

在這裏插入圖片描述
在 redis-cluster 架構中,redis-master節點一般用於接收讀寫,而redis-slave節點則一般只用於備份, 其與對應的 master 擁有相同的 slot 集合,若某個 redis-master 意外失效,則再將其對應的 slave 進行升級爲臨時 redis-master。

4.2、優缺點

優點:

  • 無中心架構
  • 可擴展性高
  • 高可用性
  • 降低運維成本,提高系統的擴展性和可用性。

缺點:

  • 數據通過異步複製,不保證數據的強一致性。

  • 多個業務使用同一套集羣時,無法根據統計區分冷熱數據,資源隔離性較差,容易出現相互影響的情況。

五、redis-cluster集羣部署

redis官方推薦使用6個節點,其中3個爲主節點,3個爲從節點。
一旦有master 發生故障的時候,Redis Cluster集羣可以選舉出對應的slave成爲新的主節點,繼續對外服務,從而保證服務的高可用性。
這裏的實驗模擬採用兩個虛擬機,每個虛擬機三個網卡,充當6個節點。

5.1、環境說明

節點類型 IP地址 操作系統 所需軟件包
master 192.168.100.128
192.168.100.100
192.168.100.101
centos7 redis-5.0.7.tar.gz
rvm-1.29.9.tar.gz
slave 192.168.100.131
192.168.100.102
192.168.100.103
centos7 redis-5.0.7.tar.gz

5.2、部署過程

1、master 和 slave節點都安裝redis包,步驟一樣

//先安裝防火牆
systemctl stop firewalld
setenforce 0

//通過yum工具,安裝編譯工具
yum install gcc gcc-c++ make -y 

//解壓redis軟件包
tar xzvf redis-5.0.7.tar.gz -C /opt

//編譯且安裝
cd /opt/redis-5.0.7/
make
make PREFIX=/usr/local/redis install

//開啓服務,設置各類文件
cd /opt/redis-5.0.7/utils/

[root@localhost utils]# ./install_server.sh 
Welcome to the redis service installer
This script will help you easily set up a running redis server
 
Please select the redis port for this instance: [6379] 
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf]     //定義主配置文件
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log]     //定義日誌文件
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] //數據文件
Selected default - /var/lib/redis/6379
Please select the redis executable path [] /usr/local/redis/bin/redis-server //可執行文件路徑,需要自行定義
Selected config:
Port           : 6379
Config file    : /etc/redis/6379.conf
Log file       : /var/log/redis_6379.log
Data dir       : /var/lib/redis/6379
Executable     : /usr/local/redis/bin/redis-server
Cli Executable : /usr/local/redis/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!

//創建軟鏈接,便於服務控制
ln -s /usr/local/redis/bin/* /usr/local/bin/

2、主從節點都修改配置文件,進行優化

vim /etc/redis/6379.conf
  70行/註釋掉 bind 項    #註釋後監聽所有IP地址
   89/ protected mode no    #關閉保護模式
   93/ port 6379
   137/ daemonize yes          #以獨立進程啓動
  700/ appendonly yes      #開啓aof持久化功能
   833/ cluster-enabled yes   #開啓羣集功能
   841/ pluster-config-file nodes-6379.conf    #羣集名稱文件設置
   847/ cluster-node- timeout 15000     #羣集超時時間設置

service redis_6379 restart    #重啓服務
ls /var/lib/redis/6379/    //生成下列三個文件說明設置成功
文件有:
1、持久化 appendonly.aof 文件
2、節點首次啓動生成的nodes-6379.conf 配置文件。

在這裏插入圖片描述
3、只在master節點操作,安裝rvm、ruby等軟件包

//安裝管理 ruby的工具:rvm ,安裝命令在官網找:http://rvm.io/
1、安裝GPG keys
gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 	
注意:若出現超時狀態,重新導入一次即可
2、安裝RVM
curl -sSL https://get.rvm.io | bash -s stable

安裝完提示去網站下載ruby安裝包:https://github.com/rvm/rvm/archive/1.29.9.tar.gz
在這裏插入圖片描述

tar xzvf rvm-1.29.9.tar.gz -C /opt
cd /opt/rvm-1.29.9/
./install
source /etc/profile.d/rvm.sh	   #執行環境變量

rvm list known	   #列出ruby可以安裝的版本
rvm install 2.4.1	   #安裝ruby2.4.1版本,安裝版本的事件會比較長
ruby -v      #查看當前ruby版本

gem install redis    #再次安裝redis

4、分別在主、從服務器上添加兩張網卡(NAT模式),設置IP地址
主服務器的IP地址:

[root@localhost network-scripts]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.128  netmask 255.255.255.0  broadcast 192.168.100.255
        inet6 fe80::c7ca:cf27:f0bb:92aa  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:67:b0:5d  txqueuelen 1000  (Ethernet)
        RX packets 816405  bytes 290626803 (277.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1003561  bytes 150373025 (143.4 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.100  netmask 255.255.255.0  broadcast 192.168.100.255
        inet6 fe80::d4d1:edc1:f4fe:dc9c  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::7aa5:ee9:42b9:c023  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:67:b0:71  txqueuelen 1000  (Ethernet)
        RX packets 4642  bytes 1339135 (1.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4207  bytes 746165 (728.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.101  netmask 255.255.255.0  broadcast 192.168.100.255
        inet6 fe80::4c48:e4cd:3aa9:a652  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::b066:20a7:751d:dc88  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:67:b0:67  txqueuelen 1000  (Ethernet)
        RX packets 4646  bytes 1340305 (1.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4195  bytes 743666 (726.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

從服務器的IP地址:

[root@localhost network-scripts]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.131  netmask 255.255.255.0  broadcast 192.168.100.255
        inet6 fe80::3661:4f5c:6149:3ae1  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::c7ca:cf27:f0bb:92aa  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:72:f9:68  txqueuelen 1000  (Ethernet)
        RX packets 680326  bytes 405482087 (386.6 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 682537  bytes 100916715 (96.2 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.102  netmask 255.255.255.0  broadcast 192.168.100.255
        inet6 fe80::7aa5:ee9:42b9:c023  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:72:f9:7c  txqueuelen 1000  (Ethernet)
        RX packets 4387  bytes 1273664 (1.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3669  bytes 644059 (628.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.103  netmask 255.255.255.0  broadcast 192.168.100.255
        inet6 fe80::b066:20a7:751d:dc88  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:72:f9:72  txqueuelen 1000  (Ethernet)
        RX packets 2677  bytes 756825 (739.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1855  bytes 328843 (321.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

5、創建集羣

[root@localhost src]# redis-cli --cluster create --cluster-replicas 1 192.168.100.128:6379 192.168.100.100:6379 192.168.100.101:6379 192.168.100.131:6379 192.168.100.102:6379 192.168.100.103:6379
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.100.102:6379 to 192.168.100.131:6379
Adding replica 192.168.100.103:6379 to 192.168.100.100:6379
Adding replica 192.168.100.132:6379 to 192.168.100.101:6379
M: ed2d5df0072fd2d41d7d284753bdf565b549c6a1 192.168.100.128:6379
   slots:[0-5460] (5461 slots) master
M: ed2d5df0072fd2d41d7d284753bdf565b549c6a1 192.168.100.100:6379
   slots:[5461-10922] (5462 slots) master
M: ed2d5df0072fd2d41d7d284753bdf565b549c6a1 192.168.100.101:6379
   slots:[10923-16383] (5461 slots) master
S: 35ae81002d4a47f3a649e2a3aebdf084222e5a6a 192.168.100.131:6379
   replicates ed2d5df0072fd2d41d7d284753bdf565b549c6a1
S: 35ae81002d4a47f3a649e2a3aebdf084222e5a6a 192.168.100.102:6379
   replicates ed2d5df0072fd2d41d7d284753bdf565b549c6a1
S: 35ae81002d4a47f3a649e2a3aebdf084222e5a6a 192.168.100.103:6379
   replicates ed2d5df0072fd2d41d7d284753bdf565b549c6a1
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join

>>> Performing Cluster Check (using node 192.168.100.131:6379)
M: ed2d5df0072fd2d41d7d284753bdf565b549c6a1 192.168.100.128:6379
   slots:[0-16383] (16384 slots) master
   1 additional replica(s)
S: 35ae81002d4a47f3a649e2a3aebdf084222e5a6a 192.168.100.131:6379
   slots: (0 slots) slave
   replicates ed2d5df0072fd2d41d7d284753bdf565b549c6a1
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

6、驗證羣集功能,一個主節點master對應一個從節點slave。

[root@localhost ~]# redis-cli -h 192.168.100.128 -p 6379	 #進入192.168.100.128的數據庫裏
192.168.100.128:6379> set name zhangsan	   #創建一個鍵值對
OK
192.168.100.128:6379> keys *	  #查看所有鍵
1) "name"
192.168.100.128:6379> get name	    #查看name鍵的值
"zhangsan"
192.168.100.128:6379> exit	
[root@localhost ~]# redis-cli -h 192.168.100.102 -p 6379	   #進入192.168.100.102的數據庫裏
192.168.100.102:6379> keys *
1) "name"
192.168.100.102:6379> get name	  
(error) MOVED 5474 192.168.100.131:6379	     
192.168.100.102:6379> exit
[root@localhost ~]# redis-cli -h 192.168.100.131 -p 6379	
192.168.100.131:6379> keys *
1) "name"
192.168.100.131:6379> get name
"zhangsan"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章