近期公司的一块核心业务使用redis做为配置转发中心,存在单点问题,考虑服务的可靠性。针对业务需求,咱们肯定了咱们的需求:php
针对以上需求,咱们分别对redis主从复之,redis-cluster,redis-sentinel方案进行了调研,对比结果以下:mysql
方案git |
数据可靠性github |
服务可靠性redis |
风险sql |
主从备份api |
高网络 |
无composer |
出问题须要手动切换,中间推送的数据会丢失运维 |
redis-cluster |
高 |
高 |
异地机房热备,机房间网络出问题的状况下会出现脑裂的问题;同时咱们对redis-cluster无运维和使用经验 |
redis-sentinel |
高 |
中 |
在master宕机后,客户端会经过api查询当前master归属,重连redis 使用内网同步,主从之间的数据丢失同步基本能够忽略,业务能够忍受 |
基于以上调研,咱们放弃了主从备份方案,对redis-cluster及redis-sentinel方案进行了深刻分析。redis-cluster采用主从备份、master选举的方式实现高可用,但在异地机房部署时,如配置不当,很容易引起脑裂问题;同时因为redis-cluster咱们并无成熟的运维经验,最终放弃了该方案,转向redis-sentinel。 redis-sentinel就像他的名字同样,他是一个哨兵,监控master状态,若是超过规定时间没有响应,则自动进行主从切换,期间会有一段时间(决定于具体的配置参数)redis集群没法提供服务 。原理相似mysql的MHA。redis-sentinel-server同时提供了一套接口,用于查询当前集群的状态,Java的客户端有完整的封装,php的扩展并无提供相应功能,在github上有几个package,但因为太过复杂,不适合迁移到现有业务(没有使用命名空间和composer),因此基于phpredis-2.2.8封装了一个简易的redis-sentinel客户端,目前已在核心业务生产环境上稳定运行。Java客户端与php客户端经过查询redis-sentinel集群得到当前redis-master地址,进行链接,当集群发生主从切换时,客户端会进行重连。 php-redis-sentinel的demo代码以下:
1
2
3
4
5
6
7
8
9
10
|
$sentinel_pool
=
new
\Jenner\RedisSentinel\SentinelPool();
$sentinel_pool
->addSentinel(
'127.0.0.1'
, 26379);
$sentinel_pool
->addSentinel(
'127.0.0.1'
, 26380);
$address
=
$sentinel_pool
->master(
'mymaster'
);
print_r(
$address
);
$redis
=
$sentinel_pool
->getRedis(
'mymaster'
);
$info
=
$redis
->info();
print_r(
$info
);
|
参考资料: redis-sentinel: https://redis.io/topics/sentinel cluster-tutorial: https://redis.io/topics/cluster-tutorial cluster-spec: https://redis.io/topics/cluster-spec
原创文章,转载请注明: 转载自始终不够