Redis-运维基础技能-学习记录

最新稳定版安装包下载地址

最新稳定版本始终在固定的 https://download.redis.io/redis-stable.tar.gz URL 及其 SHA-256 和 中提供。


一、单节点安装

1、下载客户端安装包
wget https://download.redis.io/redis-stable.tar.gz

2、安装编译环境

redis编译依赖于gcc环境

选择对应包管理器安装

yum -y install make gcc
apt -y install make gcc
tar zxf redis-stable.tar.gz 

3、编译安装

默认安装路径是/usr/local/bin/ ,make install 安装根据需要使用 PREFIX 指定安装路径,也可以手动从安装包src目录中复制出来

cd ./redis-stable && make && make PREFIX=/usr/local/redis/ install
cp redis.conf /usr/local/redis/

4、启动

参数 : redis-server [配置文件]

/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf


二、主从复制集群

注意!!!主从复制前提:有两个或以上Redis服务,并且Redis的端口网络互通且Redis版本在2.3以上

环境

Redis-1(master)Redis-2(slave)安装路径端口密码数据持久化
192.168.100.10192.168.100.20/usr/local/redis/163791qaz2wsx#EDCrdb,aof

1、配置文件参考

master , redis.conf

bind 192.168.100.10 127.0.0.1  # 可访问的ip
protected-mode yes
daemonize yes
port 16379
slowlog-max-len 128
appendonly yes
appendfilename appendonly.aof
maxclients 2000
masterauth 1qaz2wsx#EDC
requirepass 1qaz2wsx#EDC
maxmemory 1024M
maxmemory-policy volatile-lru
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
save 900 10
save 300 10
save 60 10000
loglevel warning
logfile /usr/local/redis/logs/redis_16379.log
pidfile /usr/local/redis/redis_16379.pid
dir /usr/local/redis/data/

slave ,redis.conf

bind 192.168.100.20 127.0.0.1  # 可访问的ip
protected-mode yes
daemonize yes
port 16379
slowlog-max-len 128
appendonly yes
appendfilename appendonly.aof
maxclients 2000
masterauth 1qaz2wsx#EDC
requirepass 1qaz2wsx#EDC
maxmemory 1024M
maxmemory-policy volatile-lru
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
save 900 10
save 300 10
save 60 10000
loglevel warning
logfile /usr/local/redis/logs/redis_16379.log
pidfile /usr/local/redis/redis_16379.pid
dir /usr/local/redis/data/
# 增加了slaveof 参数 指定主节点
slaveof 192.168.100.10 16379

2、重启生效

使用shutdown 命令关闭 redis服务

/usr/local/redis/bin/redis-cli -p 16379 -a 1qaz2wsx#EDC shutdown

启动redis服务

/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf

至此 主从配置完成 主从配置成功后 主可读可写从只读

3、查看当前主从状态

主节点

root@ubuntu:/home/ubuntu# /usr/local/redis/bin/redis-cli -p 16379
127.0.0.1:16379> auth 1qaz2wsx#EDC
OK
127.0.0.1:16379> info replication
# Replication
role:master # 角色
connected_slaves:1
slave0:ip=192.168.100.20,port=16379,state=online,offset=2852,lag=1
master_failover_state:no-failover
master_replid:5a007a358c5f32430c4f29f78ad4bf824dc7cc11
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2852
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2852
127.0.0.1:16379>

从节点

[root@localhost redis]# /usr/local/redis/bin/redis-cli -p 16379
127.0.0.1:16379> auth 1qaz2wsx#EDC
OK
127.0.0.1:16379> info replication
# Replication
role:slave # 角色
master_host:192.168.100.10 # 主节点ip
master_port:16379          # 主节点端口
master_link_status:up      # 主节点链接状态
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_read_repl_offset:2964
slave_repl_offset:2964
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:5a007a358c5f32430c4f29f78ad4bf824dc7cc11
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2964
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:758
repl_backlog_histlen:2207
127.0.0.1:16379>

4、指定一个从节点为master

在没有哨兵时,当主节点挂掉导致无法写入,需要将一个 slave 选举成为master来负责写,其他的slave来复制这个新选举的master数据

方法一(不用停服务)

在redis-cli中手动将一个slave节点 断开复制 成为一个独立的master节点

注意!!!

1、 此处 断开复制前请查看 master_sync_in_progress:0 是否是0 确保没有数据正在同步 或 slave_repl_offset:3495 选择 复制偏移量较大的根据实际环境选择,偏移量较大有时也会因为网络环境和服务器压力导致

2、这里在redis-cli中配置的是临时的,这样不用重启服务 ,但是使用命令修改完成后需要在redis.conf中修改slaveof 配置,从节点就修改master的ip和端口,晋升为master的slave节点则删除slaveof这行配置,否则会造成 redis服务下次重启后会再次加载redis.conf中配置,原先在redis-cli配置的主从环境失效。 (关于修改redis.conf的slaveof配置 参考方法二)

[root@localhost etc]# /usr/local/redis/bin/redis-cli -p 16379
127.0.0.1:16379> auth 1qaz2wsx#EDC
OK
127.0.0.1:16379> info replication
# Replication
role:slave
master_host:192.168.100.10
master_port:16379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_read_repl_offset:70
slave_repl_offset:70
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:ce8700ea38a03d70b4044df836d1453e95af23c1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:70
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:56
127.0.0.1:16379> slaveof no one
OK
127.0.0.1:16379> info replication   # 已经成为了独立的master
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:259dc5b9880404037b65e2c997d9407bc99e0b53
master_replid2:ce8700ea38a03d70b4044df836d1453e95af23c1
master_repl_offset:84
second_repl_offset:85
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:70

将剩下的slave节点使用 slaveof 192.168.100.10 16379 来完成master机器的转换

root@ubuntu:/home/ubuntu# /usr/local/redis/bin/redis-cli -p 16379
127.0.0.1:16379> auth 1qaz2wsx#EDC
OK
127.0.0.1:16379> slaveof no one
OK
127.0.0.1:16379> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:5a007a358c5f32430c4f29f78ad4bf824dc7cc11
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3356
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:3356
127.0.0.1:16379> slaveof 192.168.100.20 16379
OK

方法二(需要停服务)

该方法是修改redis.conf配置文件,需要重启服务,让redis-server重新加载redis.conf配置文件

新选举master配置文件修改

bind 192.168.100.20 127.0.0.1
protected-mode yes
daemonize yes
port 16379
slowlog-max-len 128
appendonly yes
appendfilename appendonly.aof
maxclients 2000
masterauth 1qaz2wsx#EDC
requirepass 1qaz2wsx#EDC
maxmemory 1024M
maxmemory-policy volatile-lru
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
save 900 10
save 300 10
save 60 10000
loglevel warning
logfile /usr/local/redis/logs/redis_16379.log
pidfile /usr/local/redis/redis_16379.pid
dir /usr/local/redis/data/
# slaveof 192.168.100.10 16379 删除或注释此项

其他从节点配置文件修改

bind 192.168.100.20 127.0.0.1
protected-mode yes
daemonize yes
port 16379
slowlog-max-len 128
appendonly yes
appendfilename appendonly.aof
maxclients 2000
masterauth 1qaz2wsx#EDC
requirepass 1qaz2wsx#EDC
maxmemory 1024M
maxmemory-policy volatile-lru
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
save 900 10
save 300 10
save 60 10000
loglevel warning
logfile /usr/local/redis/logs/redis_16379.log
pidfile /usr/local/redis/redis_16379.pid
dir /usr/local/redis/data/
slaveof 192.168.100.20 16379 # 修改成新的master 地址和端口

修改完成后重启 重新加载redis.conf

使用shutdown 命令关闭 redis服务

/usr/local/redis/bin/redis-cli -p 16379 -a 1qaz2wsx#EDC shutdown

启动redis服务

/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf


三、主从复制 + 哨兵

注意!!! redis版本需要在2.8以上

相比 主从复制 就是给主和从各启动一个redis-sentinel 用来 监控 和 自动选举 新的 master

环境

Redis-1(master)Redis-2(slave)安装路径端口密码数据持久化
192.168.100.10192.168.100.20/usr/local/redis/163791qaz2wsx#EDCrdb,aof
Redis-1(sentinel)Redis-1(sentinel)安装路径端口
192.168.100.10192.168.100.20/usr/local/redis/sentinel26379

1、配置文件参考

redis.conf 保持不动,修改sentinel.conf配置,该配置在redis安装包中有

sentinel.conf

注意!!! 此处为重要配置

sentinel monitor [主节点名] [当前redis集群的master节点] [当前redis集群的master节点端口] [需要多少的票数才会成为master] 计算方式 票数=节点数/2-1

protected-mode yes
bind 192.168.100.10 127.0.0.1 # 可访问的ip
port 26379
dir "/usr/local/redis/sentinel"
daemonize yes
pidfile "/usr/local/redis/sentinel_26379.pid"
loglevel warning
logfile "/usr/local/redis/logs/sentinel_26379.log"
sentinel monitor mymaster 192.168.100.10 16379 2
sentinel down-after-milliseconds mymaster 1000
sentinel parallel-syncs mymaster 2
sentinel failover-timeout mymaster 5000
sentinel deny-scripts-reconfig yes
sentinel auth-pass mymaster 1qaz2wsx#EDC

保存后 就可以启动 redis-sentinel服务了

2、启动redis-sentinel
/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel.conf
root@ubuntu:/usr/local/redis/etc# ps -ef | grep redis
redis       4169       1  0 09:59 ?        00:00:05 /usr/local/redis/bin/redis-server 192.168.100.10:16379
redis      12149       1  0 10:26 ?        00:00:00 /usr/local/redis/bin/redis-sentinel 192.168.100.10:26379 [sentinel]  #启动成功
root       12169    1248  0 10:26 pts/1    00:00:00 grep --color=auto redis

有了哨兵后,再次出现master宕掉情况就会自己选举master了

3、链接sentinel获取节点信息

获取主节点信息

[root@localhost redis]# /usr/local/redis/bin/redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
1) "192.168.100.10"
2) "16379"

获取主节点相关信息

[root@localhost redis]# /usr/local/redis/bin/redis-cli -p 26379 SENTINEL masters
1)  1) "name"
    2) "mymaster"
    3) "ip"
    4) "192.168.100.10"
    5) "port"
    6) "16379"
    7) "runid"
    8) "ba331c9321db5dff7dcd43d12ca45828343b7d40"
    9) "flags"
   10) "master"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "77"
   19) "last-ping-reply"
   20) "77"
   21) "down-after-milliseconds"
   22) "1000"
   23) "info-refresh"
   24) "8853"
   25) "role-reported"
   26) "master"
   27) "role-reported-time"
   28) "18951"
   29) "config-epoch"
   30) "0"
   31) "num-slaves"
   32) "1"
   33) "num-other-sentinels"
   34) "1"
   35) "quorum"
   36) "2"
   37) "failover-timeout"
   38) "5000"
   39) "parallel-syncs"
   40) "2"

获取从节点信息

[root@localhost redis]# /usr/local/redis/bin/redis-cli -p  26379 SENTINEL slaves mymaster
1)  1) "name"
    2) "192.168.100.20:16379"
    3) "ip"
    4) "192.168.100.20"
    5) "port"
    6) "16379"
    7) "runid"
    8) "ce0a896d9d0ba5b0fa6ddd2f27702c053add4f70"
    9) "flags"
   10) "slave"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "614"
   19) "last-ping-reply"
   20) "614"
   21) "down-after-milliseconds"
   22) "1000"
   23) "info-refresh"
   24) "6744"
   25) "role-reported"
   26) "slave"
   27) "role-reported-time"
   28) "42293"
   29) "master-link-down-time"
   30) "0"
   31) "master-link-status"
   32) "ok"
   33) "master-host"
   34) "192.168.100.10"
   35) "master-port"
   36) "16379"
   37) "slave-priority"
   38) "100"
   39) "slave-repl-offset"
   40) "4998"
   41) "replica-announced"
   42) "1"


四、Redis cluster集群

注意!!! 需要Redis在3.0以上版本,redis数量在3个或三个以上

环境

ip安装路径端口密码数据持久化操作记录
192.168.100.10/usr/local/u1/163791qaz2wsx#EDCrdb,aof初始化安装时组成集群
192.168.100.10/usr/local/u2/163801qaz2wsx#EDCrdb,aof初始化安装时组成集群
192.168.100.10/usr/local/u3/163811qaz2wsx#EDCrdb,aof初始化安装时组成集群
192.168.100.20/usr/local/u1/163791qaz2wsx#EDCrdb,aof初始化安装时组成集群
192.168.100.20/usr/local/u2/163801qaz2wsx#EDCrdb,aof初始化安装时组成集群
192.168.100.20/usr/local/u3/163811qaz2wsx#EDCrdb,aof初始化安装时组成集群
192.168.100.20/usr/local/u4/163821qaz2wsx#EDCrdb,aof手动进行节点添加-》分配槽位-》将槽位分配到其他主节点-》删除下线
192.168.100.20/usr/local/u5/163831qaz2wsx#EDCrdb,aof手动进行节点添加-》分配为100.20:16382的从节点-》删除下线

1、主要配置文件

redis.conf

cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000

2、Redis cluster集群

建立集群

随便找一个要建立集群的节点执行

参数:- -cluster create 创建集群实例列表 IP:PORT IP:PORT IP:PORT --cluster-replicas 复制因子1(即每个主节点需1个从节点

root@ubuntu:~# /usr/local/u1/bin/redis-cli -p 16379 -a 1qaz2wsx#EDC --cluster create 192.168.100.10:16379 192.168.100.10:16380 192.168.100.10:16381 192.168.100.20:16379 192.168.100.20:16380 192.168.100.20:16381 --cluster-replicas 1

image-20240819134735631

image-20240819134653542

添加主节点

- -cluster add-node 添加节点 新节点IP:新节点端口 任意存活节点IP:任意存活节点端口

/usr/local/u1/bin/redis-cli -p 16379 -a 1qaz2wsx#EDC --cluster add-node 192.168.100.20:16382 192.168.100.10:16379

image-20240819153137003

image-20240819153315150

加入成功。

添加从节点

--cluster add-node 添加节点 新节点IP:新节点端口 任意存活节点IP:任意存活节点端口

/usr/local/u5/bin/redis-cli -p 16379 -a 1qaz2wsx#EDC --cluster add-node 192.168.100.20:16383 192.168.100.20:16379

image-20240819231843192

获取 192.168.100.20:16382的节点id

image-20240819232103945

将当前节点分配为 632b491562c804975c6aabc08536be805b6c6096 的从节点

 CLUSTER REPLICATE 632b491562c804975c6aabc08536be805b6c6096

image-20240819232325135

槽位迁移

- -cluster reshard 槽位迁移 集群中任意一个从节点IP:节点端口,中迁移槽位到当前节点中,ip和port集群内任意存活节点即可

 /usr/local/u4/bin/redis-cli -p 16382 -a 1qaz2wsx#EDC --cluster reshard 192.168.100.10:16379

image-20240819230241237

image-20240819230419391

等待迁移完毕。

迁移完毕后,查看就可以看到迁移过来的槽位了

image-20240819230534875

删除从节点

- -cluster del-node 连接任意一个存活的节点IP:连接任意一个存活的节点端口 要删除节点ID,ip和port集群内任意存活节点即可

获取要删除的 192.168.100.20:16383的ID信息

image-20240819233007423

/usr/local/u5/bin/redis-cli -p 16383 -a 1qaz2wsx#EDC --cluster del-node 192.168.100.20:16379 1bc377fbf741623d61936f6d80bb26fbe1703f0f

image-20240819233305650

image-20240819233354306

删除从节点完成

删除主节点

- -cluster del-node 连接任意一个存活的节点IP:连接任意一个存活的节点端口 要删除节点ID,ip和port集群内任意存活节点即可

需要先将主节点的槽位分给其他机器,在进行删除

image-20240819233748367

槽位迁移完成,自动将为从节点

开始删除从节点

/usr/local/u5/bin/redis-cli -p 16379 -a 1qaz2wsx#EDC --cluster del-node 192.168.100.20:16379 632b491562c804975c6aabc08536be805b6c6096

image-20240819233921099

删除完成

重新分配槽位

注意 !!! 重新分配槽位慎用!!!,该功能可以让着集群的槽位重新平均分配但是由于涉及到槽位大量迁移会导致整个Redis阻塞停止处理客户端的请求

- -cluster rebalance 重新分配集群中的槽位,ip和port集群内任意节点即可

 /usr/local/u5/bin/redis-cli -p 16379 -a 1qaz2wsx#EDC --cluster rebalance 192.168.100.10:16379

image-20240819234147244

重新分配完成

五、高可用架构方案对比

Redis 作为一款高性能的内存数据库,在实际应用中确保其高可用性至关重要。

以下将对三种常见的 Redis 高可用方案进行对比:

  • 主从复制(Master-Slave Replication)

  • Redis 哨兵(Redis Sentinel)

  • Redis 集群(Redis Cluster)

1、主从复制

主从复制是 Redis 实现高可用的基本方式。在这种方案中,一个 Redis 实例作为主节点(Master),负责处理写操作和数据的更新,而多个 Redis 实例作为从节点(Slave),从主节点复制数据以实现数据的备份和读操作的分担。

优点:

  1. 实现简单,配置相对容易。

  2. 可以通过增加从节点来提高读操作的性能,实现读写分离。

缺点:

  1. 主节点出现故障时,需要手动进行故障切换,可能会导致数据丢失和服务中断。

  2. 无法自动监测主节点的状态,需要外部监控机制配合。

例如,如果主节点在数据同步到从节点之前发生故障,那么尚未同步的数据将会丢失。

2、Redis 哨兵

Redis Sentinel 是 Redis 官方提供的高可用解决方案。它可以监控多个 Redis 主从服务器实例,并在主节点出现故障时自动进行故障转移。

优点:

  1. 能够自动监测主节点的状态,实现故障自动切换,减少了人工干预和服务中断的时间。

  2. 可以配置多个哨兵节点,提高了监控的可靠性和容错性。

缺点:

  1. 配置相对复杂,需要对哨兵的配置参数有深入理解。

  2. 增加了系统的复杂性和资源消耗。

例如,在故障转移过程中,可能会出现短暂的服务不可用,但通常时间较短。

3、Redis cluster 集群

Redis 集群是 Redis 提供的分布式解决方案,通过数据分片将数据分布在多个节点上,实现了自动的故障转移和扩展性。

优点:

  1. 支持数据的自动分片,能够实现水平扩展,轻松应对数据量的增长。

  2. 提供了高可用性,当某个节点出现故障时,能够自动将其负责的数据迁移到其他正常节点。

缺点:

  1. 配置和维护相对复杂,需要对集群的概念和原理有深入的理解。

  2. 不支持跨节点的事务操作。

例如,在进行数据迁移时,可能会对性能产生一定的影响。

4、总结

Redis哨兵 是作为主从复制架构方案的一种延申,解决主从复制的单主节点问题。

Redis主从复制 + Reids哨兵 可适用于大部分的公司业务环境

总结:主从复制适合对高可用要求不高、配置简单的场景;Redis 哨兵则更适合对高可用要求较高、能够接受一定配置复杂性和资源消耗的场景;Redis 集群适用于数据量大、需要水平扩展和高可用性的复杂业务场景。在实际应用中,可以根据具体的业务需求和技术能力来选择合适的高可用方案。

六、配置文件常用配置

redis.conf

bind 192.168.100.20 127.0.0.1  # 可访问的ip
# 备注:指定了该 Redis 实例可以通过 192.168.100.20 和本地回环地址 127.0.0.1 进行访问。
​
protected-mode yes
# 备注:开启保护模式,当 Redis 实例绑定的地址不可公开访问且没有设置密码时,外部连接将被禁止。
​
daemonize yes
# 备注:以守护进程方式运行 Redis。
​
port 16379
# 备注:该 Redis 实例监听的端口号为 16379。
​
slowlog-max-len 128
# 备注:设置慢查询日志的最大长度为 128 条。
​
appendonly yes
appendfilename appendonly.aof
# 备注:开启 AOF(Append Only File)持久化,并指定 AOF 文件名为 appendonly.aof。
​
maxclients 2000
# 备注:设置该 Redis 实例的最大客户端连接数为 2000。
​
masterauth 1qaz2wsx#EDC
requirepass 1qaz2wsx#EDC
# 备注:设置主节点连接密码和该实例自身的访问密码为 1qaz2wsx#EDC,用于身份验证。
​
maxmemory 1024M
maxmemory-policy volatile-lru
# 备注:设置最大内存为 1024MB,当内存达到上限时,采用 volatile-lru(最近最少使用且设置了过期时间的键优先被淘汰)的策略进行内存淘汰。
​
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
save 900 10
save 300 10
save 60 10000
# 备注:设置了 RDB(Redis Database)持久化的触发条件,分别是在 900 秒内有至少 10 次修改、300 秒内有至少 10 次修改、60 秒内有至少 10000 次修改时执行 RDB 持久化操作;开启 RDB 文件压缩和校验。
​
loglevel warning
logfile /usr/local/redis/logs/redis_16379.log
pidfile /usr/local/redis/redis_16379.pid
dir /usr/local/redis/data/
# 备注:设置日志级别为 warning,指定日志文件路径为 /usr/local/redis/logs/redis_16379.log,进程 ID 文件路径为 /usr/local/redis/redis_16379.pid,数据存储目录为 /usr/local/redis/data/。
​
# 增加了slaveof 参数 指定主节点
slaveof 192.168.100.10 16379
# 备注:将该实例配置为 192.168.100.10:16379 主节点的从节点,用于实现数据复制和高可用。
​
cluster-enabled yes
# 备注:开启 Redis 集群模式,使该实例能够参与到 Redis 集群中。
​
cluster-config-file nodes.conf
# 备注:指定集群配置文件为 nodes.conf,该文件会在运行过程中自动生成和更新,用于存储集群的节点信息、槽位分配等状态。
​
cluster-node-timeout 15000
# 备注:设置节点超时时间为 15000 毫秒(15 秒)。如果一个节点在这个时间内没有响应 PING 包或者其他消息,它将被标记为疑似下线(PFAIL)状态。如果足够多的其他节点也报告该节点疑似下线,那么这个节点将被标记为确定下线(FAIL)状态,随后触发故障转移等操作。

sentinel.conf

protected-mode yes
# 备注:开启保护模式,当 Redis Sentinel 实例绑定的地址不可公开访问且没有设置密码时,外部连接将被禁止。
​
bind 192.168.100.10 127.0.0.1 # 可访问的ip
# 备注:指定了该 Sentinel 实例可以通过 192.168.100.10 和本地回环地址 127.0.0.1 进行访问。
​
port 26379
# 备注:该 Sentinel 实例监听的端口号为 26379。
​
dir "/usr/local/redis/sentinel"
# 备注:设置 Sentinel 的工作目录为 /usr/local/redis/sentinel,用于存放 Sentinel 运行过程中产生的文件。
​
daemonize yes
# 备注:以守护进程方式运行 Redis Sentinel。
​
pidfile "/usr/local/redis/sentinel_26379.pid"
# 备注:指定进程 ID 文件路径为 /usr/local/redis/sentinel_26379.pid。
​
loglevel warning
logfile "/usr/local/redis/logs/sentinel_26379.log"
# 备注:设置日志级别为 warning,指定日志文件路径为 /usr/local/redis/logs/sentinel_26379.log。
​
sentinel monitor mymaster 192.168.100.10 16379 2
# 备注:配置 Sentinel 监控一个名为 mymaster 的主节点,主节点地址为 192.168.100.10:16379,当有 2 个 Sentinel 认为该主节点下线时,才会触发故障转移。
​
sentinel down-after-milliseconds mymaster 1000
# 备注:设置 Sentinel 判断主节点下线的时间为 1000 毫秒,如果在这个时间内主节点没有响应 PING 包,Sentinel 将认为主节点主观下线。
​
sentinel parallel-syncs mymaster 2
# 备注:在故障转移期间,最多允许 2 个从节点同时进行同步操作。
​
sentinel failover-timeout mymaster 5000
# 备注:设置故障转移超时时间为 5000 毫秒,如果在这个时间内故障转移没有完成,Sentinel 将放弃本次故障转移操作。
​
sentinel deny-scripts-reconfig yes
# 备注:禁止通过 Sentinel 的客户端连接对脚本进行重新配置,增强安全性。
​
sentinel auth-pass mymaster 1qaz2wsx#EDC
# 备注:设置连接到名为 mymaster 的主节点的密码为 1qaz2wsx#EDC,用于 Sentinel 对主从节点进行监控和故障转移时的身份验证。

七、关于数据持久化的优缺点

1、RDB(Redis Database)持久化

优点:

  1. 生成紧凑的二进制文件,恢复数据的速度非常快。

  2. 适合用于数据备份和灾难恢复。

  3. 性能较好,在保存 RDB 快照时,主进程会fork一个子进程来完成,不会阻塞主进程处理请求。

缺点:

  1. 可能会丢失最后一次持久化之后的数据,因为 RDB 是按照一定的时间间隔进行持久化的。

  2. 当数据量较大时,fork 子进程可能会导致短时间的服务暂停。

配置:

  1. save:通过配置多个 save 条件来触发 RDB 持久化。例如,save 900 1 表示 900 秒内至少有 1 个键被修改就进行持久化。

  2. bgsave:执行后台保存操作,Redis 会 fork 一个子进程来创建 RDB 文件,不会阻塞主进程处理请求。

2、AOF(Append Only File)持久化

优点:

  1. 数据的完整性和一致性更好,因为它是按顺序记录每一个写操作。

  2. 可以通过设置 appendfsync 选项为 always 来实现实时持久化,最大限度减少数据丢失。

缺点:

  1. AOF 文件通常比 RDB 文件大,因为它记录了更多的操作细节。

  2. 恢复数据的速度相对较慢,尤其是在 AOF 文件较大的情况下。

配置:

  1. appendfsync always:每次执行写命令都会立即将数据同步到 AOF 文件,数据安全性最高,但性能开销较大。

  2. appendfsync everysec:每秒将数据同步到 AOF 文件,是一种平衡性能和数据安全性的模式,默认采用此模式。

  3. appendfsync no:由操作系统决定何时将数据同步到 AOF 文件,性能最好,但数据安全性最低。

总的来说,RDB 适合对数据完整性要求不高,希望快速恢复数据的场景;AOF 适合对数据完整性要求较高,能够接受一定性能损失的场景。在实际应用中,也可以同时启用两种持久化方式,以充分利用它们的优点。

redis 主从之间数据复制

在 Redis 的主从集群中,当同时开启了 RDB 和 AOF 持久化时,从节点复制数据的过程包含以下详细步骤:

  1. 建立连接:

    • 从节点启动后,会向主节点发送 PSYNC 命令,尝试与主节点建立连接。

  2. 全量同步:

    • 主节点接收到从节点的 PSYNC 命令后,会判断是否需要进行全量同步。如果从节点是初次连接或者主从节点的复制偏移量差距过大,就会触发全量同步。

    • 主节点执行 bgsave 命令,创建一个新的 RDB 文件。在这个过程中,主节点仍然可以处理客户端的请求。

    • 主节点生成 RDB 文件完成后,将该文件发送给从节点。

    • 从节点接收到 RDB 文件后,会将其存储到本地,并进行加载,从而完成数据的初始化。

  3. 增量同步(后续持续进行):

    • 主节点在执行写操作时,会将这些写命令同时写入 AOF 缓冲区和一个称为复制积压缓冲区的内存区域。

    • 从节点在完成 RDB 文件的加载后,会向主节点发送自己当前的复制偏移量。

    • 主节点根据从节点的复制偏移量和复制积压缓冲区中的内容,判断哪些写命令需要发送给从节点。

    • 主节点将需要的写命令发送给从节点。

    • 从节点接收并执行这些写命令,从而保持与主节点数据的一致性。

例如,假设主节点在全量同步完成后,又执行了一系列写入操作,如 SET key1 value1DEL key2 等。这些操作首先会被记录在主节点的 AOF 缓冲区和复制积压缓冲区中。然后,主节点会根据从节点的复制偏移量,将从节点缺失的写命令发送给从节点。从节点接收到这些命令后,依次执行 SET key1 value1DEL key2 等操作,以确保其数据与主节点保持一致。

复制积压缓冲区是一个固定大小(默认大小为 1MB)的环形缓冲区,它存储了主节点最近执行的写命令。通过这个缓冲区,即使在网络出现短暂中断的情况下,如果从节点的复制偏移量仍在缓冲区范围内,主从节点之间就可以进行部分数据的增量同步,而不必重新进行全量同步,从而提高了数据同步的效率和系统的稳定性。

注意事项

1、主从集群,主从新上线要作为从节点的话需要手动加入slaveof 【master ip】【master port】配置

问题处理

18978:X 13 Aug 2024 02:21:35.780 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see vm.max_map_count growing steadily when vm.overcommit_memory is 2 · Issue #1328 · jemalloc/jemalloc · GitHub. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

这段信息是一个警告,指出内存超量提交(Memory overcommit)必须被启用。
如果未启用,在低内存情况下,后台保存或复制操作可能会失败。即使在非低内存情况下被禁用,也可能导致故障。
要解决此问题,需要在 /etc/sysctl.conf 文件中添加 vm.overcommit_memory = 1 ,然后重新启动系统或者运行命令 sysctl vm.overcommit_memory=1 以使更改生效。
例如:
sudo sysctl vm.overcommit_memory=1
然后将配置添加到 /etc/sysctl.conf 中,以确保在系统重启后仍然有效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值