Redis sentinel模式部署

环境: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
2
3
sudo yum -y install gcc gcc-c++

sudo pip install supervisor

1.5 编译

1
2
cd /work/admin/download/redis-4.0.9
make -j `grep processor /proc/cpuinfo | wc -l`

1.6 编译完成后,copy编译好的执行文件及默认配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mkdir -p /work/admin/redis/bin
mkdir -p /work/admin/redis/etc
mkdir -p /work/admin/redis/etc/server
mkdir -p /work/admin/redis/etc/sentinel
mkdir -p /work/admin/redis/log
mkdir -p /work/admin/redis/log/supervisor
mkdir -p /work/admin/redis/log/sentinel
mkdir -p /work/admin/redis/log/server
mkdir -p /work/admin/redis/data
mkdir -p /work/admin/supervisor

cd /work/admin/download/redis-4.0.9/src
cp -rf mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server redis-trib.rb /work/admin/redis/bin

cp -rf /work/admin/download/redis-4.0.9/redis.conf /work/admin/redis/etc/server/6379.conf
cp -rf /work/admin/download/redis-4.0.9/sentinel.conf /work/admin/redis/etc/sentinel/26379.conf

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
2
3
4
5
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512

ziplist优化sorted set

1
2
zset-max-ziplist-entries 128
zset-max-ziplist-value 64

启用哈希刷新

1
hll-sparse-max-bytes 3000

是否开启顶层数据结构的rehash功能,如果内存允许,请开启

1
activerehashing yes

缓冲区软限制,硬限制和以秒为单位的超时(类似于复制缓冲区)

1
2
3
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

执行后台任务的频率,默认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
2
3
4
5
6
7
8
9
10
11
12
13

#####增加以下内容:

```bash
[program:redis-server]
command=/work/admin/redis/bin/redis-server /work/admin/redis/etc/server/6379.conf
directory=/work/admin/redis
redirect_stderr=true

;[program:redis-sentinel]
;command=/work/admin/redis/bin/redis-sentinel /work/admin/redis/etc/sentinel/26379.conf
;directory=/work/admin/redis
;redirect_stderr=true

注:redis-server主从测试好后再开启sentinel

分发到所有节点

1
scp -r supervisor.conf admin@ip地址:`pwd`

2.4 系统优化

添加优化参数

vim /etc/sysctl.conf
添加以下参数

1
2
socket监听(listen)的backlog上限
net.core.somaxconn= 1024
1
2
内存分配策略 1表示内核允许分配所有的物理内存,而不管当前的内存状态如何
vm.overcommit_memory = 1
1
2
3
4
5
6
禁止使用透明大页
echo never > /sys/kernel/mm/transparent_hugepage/enabled

vim /etc/rc.local
加入:
echo never > /sys/kernel/mm/transparent_hugepage/enabled

3、启动并验证

3.1 以supervisor启动,先启动redis-server

1
supervisord -c /work/admim/supervisor/supervisor.conf

3.2 测试redis主从是否可用

3.2.1 在主节点上:

1
2
3
4
/work/admin/redis/bin/redis-cli

127.0.0.1:6379>set test test
OK

3.2.2 从节点上:

1
2
3
4
/work/admin/redis/bin/redis-cli

get test
"test"

3.3 测试redis-sentinel(三个节点都要做)

3.3.1 在supervisor中开启redis-sentinel配置项并保存,分发到另外两个节点上

1
2
3
4
[program:redis-sentinel]
command=/work/admin/redis/bin/redis-sentinel /work/admin/redis/etc/sentinel/26379.conf
directory=/work/admin/redis
redirect_stderr=true

3.3.2 进入supervisor命令行,执行update,自动开启redis-sentinel

1
2
3
4
5
6
7
8
9
supervisorctl

supervisor> update

supervisor> status

redis-sentinel RUNNING pid 19669, uptime 111 days, 3:21:31
redis-server RUNNING pid 19668, uptime 111 days, 3:21:31
supervisor>

3.3.3 测试sentinel是否将从节点提升为主节点

关闭一台master,查看另外两台从节点

1
supervisor> stop redis-server
1
2
3
/work/admin/redis/bin/redis-cli

127.0.0.1:6379> info **

![](Redis sentinel模式部署/图片2.png)

某一台role为master即可

注:如果刚退出的主节点再次开启时,会成为从节点,不会切换。

4、访问redis

因redis主从节点不固定,需要先访问redis-sentinel查询主从节点ip地址,然后再访问redis-server

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/env python
from redis.sentinel import Sentinel # 加载redis模块
sentinel = Sentinel([('192.168.232.134', 26379),
('192.168.232.134', 26380),
('192.168.232.134', 26381)],
socket_timeout=0.1) # 连接哨兵服务器
masterip = sentinel.discover_master('master-business-2') # 获取主redis服务器地址
for i in masterip:
print(i)
slaveip = sentinel.discover_slaves('master-business-2') # 获取从redis服务器地址
for i in slaveip:
for a in i:
print(a)
-------------本文结束感谢您的阅读-------------