最新稳定版安装包下载地址
最新稳定版本始终在固定的 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.10 | 192.168.100.20 | /usr/local/redis/ | 16379 | 1qaz2wsx#EDC | rdb,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.10 | 192.168.100.20 | /usr/local/redis/ | 16379 | 1qaz2wsx#EDC | rdb,aof |
Redis-1(sentinel) | Redis-1(sentinel) | 安装路径 | 端口 | ||
192.168.100.10 | 192.168.100.20 | /usr/local/redis/sentinel | 26379 |
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/ | 16379 | 1qaz2wsx#EDC | rdb,aof | 初始化安装时组成集群 |
192.168.100.10 | /usr/local/u2/ | 16380 | 1qaz2wsx#EDC | rdb,aof | 初始化安装时组成集群 |
192.168.100.10 | /usr/local/u3/ | 16381 | 1qaz2wsx#EDC | rdb,aof | 初始化安装时组成集群 |
192.168.100.20 | /usr/local/u1/ | 16379 | 1qaz2wsx#EDC | rdb,aof | 初始化安装时组成集群 |
192.168.100.20 | /usr/local/u2/ | 16380 | 1qaz2wsx#EDC | rdb,aof | 初始化安装时组成集群 |
192.168.100.20 | /usr/local/u3/ | 16381 | 1qaz2wsx#EDC | rdb,aof | 初始化安装时组成集群 |
192.168.100.20 | /usr/local/u4/ | 16382 | 1qaz2wsx#EDC | rdb,aof | 手动进行节点添加-》分配槽位-》将槽位分配到其他主节点-》删除下线 |
192.168.100.20 | /usr/local/u5/ | 16383 | 1qaz2wsx#EDC | rdb,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
添加主节点
- -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
加入成功。
添加从节点
--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
获取 192.168.100.20:16382的节点id
将当前节点分配为 632b491562c804975c6aabc08536be805b6c6096 的从节点
CLUSTER REPLICATE 632b491562c804975c6aabc08536be805b6c6096
槽位迁移
- -cluster reshard 槽位迁移 集群中任意一个从节点IP:节点端口,中迁移槽位到当前节点中,ip和port集群内任意存活节点即可
/usr/local/u4/bin/redis-cli -p 16382 -a 1qaz2wsx#EDC --cluster reshard 192.168.100.10:16379
等待迁移完毕。
迁移完毕后,查看就可以看到迁移过来的槽位了
删除从节点
- -cluster del-node 连接任意一个存活的节点IP:连接任意一个存活的节点端口 要删除节点ID,ip和port集群内任意存活节点即可
获取要删除的 192.168.100.20:16383的ID信息
/usr/local/u5/bin/redis-cli -p 16383 -a 1qaz2wsx#EDC --cluster del-node 192.168.100.20:16379 1bc377fbf741623d61936f6d80bb26fbe1703f0f
删除从节点完成
删除主节点
- -cluster del-node 连接任意一个存活的节点IP:连接任意一个存活的节点端口 要删除节点ID,ip和port集群内任意存活节点即可
需要先将主节点的槽位分给其他机器,在进行删除
槽位迁移完成,自动将为从节点
开始删除从节点
/usr/local/u5/bin/redis-cli -p 16379 -a 1qaz2wsx#EDC --cluster del-node 192.168.100.20:16379 632b491562c804975c6aabc08536be805b6c6096
删除完成
重新分配槽位
注意 !!!
重新分配槽位慎用!!!
,该功能可以让着集群的槽位重新平均分配但是由于涉及到槽位大量迁移会导致整个Redis阻塞停止处理客户端的请求
- -cluster rebalance 重新分配集群中的槽位,ip和port集群内任意节点即可
/usr/local/u5/bin/redis-cli -p 16379 -a 1qaz2wsx#EDC --cluster rebalance 192.168.100.10:16379
重新分配完成
五、高可用架构方案对比
Redis 作为一款高性能的内存数据库,在实际应用中确保其高可用性至关重要。
以下将对三种常见的 Redis 高可用方案进行对比:
-
主从复制(Master-Slave Replication)
-
Redis 哨兵(Redis Sentinel)
-
Redis 集群(Redis Cluster)
1、主从复制
主从复制是 Redis 实现高可用的基本方式。在这种方案中,一个 Redis 实例作为主节点(Master),负责处理写操作和数据的更新,而多个 Redis 实例作为从节点(Slave),从主节点复制数据以实现数据的备份和读操作的分担。
优点:
-
实现简单,配置相对容易。
-
可以通过增加从节点来提高读操作的性能,实现读写分离。
缺点:
-
主节点出现故障时,需要手动进行故障切换,可能会导致数据丢失和服务中断。
-
无法自动监测主节点的状态,需要外部监控机制配合。
例如,如果主节点在数据同步到从节点之前发生故障,那么尚未同步的数据将会丢失。
2、Redis 哨兵
Redis Sentinel 是 Redis 官方提供的高可用解决方案。它可以监控多个 Redis 主从服务器实例,并在主节点出现故障时自动进行故障转移。
优点:
-
能够自动监测主节点的状态,实现故障自动切换,减少了人工干预和服务中断的时间。
-
可以配置多个哨兵节点,提高了监控的可靠性和容错性。
缺点:
-
配置相对复杂,需要对哨兵的配置参数有深入理解。
-
增加了系统的复杂性和资源消耗。
例如,在故障转移过程中,可能会出现短暂的服务不可用,但通常时间较短。
3、Redis cluster 集群
Redis 集群是 Redis 提供的分布式解决方案,通过数据分片将数据分布在多个节点上,实现了自动的故障转移和扩展性。
优点:
-
支持数据的自动分片,能够实现水平扩展,轻松应对数据量的增长。
-
提供了高可用性,当某个节点出现故障时,能够自动将其负责的数据迁移到其他正常节点。
缺点:
-
配置和维护相对复杂,需要对集群的概念和原理有深入的理解。
-
不支持跨节点的事务操作。
例如,在进行数据迁移时,可能会对性能产生一定的影响。
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)持久化
优点:
-
生成紧凑的二进制文件,恢复数据的速度非常快。
-
适合用于数据备份和灾难恢复。
-
性能较好,在保存 RDB 快照时,主进程会fork一个子进程来完成,不会阻塞主进程处理请求。
缺点:
-
可能会丢失最后一次持久化之后的数据,因为 RDB 是按照一定的时间间隔进行持久化的。
-
当数据量较大时,fork 子进程可能会导致短时间的服务暂停。
配置:
-
save
:通过配置多个save
条件来触发 RDB 持久化。例如,save 900 1
表示 900 秒内至少有 1 个键被修改就进行持久化。 -
bgsave
:执行后台保存操作,Redis 会 fork 一个子进程来创建 RDB 文件,不会阻塞主进程处理请求。
2、AOF(Append Only File)持久化
优点:
-
数据的完整性和一致性更好,因为它是按顺序记录每一个写操作。
-
可以通过设置
appendfsync
选项为always
来实现实时持久化,最大限度减少数据丢失。
缺点:
-
AOF 文件通常比 RDB 文件大,因为它记录了更多的操作细节。
-
恢复数据的速度相对较慢,尤其是在 AOF 文件较大的情况下。
配置:
-
appendfsync always
:每次执行写命令都会立即将数据同步到 AOF 文件,数据安全性最高,但性能开销较大。 -
appendfsync everysec
:每秒将数据同步到 AOF 文件,是一种平衡性能和数据安全性的模式,默认采用此模式。 -
appendfsync no
:由操作系统决定何时将数据同步到 AOF 文件,性能最好,但数据安全性最低。
总的来说,RDB 适合对数据完整性要求不高,希望快速恢复数据的场景;AOF 适合对数据完整性要求较高,能够接受一定性能损失的场景。在实际应用中,也可以同时启用两种持久化方式,以充分利用它们的优点。
redis 主从之间数据复制
在 Redis 的主从集群中,当同时开启了 RDB 和 AOF 持久化时,从节点复制数据的过程包含以下详细步骤:
-
建立连接:
-
从节点启动后,会向主节点发送
PSYNC
命令,尝试与主节点建立连接。
-
-
全量同步:
-
主节点接收到从节点的
PSYNC
命令后,会判断是否需要进行全量同步。如果从节点是初次连接或者主从节点的复制偏移量差距过大,就会触发全量同步。 -
主节点执行
bgsave
命令,创建一个新的 RDB 文件。在这个过程中,主节点仍然可以处理客户端的请求。 -
主节点生成 RDB 文件完成后,将该文件发送给从节点。
-
从节点接收到 RDB 文件后,会将其存储到本地,并进行加载,从而完成数据的初始化。
-
-
增量同步(后续持续进行):
-
主节点在执行写操作时,会将这些写命令同时写入 AOF 缓冲区和一个称为复制积压缓冲区的内存区域。
-
从节点在完成 RDB 文件的加载后,会向主节点发送自己当前的复制偏移量。
-
主节点根据从节点的复制偏移量和复制积压缓冲区中的内容,判断哪些写命令需要发送给从节点。
-
主节点将需要的写命令发送给从节点。
-
从节点接收并执行这些写命令,从而保持与主节点数据的一致性。
-
例如,假设主节点在全量同步完成后,又执行了一系列写入操作,如 SET key1 value1
、 DEL key2
等。这些操作首先会被记录在主节点的 AOF 缓冲区和复制积压缓冲区中。然后,主节点会根据从节点的复制偏移量,将从节点缺失的写命令发送给从节点。从节点接收到这些命令后,依次执行 SET key1 value1
和 DEL 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 中,以确保在系统重启后仍然有效。