设为首页 收藏本站
查看: 1542|回复: 0

[经验分享] 利用redis-sentinel+keepalived实现redis高可用

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-2-18 08:41:18 | 显示全部楼层 |阅读模式
目标、需求:为上层应用提供高可靠、低延迟、低(无限接近0)数据损失的Redis缓存服务
方案概述:采用同一网络内的三台主机(可以是物理主机、虚拟机或docker容器),要求三台主机之间都能相互访问,每一台主机上都安装redis-server、redis-sentinel和keepalived。
redis-server负责提供Redis缓存服务,三台主机间的关系是master-slave-slave
redis-sentinel负责提供Redis高可用,三台主机间的关系与redis-server相同
keepalived负责提供VIP地址供上层应用使用,三台主机的关系是master-backup-backup,VIP始终在redis-server master上,保证对上层应用可写可读。
三台主机的冗余度是1,也就是说当有一台主机宕机时另外两台中至少有一台主机可以提供Redis缓存服务
方案原理:redis-server提供单实例的Redis缓存服务,redis-sentinel能在一台主机挂掉时自动的将某一台可用主机上的redis-server由slave状态切换成master状态。
keepalived通过vrrp_script检测当前主机上的redis-server是否以master状态运行,如果当前主机上的redis-server正在以master状态运行,则将vrrp_instance标记为存活状态,并分配VIP;如果当前主机上的redis-server正在以slave状态运行,则将vrrp_instance标记为错误状态。当某台主机宕机后,其他两台主机上的keepalived会将VIP切换到新的master(当前主机上的redis-server正在以master状态运行)上。
由于keepalived的VIP切换有延迟(大约40ms),因此上层应用不能过分依赖Redis,例如大规模并发性的短时间内向Redis插入大量数据。
连接图 wKioL1bEPl6Th8eQAADX03xDfB4086.jpg
如图所示,有三台主机,分别标识为Redis1、Redis2、Redis3,它们的角色和配置等信息如下:
主机标识Redis1Redis2Redis3
IP地址192.168.1.241192.168.1.242192.168.1.243
预设配置redis-server master         
keepalived master
redis-server slave         
keepalived backup
redis-server slave         
keepalived backup
VIP

配置步骤:步骤概述
  • 安装:安装redis-server、redis-sentinel、keepalived
  • 配置:配置Redis1、Redis2、Redis3,主要是编辑各个服务的配置文件
  • 启动:先启动redis-server、再启动redis-sentinel、最后自动keepalived
  • 验证:模拟一台主机宕机,主机网络中断,redis-server、redis-sentinel、keepalived三个服务任何一个发生故障的情况。

(1)设定主机名(建议设定为fqdn格式)、同步时间、更改文件描述符最大打开数量、更改内核参数、配置编译环境、配置防火墙在此就不赘述了。
(2)安装redis-server和redis-sentinel
Redis的安装由于只是bin二进制可执行文件和data目录比较重要,因此简化安装如下   
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# http://download.redis.io/redis-stable.tar.gz     
wget -c 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     
\cp redis-3.0.7/src/redis-benchmark /usr/local/sbin/     
\cp redis-3.0.7/src/redis-check-aof /usr/local/sbin/     
\cp redis-3.0.7/src/redis-check-dump /usr/local/sbin/     
\cp redis-3.0.7/src/redis-cli /usr/local/sbin/     
\cp redis-3.0.7/src/redis-sentinel /usr/local/sbin/     
\cp redis-3.0.7/src/redis-server /usr/local/sbin/     
mkdir /etc/redis     
mkdir -p /data/redis-6379/



(3)安装keepalived
1
2
3
4
5
6
7
8
9
10
11
# http://www.keepalived.org/documentation.html     
wget -c 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/keepalived     
make     
make install     
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/     
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/     
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/     
mkdir /etc/keepalived



keepalived的配置文件在后面添加
(4)Redis1上的redis-sentinel配置文件
1
2
3
4
5
6
7
8
cat >/etc/redis/sentinel.conf<<eof   
port 26379     
dir /tmp     
sentinel monitor mymaster 192.168.1.241 6379 2     
sentinel down-after-milliseconds mymaster 30000     
sentinel parallel-syncs mymaster 1     
sentinel failover-timeout mymaster 180000     
eof



Redis2和Redis3上的redis-sentinel配置文件与Redis1上的redis-sentinel配置文件内容相同。
(5)Redis1上的redis-server的配置文件
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
cat > /etc/redis/redis-6379.conf <<eof     
# maxmemory 268435456     
maxmemory 256mb     
daemonize yes     
pidfile /data/redis-6379/redis-6379.pid     
port 6379     
bind 0.0.0.0     
tcp-backlog 511     
timeout 0     

tcp-keepalive 0     
loglevel notice     
logfile /data/redis-6379/redis.log     
databases 16     
save 900 1     
save 300 10     
save 60 10000     
stop-writes-on-bgsave-error yes     
rdbcompression yes     
rdbchecksum yes     
dbfilename dumpredis-6379.rdb     
dir /data/redis-6379     
slave-serve-stale-data yes     
slave-read-only yes     
repl-diskless-sync no     
repl-diskless-sync-delay 5     
# repl-ping-slave-period 10     
# repl-timeout 60     
repl-disable-tcp-nodelay no     
# repl-backlog-size 1mb     
# repl-backlog-ttl 3600     
slave-priority 100     
# min-slaves-to-write 3     
# min-slaves-max-lag 10     

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     
eof



(6)Redis2与Redis3上的redis-server配置文件
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
cat > /etc/redis/redis-6379.conf <<eof   
slaveof 192.168.1.241 6379     
# maxmemory 268435456     
maxmemory 256mb     
daemonize yes     
pidfile /data/redis-6379/redis-6379.pid     
port 6379     
bind 0.0.0.0     
tcp-backlog 511     
timeout 0     
tcp-keepalive 0     
loglevel notice     
logfile /data/redis-6379/redis.log     
databases 16     
save 900 1     
save 300 10     
save 60 10000     
stop-writes-on-bgsave-error yes     
rdbcompression yes     
rdbchecksum yes     
dbfilename dumpredis-6379.rdb     
dir /data/redis-6379     
slave-serve-stale-data yes     
slave-read-only yes     
repl-diskless-sync no     
repl-diskless-sync-delay 5

# repl-ping-slave-period 10     
# repl-timeout 60     
repl-disable-tcp-nodelay no     
# repl-backlog-size 1mb     
# repl-backlog-ttl 3600     
slave-priority 100     
# min-slaves-to-write 3     
# min-slaves-max-lag 10     
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     
eof



(7)Redis1上的keepalived配置文件(vim /etc/keepalived/keepalived.conf)
关于keepalived的配置文件
keepalived的配置文件默认是没有的,当然sample&example文件还是有的,通常在PREFIX/etc/sample目录下。
keepalived master和backup(backups)之间不同的是:
1.优先级的不同,master的优先级priority的数字要高一些
2.global_defs段的router_id都不一样,实际中可以用任意名字区分也可以用主机名区分
3.backup的配置文件中还有一个nopreempt字段,意思是设置为非抢占模式,作用是让master优先获取到VIP,并保证VIP是在原先的master上。
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
! 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_http_port {     
    script "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 eth1     
    #use_vmac keepalived     
    #vmac_xmit_base     
    mcast_src_ip 192.168.1.241     
    smtp_alert     
    virtual_router_id 20   
    priority 100     
    advert_int 1     
    authentication {     
        auth_type PASS     
        auth_pass password     
    }     
    virtual_ipaddress {     
        192.168.1.245     
    }     
    track_script {     
        chk_http_port     
    }     
}



(8)Redis2上的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
43
44
! 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_2     
}     
vrrp_script chk_http_port {     
    script "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 eth2     
    #use_vmac keepalived     
    #vmac_xmit_base     
    mcast_src_ip 192.168.1.242     
    smtp_alert     
    virtual_router_id 20   
    priority 99     
    advert_int 1     
    authentication {     
        auth_type PASS     
        auth_pass password     
    }     
    virtual_ipaddress {     
        192.168.1.245     
    }     
    track_script {     
        chk_http_port     
    }     
    nopreempt     
}



(9)Redis3上的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
43
44
! 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_3   
}     
vrrp_script chk_http_port {     
    script "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 eth1     
    #use_vmac keepalived     
    #vmac_xmit_base     
    mcast_src_ip 192.168.1.243     
    smtp_alert     
    virtual_router_id 20   
    priority 98     
    advert_int 1     
    authentication {     
        auth_type PASS     
        auth_pass password     
    }     
    virtual_ipaddress {     
        192.168.1.245     
    }     
    track_script {     
        chk_http_port     
    }     
    nopreempt     
}



(10)启动redis-server
1
2
redis-server /etc/redis/redis-6379.conf
tail /data/redis-6379/redis.log



(11)启动redis-sentinel
1
2
redis-sentinel /etc/redis/redis-sentinel.conf
tail /data/redis-6379/redis-sentinel.log



(12)启动keepalived
1
2
service keepalived start
tail /var/log/messages



如果keepalived启动后日志如下图显示则表示启动成功。
wKioL1bEPl_TW6s1AABmMraW3v8106.jpg
wKiom1bEPfzARKDHAACGdsw2s20718.jpg
测试先不模拟故障,先测试一下redis的set、get和复制情况
wKioL1bEPmHQLhxkAAA9XdStdMg281.jpg
wKiom1bEPf3hXRDyAABIPi8Pwow266.jpg
再测试一下模拟故障出现时redis的set、get和复制情况
停掉Redis1上的redis-server
wKioL1bEPmKCYv0PAAAkMU15fiE733.jpg
Redis1上的VIP已经被移除
wKioL1bEPmPAS-9vAABfMX4EiYQ501.jpg
wKioL1bEPmTBX4nFAAB_XNnOU00833.jpg
查看Redis2上的Redis状态和VIP状态
wKiom1bEPgCzYXzLAAAKkjB2CC4981.jpg
wKiom1bEPgHwCtKxAADBY7WdBuQ211.jpg
通过上图的黄色文字可以看出,VIP已经漂移到新的redis-server master了。
注意:VIP的漂移过程是需要时间的,时间大概需要10*4ms左右,如下图所示:
wKiom1bEPgKDanjfAABlWvc55ik609.jpg
wKiom1bEPgLQBJ3cAAAqcHlOyEY940.jpg
此时再次测试一下Redis的复制情况
wKioL1bEPmfB1pF1AAAmMB6k5OY936.jpg
由上图可见,Redis复制情况正常,上层应用依然可以使用Redis缓存服务。
故障切换的步骤如果一台主机宕机,则主机启动后,先启动redis-server、再启动redis-sentinel、最后自动keepalived。
如果多台主机宕机,则按照一台主机宕机的步骤做同样处理。
如果一台主机的中的某台服务停止,则直接启动该服务即可。
参考Redis Documention http://redis.io/documentation
Redis High Availability http://redis.io/topics/sentinel
Redis Replication http://redis.io/topics/replication

tag:Redis集群,Redis高可用,redis-sentinel,keepalived配置,Redis主从复制


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-179371-1-1.html 上篇帖子: Redis 单机版本安装及其启动 下篇帖子: 使用Codis来部署Redis集群
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表