1.Redis 集群部署
感谢老王先生提供封面图片
三主三从 Redis 集群是一种高可用性架构,通常用于分布式场景,其核心在于通过主从复制和自动分片实现数据冗余与负载均衡。他的优势就在于三个主节点负责不同的hash槽,从节点复制主节点数据,提供数据冗余和故障转移
redis [ ~ ]$ wget http://20.198.69.*:8080/redis-5.0.5/redis-5.0.5.tar.gz -P /app/redis/
redis [ /app ]$ cd /app/redis/
redis [ /app/redis] tar -xzf redis-5.0.S.tar.gz
redis [ /app/redis J$ ls
redis-5.0.5 redis-5.0.5. tar.gz
redis [ /app/redis]$ cd redis-5.0.5 && make PREFIX=/app/redis/redis_5.0.5 install
redis [ /app/redis/redis 5.0.5 ]$ wget http://20.198.69.*:8080/redis5.0./redisnew/redis_6379.conf
--2023-05-17 17:28:28-- http://20.198.69.*:8080/redis-5.0.5/redisnew/redis_6379.conf
redis [ /app/redis/redis 5.0.5 ] cp -rf redis_6379.conf redis_6380. conf
#对 redis_6379.conf 进行配置修改
sed -i "/dbfilename/s@\(dbfilename \).*@\1dump_6379.rdb@" redis_6379.conf
sed -i "/logfile/s@\(logfile \).*@\1\"${PWD}/redis_6379.log\"@" redis_6379.conf
sed -i "/pidfile/s@\(pidfile \).*@\1${PWD}/redis_6379.pid@" redis_6379.conf
sed -i "/^daemonize/s/no/yes/" redis_6379.conf
sed -i "/^bind/s/127.0.0.1/$(hostname -I)/" redis_6379.conf
sed -i "/protected - mode/s/yes/no/" redis_6379.conf
sed -i "/# cluster - enabled yes/s/# //" redis_6379.conf
sed -i "/cluster - config - file/s/# //" redis_6379.conf
sed -i "/cluster - node - timeout/s/# //" redis_6379.conf
# 对 redis_6380.conf 进行配置修改
sed -i "/dbfilename/s@\(dbfilename \).*@\1dump_6380.rdb@" redis_6380.conf
sed -i "/logfile/s@\(logfile \).*@\1\"${PWD}/redis_6380.log\"@" redis_6380.conf
sed -i "/pidfile/s@\(pidfile \).*@\1${PWD}/redis_6380.pid@" redis_6380.conf
sed -i "/^daemonize/s/no/yes/" redis_6380.conf
sed -i "/^bind/s/127.0.0.1/$(hostname -I)/" redis_6380.conf
sed -i "/protected - mode/s/yes/no/" redis_6380.conf
sed -i "/port/s/6379/6380/" redis_6380.conf
sed -i "/# cluster - enabled yes/s/# //" redis_6380.conf
sed -i "/cluster - config - file/s/# //" redis_6380.conf
sed -i "/cluster - config - file/s/6379/6380/" redis_6380.conf
sed -i "/cluster - node - timeout/s/# //" redis_6380.conf
./bin/redis-server redis_6379. conf
./bin/redis-server redis_6380.conf
#以上步骤在三台机器上都执行
优化的参数有:
数据库文件名(dbfilename):把数据库文件名分别修改为 dump_6379.rdb 和 dump_6380.rdb,这样能区分不同端口实例的数据文件。
日志文件路径(logfile):将日志文件路径修改为当前工作目录下的 redis_6379.log 和 redis_6380.log,方便管理不同实例的日志。
进程 ID 文件路径(pidfile):把进程 ID 文件路径修改为当前工作目录下的 redis_6379.pid 和 redis_6380.pid,便于管理不同实例的进程。
守护进程模式(daemonize):将 daemonize 参数从 no 改为 yes,让 Redis 以守护进程模式运行。
绑定地址(bind):把绑定地址从 127.0.0.1 改为当前主机的 IP 地址,使 Redis 可以被外部访问。
保护模式(protected - mode):将保护模式从 yes 改为 no,允许外部网络访问 Redis 服务。
端口号(port):在 redis_6380.conf 里把端口号从 6379 改为 6380,用于区分不同的 Redis 实例。
集群启用(cluster - enabled):去掉注释启用 Redis 集群功能。
集群配置文件(cluster - config - file):去掉注释并把配置文件里的端口号从 6379 改为 6380,以适配不同端口的集群实例。
集群节点超时时间(cluster - node - timeout):去掉注释,启用集群节点超时时间配置。
7、创建集群:
/app/redis/redis_5.0.5/bin/redis-cli -a 12345 --clusten create 20.224.10.*:6379 20.224.10.**:6379 20.224.10.***:6379 20.224.10.*:6380 20.224.10.**:6380 20.224.10.***:6380 --cluster-replicas 1(提示输入yes即可)
#验证集群
redis [ /app/redis/redis_5.0.5 ]$ 1s
bin dump_6379.rdb dump_6380.rdb install.sh nodes-6379.conf nodes-6380.conf nodes-6379.conf nodes-6380.conf redis_6379.pid
#验证集群
redis [ /app/redis/redis_5.0.5 ]$ 15
bin dump_6379.rdb dump_6380.rdb install.sh nodes-6379.conf nodes-6380.conf redis_6379.conf redis_6379.log redis_6379.pid redis_6380.conf redis_6380.log redis_6380.pid
redis [ /app/redis/redis_5.0.5 ]$ cd bin
#验证集群
redis [ /app/redis/redis_5.0.5 ]$ 15
bin dump_6379.rdb dump_6380.rdb install.sh nodes-6379.conf nodes-6380.conf redis_6379.conf redis_6379.log redis_6379.pid redis_6380.conf redis_6380.log redis_6380.pid
redis [ /app/redis/redis_5.0.5 ]$ cd bin
redis [ /app/redis/redis_5.0.5/bin ]$ ./redis-cli -a 12345 -h 20.224.10.*
Warning: Using a password with '-a' or "-u' option on the command line interface may not be safe.
20.224.10.*: 6379> cluster nodes
d2a3c8bc690al4eeb777b457a31d37a25e41c0a7 20.224.10.***:6380@16380 slave 0d21eb06f702eb5ea0511e90bb5c84994fd68211 0 1684316150993
5 connected
c88707f73048257f6eb79a8060d15e0a6702efa9 20.224.10.**:6380016380 slave 0ef515909c24b892956f1f7ba38f48854c07c2d0 0 1684316149990
3 connected
0d21eb06f702eb5ea0511e90bb5c84994fd68211 20.224.10.*:6379016379 myself,master - 0 1684316148000 2 connected 5461-10922
cdcfdeb303a09e37109b422c840ea2ae17204f22 20.224.10.*:6380Q16380 slave 8ce777a3255b50071e07elce6ab947db41756b7a 0 1684316148989
4 connected
8ce777a3255b50071e07elce6ab947db41756b7a 20.224.10.**:6379@16379 master - 0 1684316150000 1 connected 0-5460
Oef515909c24b892956f1f7ba38f48854c07c2d0 220.224.10.***:6379@16379 master - 0 1684316149000 3 connected 10923-16383
20.224.10.*:6379>
2.Redis 数据库持久化
在现代应用开发中,Redis 作为一款高性能的内存数据库,被广泛用于缓存、消息队列、分布式锁等场景。然而,由于其数据存储在内存中,一旦服务器发生故障、重启或断电,内存中的数据将会丢失。为了解决这个问题,Redis 提供了持久化机制,能够将内存中的数据保存到磁盘上,以便在需要时进行恢复。
1 持久化的方式
Redis 提供了两种主要的持久化方式:RDB(Redis Database)和 AOF(Append - Only File),以及混合持久化。
RDB(快照持久化)
-
原理
RDB 持久化是将 Redis 在某一时刻的内存数据快照保存到磁盘上,生成一个二进制文件(通常命名为
dump.rdb
)。可以通过手动执行SAVE
或BGSAVE
命令触发,也可以根据配置文件中的规则自动触发。 -
优点
文件紧凑:RDB 文件是经过压缩的二进制文件,占用空间小,适合用于备份和灾难恢复。
恢复速度快:在重启 Redis 时,加载 RDB 文件的速度比 AOF 方式更快。
-
缺点
数据丢失风险:由于是定期生成快照,如果在两次快照之间发生故障,这期间的数据将会丢失。
性能影响:在生成快照时,可能会阻塞 Redis 主线程,尤其是在数据量较大时。
AOF(追加日志持久化)
原理
AOF 持久化是将 Redis 执行的每一条写命令追加到一个日志文件(通常命名为 appendonly.aof
)中。当 Redis 重启时,会重新执行这些命令来恢复数据。
优点
数据安全性高:AOF 可以配置不同的同步策略,如每秒同步一次或每次写操作都同步,这样可以最大程度减少数据丢失的风险。
日志易读:AOF 文件是文本格式,方便查看和修改。
缺点
文件体积大:随着时间的推移,AOF 文件会越来越大,占用更多的磁盘空间。
恢复速度慢:由于需要重新执行大量的命令,AOF 方式的恢复速度相对较慢。
混合持久化
-
原理
混合持久化结合了 RDB 和 AOF 的优点。在 Redis 4.0 及以后版本中,当开启混合持久化时,Redis 会在生成 AOF 文件时,先将当前时刻的内存数据以 RDB 格式写入文件,然后再将后续的写命令以 AOF 格式追加到文件末尾。 -
优点
恢复速度快:重启 Redis 时,先加载 RDB 部分,然后再执行 AOF 部分的命令,恢复速度比纯 AOF 方式更快。
数据安全性高:与 AOF 方式一样,能够保证数据的安全性。
三、在配置文件中开启持久化
开启 RDB 持久化
RDB 持久化默认是开启的,在 Redis 的配置文件 redis.conf
中,可以通过以下参数进行配置:
# 以下规则表示在 900 秒内如果有至少 1 个键被修改,就生成一次快照
save 900 1
# 300 秒内如果有至少 10 个键被修改,就生成一次快照
save 300 10
# 60 秒内如果有至少 10000 个键被修改,就生成一次快照
save 60 10000
# RDB 文件的名称
dbfilename dump.rdb
# RDB 文件的存储路径
dir ./
开启 AOF 持久化
要开启 AOF 持久化,需要在 redis.conf
中修改以下参数:
# 开启 AOF 持久化
appendonly yes
# AOF 文件的名称
appendfilename "appendonly.aof"
# AOF 同步策略,可选值为 always、everysec、no
appendfsync everysec
always:每次写操作都同步到磁盘,数据安全性最高,但性能最差。
everysec:每秒同步一次,是性能和数据安全性的一个折中选择。
no:由操作系统决定何时同步,性能最好,但数据安全性最低。
开启混合持久化
要开启混合持久化,需要在 redis.conf
中添加以下配置:
# 开启混合持久化
aof-use-rdb-preamble yes