大家应该都经历过单机redis的场景,一旦出现单点故障那就扎心了,我们以哨兵模式的经典场景 1主+2从+3哨兵为例,如果避免单主挂掉后的服务可用性。
服务器规划
192.168.52.136 主
192.168.52.137 从
192.168.52.129 从
安装配置
redis.conf主要配置项
slaveof 192.168.52.136 6379
sentinel.conf主要配置项
sentinel monitor mymaster 192.168.52.136 6379 2
sentinel config-epoch mymaster 34
sentinel leader-epoch mymaster 34
sentinel known-slave mymaster 192.168.52.129 6379
sentinel known-slave mymaster 192.168.52.137 6379
sentinel known-sentinel mymaster 192.168.52.129 26379 3ab877a5329c2c3c8353da2f93741d6d832bb2f5
sentinel known-sentinel mymaster 192.168.52.137 26379 6e8792e877b00c4e0d1a916f90366403c9628b50
sentinel current-epoch 34
启用实例
每台服务器上都启动2个redis实例
root 2229 0.2 0.2 133576 2320 pts/0 Sl+ 07:06 0:00 src/redis-server *:6379
root 2256 0.4 0.2 133568 2476 pts/1 Sl+ 07:07 0:00 src/redis-sentinel *:26379 [sentinel]
模拟主挂掉的场景
停掉主192.168.52.136的进程,通过代码来切换到由哨兵选举出来的新主的。代码如下
require_once 'vendor/autoload.php';
use PSRedis\Client;
use PSRedis\HAClient;
use PSRedis\MasterDiscovery;
$sentinel1 = new Client('192.168.52.136', '26379');
$sentinel2 = new Client('192.168.52.137', '26379');
$sentinel3 = new Client('192.168.52.129', '26379');
$masterDiscovery = new MasterDiscovery('wsmaster');
$masterDiscovery->addSentinel($sentinel1);
$masterDiscovery->addSentinel($sentinel2);
$masterDiscovery->addSentinel($sentinel3);
$master = $masterDiscovery->getMaster();
var_export($master->getIpAddress());
var_export($master->getPort());
附切换master的代码库地址 https://github.com/jamescauwelier/PSRedis
领取专属 10元无门槛券
私享最新 技术干货