在生产场景下都必须做到高可用,否则出现问题就会造成服务停止。这里介绍下Redis的Sentinel功能实现的高可用,当然也有Redis提供的cluster功能。

1.Redis的安装
1
2
3
4
5
6
7
8
9
10
|
wget http: //download .redis.io /releases/redis-3 .0.7. tar .gz
tar zxf redis-3.0.7. tar .gz
cd redis-3.0.7
make
cd src
mkdir -p /usr/local/redis3 .0.7/{sbin,data,conf}
scp -r mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-sentinel redis-server localhost: /usr/local/redis3 .0.7 /sbin
cp .. /redis .conf /usr/local/redis3 .0.7 /conf/
echo 'PATH=$PATH:/usr/local/redis3.0.7/sbin' >> /etc/profile
source /etc/profile
|
2.Redis的配置
1
|
vim /usr/local/redis3 .0.7 /conf/redis .conf
|
(以下为db1的配置,db2的配置只需要增加一行slaveof 192.168.2.241 6379)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
daemonize no
pidfile /var/run/redis .pid
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
logfile ""
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /usr/local/redis3 .0.7 /data
slave-serve-stale-data yes
slave- read -only yes
repl-diskless- sync no
repl-diskless- sync -delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
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
|
3.Sentinel的配置
1
|
vim /usr/local/redis3 .0.7 /conf/sentinel .conf
|
1
2
3
4
5
6
7
8
9
|
port 26379
sentinel monitor master 192.168.2.241 6379 2
sentinel down-after-milliseconds master 5000
sentinel failover-timeout master 900000
sentinel parallel-syncs master 2
dir "/usr/local/redis3.0.7/conf"
|
4.启动redis-server及redis-sentinel
在db1,db2,db3上分别启动redis-server及redis-sentinel
1
2
|
/usr/local/redis3 .0.7 /sbin/redis-server /usr/local/redis3 .0.7 /conf/redis .conf
/usr/local/redis3 .0.7 /sbin/redis-sentinel /usr/local/redis3 .0.7 /conf/sentinel .conf
|
这个时候就已经做好了Redis的主从复制及故障转移,我们客户端的连接就需要修改,因此就涉及到VIP的问题,客户端只要连接VIP的问题,目前VIP的解决方法有
-
利用redis-sentinel的sentinel client-reconfig-script参数进行设置
-
利用keepalived进行VIP的转移
-
利用consul进行服务注册
a.利用redis-sentinel自带的参数进行VIP的配置
在db1,db2的sentinel.conf中加入
sentinel client-reconfig-script master1 /usr/local/redis3.0.7/sbin/vip.sh
然后创建脚本/usr/local/redis3.0.7/sbin/vip.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#!/bin/bash
MASTER_IP=$6
LOCAL_IP= '192.168.2.241'
VIP= '192.168.2.250'
NETMASK= '24'
INTERFACE= 'eth0'
if [ ${MASTER_IP} = ${LOCAL_IP} ]; then
/sbin/ip addr add ${VIP}/${NETMASK} dev ${INTERFACE}
/sbin/arping -q -c 3 -A ${VIP} -I ${INTERFACE}
exit 0
else
/sbin/ip addr del ${VIP}/${NETMASK} dev ${INTERFACE}
exit 0
fi
exit 1
|
在集群启动的时候需要手动添加VIP
1
|
/sbin/ip addr add 192.168.2.250 /24 dev eth0
|
使用上面脚本的时候需要注意你的网卡是eth0,否则可能出现VIP无法使用的情况
b.利用keepalived进行VIP的切换
1
2
3
4
5
6
7
8
9
|
wget http: //www .keepalived.org /software/keepalived-1 .2.19. tar .gz
tar zxf keepalived-1.2.19. tar .gz
cd keepalived-1.2.19
. /configure --prefix= /usr/local/keepalived1 .2.19 --disable-fwmark
make && make install
ln -s /usr/local/keepalived1 .2.19 /sbin/keepalived /usr/sbin/
ln -s /usr/local/keepalived1 .2.19 /etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/keepalived1 .2.19 /etc/keepalived/ /etc/keepalived
ln -s /usr/local/keepalived1 .2.19 /etc/rc .d /init .d /keepalived /etc/init .d/
|
db1的keepalived配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 10
router_id keepalivedha_1
}
vrrp_script chk_redis_role {
script "/usr/local/redis3.0.7/sbin/redis-cli info | grep role:master >/dev/null 2>&1"
interval 1
timeout 2
fall 2
rise 1
}
vrrp_sync_group VG_1 {
group {
VI_1
}
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
smtp_alert
virtual_router_id 20
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass password
}
virtual_ipaddress {
192.168.2.250
}
track_script {
chk_redis_role
}
}
|
db2的配置文件,只需要将以上文件复制过来并修改下面参数
#注意一下interface eth0看下你机器的网卡接口
c.利用consul服务注册
参考:http://dgd2010.blog.51cto.com/1539422/1745314
从上面可以看出以上三种方法:
脚本跟keepalived的形式一样,但是脚本相对轻量,首次启动麻烦,配置简单,依赖于redis-sentinel
keepalived启动简单,排错简便
consul适合大型场景,及云环境没有多余的IP这种情况
以上也适用于2台服务器的场景,也可以不用3台服务器。只需要更改
1
|
sentinel monitor master 192.168.2.241 6379 1
|
后面值更改为1即可
本文转自 rong341233 51CTO博客,原文链接:http://blog.51cto.com/fengwan/1746731