1簡(jiǎn)介
在 Redis 3.0 之前,使用 哨兵(sentinel)機(jī)制來(lái)監(jiān)控各個(gè)節(jié)點(diǎn)之間的狀態(tài)腻贰。Redis Cluster 是 Redis 的 分布式解決方案迅腔,在 3.0 版本正式推出牍帚,有效地解決了 Redis 在 分布式 方面的需求银伟。當(dāng)遇到單機(jī)內(nèi)存伍伤、并發(fā)并徘、流量等瓶頸時(shí),可以采用 Cluster 架構(gòu)方案達(dá)到負(fù)載均衡的目的
2 Redis Cluster集群介紹
Redis Cluster 集群模式通常具有高可用扰魂、可擴(kuò)展性麦乞、分布式、容錯(cuò)等特性劝评。Redis Cluster采用的是虛擬槽分區(qū)姐直。先來(lái)解釋一下什么是虛擬槽分區(qū)
2.1 虛擬槽分區(qū)介紹
虛擬槽分區(qū)巧妙地使用了哈希空間蒋畜,使用分散度良好的哈希函數(shù)把所有數(shù)據(jù)映射到一個(gè)固定范圍的整數(shù)集合中声畏,整數(shù)定義為槽(slot)。這個(gè)范圍一般遠(yuǎn)遠(yuǎn)大于節(jié)點(diǎn)數(shù)姻成,比如 Redis Cluster 槽范圍是 0 ~ 16383插龄。槽是集群內(nèi)數(shù)據(jù)管理和遷移的基本單位。采用大范圍槽的主要目的是為了方便數(shù)據(jù)拆分和集群擴(kuò)展科展。每個(gè)節(jié)點(diǎn)會(huì)負(fù)責(zé)一定數(shù)量的槽均牢,如圖所示:
當(dāng)前集群有 5 個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)平均大約負(fù)責(zé) 3276 個(gè)槽才睹。由于采用高質(zhì)量的哈希算法徘跪,每個(gè)槽所映射的數(shù)據(jù)通常比較均勻,將數(shù)據(jù)平均劃分到 5 個(gè)節(jié)點(diǎn)進(jìn)行數(shù)據(jù)分區(qū)砂竖。Redis Cluster 就是采用虛擬槽分區(qū)真椿。
節(jié)點(diǎn)1: 包含 0 到 3276 號(hào)哈希槽。
節(jié)點(diǎn)2:包含 3277 到 6553 號(hào)哈希槽乎澄。
節(jié)點(diǎn)3:包含 6554 到 9830 號(hào)哈希槽突硝。
節(jié)點(diǎn)4:包含 9831 到 13107 號(hào)哈希槽。
節(jié)點(diǎn)5:包含 13108 到 16383 號(hào)哈希槽置济。
這種結(jié)構(gòu)很容易添加或者刪除節(jié)點(diǎn)解恰。如果增加一個(gè)節(jié)點(diǎn) 6,就需要從節(jié)點(diǎn) 1 ~ 5 獲得部分槽分配到節(jié)點(diǎn) 6 上浙于。如果想移除節(jié)點(diǎn) 1护盈,需要將節(jié)點(diǎn) 1 中的槽移到節(jié)點(diǎn) 2 ~ 5 上,然后將沒(méi)有任何槽的節(jié)點(diǎn) 1 從集群中移除即可羞酗。
由于從一個(gè)節(jié)點(diǎn)將哈希槽移動(dòng)到另一個(gè)節(jié)點(diǎn)并不會(huì)停止服務(wù)腐宋,所以無(wú)論添加刪除或者改變某個(gè)節(jié)點(diǎn)的哈希槽的數(shù)量都不會(huì)造成集群不可用的狀態(tài).
2.2 Redis數(shù)據(jù)分區(qū)
上面說(shuō)過(guò),Redis Cluster 采用虛擬槽分區(qū),所有的鍵根據(jù)哈希函數(shù)映射到 0~16383 整數(shù)槽內(nèi)胸竞,計(jì)算公式:slot = CRC16(key)& 16383欺嗤。每個(gè)節(jié)點(diǎn)負(fù)責(zé)維護(hù)一部分槽以及槽所映射的鍵值數(shù)據(jù),如圖所示:
3 Redis集群搭建
3.1 環(huán)境準(zhǔn)備
3.1.1 安裝GCC
Redis 安裝需要依托GCC環(huán)境
\1.? 檢查是否安裝gcc
命令: gcc -v
如果能輸出gcc版本信息,卫枝,說(shuō)明安裝了gcc煎饼。反之需要安裝gcc
\2.? 安裝gcc
創(chuàng)建目錄/usr/local/gccSrc
上傳以下rpm文件至/usr/local/gccSrc目錄下
cpp-4.8.5-11.el7.x86_64.rpm
gcc-4.8.5-11.el7.x86_64.rpm
glibc-devel-2.17-157.el7.x86_64.rpm
glibc-headers-2.17-157.el7.x86_64.rpm
kernel-headers-3.10.0-514.el7.x86_64.rpm
libmpc-1.0.1-3.el7.x86_64.rpm
mpfr-3.1.1-4.el7.x86_64.rpm
\3.? 依次進(jìn)行安裝
rpm -ivh mpfr-3.1.1-4.el7.x86_64.rpm
rpm -ivh libmpc-1.0.1-3.el7.x86_64.rpm
rpm -ivh kernel-headers-3.10.0-514.el7.x86_64.rpm
rpm -ivh glibc-headers-2.17-157.el7.x86_64.rpm
rpm -ivh glibc-devel-2.17-157.el7.x86_64.rpm
rpm -ivh cpp-4.8.5-11.el7.x86_64.rpm
rpm -ivh gcc-4.8.5-11.el7.x86_64.rpm
\4.? 都安裝成功后黑滴,驗(yàn)證gcc -v
3.1.2 安裝zlib
因?yàn)镽edis集群環(huán)境需要使用到ruby的接口辅柴,需要使用到redis的gem包,而安裝gem包時(shí)需要有zlib的環(huán)境
1置侍、上傳zlib-1.2.11.tar.gz到/usr/local目錄下
2马篮、解壓 tar -xzvf zlib-1.2.11.tar.gz
3沾乘、cd zlib-1.2.11
4、./configure --prefix=/usr/local/zlib
(如果報(bào)錯(cuò)check for gcc浑测,需要先安裝gcc意鲸,安裝完GCC再來(lái)執(zhí)行)
5、make
6尽爆、make install
3.1.3 安裝openssl
因?yàn)镽edis集群環(huán)境需要使用到ruby的接口,需要使用到redis的gem包读慎,而安裝gem包時(shí)需要有openssl的環(huán)境
1漱贱、上傳openssl-1.0.1h.tar.gz到/usr/local/目錄下
2、解壓 tar -xzvf openssl-1.0.1h.tar.gz
3夭委、cd openssl-1.0.1h/
4幅狮、./config -fPIC --prefix=/usr/local/openssl enable-shared
5、./config -t
6株灸、make && make install
7崇摄、which openssl? ? //查看系統(tǒng)openssl的路勁
8、rm -rf /usr/bin/openssl? // /usr/bin/openssl是which openssl 查看到的舊版本的openssl的路徑
9慌烧、cp /usr/local/openssl/bin/openssl /usr/bin/openssl //拷貝新版本的安裝路徑到系統(tǒng)路徑
10逐抑、執(zhí)行openssl version
輸出版本信息
3.1.4 安裝ruby
在安裝Redis集群環(huán)境是需要使用到Ruby
1、上傳ruby-2.5.7.tar.gz到/usr/local目錄下
2屹蚊、解壓 tar -xzvf ruby-2.5.7.tar.gz
3厕氨、cd ruby-2.5.7
4、./configure –-prefix=/usr/local/ruby? //-prefix是將ruby安裝到指定目錄
5汹粤、make && make install
成功安裝如圖所示
6命斧、配置環(huán)境變量
vi /etc/profile
添加環(huán)境變量,如圖所示
7嘱兼、執(zhí)行命令使配置文件生效
source /etc/profile
8国葬、執(zhí)行命令校驗(yàn)ruby是否安裝成功,安裝配置成功會(huì)輸出ruby版本信息
ruby -v
9、進(jìn)入/usr/local/ruby-2.5.7/ext/zlib/目錄下
cd /usr/local/ruby-2.5.7/ext/zlib/
(備注:/usr/local/ruby-2.5.7這個(gè)目錄是ruby安裝包后解壓的目錄)
10汇四、執(zhí)行命令:ruby extconf.rb --with-zlib-include=/usr/local/zlib/include/ --with-zlib-lib=/usr/local/zlib/lib
(備注:/usr/local/zlib是zlib安裝目錄接奈,命令執(zhí)行后會(huì)生成Makefile文件)
11、打開(kāi)Makefile文件船殉,找到下面一行(在文件倒數(shù)第3行)把路徑修改一下
把zlib.o: $(top_srcdir)/include/ruby.h 改zlib.o: ../../include/ruby.h
12鲫趁、make && make install
13、進(jìn)入 /usr/local/ruby-2.5.7/ext/openssl/目錄下
cd /usr/local/ruby-2.5.7/ext/openssl/
14利虫、執(zhí)行命令:
ruby extconf.rb --with-openssl-include=/usr/local/openssl/include/ --with-openssl-lib=/usr/local/openssl/lib
(備注:/usr/local/openssl是openssl的安裝目錄挨厚,命令執(zhí)行后會(huì)生成Makefile文件)
15、打開(kāi)Makefile文件糠惫,在topdir = /usr/local/ruby/include/ruby-xxx后面新增一行 top_srcdir = /usr/local/ruby-2.5.7
(備注/usr/local/ruby-2.5.7是ruby解壓的目錄)
16疫剃、make && make install
3.1.5 安裝redis-4.1.3.gem
安裝集群環(huán)境時(shí)需要使用到ruby的接口,這個(gè)redis-4.1.3.gem提供了這個(gè)接口
1硼讽、上傳redis-4.1.3.gem到/usr/local/目錄下
2巢价、執(zhí)行命令 gem install redis-4.1.3.gem
成功安裝如圖所示
3.2 安裝單機(jī)Redis
1、創(chuàng)建/usr/local/redis目錄固阁,上傳redis-4.0.14.tar.gz至/usr/local/redis目錄
2壤躲、cd /usr/local/redis
3、解壓 tar -xzvf redis-4.0.14.tar.gz
4备燃、cd redis-4.0.14/
5碉克、make && make install
看到如下信息,redis安裝成功了
進(jìn)入安裝目錄 cd /usr/local/redis/redis-4.0.14
6并齐、修改配置文件redis.conf
bind 127.0.0.1 改為bind 0.0.0.0 【說(shuō)明:表示所有ip都可以連接這個(gè)redis】
daemonize no 改為 daemonize yes 【說(shuō)明:?jiǎn)?dòng)守護(hù)進(jìn)程】
protected-mode yes 改為 protected-mode no 【說(shuō)明:取消保護(hù)模式漏麦,如果啟用保護(hù)模式需要設(shè)置密碼】
logfile "" 改為 logfile "redis日志存儲(chǔ)文件路徑" 【說(shuō)明:指定日志存儲(chǔ)路徑】
7、啟動(dòng)redis的命令
進(jìn)入redis安裝目錄/usr/local/redis/redis-4.0.14况褪,執(zhí)行如下命令啟動(dòng)redis
redis-server redis.conf
啟動(dòng)后執(zhí)行如下命令連接redis
redis-cli -p 6379 -h 192.169.1.86
(備注:6379是redis默認(rèn)端口 192.169.1.86是redis所在服務(wù)器ip)
并執(zhí)行命令set 1 1存入值至redis中測(cè)試一下
3.3 部署集群環(huán)境
集群模式相當(dāng)于將數(shù)據(jù)槽分片撕贞。每個(gè)節(jié)點(diǎn)分一段數(shù)據(jù)片。這樣的話测垛,當(dāng)一個(gè)節(jié)點(diǎn)宕機(jī)后捏膨,這個(gè)節(jié)點(diǎn)沒(méi)有備份的話,此段分片將不再可以使用食侮。所以脊奋,官方推薦,集群內(nèi)的每個(gè)節(jié)點(diǎn)都應(yīng)該配備一個(gè)從節(jié)點(diǎn)疙描,作為冷備诚隙。
官網(wǎng)推薦的模式,是三主三從的集群部署方式起胰,這里以配置三主三從為例.
需要配置的節(jié)點(diǎn)信息
節(jié)點(diǎn)名稱端口號(hào)是主是從所屬主節(jié)點(diǎn)
Redis70017001主
Redis70027002主
Redis70037003主
Redis70047004從Redis7004
Redis70057005從Redis7001
Redis70067006從Redis7002
1久又、進(jìn)入/usr/local/redis/目錄
cd /usr/local/redis
2巫延、執(zhí)行mkdir redis700{1,2,3,4,5,6} 創(chuàng)建文件夾redis7001、redis7002地消、redis7003炉峰、redis7004、redis7005脉执、redis7006
3疼阔、將/usr/local/bin/ 目錄下的redis-cli和redis-server復(fù)制到redis7001、...redis7006目錄下
1半夷、在redis7001目錄下創(chuàng)建redis.conf文件
vim redis.conf
文件內(nèi)容
#端口號(hào)(6個(gè)對(duì)應(yīng)各自的端口號(hào))
port 7001
appendonly yes
#啟動(dòng)集群
cluster-enabled yes
#yes 啟用守護(hù)進(jìn)程
daemonize yes
#關(guān)聯(lián)集群配置文件
cluster-config-file "nodes.conf"
#設(shè)置超時(shí)
cluster-node-timeout 5000
#日志信息
logfile "redis7001.log"
#指定訪問(wèn)地址
bind 0.0.0.0
tcp-keepalive 300
redis7002目錄下創(chuàng)建redis.conf文件
文件內(nèi)容為
port 7002
appendonly yes
cluster-enabled yes
daemonize yes
cluster-config-file "nodes.conf"
cluster-node-timeout 5000
logfile "redis7002.log"
bind 0.0.0.0
tcp-keepalive 300
依次類推婆廊,redis7003至redis7006目錄下都創(chuàng)建redis.conf文件
每個(gè)目錄下(redis7001至redis7006)都應(yīng)該有這三個(gè)文件
分別將這6個(gè)服務(wù)啟動(dòng)起來(lái),啟動(dòng)命令:redis-server redis.conf
一個(gè)一個(gè)啟動(dòng)有點(diǎn)麻煩巫橄,在/usr/local/redis/目錄下創(chuàng)建一下sh腳本來(lái)啟動(dòng)redis實(shí)例
vim startall.sh
cd redis7001
./redis-server redis.conf
cd ..
cd redis7002
./redis-server redis.conf
cd ..
cd redis7003
./redis-server redis.conf
cd ..
cd redis7004
./redis-server redis.conf
cd ..
cd redis7005
./redis-server redis.conf
cd ..
cd redis7006
./redis-server redis.conf
賦予 startall.sh腳本可執(zhí)行權(quán)限
chmod 777 startall.sh
執(zhí)行 startall.sh腳本
./startall.sh
執(zhí)行ps -ef|grep redis情況查看redis運(yùn)行情況淘邻,啟動(dòng)成功如圖所示
創(chuàng)建集群,將這幾個(gè)節(jié)點(diǎn)加入集群湘换。首先進(jìn)入redis-trib.rb所在目錄
進(jìn)入/usr/local/redis/redis-4.0.14/src/目錄
cd /usr/local/redis/redis-4.0.14/src/
執(zhí)行如下命令:
./redis-trib.rb create --replicas 1 192.169.1.86:7001 192.169.1.86:7002 192.169.1.86:7003 192.169.1.86:7004 192.169.1.86:7005 192.169.1.86:7006
【備注:192.169.1.86是redis所在服務(wù)器ip,注意這個(gè)ip不能寫127.0.0.1,否則只有本機(jī)才能連接】
輸入yes 回車 宾舅,redis-trib.rb 開(kāi)始執(zhí)行節(jié)點(diǎn)握手和槽分配操作,如圖所示加入集群成功
說(shuō)明:M表示是主節(jié)點(diǎn)彩倚,S表示是從節(jié)點(diǎn)】
執(zhí)行集群檢查筹我,檢查各個(gè) redis 節(jié)點(diǎn)占用的哈希槽(slot)的個(gè)數(shù)以及 slot覆蓋率。16384 個(gè)槽位中帆离,主節(jié)點(diǎn)Redis7001崎溃、主節(jié)點(diǎn)Redis7002和,主節(jié)點(diǎn)Redis7003分別占用了 5461盯质、5462 和 5461 個(gè)槽位。
連接集群測(cè)試
連接命令:redis-cli -p 其中一個(gè)節(jié)點(diǎn)的端口 -h 其中一個(gè)節(jié)點(diǎn)的ip -c
[備注:一定要有-c , -c表示以集群方式連接概而,沒(méi)有-c就是單點(diǎn)連接了]
并往redis存一個(gè)值進(jìn)行測(cè)試:set a a ,如下圖表示成功
3.3 集群環(huán)境中每個(gè)節(jié)點(diǎn)加入密碼
加入密碼有兩種方式:
u 方法一:修改所有Redis集群中的redis.conf配置文件
masterauth 123456 //設(shè)置master密碼呼巷,是為了Salve能夠連接上Masterrequirepass 123456 //設(shè)置Redis訪問(wèn)請(qǐng)求密碼復(fù)制代碼
u 方法二:進(jìn)入各個(gè)Redis集群中的實(shí)時(shí)配置
./redis-cli -c -p 7001 //分別進(jìn)入各個(gè)Redis片機(jī)進(jìn)行各自設(shè)置config set masterauth 123456 config set requirepass 123456 config rewrite復(fù)制代碼
注意:各個(gè)節(jié)點(diǎn)密碼都必須一致,否則Redirected就會(huì)失敗赎瑰。推薦使用第一種方式王悍。
先關(guān)閉所有的redis服務(wù),使用命令 redis-cli -p 7001 shutdown依次將redis實(shí)例關(guān)閉餐曼。經(jīng)過(guò)上面的步驟其實(shí)已經(jīng)生成了相應(yīng)的節(jié)點(diǎn)信息文件(nodes.conf)和數(shù)據(jù)信息文件(appendonly.aof压储,dump.rdb)。將所有redis7001 到redis7006的文件夾下的這三個(gè)文件都刪除源譬,然后修改redis.conf添加密碼如圖所示
然后找到client.rb文件(可以使用 find / -name “client.rb”命令)然后修改password集惋,如圖
然后使用腳本啟動(dòng)所有的集群節(jié)點(diǎn)。
再次運(yùn)行命令 ./redis-trib.rb create --replicas 1 192.169.1.21:7001 192.169.1.21:7002 192.169.1.21:7003 192.169.1.21:7004 192.169.1.21:7005 192.169.1.21:7006 創(chuàng)建集群踩娘。
測(cè)試集群
使用命令 redis-cli -c -p 7001 設(shè)置一個(gè)set name song刮刑,會(huì)提示需要認(rèn)證 輸入auth “123456”即可 ,然后再次set name song 會(huì)redirected 到7002,也需要密碼 雷绢,當(dāng)然可以直接再次使用 auth “123456”,這樣顯得有些繁瑣泛烙,可以直接使用命令,redis-cli -c -p 7001 -a 123456連接(-a 相當(dāng)于是輸入密碼驗(yàn)證)翘紊,這樣就可以直接跳轉(zhuǎn)蔽氨。如圖
加入密碼后的關(guān)閉redis實(shí)例的腳本也要相應(yīng)的修改一下,加入-a 123456 的參數(shù)? 修改后內(nèi)容如下: