Redis的三种模式
分别是主从同步/复制、哨兵模式、Cluster
- 主从复制
- 主从复制是高可用Redis的基础,哨兵和群集都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单故障恢复。
- 缺陷:故障恢复无法自动化,写操作无法负载均衡,存储能力受到单机的限制。
- 哨兵
- 在主从复制的基础上,哨兵实现了自动化的故障恢复。
- 缺陷:写操作无法负载均衡,存储能力受到单机的限制,哨兵无法对从节点进行自动故障转移;在读写分离场景下,从节点故障会导致读服务不可用,需要对从节点做额外的监控、切换操作。
- 集群
- 通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。
故障转移的具体步骤如下:
哨兵选举:由于哨兵可能存在网络延迟等问题,所以在进行故障转移前,需要进行哨兵选举,确保选出的哨兵具有最新的信息。
主从切换:被选中的哨兵会向所有从节点发送SLAVEOF命令,要求它们成为新的主节点的从节点。同时,被选中的哨兵还会将自己的配置文件中的主节点地址改为新的主节点地址,并通过CONFIG REWRITE命令将其保存到磁盘上。
客户端重定向:当故障转移完成后,客户端可能还会继续向旧的主节点发送请求。为了避免这种情况,被选中的哨兵会向客户端发送一个MOVED错误,告诉客户端新的主节点地址。
总的来说,Redis哨兵模式可以自动地监控Redis集群的状态,并在必要时进行故障转移操作,以确保服务的持续可用性。同时,哨兵还提供了一些其他功能,如配置重写、通知等,使得Redis集群更加健壮和灵活。
安装
# 下载及操作目录
mkdir /root/redis
cd /root/redis
# 安装 gcc 套装
yum install -y cpp binutils glibc glibc-kernheaders glibc-common glibc-devel gcc mak
# 升级gcc
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash
# 设置永久升级
echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
source /etc/profile
# 下载解压 Redis 包
wget https://download.redis.io/releases/redis-6.0.9.tar.gz
tar zxvf redis-6.0.9.tar.gz
# 编译安装
cd redis-6.0.9
make
make PREFIX=/usr/local/redis install
配置
创建相关目录
# 数据目录
mkdir -p /ware/redis/data/
# 日志目录
mkdir -p /ware/redis/logs/
# 配置文件目录
mkdir -p /etc/redis/
配置文件(也可以直接修改这几部分)
sed -i s'/127.0.0.1/0.0.0.0/g' redis.conf
sed -i s'/daemonize no/daemonize yes/g' redis.conf
sed -i s'/# cluster-enabled yes/cluster-enable yes/g' redis.conf
sed -i s'/appendonly no/appendonly yes/g' redis.conf
sed -i s'/# requirepass foobared/requirepass 123456/g' redis.conf
sed -i s'#dir ./#dir /ware/redis/data/6379/#g' redis.conf
配置文件:vi /etc/redis/redis_6379.conf(完整版)
################################## INCLUDES ###################################
# include /path/to/local.conf
# include /path/to/other.conf
################################## MODULES #####################################
# loadmodule /path/to/my_module.so
# loadmodule /path/to/other_module.so
################################## NETWORK #####################################
# bind 127.0.0.1
protected-mode yes
#yes表示仅允许来自本地网络的连接,而阻止来自公共网络的访问
port 6379
tcp-backlog 10240
timeout 0
tcp-keepalive 300
################################# TLS/SSL #####################################
# port 0
# tls-port 6379
# tls-cert-file redis.crt
# tls-key-file redis.key
# tls-dh-params-file redis.dh
# tls-ca-cert-file ca.crt
# tls-ca-cert-dir /etc/ssl/certs
# tls-auth-clients no
# tls-auth-clients optional
# tls-replication yes
# tls-cluster yes
# tls-protocols "TLSv1.2 TLSv1.3"
# tls-ciphers DEFAULT:!MEDIUM
# tls-ciphersuites TLS_CHACHA20_POLY1305_SHA256
# tls-prefer-server-ciphers yes
# tls-session-caching no
# tls-session-cache-size 5000
# tls-session-cache-timeout 60
################################# GENERAL #####################################
daemonize yes
#启用守护进程,将以后台进程运行
supervised no
#服务器将不会受到监督程序的的管理
pidfile /var/run/redis_6379.pid
loglevel notice
logfile "/ware/redis/logs/redis_6379.log"
# syslog-enabled no
# syslog-ident redis
# syslog-facility local0
databases 16
always-show-logo yes
#服务器将在启动时显示Redis的标志
################################ SNAPSHOTTING ################################
#用于配置 Redis 的持久化功能
save 900 1
#表示在执行至少一次写操作之后,如果在900秒内发生至少1个写操作,则自动执行背景数据快照
save 300 10
save 200 50
save 100 1000
save 80 5000
save 60 10000
stop-writes-on-bgsave-error yes
#表示在执行背景数据快照发生错误时,停止写入操作
rdbcompression yes
#表示在持久化数据时使用压缩
rdbchecksum yes
#表示在持久化数据时计算校验和
dbfilename redis-dump_6379.rdb
rdb-del-sync-files no
#表示在删除同步文件时不要等待确认
dir /ware/redis/data/6379/
################################# REPLICATION #################################
#用于配置 Redis 的复制功能和主从复制相关的参数
# replicaof <masterip> <masterport>
#表示从服务器要复制的主服务器的 IP 地址和端口号
# masterauth foo
#表示主服务器的身份验证密码
# masteruser <username>
#表示主服务器的用户名
replica-serve-stale-data yes
#表示从服务器是否可以提供旧数据
replica-read-only yes
#表示从服务器是否只读
repl-diskless-sync no
#表示从服务器是否使用磁盘进行同步
repl-diskless-sync-delay 5
#表示从服务器在磁盘同步之前的延迟时间
repl-diskless-load disabled
#表示从服务器是否禁用磁盘同步的预加载
# repl-ping-replica-period 10
#表示主服务器每隔多少秒向从服务器发送一次心跳
# repl-timeout 60
repl-disable-tcp-nodelay no
#表示是否禁用 TCP 的 NODELAY 选项
# repl-backlog-size 1mb
#表示复制缓冲区的大小
# repl-backlog-ttl 3600
#表示复制缓冲区的过期时间
replica-priority 100
#表示从服务器的优先级
# min-replicas-to-write 3
# min-replicas-max-lag 10
# replica-announce-ip 5.5.5.5
# replica-announce-port 1234
############################### KEYS TRACKING #################################
# tracking-table-max-keys 1000000
################################## SECURITY ###################################
acllog-max-len 128
requirepass xxxxxx
# 认证密码
# rename-command CONFIG ""
#这意味着在 Redis 中无法通过 CONFIG 命令来查看或修改 Redis 的配置参数。这个重命名可以增加 Redis 的安全性,防止未经授权的用户通过 CONFIG 命令获取敏感信息或更改配置
################################### CLIENTS ####################################
# maxclients 10000
#Redis 服务器同时最多能处理的客户端连接数
############################## MEMORY MANAGEMENT ################################
# maxmemory <bytes>
# Redis 服务器使用的最大内存限制
# maxmemory-policy noeviction
#Redis 在内存使用超限时的策略:不会选择淘汰任何数据,而是停止接受新的写入操作
# maxmemory-samples 5
#Redis 在检查内存使用情况时所考虑的样本数
# replica-ignore-maxmemory yes
#从服务器将不会考虑配置,从而允许其使用更多的内存
# active-expire-effort 1
############################# LAZY FREEING ####################################
# Redis 数据库的垃圾回收和内存管理
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
################################ THREADED I/O #################################
# io-threads 4
# io-threads-do-reads no
############################ KERNEL OOM CONTROL ##############################
oom-score-adj no
#Redis 将不会调整进程的 OOM score,从而确保进程在 OOM 事件中的优先级不变
oom-score-adj-values 0 200 800
#当 Redis 使用的内存量达到阶段一的阈值时,进程的 OOM score 将增加 200;当达到阶段二的阈值时,OOM score 将增加 800。
############################## APPEND ONLY MODE ###############################
appendonly yes
#启用Redis的AO功能,将所有写操作追加到一个文件中,以实现数据持久化
appendfilename "redis-appendonly_6379.aof"
# appendfsync always
appendfsync everysec
#Redis 每秒钟将数据同步到磁盘一次。
# appendfsync no
no-appendfsync-on-rewrite no
#当AOF文件需要重新编写时,Redis 将同步数据到磁盘。
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
################################ LUA SCRIPTING ###############################
lua-time-limit 5000
################################ REDIS CLUSTER ###############################
cluster-enabled yes
#启用 Redis 的集群功能
#cluster-config-file nodes-6379.conf
# cluster-node-timeout 15000
# Redis 集群节点超时时间
# cluster-replica-validity-factor 10
# cluster-migration-barrier 1
# cluster-require-full-coverage yes
# cluster-replica-no-failover no
#Redis 集群从节点不允许进行故障转移
# cluster-allow-reads-when-down no
#Redis集群不允许从故障节点读取数据
########################## CLUSTER DOCKER/NAT support ########################
# cluster-announce-ip 10.1.1.5
# cluster-announce-port 6379
# cluster-announce-bus-port 6380
################################## SLOW LOG ###################################
slowlog-log-slower-than 10000
# Redis 记录慢速操作的阈值
slowlog-max-len 128
#慢速日志的最大长度为 128 条记录
################################ LATENCY MONITOR ##############################
latency-monitor-threshold 0
#阈值被设置为 0,这意味着将会对所有命令进行延迟监控。
############################# EVENT NOTIFICATION ##############################
notify-keyspace-events ""
############################### GOPHER SERVER #################################
# gopher-enabled no
############################### ADVANCED CONFIG ###############################
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
# client-query-buffer-limit 1gb
# proto-max-bulk-len 512mb
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
# lfu-log-factor 10
# lfu-decay-time 1
########################### ACTIVE DEFRAGMENTATION #######################
jemalloc-bg-thread yes
# server_cpulist 0-7:2
# bio_cpulist 1,3
# aof_rewrite_cpulist 8-11
# bgsave_cpulist 1,10-11
服务文件:vi /usr/lib/systemd/system/redis-6379.service
[Unit]
Description=redis 6379
Documentation=https://redis.io/documentation/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/var/run/redis_6379.pid
ExecStart=/usr/local/redis/bin/redis-server /etc/redis/redis_6379.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
启动&自启动
systemctl enable redis-6379.service
systemctl start redis-6379.service
搭建一主两从
修改配置文件
主库
vim /opt/redis/redis.conf
port 6379
logfile "/opt/redis/redis.log"
从库
vim /opt/redis/redis.conf
port 6379
logfile "/opt/redis/redis.log"
slaveof xxxxxxx 6379 #指定主库的ip和端口
masterauth 123456 #主库密码
从库
vim /opt/redis/redis.conf
port 6379
logfile "/opt/redis/redis.log"
slaveof xxxxxxxx 6379 #指定主库的ip和端口
masterauth 123456
重启Redis
systemctl restart redis
测试Redis
主库上执行:
127.0.0.1:6379> set name xx
OK
127.0.0.1:6379> get name
"xx"
从库上执行:
127.0.0.1:6379> get name
"xx"
搭建三哨兵
删除sentinel.conf的配置,加入以下配置参数
[root@localhost redis]# vim sentinel.conf
port 9000 #监听端口9000上的请求
daemonize yes #将Redis Sentinel进程作为守护进程运行
bind 0.0.0.0 #监听所有网络接口上的请求
dir /opt/redis-5.0.4/ #指定Redis Sentinel运行时所需的工作目录
logfile "sentinel-9000.log" #指定Redis Sentinel运行时所需的工作目录
sentinel monitor mymaster xxxxx 6379 2 #监控名为mymaster的Redis实例,IP地址为xxxxxx,端口号为6379,其中2表示该实例连续两次无响应时,认为该实例不可用。
sentinel down-after-milliseconds mymaster 30000 #当mymaster实例在30s内没有回复Sentinel的请求时,判断该实例已经下线
sentinel parallel-syncs mymaster 1 #在进行故障转移时,同时同步数据的从节点数量
sentinel auth-pass mymaster 123456 #连接到mymaster实例需要使用的密码
sentinel failover-timeout mymaster 180000 #进行故障转移的超时时间为180s。
sentinel deny-scripts-reconfig yes #禁止运行时动态重载Lua脚本
启动哨兵
/opt/redis/src/redis-sentinel /opt/redis/sentinel.conf
其他两个节点配置文件与上述文件一致
查看哨兵
[root@localhost ~]# /opt/redis/src/redis-cli -h 127.0.0.1 -p 9000
127.0.0.1:9000> 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=mymaster,status=ok,address=xxxxxx:6379,slaves=2,sentinels=3