Redis 集群(Cluster)


1、集群介紹

1-1、含義

集群(cluster)就是一組計算機,他們作為一個整體向用戶提供一組網絡資源,這些單個的計算機系統就是集群的節點(node)。集群提供了以下關鍵的特性

  • 可擴展性
  • 高可用性
  • 負載均衡
  • 錯誤恢復

1-2、集群分類

  • HA:高可用(Hight Availability Cluster)
  • LBC:負載均衡集群 / 負載均衡系統(Load Balance Cluster)
  • HPC:科學計算集群(Hight Performance Computing Cluster) / 高性能計算(Hight Performance Computing)集群

1-3、優點

  • 去中心化
  • 可擴展性
  • 高可用性
  • 自動故障轉移

1-4、缺點

  • 數據通過異步復制,無法保證數據強一致性
  • 集群環境搭建略微復雜

2、集群架構

並發量大 -> 主從復制解決 -> 主從穩定性 -> 哨兵解決 -> 單節點存儲能力 -> 集群Cluster解決

image

Redis Cluster 采用無中心結構,每個節點都可以保存數據和整個集群狀態,每個節點都和其他所有節點連接。Cluster至少為6個才能保證組成完整高可用的集群,其中三主三從。主節點分配槽,處理客戶端的命令請求,從節點可用在主節點故障,頂替主節點

因為最小的 Redis 集群,需要至少3個主節點,既然有3個主節點,而一個主節點搭配至少一個從節點。該集群中包含6個Redis幾點,3主3從,分別是M1、M2、M3、S1、S2、S3。除了主從Redis節點之間進行數據復制外,所有Redis節點之間采用Gossip協議進行通信,交換維護元數據信息

簡單粗暴來說就是:讀請求分配給 Slave 節點,寫請求分配給 Master ,數據同步從 Master 到 Slave 節點

3、數據分區方式

3-1、概述

隨着請求量和數據量的增加,一台機器已經無法滿足需求,我們就需要把數據和請求分散到多台機器。這時候需要引入分布式存儲。分布式存儲有以下特征:

  1. 增強可用性
  2. 維護方便
  3. 均衡I / O
  4. 改善查詢性能

分布式存儲首先要解決把整個數據集按照分區規則映射到多個節點的問題,即把數據集划分到多個節點上,每個節點負責整體數據的一個子集

3-2、常見分區算法

范圍分區

  • 優點:同一范圍內的范圍查詢不需要跨節點,提升查詢速度
  • 應用場景Oracle、MySQL

節點取余分區

hash(object)% N

優點:實現簡單

缺點:當擴容或收縮節點時,需要遷移的數據量大

一致性哈希分區

優點:相比節點取余最大的好處在於加入和刪除節點只影響哈希環中相鄰的節點,對其他節點無影響

缺點:當使用少量節點時,節點變化將大范圍影響哈希環中數據映射,因此這種方式不適合少量數據節點的分布式方案

應用場景:Memcached

虛擬槽分區

  • 優點:每個 node 均勻的分配了 slot,縮小增減節點影響的范圍
  • 缺點:需要存儲 node 和 slot 的對應信息
  • 應用場景:Redis Cluster

image

4、環境搭建

節點介紹
IP 節點
192.168.86.135 6379,6380
192.168.86.136 6381,6382
192.168.86.137 6383,6384
前提條件(Master、Node01、Node02)
# 關閉防火牆,臨時關閉:systemctl stop firewalld
systemctl disable --now firewalld
systemctl disable --now dnsmasq
systemctl disable --now NetworkManager

# 關閉selinux
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config

# 關閉分區
swapoff -a && sysctl -w vm.swappiness=0
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab

# 設置hosts
[root@redis-master]#
cat >> /etc/hosts << EOF
192.168.86.135 redis-master
192.168.86.136 redis-node01
192.168.86.137 redis-node02
EOF

# redis 6.x 的版本情況下執行命令
yum install -y centos-release-scl scl-utils-build
yum install -y devtoolset-9-toolchain
scl enable devtoolset-9 bash
yum install cpp binutils glibc-kernheaders glibc-common glibc-devel gcc make -y
免密(Master)
ssh-keygen -t rsa

for i in redis-master redis-node01 redis-node02;do ssh-copy-id -i .ssh/id_rsa.pub $i;done
安裝編譯(Master、Node01、Node02)
cd /opt
wget https://download.redis.io/releases/redis-6.2.4.tar.gz
tar xvf redis-6.2.4.tar.gz
cd redis-6.2.4 && make
mkdir -p /usr/local/redis
make PREFIX=/usr/local/redis install

mkdir -p /usr/local/redis
cd /usr/local/redis
mkdir -p /usr/local/redis/cluster/conf /usr/local/redis/cluster/data /usr/local/redis/cluster/logs
編寫配置
[root@redis-master cluster]# pwd
/usr/local/redis/cluster

vi conf/redis-6379.conf
# 是否以守護進程的方式啟動
daemonize yes
# 默認數據庫16個
databases 16
# 綁定IP
# bind 0.0.0.0
# 端口
port 6379
# 配置密碼
requirepass 123456
# 從節點訪問主節點密碼(必須和requirepass一致)
masterauth 123456
# 設置日志路徑
logfile "/usr/local/redis/cluster/logs/redis-6379.log"
# 設置存儲數據路徑
dir /usr/local/redis/cluster/data
# rdb 數據文件名
dbfilename dump-6379.rdb
# aof模式開啟和aof數據文件名
appendonly yes
appendfilename "appendonly.aof"
# 開啟集群
cluster-enabled yes
# 集群超時時間
cluster-node-timeout 15000
# 節點配置
cluster-config-file nodes-6379.conf
# 集群節點 IP
cluster-announce-ip 192.168.86.135
# 集群映射端口
cluster-announce-port 6379
# 集群節點總線端口
cluster-announce-bus-port 16379
[root@redis-master cluster]# cp conf/redis-6379.conf conf/redis-6380.conf
[root@redis-master cluster]# vi conf/redis-6380.conf
# 修改端口,命令模式 :%s/6379/6380,然后 :wq! 保存退出
[root@redis-master cluster]# scp conf/redis-6379.conf conf/redis-6380.conf redis-node01:/usr/local/redis/cluster/conf/
[root@redis-master cluster]# scp conf/redis-6379.conf conf/redis-6380.conf redis-node02:/usr/local/redis/cluster/conf/
[root@redis-node01 cluster]# mv conf/redis-6379.conf conf/redis-6381.conf
[root@redis-node01 cluster]# mv conf/redis-6380.conf conf/redis-6382.conf

[root@redis-node01 cluster]# vi conf/redis-6381.conf
# 修改端口,命令模式 :%s/6379/6381,:%s/192.168.86.135/192.168.86.136 然后 :wq! 保存退出

[root@redis-node01 cluster]# vi conf/redis-6382.conf
# 修改端口,命令模式 :%s/6380/6382,:%s/192.168.86.135/192.168.86.136 然后 :wq! 保存退出
[root@redis-node02 cluster]# mv conf/redis-6379.conf conf/redis-6383.conf
[root@redis-node02 cluster]# mv conf/redis-6380.conf conf/redis-6384.conf

[root@redis-node02 cluster]# vi conf/redis-6383.conf
# 修改端口,命令模式 :%s/6379/6383,:%s/192.168.86.135/192.168.86.137 然后 :wq! 保存退出

[root@redis-node02 cluster]# vi conf/redis-6384.conf
# 修改端口,命令模式 :%s/6380/6384,:%s/192.168.86.135/192.168.86.137 然后 :wq! 保存退出
啟動
[root@redis-master redis]# pwd
/usr/local/redis
[root@redis-master redis]# ./bin/redis-server cluster/conf/redis-6379.conf
[root@redis-master redis]# ./bin/redis-server cluster/conf/redis-6380.conf
[root@redis-node01 redis]# pwd
/usr/local/redis
[root@redis-node01 redis]# ./bin/redis-server cluster/conf/redis-6381.conf
[root@redis-node01 redis]# ./bin/redis-server cluster/conf/redis-6382.conf
[root@redis-node02 redis]# pwd
/usr/local/redis
[root@redis-node02 redis]# ./bin/redis-server cluster/conf/redis-6383.conf
[root@redis-node02 redis]# ./bin/redis-server cluster/conf/redis-6384.conf
創建集群(任意一個節點)
# 集群幫助命令
./bin/redis-cli --cluster help

# 隨便一個節點:創建集群
./bin/redis-cli -a 123456 --cluster create \
192.168.86.135:6379 192.168.86.135:6380 \
192.168.86.136:6381 192.168.86.136:6382 \
192.168.86.137:6383 192.168.86.137:6384 \
--cluster-replicas 1

...
Can I set the above configuration? (type 'yes' to accept): yes
...
M: a5aa2e356508ee76d1c75739f8f6434f87a903e6 192.168.86.135:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: fe5e55b629c28ac66ff1d2859744cae33c50f586 192.168.86.136:6383
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: b9545b0f83ae0ef7a78bf8d5dab63189cb9172c5 192.168.86.137:6381
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 8ad5630f8183909508e2251487e2d2975e684400 192.168.86.135:6380
   slots: (0 slots) slave
   replicates fe5e55b629c28ac66ff1d2859744cae33c50f586
S: 6feb528fb01e366d6830dca2715b7cb54121bb08 192.168.86.137:6382
   slots: (0 slots) slave
   replicates a5aa2e356508ee76d1c75739f8f6434f87a903e6
S: 2cebb091fc9563e602d38d52e2aff7695e9ba5dc 192.168.86.136:6384
   slots: (0 slots) slave
   replicates b9545b0f83ae0ef7a78bf8d5dab63189cb9172c5
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
檢測節點(任意一個節點)
./bin/redis-cli -a 123456 --cluster check  192.168.86.135:6379
查看分片(任意一個節點)
./bin/redis-cli -c -a 123456 -h 192.168.86.135 -p 6379 cluster info
查看節點(任意一個節點)
./bin/redis-cli -c -a 123456 -h 192.168.86.135 -p 6379 cluster nodes
從節點設置只讀模式
./bin/redis-cli -c -a 123456 -h 192.168.86.135 -p 6380 readonly
手動故障轉移
# 只允許從節點,如果操作在主節點上就會報錯
./bin/redis-cli -c -a 123456 -h 192.168.86.137 -p 6384 cluster failover
添加 Master 節點
# 將新的 6385 節點加入了 192.168.86.135:6381 主節點中
[root@redis-master redis]#
./bin/redis-cli -a 123456 \
--cluster add-node 192.168.86.138:6385 192.168.86.136:6381 \
--cluster-master-id b9545b0f83ae0ef7a78bf8d5dab63189cb9172c5
分配槽 slots
# 分配槽slots:把 6381 的槽分 1024 個槽給 新加入節點 6385 的槽中
# reshard:表示連接IP:host
# --cluster-from:表示slot目前所在的節點的node ID,多個ID用逗號分隔
# --cluster-to:表示需要新分配節點的node ID(貌似每次只能分配一個)
# --cluster-slots:分配的slot數量
[root@redis-master redis]#
./bin/redis-cli -a 123456 \
--cluster reshard 192.168.86.135:6379 \
--cluster-from b9545b0f83ae0ef7a78bf8d5dab63189cb9172c5, ...... \
--cluster-to 31940458ecc5becade331e89faa254197d812c9a \
--cluster-slots 1024 --cluster-yes
添加 Slave 節點
把 6386 作為 6385 的slave節點
[root@redis-master redis]#
./bin/redis-cli -a 123456 \
--cluster add-node 192.168.86.139:6386 192.168.86.138:6385 \
--cluster-slave --cluster-master-id 31940458ecc5becade331e89faa254197d812c9a
刪除從節點
把 6386 作為 6385 的slave節點
[root@redis-master redis]#
./bin/redis-cli -a 123456 \
--cluster del-node 192.168.86.139:6386 88f148d854b4552e60f96681d902591691178ff6
刪除主節點
# 方式1:把要刪除的主節點的槽先分配給其他主節點后再刪
[root@redis-master redis]#
./bin/redis-cli -a 123456 \
--cluster reshard 192.168.86.135:6379  \
--cluster-from 31940458ecc5becade331e89faa254197d812c9a \
--cluster-to b9545b0f83ae0ef7a78bf8d5dab63189cb9172c5 \
--cluster-slots 1024 --cluster-yes

./bin/redis-cli -a 123456 、
--cluster del-node 192.168.86.138:6385 31940458ecc5becade331e89faa254197d812c9a


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM