本文是转载一位叫itmrl博主的博客文章,因为觉得他的这边文章是我看过的比较清晰和全面的,用来做笔记留存,下面是原文链接
redis哨兵模式搭建
Redis Sentinel 在不使用Redis Cluster时为 Redis 提供高可用性。Redis Sentinel 还提供其他附带任务,例如监控、通知并充当客户端的配置提供程序。
CentOS 7.5(64位)
服务类型 | IP地址 | 端口 |
---|---|---|
Redis | 192.168.140.11 | 6379 |
Redis | 192.168.140.12 | 6379 |
Redis | 192.168.140.13 | 6379 |
Sentinel | 192.168.140.11 | 26379 |
Sentinel | 192.168.140.12 | 26379 |
Sentinel | 192.168.140.13 | 26379 |
Redis服务和哨兵服务需要占用端口,请先按照上面主机规划设置防火墙开放端口
Redis版本为5.0.5。
Redis的安装步骤为:下载、解压、编译、配置、启动。
以下以192.168.140.11服务器安装为例,其他类似(注意在redis主配置文件中,从节点需要配置上主节点ip)。
ssh root@192.168.140.11
yum -y install wget vim tcl gcc make
2.1.3 下载Redis
cd /opt/itmrl/srclib/
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
或者通过FTP将redis-5.0.5.tar.gz上传
tar -zxvf redis-5.0.5.tar.gz
cd redis-5.0.5/
make install PREFIX=/opt/itmrl/redis/redis-5.0.5
拷贝配置文件到Redis程序目录
cp redis.conf /opt/itmrl/redis/redis-5.0.5/bin
cp sentinel.conf /opt/itmrl/redis/redis-5.0.5/bin
redis.conf是Redis服务的配置文件;sentinel.conf是哨兵服务的配置文件。
内核参数overcommit_memory
它是 内存分配策略
可选值:0,1,2。
0,:表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1:表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2: 表示内核允许分配超过所有物理内存和交换空间总和的内存。
配置 vm.overcommit_memory 为1,这可以避免数据被截断
编辑vim /etc/sysctl.conf ,修改如下:
vm.overcommit_memory=1
sysctl -p
mkdir -p /opt/itmrl/redis/redis-5.0.5/run
mkdir -p /opt/itmrl/redis/redis-5.0.5/log
mkdir -p /opt/itmrl/redis/redis-5.0.5/working
vim /opt/itmrl/redis/redis-5.0.5/bin/redis.conf
redis的通用主配置,下面记得在从节点加上 replicaof 192.168.140.11 6379 这一行配置来连接主节点
# 工作目录
dir /opt/itmrl/redis/redis-5.0.5/working
# 需要不同服务器的节点连通,就不能设置为 127.0.0.1
bind 0.0.0.0
# 需要不同服务器的节点连通,这个就要设置为 no
protected-mode no
# 设置后台运行redis
daemonize yes
# 端口
port 6379
# 密码
requirepass itmrl@123qwe
# PID文件
pidfile /opt/itmrl/redis/redis-5.0.5/run/redis_6379.pid
# LOG文件
logfile /opt/itmrl/redis/redis-5.0.5/log/redis.log
# RDB文件名
dbfilename dump.rdb
# 开启AOF
appendonly yes
# AOF文件名
appendfilename "appendonly.aof"
# 主节点认证,主从节点均需要配置
masterauth itmrl@123qwe
cd /opt/itmrl/redis/redis-5.0.5/bin
./redis-server redis.conf
使用 ps -ef|grep redis 查看是否都启动成功,IP和端口号都正确
必须开哨兵总线端口,哨兵总线端口=端口号+20000
例:6379的哨兵总线端口是26379。这个哨兵总线端口不开放,部署的时候外部服务器的节点添加不进来
firewall-cmd --zone=public --add-port=6379/tcp --permanent
firewall-cmd --zone=public --add-port=26379/tcp --permanent
firewall-cmd --reload
哨兵模式采用一主二从三哨兵模式。
cd /opt/itmrl/redis/redis-5.0.5/bin
vi sentine.conf
# 保护模式默认关闭
protected-mode no
# 哨兵端口
port 26379
# 后台运行
daemonize yes
# pid
pidfile /opt/itmrl/redis/redis-5.0.5/run/redis-sentinel.pid
# log
logfile /opt/itmrl/redis/redis-5.0.5/log/redis-sentinel.log
# 工作目录
dir /opt/itmrl/redis/redis-5.0.5/working
# 监控Redis主服务
sentinel monitor redis-master 192.168.140.11 6379 2
# 配置认证密码
sentinel auth-pass redis-master itmrl@123qwe
# S_DOWN时间
sentinel down-after-milliseconds redis-master 30000
# 设置在故障转移后可以重新配置以同时使用新主服务器的副本数
sentinel parallel-syncs redis-master 1
# 故障转移超时时间
sentinel failover-timeout redis-master 180000
./redis-sentinel sentinel.conf
随意登录一台主机执行 info命令,下面以连接41机器为例。
cd /opt/itmrl/redis/redis-5.0.5/bin
./redis-cli -p 26379 info
输出信息如下:
# Server
redis_version:5.0.5
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:dd4fc568347dd241
redis_mode:sentinel
os:Linux 3.10.0-957.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:4.8.5
process_id:60336
run_id:1ee2ed34a11d346c61f5d591bb82837da098496c
tcp_port:26379
uptime_in_seconds:839
uptime_in_days:0
hz:11
configured_hz:10
lru_clock:13438056
executable:/opt/itmrl/redis/redis-5.0.5/bin/./redis-sentinel
config_file:/opt/itmrl/redis/redis-5.0.5/bin/sentinel.conf
# Clients
connected_clients:3
client_recent_max_input_buffer:2
client_recent_max_output_buffer:0
blocked_clients:0
# CPU
used_cpu_sys:1.875286
used_cpu_user:0.071192
used_cpu_sys_children:0.000000
used_cpu_user_children:0.000000
# Stats
total_connections_received:10
total_commands_processed:2196
instantaneous_ops_per_sec:2
total_net_input_bytes:128865
total_net_output_bytes:24810
instantaneous_input_kbps:0.17
instantaneous_output_kbps:0.02
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
expired_stale_perc:0.00
expired_time_cap_reached_count:0
evicted_keys:0
keyspace_hits:0
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:0
migrate_cached_sockets:0
slave_expires_tracked_keys:0
active_defrag_hits:0
active_defrag_misses:0
active_defrag_key_hits:0
active_defrag_key_misses:0
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=redis-master,status=ok,address=192.168.140.11:6379,slaves=2,sentinels=3
随意登录一台主机执行 cluster info命令,下面以连接192.168.140.11机器为例。
cd /opt/itmrl/redis/redis-5.0.5/bin
./redis-cli -p 26379 info Sentinel
输出信息如下:
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=redis-master,status=ok,address=192.168.140.11:6379,slaves=2,sentinels=3
可以看出 192.168.140.13已经正为Master。
当前是down的状态
查看sentinel日志,发现当前11节点没有启动成功。
经过排查发现主服务的配置文件没有配置认证
application.yml 添加Redis配置
spring:
redis:
database: 1
password: itmrl@123qwe
# 哨兵模式
sentinel:
master: redis-master
nodes: 192.168.140.11:26379,192.168.140.12:26379,192.168.140.13:26379