redis分布式集群架構(Redis+Keepalived+Haproxy)至少需要3臺服務器、6個節點,一臺服務器2個節點。
redis分布式集群架構中的每臺服務器都使用六個端口來實現多路復用,最終實現主從熱備、負載均衡、秒級切換的目標。
redis分布式集群架構思路為:keepalived給haproxy做高可用,當一臺haproxy出現故障時,高可用會將另一臺備用的haproxy作為master,繼續給后端提供服務,防止單點故障。
部署redis集群
第一步,環境準備。
redis分布式集群架構至少需要3臺服務器、6個節點,一臺機器2個節點,創建出3個master節點、3個salve節點環境。
第一臺服務器:
私網IP:x.x.x.x?redis-master 6001?redis-slave 6002
第二臺服務器:
私網IP:y.y.y.y?redis-master 6001?redis-slave 6002
第三臺服務器:
私網IP:z.z.z.z?redis-master 6001?redis-slave 6002
第二步,安裝redis。(每臺服務器都安裝)
命令:yum -y install redis
若結果顯示“redis-6.0.5-1.11.al8.x86_64”,則說明成功安裝了redis-6.0.5。
第三步,啟動redis服務。(每臺服務器都啟動)
命令:systemctl start redis
若結果顯示“Active: failed”,則需要把文件/usr/lib/systemd/system/redis.service中的“--daemonize no --supervised systemd”去掉,注釋掉“Type=notify”,最后再次啟動redis,服務狀態為“Active: active (running)。
systemctl stop redis
systemctl restart redis
systemctl daemon-reload
# 設置開機自啟動
命令:systemctl enable redis
# 查看服務狀態是否為“Active: active (running)”
命令:systemctl status redis
ps -ef | grep redis
netstat -nap | grep ?6379
# 服務端啟動成功后,啟動redis 客戶端,查看端口號。
命令:redis-cli
set [key] [value]
get [key]
exit
ps -ef | grep redis
netstat -nap | grep 6379
第四步,在/usr/local中新建/redis/6001/conf、/redis/6001/data、/redis/6001/log、 /redis/6002/conf、/redis/6002/data和/redis/6002/log文件夾。(每臺服務器都新建)
命令:mkdir -p /usr/local/redis/{6001,6002}/{conf,data,log}
第五步,將/etc/redis.conf配置文件復制粘貼到文件夾/usr/local/redis/6001/conf。(每臺服務器都復制)
命令:cp /etc/redis.conf /usr/local/redis/6001/conf
cp /etc/redis.conf /usr/local/redis/6002/conf
第六步,配置redis.conf。(每臺服務器都配置)
redis主編輯配置/usr/local/redis/6001/conf/redis.conf文件,做以下幾處修改:
“bind 127.0.0.1”改為“bind 0.0.0.0”,“protected-mode yes”改為“protected-mode no”,“port 6379”改為“port 6001”,“daemonize no”改為“daemonize yes”,“requirepass foobared”改為requirepass "redis123456",“dir ./”改為“dir /usr/local/redis/6001/data”,“pidfile /var/run/redis_6379.pid”改為“pidfile /usr/local/redis/6001/redis.pid”,“logfile ”改為“logfile /usr/local/redis/6001/log/redis.log”,“appendonly no”改為“appendonly yes”,“# cluster-enabled yes”改為“cluster-enabled yes”,“# cluster-config-file nodes-6379.conf”改為“cluster-config-file /usr/local/redis/6001/conf/nodes.conf”,“# cluster-node-timeout 15000”改為“cluster-node-timeout 5000”。
redis從編輯配置/usr/local/redis/6002/conf/redis.conf文件,做以下幾處修改:
“bind 127.0.0.1”改為“bind 0.0.0.0”,“protected-mode yes”改為“protected-mode no”,“port 6379”改為“port 6002”,“daemonize no”改為“daemonize yes”,“requirepass foobared”改為requirepass "redis123456",“dir ./”改為“dir /usr/local/redis/6002/data”,“pidfile /var/run/redis_6379.pid”改為“pidfile /usr/local/redis/6002/redis.pid”,“logfile ”改為“logfile /usr/local/redis/6002/log/redis.log”,“appendonly no”改為“appendonly yes”,“# cluster-enabled yes”改為“cluster-enabled yes”,“# cluster-config-file nodes-6379.conf”改為“cluster-config-file?/usr/local/redis/6002/conf/nodes.conf”,“# cluster-node-timeout 15000”改為“cluster-node-timeout 5000”。
第七步,重新啟動redis服務。(每臺服務器都重啟)
# 關閉redis服務
命令:systemctl stop redis
ps -ef | grep redis
或??ss -tnlp|grep redis
# 重新啟動redis服務
命令:/usr/bin/redis-server /usr/local/redis/6001/conf/redis.conf
/usr/bin/redis-server /usr/local/redis/6002/conf/redis.conf
第八步,檢查redis啟動情況。(每臺服務器都檢查)
命令:ps -ef | grep redis
或????ss -tnlp|grep redis
?
?
第九步,創建redis集群。
命令:/usr/bin/redis-cli --cluster create x.x.x.x:6001 x.x.x.x:6002 y.y.y.y:6001 y.y.y.y:6002 z.z.z.z:6001 z.z.z.z:6002 --cluster-replicas 1
ps -ef|grep redis
第十步,redis集群驗證。
# 連接集群
命令:redis-cli -c -p 6001 -a redis123456
部署keepalived
第一步,環境準備。
redis分布式集群架構選擇任意兩個節點進行配置,實現主從熱備和秒級切換。
keepalived主服務器私網IP:x.x.x.x?redis-master 6001?redis-slave 6002
keepalived備服務器私網IP:y.y.y.y?redis-master 6001?redis-slave 6002
高可用虛擬IP:v.v.v.v
第二步,安裝keepalived。(keepalived主、備服務器都安裝)
命令:yum -y install keepalived
若結果顯示“keepalived-2.2.4-6.al8.x86_64”,則說明成功安裝了keepalived-2.2.4。
第三步,配置keepalived.conf文件。(keepalived主、備服務器都配置)
1)配置Keepalived主服務器中的/etc/keepalivedkeepalived.conf文件,代碼如下:
global_defs {router_id redis-master}vrrp_script redis_check {script "/etc/keepalived/scripts/haproxy_check.sh"interval 4weight -5fall 3rise 2}vrrp_instance VI_REDIS {state MASTERinterface eth0virtual_router_id 51priority 150advert_int 1nopreemptauthentication {auth_type PASSauth_pass 1111}track_script {chk_haproxy}virtual_ipaddress {v.v.v.v}}
2)先利用命令“mkdir -p /etc/keepalived/scripts”在Keepalived主服務器創建文件夾。然后在新建文件夾中創建haproxy_check.sh腳本,在腳本中寫入下面代碼:
#!/bin/bashsystemctl status haproxy | grep runningif [ $? -ne 0 ];thensystemctl stop keepalivedfi
3)配置Keepalived備服務器中的/etc/keepalivedkeepalived.conf文件,代碼如下:
global_defs {router_id redis-slave}vrrp_script redis_check {script "/etc/keepalived/scripts/haproxy_check.sh"interval 4weight -5fall 3rise 2}vrrp_instance VI_REDIS {state BAKCUPinterface eth0virtual_router_id 51priority 100advert_int 1nopreemptauthentication {auth_type PASSauth_pass 1111}track_script {chk_haproxy}virtual_ipaddress {v.v.v.v}}
4)先利用命令“mkdir -p /etc/keepalived/scripts”在Keepalived備服務器創建文件夾。然后在新建文件夾中創建haproxy_check.sh腳本,在腳本中寫入下面代碼:
#!/bin/bashsystemctl status haproxy | grep runningif [ $? -ne 0 ];thensystemctl stop keepalivedfi
第四步,給新建的腳本加上可執行權限。(keepalived主、備服務器都加上)
命令:chmod +x /etc/keepalived/scripts/*.sh
第五步,開啟服務驗證。
關掉Keepalived主服務器的keepalived服務之后,VIP可以漂移Keepalived備服務器。
部署haproxy
第一步,環境準備。
redis分布式集群架構選擇安裝keepalived的兩個服務器來部署haproxy,haproxy訪問6379端口時,輪詢訪問六個節點。
keepalived主服務器私網IP:x.x.x.x?redis-master 6001?redis-slave 6002
keepalived備服務器私網IP:y.y.y.y?redis-master 6001?redis-slave 6002
高可用虛擬IP:v.v.v.v
第二步,安裝haproxy。
命令:yum -y install haproxy
第三步,配置haproxy.cfg文件。
配置/etc/haproxy/haproxy.cfg文件,在文件中寫入下面代碼:
globallog ????????????????????127.0.0.1 local0chroot ?????????????????/var/lib/haproxypidfile ????????????????/var/run/haproxy.pidmaxconn ????????????????4000user ???????????????????nobodygroup ??????????????????nobodydaemondefaultsmode ????????????????????httplog ?????????????????????globaloption ??????????????????dontlognullretries ?????????????????3maxconn ?????????????????3000contimeout ??????????????50000clitimeout ??????????????50000srvtimeout ??????????????50000listen statsbind ???????????????????*:8888stats ??????????????????enablestats ??????????????????hide-versionstats uri ??????????????/haproxystats realm ????????????Haproxy\ statsstats auth ?????????????admin:adminstats admin ????????????if TRUElisten ?redisbind *:6379mode tcpbalance roundrobinserver redis1 x.x.x.x:6001 checkserver redis2 x.x.x.x:6002 checkserver redis3 y.y.y.y:6001 checkserver redis4 y.y.y.y:6002 checkserver redis5 z.z.z.z:6001 checkserver redis6 z.z.z.z:6002 check
第四步,配置haproxy rsyslog.conf文件。
vim /etc/rsyslog.conf
在/etc/rsyslog.conf文件中做出如下修改:
“# Provides UDP syslog reception# for parameters see http://www.rsyslog.com/doc/imudp.html#module(load="imudp") # needs to be done just once#input(type="imudp" port="514")”修改為“# Provides UDP syslog reception$ModLoad imudp$UDPServerRun 514”;“# Provides TCP syslog reception# for parameters see http://www.rsyslog.com/doc/imtcp.html#module(load="imtcp") # needs to be done just once#input(type="imtcp" port="514")”修改為“# Provides TCP syslog reception$ModLoad imtcp$InputTCPServerRun 514”;添加“# haproxy loglocal0.* ????????????????/var/log/haproxy.log”。
第五步,haproxy訪問6379端口時,輪詢訪問六個節點。
命令:redis-cli -c -p 6379 -h v.v.v.v?-a redis123456
測試
經測試,keepalived優先級最高的服務器(私網:x.x.x.x?keepalived主+haproxy)中的兩個redis節點不能同時被殺死,否則集群會馬上停止,但是重啟該服務器,集群就會馬上恢復。
另兩臺服務器中的任何一臺服務器發生宕機(或者兩個redis節點掛掉)都不會影響redis集群的使用。
redis集群負載比較低。
需要注意redis集群缺點:
redis集群模式下只能選擇db0,選擇其他庫會出現類似“(error) ERR SELECT is not allowed in cluster mode”的異常。