环境:CentOS7.4 * 3,redis * 3,sentinel * 3
配置一主双从,使用aof数据持久化
1、安装
1.1 下载redis安装包:
1 | wget http://download.redis.io/releases/redis-4.0.9.tar.gz |
1.2 安装包推送到其它两台机器上
1 | scp redis-4.0.9.tar.gz admin@ip地址:`pwd` |
1.3 解压下载好的安装包(以下步骤建议三台机器同时进行)
1 | tar xzvf redis-4.0.9.tar.gz |
1.4 安装编译环境
1 | sudo yum -y install gcc gcc-c++ |
1.5 编译
1 | cd /work/admin/download/redis-4.0.9 |
1.6 编译完成后,copy编译好的执行文件及默认配置文件
1 | mkdir -p /work/admin/redis/bin |
2、编辑配置文件
2.1 编辑redis-server配置(主节点):
配置文件位置:
1 | vim /work/admin/redis/etc/server/6379.conf |
绑定ip地址
1 | bind 0.0.0.0 |
关闭增强安全模式
1 | protected-mode no |
使用指定端口
1 | port 6379 |
连接队列·
1 | tcp-backlog 511 |
关闭空闲超时的连接
1 | timeout 0 |
keepalive超时时间
1 | tcp-keepalive 300 |
关闭后台运行模式
1 | daemonize no |
supervisor模式关闭
1 | supervised no |
指定pid文件位置
1 | pidfile "/var/run/redis_6379.pid" |
记录日志类型
1 | loglevel notice |
指定日志文件位置
1 | logfile "/work/admin/redis/log/server/6379.log" |
指定databases数量
1 | databases 16 |
打开redis-logo,如下图
1 | always-show-logo yes |
![](Redis sentinel模式部署/图片1.png)
bgsave遇错不执行,默认为yes
1 | stop-writes-on-bgsave-error yes |
指定aof文件存放目录
1 | dir "/work/admin/redis/data" |
bgsave快照操作出错时停止写数据到磁盘,默认为yes
1 | slave-serve-stale-data yes |
开启从库只读模式,为保护从库数据,请不要设置为no
1 | slave-read-only yes |
启用无硬盘备份
1 | repl-diskless-sync no |
无硬盘备份延迟时间,以秒为单位
1 | repl-diskless-sync-delay 5 |
禁用TCP_NODELAY,但带宽加大
1 | repl-disable-tcp-nodelay no |
设置sentinel提升主库优先级,数越小优先级更高,0不能提升
1 | slave-priority 10 |
内存满逐出选项
1 | lazyfree-lazy-eviction no |
过期key删除选项
1 | lazyfree-lazy-expire no |
内部删除选项
1 | lazyfree-lazy-server-del no |
slave接收完RDB文件后清空数据选项
1 | slave-lazy-flush no |
开启aof持久化
1 | appendonly yes |
指定aof文件名称
1 | appendfilename "6379.aof" |
每一秒写入aof文件,并完成磁盘同步
1 | appendfsync everysec |
在aof rewrite期间,是否对aof新记录的append暂缓使用文件同步策略,主要考虑磁盘IO开支和请求阻塞时间。默认为no,表示”不暂缓”,新的aof记录仍然会被立即同步
1 | no-appendfsync-on-rewrite no |
当Aof log增长超过指定比例时,重写log file, 设置为0表示不自动重写Aof 日志,重写是为了使aof体积保持最小,而确保保存最完整的数据
1 | auto-aof-rewrite-percentage 100 |
触发aof rewrite的最小文件尺寸
1 | auto-aof-rewrite-min-size 64mb |
如果aof-load-truncated是yes,会自动发布一个log给客户端然后load(默认)。如果是no,用户必须手动redis-check-aof修复AOF文件才可以
1 | aof-load-truncated yes |
关闭rdb文件生成
1 | aof-use-rdb-preamble no |
限制脚本的最长运行时间,毫秒单位
1 | lua-time-limit 5000 |
慢查询超过10000毫秒会被记录
1 | slowlog-log-slower-than 10000 |
记录128条慢查询日志
1 | slowlog-max-len 128 |
redis延时监控系统在运行时会采样一些操作,以便收集可能导致延时的数据根源,0为关闭
1 | latency-monitor-threshold 0 |
发布key事件,使用过期事件(当每一个key失效时,都会生成该事件)。
1 | notify-keyspace-events "" |
指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法
1 | hash-max-ziplist-entries 512 |
ziplist优化sorted set
1 | zset-max-ziplist-entries 128 |
启用哈希刷新
1 | hll-sparse-max-bytes 3000 |
是否开启顶层数据结构的rehash功能,如果内存允许,请开启
1 | activerehashing yes |
缓冲区软限制,硬限制和以秒为单位的超时(类似于复制缓冲区)
1 | client-output-buffer-limit normal 0 0 0 |
执行后台任务的频率,默认10
1 | hz 10 |
aof rewrite过程中,是否采取增量文件同步策略,默认yes
1 | aof-rewrite-incremental-fsync yes |
以上配置完成,scp分发到另外两台从库上
1 | scp -r 6379.conf admin@ip地址:`pwd |
2.2 从库配置
#####根据主库配置文件基础上,增加
1 | slaveof 主库ip地址 端口号 |
2.3 配置sentinel
配置文件位置
1 | vim /work/admin/redis/etc/sentinel/26379.conf |
关闭增强安全模式
1 | protected-mode no |
绑定端口
1 | port 26379 |
绑定ip地址
1 | bind 0.0.0.0 |
关闭后台运行
1 | daemonize no |
指定log文件位置
1 | logfile "/work/admin/redis/log/sentinel/26379.log" |
log文件记录等级
1 | loglevel debug |
redis数据文件位置
1 | dir "/work/admin/redis/data" |
设置sentinel的名称、要监控的redis-server的ip地址、端口、1代表即使1个sentinel存活也进行投票提升节点
如果某个redis-server退出,1个sentinel会进行从节点提升节点
1 | sentinel monitor mymaster 192.168.101.83 6379 1 |
redis-server退出后5秒,开始投票提升主节点(即从节点提升为主节点)
1 | sentinel down-after-milliseconds mymaster 5000 |
以上配置文件保存后分发另外两个节点
1 | scp -r 26379.conf admin@ip地址:`pwd` |
####4.编辑supervisor配置文件
```bash
vim /work/admin/supervisor/supervisor.conf
1 |
|
注:redis-server主从测试好后再开启sentinel
分发到所有节点
1 | scp -r supervisor.conf admin@ip地址:`pwd` |
2.4 系统优化
添加优化参数
vim /etc/sysctl.conf
添加以下参数
1 | socket监听(listen)的backlog上限 |
1 | 内存分配策略 1表示内核允许分配所有的物理内存,而不管当前的内存状态如何 |
1 | 禁止使用透明大页 |
3、启动并验证
3.1 以supervisor启动,先启动redis-server
1 | supervisord -c /work/admim/supervisor/supervisor.conf |
3.2 测试redis主从是否可用
3.2.1 在主节点上:
1 | /work/admin/redis/bin/redis-cli |
3.2.2 从节点上:
1 | /work/admin/redis/bin/redis-cli |
3.3 测试redis-sentinel(三个节点都要做)
3.3.1 在supervisor中开启redis-sentinel配置项并保存,分发到另外两个节点上
1 | [program:redis-sentinel] |
3.3.2 进入supervisor命令行,执行update,自动开启redis-sentinel
1 | supervisorctl |
3.3.3 测试sentinel是否将从节点提升为主节点
关闭一台master,查看另外两台从节点
1 | supervisor> stop redis-server |
1 | /work/admin/redis/bin/redis-cli |
![](Redis sentinel模式部署/图片2.png)
某一台role为master即可
注:如果刚退出的主节点再次开启时,会成为从节点,不会切换。
4、访问redis
因redis主从节点不固定,需要先访问redis-sentinel查询主从节点ip地址,然后再访问redis-server
代码示例:
1 | #!/usr/bin/env python |