架構(gòu)
OS:Centos6.8
Redis01:172.17.100.130(sentinel-1我纪,sentinel-2)
Redis02:172.17.100.131(sentinel-3)
前置條件
yum install -y gcc openssl libtool
部署Redis(主庫)
wget http://download.redis.io/releases/redis-4.0.11.tar.gz
tar -xf redis-4.0.11.tar.gz
cd redis-4.0.11
make
mkdir -p /opt/redis/sbin
mkdir -p /opt/redis/bin –p
mkdir -p /data/redis/redis6379/
cp redis.conf /data/redis/redis6379/6379.conf
cd src
cp redis-se* /opt/redis/sbin/
cp redis-check-aof /opt/redis/bin/
cp redis-cli /opt/redis/bin/
echo "export PATH=\$PATH:/opt/redis/sbin/:/opt/redis/bin/" >> /etc/profile
source /etc/profile
#這樣操作之后redis只是有一些基本的功能,如果想做測試的話,將無法完成捺宗,如果想擁有全部的功能,可以執(zhí)行下面的操作
#cd redis-4.0.11
#cp -r src /opt/redis/
#建議將redis-4.0.11文件夾改名保存
#編輯配置參數(shù)
mv?/data/redis/redis6379/6379.conf?/data/redis/redis6379/redis_conf.bak
vim?/data/redis/redis6379/6379.conf
#是否在后臺運(yùn)行
daemonize yes
#pid文件路徑
pidfile "/var/run/redis.pid"
#端口
port 6379
#密碼
requirepass "password"
#主(從)節(jié)點(diǎn)密碼
masterauth "password"
#
tcp-backlog 511
#客戶端連接超時(shí)時(shí)間
timeout 0
#
tcp-keepalive 0
#log等級,生產(chǎn)環(huán)境建議notice
loglevel notice
#logfile路徑
logfile "/data/redis/6379.log"
#數(shù)據(jù)庫個(gè)數(shù)
databases 16
#redis進(jìn)行數(shù)據(jù)庫鏡像的頻率
#900秒內(nèi)有1個(gè)key發(fā)生變化時(shí)(進(jìn)行備份)
save 900 1
#300秒內(nèi)有10個(gè)key發(fā)生變化時(shí)(進(jìn)行備份)
save 300 10
#10000秒內(nèi)有60個(gè)key發(fā)生變化時(shí)(進(jìn)行備份)
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "6379.rdb"
#redis路徑
dir "/data/redis/redis6379"
slave-serve-stale-data yes
#從庫只讀
slave-read-only yes
repl-disable-tcp-nodelay no
slave-priority 100
#最大同時(shí)連接數(shù)
maxclients 10000
#redis能夠使用的最大內(nèi)存,當(dāng)內(nèi)存滿了后变骡,如果還收到set命令,redis將剔除設(shè)置過expire信息的key
maxmemory 1G
#最大內(nèi)存淘汰策略
#volatile-lru:從已設(shè)置過期時(shí)間的內(nèi)存數(shù)據(jù)集中挑選最近最少使用的數(shù)據(jù) 淘汰
#volatile-ttl: 從已設(shè)置過期時(shí)間的內(nèi)存數(shù)據(jù)集中挑選即將過期的數(shù)據(jù) 淘汰
#volatile-random:從已設(shè)置過期時(shí)間的內(nèi)存數(shù)據(jù)集中任意挑選數(shù)據(jù) 淘汰
#allkeys-lru:從內(nèi)存數(shù)據(jù)集中挑選最近最少使用的數(shù)據(jù) 淘汰
#allkeys-random:從數(shù)據(jù)集中任意挑選數(shù)據(jù) 淘汰
#no-enviction(驅(qū)逐):禁止驅(qū)逐數(shù)據(jù)(默認(rèn))
maxmemory-policy volatile-lru
#開啟appendonly后,redis會把接收到的每一次寫操作都追加到appendonly.aof文件中
appendonly yes
#appendonly.aof的名字
appendfilename "6379.aof"
#同步頻率,對寫操作進(jìn)行累積,每秒同步一次
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
#從庫不需要密碼就能訪問
#protected-mode no
#redis-server只接收來自該IP的請求
bind 0.0.0.0
#bind 127.0.0.1
# Generated by CONFIG REWRITE
#當(dāng)redis運(yùn)行后(特別是主從),conf文件也會被修改茴肥,因此對初始文件進(jìn)行備份
cp 6379.conf 6379.conf.bak
系統(tǒng)參數(shù)配置
sed -i -r '/vm.overcommit_memory*/d' /etc/sysctl.conf
sed -i -r '/vm.swappiness*/d' /etc/sysctl.conf
echo "vm.overcommit_memory =1">>/etc/sysctl.conf
echo "vm.swappiness = 1" >>/etc/sysctl.conf
/sbin/sysctl -q -p /etc/sysctl.conf
sed -i -r '/redis soft nofile.*/d' /etc/security/limits.conf
sed -i -r '/redis hard nofile.*/d' /etc/security/limits.conf
echo "redis soft nofile 288000" >>/etc/security/limits.conf
echo "redis hard nofile 288000" >>/etc/security/limits.conf
sed -i -r '/redis soft nproc.*/d' /etc/security/limits.conf
sed -i -r '/redis hard nproc.*/d' /etc/security/limits.conf
echo "redis soft nproc unlimited">>/etc/security/limits.conf
echo "redis hard nproc unlimited">>/etc/security/limits.conf
#(單機(jī)驗(yàn)證)啟動
redis-server /data/redis/redis6379/6379.conf
#關(guān)閉
redis-cli shutdown
Redis從庫部署
安裝方式和主庫一致,主要修改conf
wget http://download.redis.io/releases/redis-4.0.11.tar.gz
tar -xf redis-4.0.11.tar.gz
cd redis-4.0.11
make
mkdir -p /opt/redis/sbin
mkdir -p /opt/redis/bin –p
mkdir -p /data/redis/redis6380/
cp redis.conf /data/redis/redis6380/6380.conf
cd src
cp redis-se* /opt/redis/sbin/
cp redis-check-aof /opt/redis/bin/
cp redis-cli /opt/redis/bin/
echo "export PATH=\$PATH:/opt/redis/sbin/:/opt/redis/bin/" >> /etc/profile
source /etc/profile
修改系統(tǒng)參數(shù)
sed -i -r '/vm.overcommit_memory*/d' /etc/sysctl.conf
sed -i -r '/vm.swappiness*/d' /etc/sysctl.conf
echo "vm.overcommit_memory =1">>/etc/sysctl.conf
echo "vm.swappiness = 1" >>/etc/sysctl.conf
/sbin/sysctl -q -p /etc/sysctl.conf
sed -i -r '/redis soft nofile.*/d' /etc/security/limits.conf
sed -i -r '/redis hard nofile.*/d' /etc/security/limits.conf
echo "redis soft nofile 288000" >>/etc/security/limits.conf
echo "redis hard nofile 288000" >>/etc/security/limits.conf
sed -i -r '/redis soft nproc.*/d' /etc/security/limits.conf
sed -i -r '/redis hard nproc.*/d' /etc/security/limits.conf
echo "redis soft nproc unlimited">>/etc/security/limits.conf
echo "redis hard nproc unlimited">>/etc/security/limits.conf
#把主庫的6379.conf傳輸?shù)綇膸旃?jié)點(diǎn)上墓阀,并修改名字為6380.conf
scp? 172.17.100.130:/data/redis/redis6379/6379.conf?/data/redis/redis6380/6380.conf
cd /data/redis/redis6380/
sed -i?'s/6379/6380/g' 6380.conf
#搭建主從毡惜,除了修改端口以外,主要是增加下面這句slaveof
echo “slaveof 172.17.100.130 6379” >> 6380.conf
#主從的驗(yàn)證
登錄從庫
info replication
master_link_status為up即顯示主從同步狀態(tài)正常
PS:
如果測試環(huán)境不想配置密碼斯撮,那么在主從的配置文件里要開啟這個(gè)protected-mode no
在此次實(shí)驗(yàn)中,我們在配置里面寫入了密碼勿锅,所以要注釋掉配置protected-mode no這句
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 至此主從redis配置完成
防火墻設(shè)置
主庫
iptables -I INPUT -p tcp --dport 6379 -j ACCEPT
iptables -I INPUT -p tcp --dport 16379 -j ACCEPT
iptables -I INPUT -p tcp --dport 26379 -j ACCEPT
service iptables save
從庫
iptables -I INPUT -p tcp --dport 6380 -j ACCEPT
iptables -I INPUT -p tcp --dport 26380 -j ACCEPT
service iptables save
測試主從是否能配置成功
#首先開啟主庫
redis-server /data/redis/redis6379/6379.conf
#然后開啟從庫
redis-server /data/redis/redis6380/6380.conf
#登陸主庫帕膜,進(jìn)行一波操作
redis-cli -p 6379
keys *
set cnvex 'mysql-dba'
get cnvex
結(jié)果顯示:"mysql-dba"
到從庫上查看
redis-cli -p 6380
get cnvex
結(jié)果顯示:"mysql-dba"
證明主庫的數(shù)據(jù)已經(jīng)傳到從庫上,主從配置成功
哨兵的配置
主庫
mkdir -p /data/redis/{sentinel-1,sentinel-2}
cd?/data/redis
vim sentinel.conf
daemonize yes
#bind 0.0.0.0
port 16379
dir "/data/redis/sentinel-1"
loglevel notice
logfile "/data/redis/sentinel-1.log"
#sentinel monitor mymaster 172.17.100.130 6379 2
sentinel monitor mymaster 172.17.100.130 6379 1
#配置mymaster的密碼
sentinel auth-pass mymaster beacon
#5秒中mymaster沒反應(yīng),則認(rèn)為mymaster宕機(jī)
sentinel down-after-milliseconds mymaster 5000
#mymaster超過10秒仍然為宕機(jī)狀態(tài)溢十,則執(zhí)行failover
sentinel failover-timeout mymaster 10000
#這個(gè)參數(shù)必須寫垮刹,不寫會影響failover
protected-mode no
#執(zhí)行故障轉(zhuǎn)移時(shí),最多有多少個(gè)從服務(wù)器同時(shí)對新的主服務(wù)器進(jìn)行同步
#sentinel config-epoch mymaster 1
由于哨兵啟動后,conf文件也會被修改张弛,所以建議對原始文件進(jìn)行備份
此次實(shí)驗(yàn)荒典,sentinel.conf就是我的原始文件
將其拷貝成sentinel-1.conf宗挥、sentinel-2.conf、sentinel-3.conf并修改文件中響應(yīng)的字段進(jìn)行匹配(主要是改端口种蝶,log名等等)
1和2放在主庫130上契耿,3放到從庫131上,分別啟動即完成了本次哨兵的搭建
啟動哨兵
在主從庫上分別啟動哨兵
redis-sentinel /data/redis/sentinel-1.conf
redis-sentinel /data/redis/sentinel-2.conf
redis-sentinel /data/redis/sentinel-3.conf
關(guān)于conf和log
redis的conf
此次設(shè)定的是6379為主庫螃征,6380為從庫搪桂;
正常啟動情況下,6379.conf和6380.conf里面的內(nèi)容不會有不同
但是在發(fā)生failover的情況下盯滚,原本出現(xiàn)在6380.conf里面的 “slaveof 172.17.100.130 6379”? 會消失
而6379.conf最底下會出現(xiàn) “slaveof 172.17.100.131 6380”
簡言之踢械,從庫的conf下會自動出現(xiàn)slaveof語句
sentinel的conf
發(fā)2張圖對比一下從庫sentinel.conf前后的變化
圖1為原始conf
圖2為啟動之后的conf
配置中列出了該sentinel的myid,當(dāng)前的epoch值魄藕,以及除自己之外的其他幾個(gè)哨兵(以及他們的myid)
關(guān)于epoch内列,哨兵啟動后都會同步同一個(gè)epoch值,當(dāng)發(fā)生切換(成功/失敱陈省)時(shí)话瞧,epoch值+1,如果一直切換失敗寝姿,這個(gè)epoch值會不停的增長(如下圖)
sentinel自動切換實(shí)驗(yàn)
主庫
ps -ef|grep redis交排,kill掉redis-server對應(yīng)的進(jìn)程號
查看哨兵的log可以發(fā)現(xiàn)哨兵集群首先在kill掉主進(jìn)程大約5秒鐘之后將狀態(tài)改為odown
生成新的epoch 17
開始選舉投票,并執(zhí)行一系列的failover準(zhǔn)備
在51秒553完成切換饵筑,將主庫由130 switch-master到131上
在56秒579的時(shí)候埃篓,將130變更為131的從庫
從庫這邊的log如下
在主庫上,重新拉起redis-server
log顯示sentinel在第一時(shí)間判定130的redis-server為-sdown根资,之后將其連接為131的從庫
此時(shí)的6379.conf末尾已經(jīng)寫入了slaveof信息
131并不會將主庫還給130架专,而是自己繼續(xù)做主庫
將131的redis-server殺掉
上面的情況又會再次復(fù)現(xiàn),130重新成為主庫
實(shí)驗(yàn)中遇到的問題
問題1
主要是哨兵配置中的那個(gè)
protected-mode no
不一定必須配置成no玄帕,但是這個(gè)參數(shù)一定要配置
我試過注釋掉這個(gè)參數(shù)部脚,會發(fā)生無法切換的問題
問題2
之前在網(wǎng)上爬文,看到某些文章在下圖里面配置數(shù)不為1桨仿,大概意思是需要多個(gè)哨兵統(tǒng)一睛低,才會發(fā)生切換,但實(shí)際中我有3個(gè)哨兵服傍,配置成1就能很好的完成切換任務(wù),反而是配置成2之后骂铁,會遇到切換的問題
目前此處沒有深究2者的差異吹零,后續(xù)再來填坑