一. 簡(jiǎn)單描述Redis集群原理:
Redis集群通過(guò)一致性哈希算法將16384個(gè)slot(槽)均勻分布在每個(gè)節(jié)點(diǎn)上,每個(gè)主節(jié)點(diǎn)又至少有一個(gè)從節(jié)點(diǎn)保證了該主節(jié)點(diǎn)的高可用。當(dāng)將值存入redis時(shí)會(huì)將該數(shù)據(jù)進(jìn)行哈希后分配到對(duì)應(yīng)slot的節(jié)點(diǎn)上保存,
-
redis cluster是去中心化的,每個(gè)節(jié)點(diǎn)都保存各自的數(shù)據(jù)和整個(gè)集群的狀態(tài)。每個(gè)節(jié)點(diǎn)都和其他所有節(jié)點(diǎn)連接,而且這些連接保持活躍。
入下圖,有三個(gè)主節(jié)點(diǎn)Master,每個(gè)節(jié)點(diǎn)又對(duì)應(yīng)的Slot段(三個(gè)節(jié)點(diǎn)slot共16384),每個(gè)Master節(jié)點(diǎn)又對(duì)應(yīng)一個(gè)子節(jié)點(diǎn)
image.png 集群會(huì)為每一個(gè)分片的主節(jié)點(diǎn),對(duì)應(yīng)一個(gè)從節(jié)點(diǎn)。 每個(gè)節(jié)點(diǎn)默認(rèn)會(huì)隨機(jī)向5個(gè)節(jié)點(diǎn)發(fā)送ping消息,默認(rèn)每秒10次,收到ping消息后返回pong消息做回復(fù),最后通過(guò)這種隨機(jī)的消息交換,最終每個(gè)節(jié)點(diǎn)將獲得所有信息實(shí)現(xiàn)slaveof功能,同時(shí)當(dāng)主節(jié)點(diǎn)down,實(shí)現(xiàn)sentinel哨兵的自動(dòng)failover切換功能,當(dāng)某個(gè)主節(jié)點(diǎn)掛掉,從節(jié)點(diǎn)會(huì)接管主節(jié)點(diǎn)的工作,并告知其他節(jié)點(diǎn)自己變?yōu)橹鞴?jié)點(diǎn),
二. 搭建redis對(duì)于ruby的依賴:
如果選擇搭建的Redis版本是5以下(本文redis為4.0.0)是需要安裝ruby作為依賴的,因?yàn)閞edis5以下版本的集群管理器redis-trib.rb 是根據(jù)ruby語(yǔ)言編寫,但在redis5以后集群管理改用了C語(yǔ)言。注:不同版本redis對(duì)于ruby版本也有限制,入本文使用redis4.0.0要求ruby版本在2.3.0以上!
三. 開始搭建redis集群:
1.linux環(huán)境下載并安裝redis
安裝wget :wget用于linux地址下載redis安裝包
yum -y install wget
安裝gcc編輯器
yum -y install gcc automake autoconf libtool make
選擇路徑下載redis,下載地址可能自行找,本文使用redis4.0.0
cd /usr/local/software
wget http://download.redis.io/releases/redis-4.0.0.tar.gz
下載后在當(dāng)前路徑下會(huì)生成下圖壓縮包

下載完成后解壓后生成對(duì)應(yīng)文件
tar -zxvf redis-4.0.0.tar.gz

切換至程序目錄
cd redis-4.0.0
make編譯redis
make MALLOC=libc
編譯后,會(huì)在src目錄下生成下圖中綠色可執(zhí)行文件

最后安裝Redis:
make install
2.redis環(huán)境有了,開始準(zhǔn)備各個(gè)集群文件夾
將要模擬搭建redis集群6節(jié)點(diǎn)(端口7001-7006),3個(gè)主節(jié)點(diǎn),3個(gè)從節(jié)點(diǎn),因?yàn)槲以趦蓚€(gè)虛擬機(jī)上搭建redis,每個(gè)虛擬機(jī)上分布3個(gè)幾點(diǎn),所以兩臺(tái)虛擬機(jī)都需要安裝redis,也就是上述操作,保證虛擬機(jī)中可以正常運(yùn)行redis
eg:虛擬機(jī)一地址為:192.168.1.128 虛擬機(jī)二地址為:192.168.1.129 兩臺(tái)虛擬機(jī)需用能夠相互訪問(wèn),需要可以ping通哈
下操作在虛擬機(jī)一中執(zhí)行,二與相同請(qǐng)自行模仿
在redis安裝目錄下,新建redis-cluster文件夾
mkdir redis-cluster

進(jìn)入該文件夾
cd redis-cluster建立個(gè)個(gè)幾點(diǎn)的文件夾(我將把7001,7002,7005節(jié)點(diǎn)建立在虛擬機(jī)一上),所以建立三個(gè)文件夾7001,7002,7005文件夾
mkdir 700{1..2} 7005
再在每個(gè)節(jié)點(diǎn)文件中創(chuàng)建data 和log 文件夾,用于保存數(shù)據(jù)和日志使用,例如7001節(jié)點(diǎn)如圖,每個(gè)節(jié)點(diǎn)都要?jiǎng)?chuàng)建
cd 7001mkdir data log
返回redis-4.0.0安裝目錄,將該目錄下redis.conf文件復(fù)制到7001節(jié)點(diǎn)中文件夾中

cp redis.conf /usr/local/software/redis_cluster/7001
復(fù)制后的每節(jié)點(diǎn)中結(jié)構(gòu)應(yīng)該如下圖,eg:7001文件夾

3.修改7001節(jié)點(diǎn)中redis.conf配置文件值
vi redis.conf 進(jìn)入修改模式后,如何修改自行百度吧
修改內(nèi)容如下:
#端口號(hào)
port 7001
#默認(rèn)ip為127.0.0.1 需要改為其他節(jié)點(diǎn)機(jī)器可訪問(wèn)的ip(本機(jī)ip) 否則創(chuàng)建集群時(shí)無(wú)法訪問(wèn)對(duì)應(yīng)的端口,無(wú)法創(chuàng)建集群
#eg:本機(jī)虛擬機(jī)一ip為192.168.1.128,所以需綁定該值
bind 192.168.1.128
#數(shù)據(jù)文件存放位置
dir /usr/local/software/redis-cluster/7001/data/
#日志文件存放位置
logfile /usr/local/software/redis-cluster/7001/log/redis.log
#redis后臺(tái)運(yùn)行
daemonize yes
#為保證集群管理器redis-trib.rb工具的正常運(yùn)行,需要設(shè)置為no,完成后可以改回yes,但每次使用redis-trib.rb都需要改回為no
protected-mode no
#pidfile文件
pidfile /var/run/redis_7001.pid
#開啟集群
cluster-enabled yes
#集群的配置 配置文件首次啟動(dòng)自動(dòng)生成
cluster-config-file nodes_7001.conf
#請(qǐng)求超時(shí) 默認(rèn)15秒,可自行設(shè)置
cluster-node-timeout 15000
#rdb文件名
dbfilename dump-7001.rdb
#aof日志開啟 有需要就開啟,它會(huì)每次寫操作都記錄一條日志,比較耗性能
appendonly yes
#aof文件名
appendfilename "appendonly-7001.aof"
#設(shè)置密碼 如果設(shè)置密碼,所有節(jié)點(diǎn)密碼必須相同
masterauth 123456
requirepass 123456
將修改后的redis.conf文件復(fù)制到其他各個(gè)節(jié)點(diǎn)中
cp redis.conf /usr/local/software/redis-cluster/7002
cp redis.conf /usr/local/software/redis-cluster/7005
修改復(fù)制后的配置文件,使用替換命令,將配置文件中7001替換700X即可
sed -i 's#7001#7002#g' /usr/local/software/redis-cluster/7002/redis.conf
sed -i 's#7001#7005#g' /usr/local/software/redis-cluster/7005/redis.conf
修改后使用cat命令,查看是否修改成功
vi /usr/local/software/redis-cluster/7002/redis.conf
虛擬機(jī)二環(huán)境同上配置,參考上文
3.啟動(dòng)redis所有節(jié)點(diǎn),包括虛擬機(jī)一二
虛擬機(jī)一
/usr/local/software/redis-4.0.0/src/redis-server /usr/local/software/redis-cluster/7001/redis.conf
/usr/local/software/redis-4.0.0/src/redis-server /usr/local/software/redis-cluster/7002/redis.conf
/usr/local/software/redis-4.0.0/src/redis-server /usr/local/software/redis-cluster/7005/redis.conf
虛擬機(jī)二
/usr/local/software/redis-4.0.0/src/redis-server /usr/local/software/redis-cluster/7003/redis.conf
/usr/local/software/redis-4.0.0/src/redis-server /usr/local/software/redis-cluster/7004/redis.conf
/usr/local/software/redis-4.0.0/src/redis-server /usr/local/software/redis-cluster/7006/redis.conf
通過(guò)查看幾點(diǎn)是否啟動(dòng)正常
ps -ef|grep redis

3.通過(guò)集群管理器啟動(dòng)先安裝ruby
yum install centos-release-scl-rh //會(huì)在/etc/yum.repos.d/目錄下多出一個(gè)CentOS-SCLo-scl-rh.repo源
yum install rh-ruby23 -y //直接yum安裝即可
scl enable rh-ruby23 bash //必要一步
ruby -v //查看安裝版本

安裝好ruby,執(zhí)行以下命令
gem install redis

成功后便可通過(guò)集群管理器啟動(dòng)集群
前面3個(gè)地址為主節(jié)點(diǎn),后面隨機(jī)分配從節(jié)點(diǎn)
/usr/local/software/redis-cluster/bin/redis-trib.rb create --replicas 1 192.168.1.128:7001 192.168.1.128:7002 192.168.1.128:7005 192.168.1.129:7003 192.168.1.129:7004 192.168.1.129:7006
節(jié)點(diǎn)設(shè)置密碼之后如果需要使用redis-trib.rb的各種命令
則會(huì)報(bào)錯(cuò) Sorry, can’t connect to node解決方法:找到client.rb 然后修改默認(rèn)password為上面設(shè)置的密碼
client.rb路徑可以通過(guò)find命令查找:
find / -name 'client.rb'
類似/usr/local/rvm/gems/ruby-2.5.5/gems/redis-4.1.2/lib/redis/client.rb-
如果執(zhí)行是一直卡在,需要開啟redeis集群總線對(duì)應(yīng)節(jié)點(diǎn)
搭建的redis集群中端口號(hào)是從 7001 ~ 7006的,需開啟端口號(hào)+10000端口,如7001需開通17001端口
image.png
開通端口命令:
虛擬機(jī)一:
firewall-cmd --zone=public --add-port=7001/tcp --permanent
firewall-cmd --zone=public --add-port=7002/tcp --permanent
firewall-cmd --zone=public --add-port=7005/tcp --permanent
firewall-cmd --zone=public --add-port=17001/tcp --permanent
firewall-cmd --zone=public --add-port=17002/tcp --permanent
firewall-cmd --zone=public --add-port=17005/tcp --permanent
firewall-cmd --reload
虛擬機(jī)一:
firewall-cmd --zone=public --add-port=7003/tcp --permanent
firewall-cmd --zone=public --add-port=7004/tcp --permanent
firewall-cmd --zone=public --add-port=7006/tcp --permanent
firewall-cmd --zone=public --add-port=17003/tcp --permanent
firewall-cmd --zone=public --add-port=17004/tcp --permanent
firewall-cmd --zone=public --add-port=17006/tcp --permanent
firewall-cmd --reload
配置好后,將所有節(jié)點(diǎn)關(guān)閉并刪除對(duì)應(yīng)節(jié)點(diǎn)data文件夾中所有文件后從新啟動(dòng)集群,啟動(dòng)中會(huì)讓輸入yes(必須輸入yes,y不行),啟動(dòng)成功入圖,我們可以清楚的看出集群的主節(jié)點(diǎn)和從節(jié)點(diǎn)與各個(gè)節(jié)點(diǎn)負(fù)責(zé)的slot分段

4.驗(yàn)證集群是否搭建成功
在虛擬機(jī)一上開啟7001節(jié)點(diǎn)客戶端
/usr/local/software/redis-4.0.0/src/redis-cli -c -h 192.168.1.128 -p 7001 -a 123456

可以查看集群信息
cluster info
cluster nodes

在7001節(jié)點(diǎn)設(shè)置一個(gè)key值,然后連接虛擬機(jī)二7003節(jié)點(diǎn),查看該值是否存在,如存在表示搭建集群成功
set 7001key 7001vale

連接虛擬機(jī)二7003節(jié)點(diǎn),查看7001存入值是否存在
/usr/local/software/redis-4.0.0/src/redis-cli -c -h 192.168.1.129 -p 7003 -a 123456get 7001key

