中间件实用笔记

📅 发布时间:2026/7/13 5:53:11 👁️ 浏览次数:
中间件实用笔记
RedisRedis集群部署部署架构服务器节点192.168.198.132192.168.198.133192.168.198.134集群架构三主Master三从Slave端口规划每台服务器部署两个 Redis 实例端口分别为7201和7202主从关系会在集群创建时由 Redis 自动分配通常会将主节点和从节点分配在不同物理机上以实现高可用第一步环境准备在三台服务器上执行在所有三台服务器上执行以下操作确保目录结构一致。创建集群目录为每个端口创建独立的目录用于存放配置文件和持久化数据。mkdir-p/usr/local/redis-cluster/{7201,7202}复制配置文件模板将 Redis 安装目录下的配置文件复制到对应的端口目录。# 请根据你的实际 redis 安装包解压路径调整下面的命令# 假设你的源码包在 /usr/local/redis-6.2.1cp/usr/local/redis-6.2.1/redis.conf /usr/local/redis-cluster/7201/cp/usr/local/redis-6.2.1/redis.conf /usr/local/redis-cluster/7202/第二步修改配置文件需要针对每个端口修改对应的配置文件。下面以192.168.198.132为例其他服务器操作类似只需替换对应的IP和端口即可。在 192.168.198.132 上配置 7201 端口编辑/usr/local/redis-cluster/7201/redis.conf文件修改或添加以下内容vim/usr/local/redis-cluster/7201/redis.conf配置文件关键修改项 # 让Redis在后台运行 daemonize yes # 绑定当前服务器的IP bind 192.168.198.132 # 设置当前实例的端口 port 7201 # 设置PID文件路径 pidfile /var/run/redis_7201.pid # 设置日志级别 loglevel notice # 设置日志文件路径 logfile /usr/local/redis-cluster/7201/redis-7201.log # 设置RDB持久化文件路径和名称 dir /usr/local/redis-cluster/7201/ dbfilename dump-7201.rdb # 开启集群模式 cluster-enabled yes # 集群节点配置文件由Redis自动生成和维护 cluster-config-file nodes-7201.conf # 节点超时时间毫秒 cluster-node-timeout 15000 # 开启AOF持久化可选建议开启以增加数据安全性 appendonly yes appendfilename appendonly-7201.aof在 192.168.198.132 上配置 7202 端口编辑/usr/local/redis-cluster/7202/redis.conf文件vim/usr/local/redis-cluster/7202/redis.conf将上述配置中的7201全部替换为7202IP保持不变。daemonize yes bind 192.168.198.132 port 7202 pidfile /var/run/redis_7202.pid loglevel notice logfile /usr/local/redis-cluster/7202/redis-7202.log dir /usr/local/redis-cluster/7202/ dbfilename dump-7202.rdb cluster-enabled yes cluster-config-file nodes-7202.conf cluster-node-timeout 15000 appendonly yes appendfilename appendonly-7202.aof在其他服务器上的配置在 192.168.198.133 上修改7201端口配置bind 192.168.198.133端口及其他文件名使用7201修改7202端口配置bind 192.168.198.133端口及其他文件名使用7202在 192.168.198.134 上修改7201端口配置bind 192.168.198.134端口及其他文件名使用7201修改7202端口配置bind 192.168.198.134端口及其他文件名使用7202第三步启动所有 Redis 节点在三台服务器上分别启动各自的 Redis 实例。在 192.168.198.132 上启动/usr/local/redis-6.2.1/src/redis-server /usr/local/redis-cluster/7201/redis.conf /usr/local/redis-6.2.1/src/redis-server /usr/local/redis-cluster/7202/redis.conf在 192.168.198.133 上启动/usr/local/redis-6.2.1/src/redis-server /usr/local/redis-cluster/7201/redis.conf /usr/local/redis-6.2.1/src/redis-server /usr/local/redis-cluster/7202/redis.conf在 192.168.198.134 上启动/usr/local/redis-6.2.1/src/redis-server /usr/local/redis-cluster/7201/redis.conf /usr/local/redis-6.2.1/src/redis-server /usr/local/redis-cluster/7202/redis.conf验证启动在所有机器上执行以下命令查看进程是否正常。ps-ef|grepredis应该能看到 6 个 redis-server 进程。第四步创建 Redis 集群在任意一台服务器上执行redis-cli命令来创建集群。这里假设在192.168.198.132上执行。进入 Redis 源码的 src 目录如果已将redis-cli加入环境变量则可直接执行命令cd/usr/local/redis-6.2.1/src执行创建集群命令--cluster-replicas 1表示每个主节点分配 1 个从节点。./redis-cli--clustercreate\192.168.198.132:7201\192.168.198.133:7201\192.168.198.134:7201\192.168.198.132:7202\192.168.198.133:7202\192.168.198.134:7202\--cluster-replicas1确认分配方案命令执行后Redis 会计算出一个主从分配方案通常是前三个 IPPort 为主后三个为从且从节点会自动分配到与主节点不同的物理机上。屏幕上会显示类似下面的信息 Performing hash slots allocation on 6 nodes... Master[0] - Slots 0 - 5460 Master[1] - Slots 5461 - 10922 Master[2] - Slots 10923 - 16383 Adding replica 192.168.198.132:7202 to 192.168.198.133:7201 Adding replica 192.168.198.133:7202 to 192.168.198.134:7201 Adding replica 192.168.198.134:7202 to 192.168.198.132:7201 ... Can I set the above configuration? (type yes to accept):确认无误后输入yes并回车。等待集群创建完成集群会自动进行槽位分配和主从复制出现[OK] All 16384 slots covered.的提示即代表集群创建成功。第五步验证集群查看集群节点信息连接到任意一个节点执行cluster nodes命令。./redis-cli-c-h192.168.198.132-p7201cluster nodes-c参数表示以集群模式连接会自动重定向 。进行数据读写测试./redis-cli-c-h192.168.198.132-p7201进入交互式命令行后192.168.198.132:7201setname zhangsan -Redirected to slot[5798]located at192.168.198.133:7201 OK192.168.198.133:7201get namezhangsan如果看到数据被自动重定向到正确的节点并成功写入/读取说明集群功能正常。注意事项故障恢复当某个主节点宕机时其对应的从节点会自动升级为主节点保证集群可用性。核心关键配置cluster-enabled yes集群模式、protected-mode no关闭保护模式、requirepass/masterauth密码认证是集群节点的核心配置确保安全和集群功能性能相关disable-thp yes必须开启禁用大页、hz 10调度频率、lazyfree系列惰性删除影响Redis的响应速度和内存效率持久化相关appendonly yesAOFrdbcompression yesRDB压缩平衡数据安全和性能集群建议开启AOF。移动端redis配置# 核心网络配置 # 关闭Redis保护模式默认开启仅允许本机访问关闭后需配合bind/密码确保安全 protected-mode no # Redis监听端口集群节点区分的核心标识7201为自定义端口 port 7201 # TCP连接队列长度backlog处理并发连接请求默认511高并发场景可调大 tcp-backlog 511 # 客户端空闲超时时间0表示永不超时若设为300则5分钟空闲断开集群场景建议0 timeout 0 # TCP保活时间单位秒300表示每5分钟检测一次TCP连接是否存活防止无效连接 tcp-keepalive 300 # 进程/日志配置 # 以守护进程方式运行后台运行脱离终端测试时可设为no便于看日志 daemonize yes # PID文件路径记录Redis进程ID用于启停脚本识别进程 pidfile redis_7201.pid # 日志级别notice普通通知级可选debug/verbose/notice/warning/error生产用notice loglevel notice # 日志文件路径相对路径实际生成在dir配置的目录下设为stdout则输出到控制台 logfile notice.log # 数据基础配置 # 数据库数量默认16个可通过SELECT命令切换集群场景一般只用db0 databases 16 # 启动时是否显示Redis logono表示不显示减少日志冗余 always-show-logo no # 是否设置进程标题yes表示开启便于ps命令识别Redis进程 set-proc-title yes # 进程标题模板{title}为进程名{listen-addr}为监听地址{server-mode}为运行模式 proc-title-template {title} {listen-addr} {server-mode} # RDB持久化配置 # BGSAVE失败时是否停止写入yes保护数据一致性失败则拒绝写操作no继续写入但有数据丢失风险 stop-writes-on-bgsave-error yes # RDB文件是否压缩yes压缩节省磁盘略耗CPUno不压缩写入更快 rdbcompression yes # RDB文件是否校验和yes写入/读取时校验防止文件损坏略耗CPU rdbchecksum yes # RDB持久化文件名默认dump.rdb集群建议按端口区分如dump-7201.rdb dbfilename dump.rdb # 是否删除主从同步生成的临时RDB文件no保留yes同步完成后删除 rdb-del-sync-files no # 数据文件RDB/AOF存储目录绝对路径需确保目录存在且Redis有读写权限 dir /home/capinfo/ydd/redis/redis-cluster/7201 # 主从复制配置 # 从节点是否提供过期数据服务yes主节点失联时从节点仍返回数据no返回错误 replica-serve-stale-data yes # 从节点是否只读yes集群场景强制从节点只读防止误写no允许从节点写入 replica-read-only yes # 是否开启无盘同步no同步时生成临时RDB文件yes直接通过网络传输节省磁盘IO repl-diskless-sync no # 无盘同步延迟时间单位秒5表示等待5秒再开始同步等待更多从节点接入 repl-diskless-sync-delay 5 # 无盘加载模式disabled禁用on-empty-db仅空库时用swapdb替换当前库 repl-diskless-load disabled # 主从同步时是否禁用TCP_NODELAYno启用减少同步延迟yes禁用节省带宽 repl-disable-tcp-nodelay no # 从节点优先级100为默认数值越小优先级越高主节点故障时优先选低数值从节点升主 replica-priority 100 # 安全/ACL配置 # ACL日志最大长度128条记录ACL相关操作如权限变更、认证失败等 acllog-max-len 128 # 主节点认证密码集群主从切换/同步时从节点连接主节点需验证的密码 masterauth redis1qaz!# # Redis客户端访问密码所有客户端连接需执行AUTH命令验证集群必须配置防止未授权访问 requirepass redis1qaz!# # 惰性删除配置 # 内存淘汰时是否惰性删除no立即删除yes异步删除减少阻塞 lazyfree-lazy-eviction no # 键过期时是否惰性删除no立即删除yes访问过期键时再删除 lazyfree-lazy-expire no # 服务器端删除键时是否惰性删除如RENAME、MOVE命令no立即删除 lazyfree-lazy-server-del no # 从节点全量同步时是否惰性清空数据no立即清空yes异步清空 replica-lazy-flush no # 用户执行DEL命令时是否惰性删除no立即删除yes异步删除 lazyfree-lazy-user-del no # 用户执行FLUSHDB/FLUSHALL时是否惰性清空no立即清空yes异步清空 lazyfree-lazy-user-flush no # 内存/OOM配置 # 是否调整进程OOM分数no不调整yesRedis根据运行状态调整OOM优先级 oom-score-adj no # OOM分数调整值分别对应正常/从节点/主节点状态数值越大越不易被OOM killer杀死 oom-score-adj-values 0 200 800 # 禁用透明大页THPRedis性能杀手必须设为yes防止内存碎片和延迟 disable-thp yes # AOF持久化配置 # 开启AOF持久化yes日志追加模式比RDB更安全no仅用RDB appendonly yes # AOF文件名默认appendonly.aof集群建议按端口区分如appendonly-7201.aof appendfilename appendonly.aof # AOF刷盘策略everysec每秒刷盘一次平衡性能和安全性always每次写都刷盘最慢最安全no由系统决定 appendfsync everysec # AOF重写时是否停止刷盘no不停止保证数据安全yes停止提升重写速度但有数据丢失风险 no-appendfsync-on-rewrite no # AOF自动重写触发百分比100表示AOF文件大小比上次重写后增长100%时触发 auto-aof-rewrite-percentage 100 # AOF自动重写最小文件大小64mb文件小于64MB时即使达到百分比也不重写 auto-aof-rewrite-min-size 64mb # AOF文件截断时是否加载yes加载正常部分忽略损坏部分no启动失败 aof-load-truncated yes # AOF文件是否使用RDB预编译yesAOF文件开头为RDB格式加载更快 aof-use-rdb-preamble yes # Lua脚本配置 # Lua脚本最大执行时间单位毫秒5000表示5秒超时则终止脚本防止阻塞 lua-time-limit 5000 # 集群核心配置 # 开启Redis集群模式yes作为集群节点运行no单机模式 cluster-enabled yes # 集群节点配置文件自动生成记录集群节点信息需按端口区分 cluster-config-file nodes-7201.conf # 集群节点超时时间单位毫秒5000表示5秒节点失联超过该时间则判定为故障 cluster-node-timeout 5000 # 慢查询/延迟监控 # 慢查询日志阈值单位微秒10000表示10毫秒执行时间超过则记录到慢查询日志 slowlog-log-slower-than 10000 # 慢查询日志最大条数128条满了之后覆盖最旧的日志 slowlog-max-len 128 # 延迟监控阈值单位毫秒0表示关闭监控设为10则记录延迟超过10ms的操作 latency-monitor-threshold 0 # 键空间通知 # 键空间事件通知空字符串表示关闭如设为KEA则监控键过期/新增/删除等事件 notify-keyspace-events # 数据结构优化配置 # Hash类型压缩列表最大条目数512超过则转为哈希表调小节省内存调大提升性能 hash-max-ziplist-entries 512 # Hash类型压缩列表最大值大小64字节值超过则转为哈希表 hash-max-ziplist-value 64 # List类型压缩列表大小-2表示按字节限制约8KB-1表示按条目限制512条 list-max-ziplist-size -2 # List类型压缩深度0表示不压缩1表示首尾各1个元素不压缩中间压缩 list-compress-depth 0 # Set类型转为intset的最大条目数512元素均为整数且数量≤512时用intset节省内存 set-max-intset-entries 512 # ZSet类型压缩列表最大条目数128超过则转为跳表 zset-max-ziplist-entries 128 # ZSet类型压缩列表最大值大小64字节值超过则转为跳表 zset-max-ziplist-value 64 # HyperLogLog稀疏存储最大字节数3000超过则转为密集存储 hll-sparse-max-bytes 3000 # Stream类型节点最大字节数4096字节超过则拆分节点 stream-node-max-bytes 4096 # Stream类型节点最大条目数100条超过则拆分节点 stream-node-max-entries 100 # 其他性能配置 # 是否开启主动重哈希yes定期重新哈希字典防止哈希表碎片化 activerehashing yes # 普通客户端输出缓冲区限制0 0 0无限制集群场景建议保留默认 client-output-buffer-limit normal 0 0 0 # 从节点输出缓冲区限制256mb最大缓冲区64mb触发限流阈值60限流60秒后断开 client-output-buffer-limit replica 256mb 64mb 60 # 发布订阅客户端输出缓冲区限制32mb最大缓冲区8mb触发限流阈值60限流60秒后断开 client-output-buffer-limit pubsub 32mb 8mb 60 # Redis核心调度频率hz10表示每秒10次调大如20可提升过期键删除/异步任务效率略耗CPU hz 10 # 是否动态调整hzyes根据负载自动调整高负载时提高hz低负载时降低 dynamic-hz yes # AOF重写时增量刷盘yes分批刷盘减少磁盘IO阻塞 aof-rewrite-incremental-fsync yes # RDB保存时增量刷盘yes分批刷盘减少磁盘IO阻塞 rdb-save-incremental-fsync yes # 开启jemalloc后台线程yes异步清理内存碎片减少主线程阻塞 jemalloc-bg-thread yes移动端报错优化三类报错的核心根源MOVED 重定向失败集群拓扑同步/节点配置/超时参数不合理RedisTimeoutException连接超时/连接池耗尽/Redis 阻塞SlaveConnectionPool no available从节点配置/主从同步/从节点连接限制。针对三类报错的配置优化逐行修改以下是需要在你的 Redis 7201 配置文件中调整/新增的项修改后需重启 Redis 集群节点生效1. 解决「MOVED 重定向失败」集群拓扑/超时优化# 原配置保留新增/修改以下项 # 1. 集群节点超时时间原5000ms太短MOVED重定向时易判定节点故障建议调大 cluster-node-timeout 15000 # 2. 开启集群重定向自动处理Redis默认开启显式配置防止被覆盖 cluster-require-full-coverage no # 3. 集群槽位迁移超时新增防止槽位迁移时MOVED异常 cluster-migration-barrier 1 # 4. 监听地址关键原配置未显式配置bind默认仅监听127.0.0.1导致集群节点间无法通信 # 改为绑定本机内网IP如192.168.198.132 回环地址集群节点间才能互通 bind 127.0.0.1 192.168.198.132 # 5. TCP连接超时新增防止集群节点间连接超时 tcp-timeout 100002. 解决「RedisTimeoutException」连接/超时优化# 原配置保留新增/修改以下项 # 1. 最大客户端连接数原未配置默认10000集群场景建议调大防止连接耗尽 maxclients 20000 # 2. 客户端超时原0表示永不超时新增客户端空闲超时释放无效连接 timeout 300 # 3. TCP backlog原511高并发场景调大防止连接队列溢出 tcp-backlog 2048 # 4. 禁用THP原已配置确认保留防止内存碎片导致的阻塞 disable-thp yes # 5. 慢查询阈值原10000微秒10ms调小至5ms便于定位慢查询导致的超时 slowlog-log-slower-than 5000 # 6. 核心调度频率原10调大至20提升过期键删除/异步任务处理效率减少阻塞 hz 20 # 7. 开启惰性删除原no改为yes减少主线程阻塞避免连接超时 lazyfree-lazy-eviction yes lazyfree-lazy-expire yes lazyfree-lazy-server-del yes3. 解决「SlaveConnectionPool no available Redis entries」从节点优化# 原配置保留新增/修改以下项 # 1. 从节点最大客户端连接数新增单独限制从节点连接防止从节点连接池耗尽 replica-max-clients 10000 # 2. 从节点同步超时新增防止主从同步超时导致从节点不可用 repl-timeout 60000 # 3. 从节点只读原yes保留但新增允许从节点临时写入应急用 replica-read-only yes # 4. 主从同步无盘加载原disabled改为on-empty-db提升从节点同步效率 repl-diskless-load on-empty-db # 5. 从节点优先级原100调小至50主节点故障时更快升主减少从节点不可用时间 replica-priority 50