文檔結構如下:
Redis cluster 是redis的分布式解決方案,在3.0版本正式推出后,有效的解決了redis分布式方面的需求;當遇到單機內存,並發,流量等瓶頸是,可以采用cluster架構方案達到負載均衡的目的。
官方網站:
https://redis.io/topics/cluster-tutorial
Redis數據分區
Redis cluster 采用虛擬槽分區,所有的鍵根據哈希函數映射到0~16383整數槽內,計算公式:
Slot=CRC16(key)&16384。每個節點負責維護一部分槽以及槽所映射的鍵值數據。
redis群集中的每個節點都負責哈希槽的子集,例如,您可能擁有一個包含3個節點的群集,其中:
節點A包含從0到5500的散列槽。
節點B包含從5501到11000的散列槽。
節點C包含從11001到16383的散列槽。
由於我的環境只有三台服務器master 和slave為同一台,一台服務器,兩張網卡。
Redis Cluster主從模型
為了在主節點子集發生故障或無法與大多數節點通信時保持可用,Redis Cluster使用主從模型,其中每個散列槽從1(主機本身)到N個副本(N) -1個額外的從節點)。
在具有節點A,B,C的示例群集中,如果節點B發生故障,則群集無法繼續,因為我們不再能夠在5501-11000范圍內提供服務哈希位置的方法。
然而,當創建集群時(或稍后),我們向每個主節點添加一個從節點,以便最終集群由作為主節點的A,B,C和作為從節點的A1,B1,C1組成。 ,如果節點B出現故障,系統就能繼續運行。
節點B1復制B,B失敗,集群將節點B1升級為新的主節點,並將繼續正常運行。
但請注意,如果節點B和B1同時發生故障,Redis Cluster將無法繼續運行。
Redis群集配置參數
我們即將創建一個示例集群部署。在繼續之前,讓我們介紹Redis Cluster在redis.conf
文件中引入的配置參數。有些人會很明顯,有些人會在你繼續閱讀時更清楚。
cluster-enabled<yes/no>
:如果是,則在特定Redis實例中啟用Redis群集支持。否則,實例像往常一樣作為獨立實例啟動。
cluster-config-file<filename>
:請注意,盡管有此選項的名稱,但這不是用戶可編輯的配置文件,而是每次發生更改時Redis群集節點自動保持群集配置(基本上是狀態)的文件,為了能夠在啟動時重新閱讀它。該文件列出了集群中其他節點,狀態,持久變量等內容。由於某些消息接收,通常會將此文件重寫並刷新到磁盤上。
cluster-node-timeout<milliseconds>
:Redis群集節點不可用的最長時間,不會被視為失敗。如果主節點的可訪問時間超過指定的時間,則其從屬節點將進行故障轉移。此參數控制Redis群集中的其他重要事項。值得注意的是,在指定時間內無法訪問大多數主節點的每個節點都將停止接受查詢。
cluster-slave-validity-factor<factor>
:如果設置為零,則從站將始終嘗試對主站進行故障切換,而不管主站和從站之間的鏈路是否保持斷開連接的時間長短。如果該值為正,則計算最大斷開時間作為節點超時值乘以此選項提供的因子,如果節點是從屬節點,則如果主鏈接斷開連接的時間超過指定的時間,則不會嘗試啟動故障轉移。例如,如果節點超時設置為5秒,並且有效性因子設置為10,則從主設備斷開超過50秒的從設備將不會嘗試故障轉移其主設備。請注意,如果沒有從站能夠對其進行故障轉移,則任何不同於零的值都可能導致Redis群集在主站發生故障后不可用。在這種情況下,只有當原始主服務器重新加入群集時,群集才會返回。
cluster-migration-barrier<count>
:主服務器將保持連接的最小從服務器數,以便另一個從服務器遷移到不再由任何從服務器覆蓋的主服務器。有關詳細信息,請參閱本教程中有關副本遷移的相應部分。
cluster-require-full-coverage<yes/no>
:如果設置為yes,則默認情況下,如果任何節點未覆蓋某個百分比的密鑰空間,則集群將停止接受寫入。如果該選項設置為no,即使只能處理有關鍵子集的請求,群集仍將提供查詢。
a) 關閉防火牆
vi /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
setenforce 0
service iptables stop
chkconfig iptables off
b) 三台服務器配置好yum
mount /dev/sr0 /mnt/
cd /etc/yum.repos.d/
mv redhat.repo redhat.repo.bak
mv rhel-source.repo rhel-source.repo.bak
vi /etc/yum.repos.d/rhel-debuginfo.repo
[rhel-debuginfo]
name=Red Hat Enterprise Linux $releasever - $basearch - Debug
baseurl=file:///mnt/
enabled=1
gpgcheck=0
安裝yum:
yum -y install make gcc* rubygems
由於需要安裝ruby環境,所以采用yum安裝
搭建集群
Redis-trib.rb是采用ruby實現的redis集群管理工具。內部通過cluster相關命令簡化集群創建,檢查,槽遷移和均衡等常見運維操作,使用之前需要安裝Ruby依賴環境。
1、環境准備
下載ruby(5.0可以不用ruby):
最新為Ruby 2.6.0,地址:http://www.ruby-lang.org/zh_cn/downloads/
由於yum 安裝的版本不符合要求
我單獨下載的
tar -zxvf ruby-2.6.0.tar.gz
./configure -prefix=/usr/local/ruby
make
make install
cd /usr/local/ruby/
cp bin/ruby /usr/local/bin/
cp bin/gem /usr/local/bin/
安裝rubygem redis 依賴:
最新版本為4.1
https://rubygems.org/gems/redis/versions/4.1.0
cd /soft/
/usr/local/bin/gem install -l redis-4.1.0.gem
/usr/local/bin/gem list redis gem
安裝redis5.0 單機
/soft/redis-5.0.0
make
make install
cd /soft/redis-5.0.0/src/
cp redis-cli redis-server ../redis.conf /usr/local/redis-cluster/redis6379
cp redis-cli redis-server ../redis.conf /usr/local/redis-cluster/redis6380
cp redis-cli redis-server ../redis.conf /usr/local/redis-cluster/redis6381
cp redis-cli redis-server ../redis.conf /usr/local/redis-cluster/redis6382
cp redis-cli redis-server ../redis.conf /usr/local/redis-cluster/redis6383
cp redis-cli redis-server ../redis.conf /usr/local/redis-cluster/redis6384
安裝redis-trib.rb
cd /soft/redis-5.0.0/src
./redis-trib.rb –help
5.0 redis-cli --cluster
redis-cli --cluster help具有以下功能:
1、 create :創建集群
2、 check :檢查集群
3、 info :查看集群信息
4、 fix :修復集群
5、 reshard :在線遷移slot
6、 rebalance :平衡集群節點slot數量
7、 add-node :將新節點加入集群
8、 del-node :從集群中刪除節點
9、 set-timeout :設置集群節點間心跳連接的超時時間
10、 call :在集群全部節點上執行命令
11、 import :將外部redis數據導入集群
cp /soft/redis-5.0.0/src/redis-trib.rb /usr/local/bin/
准備目錄:
mkdir –p /redis6379
mkdir –p /redis6380
mkdir -p /usr/local/redis-cluster/redis6379
mkdir -p /usr/local/redis-cluster/redis6380
cp
mkdir –p /redis6381
mkdir –p /redis6382
mkdir -p /usr/local/redis-cluster/redis6381
mkdir -p /usr/local/redis-cluster/redis6382
mkdir –p /redis6383
mkdir –p /redis6384
mkdir -p /usr/local/redis-cluster/redis6383
mkdir -p /usr/local/redis-cluster/redis6384
准備redis 集群配置文件:
redis6379.cnf
save 900 1
bind 0.0.0.0 --運行所有IP
daemonize yes
port 6379
loglevel warning
timeout 60
logfile "6379.log"
dbfilename dump6379.rdb
pidfile /var/run/redis_6379.pid
maxmemory-policy volatile-ttl
auto-aof-rewrite-min-size 10GB
cluster-enabled yes
cluster-node-timeout 15000
cluster-config-file nodes-6379.conf
protected-mode no --讓客戶端都可以連接redis
其他節點按照6379進行相應的修改成對應的端口。
redis-server /usr/local/redis-cluster/redis6379/redis6379.conf
redis-server /usr/local/redis-cluster/redis6380/redis6380.conf
redis-server /usr/local/redis-cluster/redis6381/redis6381.conf
redis-server /usr/local/redis-cluster/redis6382/redis6382.conf
redis-server /usr/local/redis-cluster/redis6383/redis6383.conf
redis-server /usr/local/redis-cluster/redis6384/redis6384.conf
2、集群創建
例子:create創建集群
create命令可選replicas參數,replicas表示需要有幾個slave。
在3.0每個有一個slave的集群的創建命令如下:
由於redis5.0版本與3.0差異很大
官方如下:
有兩種方法:
方法一:
redis-cli --cluster create 172.16.10.21:6379 172.16.10.23:6381 172.16.10.25:6383 172.16.10.22:6380 172.16.10.24:6382 172.16.10.26:6384 --cluster-replicas 1
方法二:
/usr/local/bin/redis-trib.rb create --replicas 1 172.16.10.21:6379 172.16.10.23:6381 172.16.10.25:6383 172.16.10.22:6380 172.16.10.24:6382 172.16.10.26:6384
由於我的redis-trib.rb不可用。用的第一種方法。
3、查看集群信息
redis-cli -h 172.16.10.21 -p 6379 –c
cluster nodes
查看節點信息:
a1 這個槽位在10.25這台redis上。
查看集群信息
cluster info
查看集群完整性:
redis-cli --cluster check 172.16.10.21:6379
可以看出來,三個master 中的slots正好分配完16384個槽