Redis高可用集群Redis Cluster搭建
前言:
? ? ? ?Redis3.0版本之前,可以通過Redis Sentinel(哨兵)來實(shí)現(xiàn)高可用 ( HA ),從3.0版本之后,官方推出了Redis Cluster,它的主要用途是實(shí)現(xiàn)數(shù)據(jù)分片(Data Sharding),不過同樣可以實(shí)現(xiàn)HA,是官方當(dāng)前推薦的方案。
? ? ? ?在Redis Sentinel模式中,每個(gè)節(jié)點(diǎn)需要保存全量數(shù)據(jù),冗余比較多,而在Redis Cluster模式中,每個(gè)分片只需要保存一部分的數(shù)據(jù),對(duì)于內(nèi)存數(shù)據(jù)庫(kù)來說,還是要盡量的減少冗余。在數(shù)據(jù)量太大的情況下,故障恢復(fù)需要較長(zhǎng)時(shí)間,另外,內(nèi)存實(shí)在是太貴了。。。
? ? ? ?Redis Cluster的具體實(shí)現(xiàn)細(xì)節(jié)是采用了Hash槽的概念,集群會(huì)預(yù)先分配16384個(gè)槽,并將這些槽分配給具體的服務(wù)節(jié)點(diǎn),通過對(duì)Key進(jìn)行CRC16(key)%16384運(yùn)算得到對(duì)應(yīng)的槽是哪一個(gè),從而將讀寫操作轉(zhuǎn)發(fā)到該槽所對(duì)應(yīng)的服務(wù)節(jié)點(diǎn)。當(dāng)有新的節(jié)點(diǎn)加入或者移除的時(shí)候,再來遷移這些槽以及其對(duì)應(yīng)的數(shù)據(jù)。在這種設(shè)計(jì)之下,我們就可以很方便的進(jìn)行動(dòng)態(tài)擴(kuò)容或縮容,個(gè)人也比較傾向于這種集群模式。
傳送門:Redis Cluster官方介紹
? ?當(dāng)然,關(guān)于高可用的實(shí)現(xiàn)方案,也可以將這兩種模式結(jié)合起來使用,不過比較復(fù)雜,不太推薦。
安裝Redis:
? ? ? ?關(guān)于Redis的具體安裝步驟,這里就不再贅述了,由于Redis Cluster 模式需要3.0以上的版本支持,因此請(qǐng)確保您的Redis版本是3.0以上的。
查看Redis版本號(hào):
[root@VM_0_15_centos src]# ./redis-cli -p 8002 info server
搭建集群:
? ? ? ?Redis Cluster集群至少需要三個(gè)master節(jié)點(diǎn),本文將以單機(jī)多實(shí)例的方式部署3個(gè)主節(jié)點(diǎn)及3個(gè)從節(jié)點(diǎn),6個(gè)節(jié)點(diǎn)實(shí)例分別使用不同的端口及工作目錄
1. 首先,在redis安裝目錄/usr/local/redis-4.0.6下新建目錄redis-cluster,并在該目錄下再新建6個(gè)子目錄,8001,8002,8003,8004,8005,8006,此時(shí)目錄結(jié)構(gòu)如下圖所示:
[root@VM_0_15_centos redis-cluster]# pwd
/usr/local/redis-4.0.6/redis-cluster
[root@VM_0_15_centos redis-cluster]# ll
total 24
drwxr-xr-x 2 root root 4096 Jul 7 18:42 8001
drwxr-xr-x 2 root root 4096 Jul 7 18:42 8002
drwxr-xr-x 2 root root 4096 Jul 7 18:42 8003
drwxr-xr-x 2 root root 4096 Jul 7 18:42 8004
drwxr-xr-x 2 root root 4096 Jul 7 18:42 8005
drwxr-xr-x 2 root root 4096 Jul 7 18:42 8006
2. 將redis安裝目錄/usr/local/redis-4.0.6下的redis.conf文件拷貝至8001文件夾,并修改以下配置:
daemonize yes #開啟后臺(tái)運(yùn)行
port 8001 #工作端口
bind 172.16.0.15 #綁定機(jī)器的內(nèi)網(wǎng)IP,一定要設(shè)置呀老鐵,不要用127.0.0.1
dir /usr/local/redis-cluster/8001/ #指定工作目錄,rdb,aof持久化文件將會(huì)放在該目錄下,不同實(shí)例一定要配置不同的工作目錄
cluster-enabled yes #啟用集群模式
cluster-config-file nodes-8001.conf #生成的集群配置文件名稱,集群搭建成功后會(huì)自動(dòng)生成,在工作目錄下
cluster-node-timeout 5000 #節(jié)點(diǎn)宕機(jī)發(fā)現(xiàn)時(shí)間,可以理解為主節(jié)點(diǎn)宕機(jī)后從節(jié)點(diǎn)升級(jí)為主節(jié)點(diǎn)時(shí)間
appendonly yes #開啟AOF模式
pidfile /var/run/redis_8001.pid #pid file所在目錄
3. 把8001文件夾下的redis.conf文件拷貝到其他5個(gè)目錄,并重新修改port 、dir、cluster-config-file 三個(gè)屬性
這里可以使用sed命令快速修改
[root@VM_0_15_centos redis-cluster]# sed -i 's/8001/8002/g' 8002/redis.conf
[root@VM_0_15_centos redis-cluster]# sed -i 's/8001/8003/g' 8003/redis.conf
[root@VM_0_15_centos redis-cluster]# sed -i 's/8001/8004/g' 8004/redis.conf
[root@VM_0_15_centos redis-cluster]# sed -i 's/8001/8005/g' 8005/redis.conf
[root@VM_0_15_centos redis-cluster]# sed -i 's/8001/8006/g' 8006/redis.conf
4. 由于創(chuàng)建集群需要用到redis-trib這個(gè)命令,它依賴Ruby和RubyGems,因此我們要先安裝一下
[root@VM_0_15_centos redis-cluster]# yum install ruby
[root@VM_0_15_centos redis-cluster]# yum install rubygems
[root@VM_0_15_centos redis-cluster]# gem install redis --version 3.3.3
5. Ruby安裝完成之后,我們開始啟動(dòng)6個(gè)節(jié)點(diǎn)
[root@VM_0_15_centos redis-4.0.6]# ./src/redis-server redis-cluster/8001/redis.conf
[root@VM_0_15_centos redis-4.0.6]# ./src/redis-server redis-cluster/8002/redis.conf
[root@VM_0_15_centos redis-4.0.6]# ./src/redis-server redis-cluster/8003/redis.conf
[root@VM_0_15_centos redis-4.0.6]# ./src/redis-server redis-cluster/8004/redis.conf
[root@VM_0_15_centos redis-4.0.6]# ./src/redis-server redis-cluster/8005/redis.conf
[root@VM_0_15_centos redis-4.0.6]# ./src/redis-server redis-cluster/8006/redis.conf
6.查看一下服務(wù)是否正常起來了
[root@VM_0_15_centos redis-4.0.6]# ps -ef|grep redis
root 20290 1 0 18:33 ? 00:00:02 ./src/redis-server *:8001 [cluster]
root 20295 1 0 18:33 ? 00:00:02 ./src/redis-server *:8002 [cluster]
root 20300 1 0 18:33 ? 00:00:02 ./src/redis-server *:8003 [cluster]
root 20305 1 0 18:33 ? 00:00:02 ./src/redis-server *:8004 [cluster]
root 20310 1 0 18:33 ? 00:00:02 ./src/redis-server *:8005 [cluster]
root 20312 1 0 18:33 ? 00:00:02 ./src/redis-server *:8006 [cluster]
root 22913 15679 0 19:31 pts/2 00:00:00 grep --color=auto redis
ok,6個(gè)節(jié)點(diǎn)都已經(jīng)正常啟動(dòng)。
7. 開始創(chuàng)建集群
[root@VM_0_15_centos redis-4.0.6]# ./src/redis-trib.rb create --replicas 1 172.16.0.15:8001 172.16.0.15:8002 172.16.0.15:8003 172.16.0.15:8004 172.16.0.15:8005 172.16.0.15:8006
由控制臺(tái)可以看到,集群已經(jīng)創(chuàng)建完畢,那么我們到8001這個(gè)節(jié)點(diǎn)看一下集群節(jié)點(diǎn)狀態(tài)
172.16.0.15:8001> cluster nodes
068ac2afe1ade8b69b83226453fecc2b79cd93ae 172.16.0.15:8004@18004 slave 421ebe9e0a5ac6c811935ecd9dba83ef119dec17 0 1531008204920 4 connected
784c727c83a5952d3714ac211021f909cc4dfee4 172.16.0.15:8005@18005 slave eb5d700e2f030c02fb1f30ba4420d0b4f7170d84 0 1531008203000 5 connected
0537099e7cc7ab595c7aad5f0c96985251b85ec0 172.16.0.15:8006@18006 slave 79262341417df0a11eaf31e72bbf3e26f5f60ebf 0 1531008204419 6 connected
421ebe9e0a5ac6c811935ecd9dba83ef119dec17 172.16.0.15:8001@18001 myself,master - 0 1531008204000 1 connected 0-5460
eb5d700e2f030c02fb1f30ba4420d0b4f7170d84 172.16.0.15:8002@18002 master - 0 1531008203000 2 connected 5461-10922
79262341417df0a11eaf31e72bbf3e26f5f60ebf 172.16.0.15:8003@18003 master - 0 1531008203419 3 connected 10923-16383
控制臺(tái)信息顯示: 當(dāng)前集群中存在3個(gè)主節(jié)點(diǎn)和3個(gè)從節(jié)點(diǎn),說明我們的集群已經(jīng)搭建成功
至此,Redis Cluster集群就搭建完成了!
Tips :
1. 如果想重新創(chuàng)建集群,需要登錄到每個(gè)節(jié)點(diǎn),執(zhí)行flushdb,然后執(zhí)行cluster reset,重啟節(jié)點(diǎn);
2. 如果要批量殺掉Redis進(jìn)程,可以使用pkill redis-server命令;
3. 如果redis開啟了密碼認(rèn)證,則需要在redis.conf中增加屬性 : masterauth yourpassword ,并且需要修改/usr/local/share/gems/gems/redis-3.3.3/lib/redis目錄下的client.rb文件,將password屬性設(shè)置為redis.conf中的requirepass的值,不同的操作系統(tǒng)client.rb的位置可能不一樣,可以使用 find / -name "client.rb"全盤查找一下;
DEFAULTS = {:url => lambda { ENV["REDIS_URL"] },:scheme => "redis",:host => "127.0.0.1",:port => 6379,:path => nil,:timeout => 5.0,:password => "yourpassword",:db => 0,:driver => nil,:id => nil,:tcp_keepalive => 0,:reconnect_attempts => 1,:inherit_socket => false}
4. Redis開啟密碼認(rèn)證后,在集群操作時(shí)問題會(huì)比較多,因此建議不要開啟密碼認(rèn)證,搭配使用防火墻保證Redis的安全。
總結(jié)
以上是生活随笔為你收集整理的Redis高可用集群Redis Cluster搭建的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenResty搭建高性能服务端
- 下一篇: workerman的基本用法