环境说明
当前的环境条件如下,当然这并不是部署sentinel的最低可行版本。
- CentOS7(ip: 192.168.8.11)
- Redis5.0.2(可执行命令已复制到
/usr/local/bin/
) - Laravel5.5(5.4>=版本开始支持sentinel)
- predis1.1
部署
按3个server节点(一主两从)+3个sentinel节点的拓扑结构进行部署。
部署的端口分配如下:
IP | 端口 | 类型 | 配置文件 |
---|---|---|---|
192.168.8.11 | 6400 | server | /usr/local/etc/redis-6400.conf |
192.168.8.11 | 6401 | server | /usr/local/etc/redis-6401.conf |
192.168.8.11 | 6402 | server | /usr/local/etc/redis-6402.conf |
192.168.8.11 | 26400 | sentinel | /usr/local/etc/sentinel-26400.conf |
192.168.8.11 | 26401 | sentinel | /usr/local/etc/sentinel-26401.conf |
192.168.8.11 | 26402 | sentinel | /usr/local/etc/sentinel-26402.conf |
实际生产环境并不建议将所有的sentinel节点都放在同一台物理机上,因为同一台机器一但发生硬件故障,则整个高可用部署都受到严重影响。
主节点配置示例
#/usr/local/etc/redis-6400.conf
port 6400
daemonize yes
pidfile "/var/run/redis-6400.pid"
logfile "/data/redis/redis-6400.log" #日志路径
dir "/data/redis-5.0.2/" #输出目录
bind 0.0.0.0 #开放给非同一服务器上的客户端调用
从节点配置示例
#/usr/local/etc/redis-6401.conf
port 6401
daemonize yes
pidfile "/var/run/redis-6401.pid"
logfile "/data/redis/redis-6401.log"
dir "/data/redis-5.0.2/"
bind 0.0.0.0
slaveof 192.168.8.11 6400 #从节点与主节点配置的主要区别
端口6402的从节点的配置与上面的基本一致,只要将6401替换成6402即可。
redis sentinel配置文件
#/usr/local/etc/sentinel-26400.conf
port 26400
daemonize no
pidfile "/var/run/redis-sentinel-26400.pid"
logfile "/data/redis/sentinel-26400"
dir "/data/redis/"
sentinel monitor mymaster 192.168.8.11 6400 2 #主节点别名为mymaster,后面是ip和端口,2代表判断主节点失败至少需要2个sentinel节点同意
sentinel down-after-milliseconds mymaster 30000 #主节点故障30秒后启用新的主节点
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
其它端口的sentinel也这样配置,只要替换26400成相应的端口即可。
为了方便操作,这里采用shel脚本指操作的方式开启服务。
#!/bin/sh
#/data/start-ms.sh
#start redis master-slave
redis-server /usr/local/etc/redis-6400.conf
redis-server /usr/local/etc/redis-6401.conf
redis-server /usr/local/etc/redis-6402.conf
redis-sentinel /usr/local/etc/sentinel-26400.conf
redis-sentinel /usr/local/etc/sentinel-26401.conf
redis-sentinel /usr/local/etc/sentinel-26402.conf
执行sh /data/start-ms.sh
开启。
role表示当前节点的角色,如果是主节点,下一行表示已连接的从节点数。
最后一行address表示当前主节点的ip:端口地址、从节点数和sentinel节点数。
至此,sentinel部署完成了。
在Laravel中使用Sentinel
//配置文件`config/database.php`
'redis' => [
'options' => [
'prefix' => 'test::', //键的前缀
],
'client' => 'predis', //指示redis客户端使用的是predis组件
'default' => [
'tcp://192.168.8.11:26400',
'tcp://192.168.8.11:26401',
'tcp://192.168.8.11:26402', //这3个都是sentinel节点的地址
'options' => [
'replication' => 'sentinel',
'service' => env('REDIS_SENTINEL_SERVICE', 'mymaster'), //sentinel
'parameters' => [
'password' => null, //redis的密码,没有时写null
'database' => 0,
],
],
],
],
高可用测试
测试是模拟在连续写入的情况下,主节点突然宕机,然后在sentinel机制的作用下开启新的主节点,实现系统的正常运转。
//核心执行代码
set_time_limit(0); //不限制程序执行时间
for ($i = 0; $i < 10000; $i++) {
try {
Redis::set('s' . $i, 's');
info('i=>'.$i);
} catch (Exception $e) {
logger()->error('redis err: '.$e->getMessage());
}
sleep(1); //1秒写入一次
}
执行上面代码后redis会处于不断写入的状态,然后用kill
命令直接终止主节点进程,过了大概30秒,新的主节点成了端口6401,系统继续正常运行。
从下面日志记录可以看到大约间隔了30秒,然后继续以固定一秒的间隔记录成功写入reids的信息。
结语
好了,上面就是简要版的sentinel部署及larave中的使用了。关于更多sentinel的玩法请参考sentinel文档。