沈阳做网站好的小程序商城系统平台

张小明 2026/1/14 3:30:28
沈阳做网站好的,小程序商城系统平台,汕头cms建站模板,网站备案和实名认证Docker 部署 Redis 集群完整指南 Spring Cloud全栈实战#xff1a;手撸企业级项目#xff0c;从入门到架构师#xff01; 一、Redis 集群架构设计 Spring Cloud全栈实战#xff1a;手撸企业级项目#xff0c;从入门到架构师#xff01;Spring Cloud全栈实战#xff1…Docker 部署 Redis 集群完整指南Spring Cloud全栈实战手撸企业级项目从入门到架构师一、Redis 集群架构设计Spring Cloud全栈实战手撸企业级项目从入门到架构师Spring Cloud全栈实战手撸企业级项目从入门到架构师1.1 集群架构┌─────────────────────────────────────────────────────────────────────┐ │ Redis Cluster (6节点) │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ Master1(7001) ──── Slave1(7004) Master2(7002) ──── Slave2(7005) │ │ │ │ │ │ │ │ ───────┴──────────────────┴──────────────┴──────────────────┴──────│ │ │ │ Master3(7003) ──── Slave3(7006) │ │ │ └─────────────────────────────────────────────────────────────────────┘二、Docker Compose 部署方案2.1 docker-compose.ymlversion:3.8services:# Redis 节点 1 (主节点)redis-node-1:image:redis:7.2-alpinecontainer_name:redis-cluster-node-1command:redis-server --bind 0.0.0.0 --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes --appendfsync everysec --save 900 1 --save 300 10 --save 60 10000 --requirepass ${REDIS_PASSWORD:-Redis123456} --masterauth ${REDIS_PASSWORD:-Redis123456} --maxmemory 2gb --maxmemory-policy allkeys-lru --loglevel notice --logfile /data/redis.log --protected-mode noports:-7001:6379-17001:16379# 集群总线端口volumes:-redis-data-1:/data-./redis.conf:/usr/local/etc/redis/redis.conf-./logs/redis-node-1:/var/log/redisenvironment:-REDIS_PORT6379-REDIS_PASSWORD${REDIS_PASSWORD:-Redis123456}-REDIS_CLUSTER_REPLICAS1networks:redis-cluster-network:ipv4_address:172.20.0.11healthcheck:test:[CMD,redis-cli,-a,${REDIS_PASSWORD:-Redis123456},ping]interval:30stimeout:10sretries:3start_period:40sdeploy:resources:limits:memory:2Greservations:memory:1Grestart:unless-stopped# Redis 节点 2 (主节点)redis-node-2:image:redis:7.2-alpinecontainer_name:redis-cluster-node-2command:redis-server --bind 0.0.0.0 --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes --appendfsync everysec --save 900 1 --save 300 10 --save 60 10000 --requirepass ${REDIS_PASSWORD:-Redis123456} --masterauth ${REDIS_PASSWORD:-Redis123456} --maxmemory 2gb --maxmemory-policy allkeys-lru --loglevel notice --logfile /data/redis.log --protected-mode noports:-7002:6379-17002:16379volumes:-redis-data-2:/data-./redis.conf:/usr/local/etc/redis/redis.conf-./logs/redis-node-2:/var/log/redisenvironment:-REDIS_PORT6379-REDIS_PASSWORD${REDIS_PASSWORD:-Redis123456}networks:redis-cluster-network:ipv4_address:172.20.0.12healthcheck:test:[CMD,redis-cli,-a,${REDIS_PASSWORD:-Redis123456},ping]interval:30stimeout:10sretries:3start_period:40srestart:unless-stopped# Redis 节点 3 (主节点)redis-node-3:image:redis:7.2-alpinecontainer_name:redis-cluster-node-3command:redis-server --bind 0.0.0.0 --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes --appendfsync everysec --save 900 1 --save 300 10 --save 60 10000 --requirepass ${REDIS_PASSWORD:-Redis123456} --masterauth ${REDIS_PASSWORD:-Redis123456} --maxmemory 2gb --maxmemory-policy allkeys-lru --loglevel notice --logfile /data/redis.log --protected-mode noports:-7003:6379-17003:16379volumes:-redis-data-3:/data-./redis.conf:/usr/local/etc/redis/redis.conf-./logs/redis-node-3:/var/log/redisenvironment:-REDIS_PORT6379-REDIS_PASSWORD${REDIS_PASSWORD:-Redis123456}networks:redis-cluster-network:ipv4_address:172.20.0.13healthcheck:test:[CMD,redis-cli,-a,${REDIS_PASSWORD:-Redis123456},ping]interval:30stimeout:10sretries:3start_period:40srestart:unless-stopped# Redis 节点 4 (从节点)redis-node-4:image:redis:7.2-alpinecontainer_name:redis-cluster-node-4command:redis-server --bind 0.0.0.0 --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes --appendfsync everysec --save 900 1 --save 300 10 --save 60 10000 --requirepass ${REDIS_PASSWORD:-Redis123456} --masterauth ${REDIS_PASSWORD:-Redis123456} --maxmemory 2gb --maxmemory-policy allkeys-lru --loglevel notice --logfile /data/redis.log --protected-mode noports:-7004:6379-17004:16379volumes:-redis-data-4:/data-./redis.conf:/usr/local/etc/redis/redis.conf-./logs/redis-node-4:/var/log/redisenvironment:-REDIS_PORT6379-REDIS_PASSWORD${REDIS_PASSWORD:-Redis123456}networks:redis-cluster-network:ipv4_address:172.20.0.14healthcheck:test:[CMD,redis-cli,-a,${REDIS_PASSWORD:-Redis123456},ping]interval:30stimeout:10sretries:3start_period:40srestart:unless-stopped# Redis 节点 5 (从节点)redis-node-5:image:redis:7.2-alpinecontainer_name:redis-cluster-node-5command:redis-server --bind 0.0.0.0 --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes --appendfsync everysec --save 900 1 --save 300 10 --save 60 10000 --requirepass ${REDIS_PASSWORD:-Redis123456} --masterauth ${REDIS_PASSWORD:-Redis123456} --maxmemory 2gb --maxmemory-policy allkeys-lru --loglevel notice --logfile /data/redis.log --protected-mode noports:-7005:6379-17005:16379volumes:-redis-data-5:/data-./redis.conf:/usr/local/etc/redis/redis.conf-./logs/redis-node-5:/var/log/redisenvironment:-REDIS_PORT6379-REDIS_PASSWORD${REDIS_PASSWORD:-Redis123456}networks:redis-cluster-network:ipv4_address:172.20.0.15healthcheck:test:[CMD,redis-cli,-a,${REDIS_PASSWORD:-Redis123456},ping]interval:30stimeout:10sretries:3start_period:40srestart:unless-stopped# Redis 节点 6 (从节点)redis-node-6:image:redis:7.2-alpinecontainer_name:redis-cluster-node-6command:redis-server --bind 0.0.0.0 --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes --appendfsync everysec --save 900 1 --save 300 10 --save 60 10000 --requirepass ${REDIS_PASSWORD:-Redis123456} --masterauth ${REDIS_PASSWORD:-Redis123456} --maxmemory 2gb --maxmemory-policy allkeys-lru --loglevel notice --logfile /data/redis.log --protected-mode noports:-7006:6379-17006:16379volumes:-redis-data-6:/data-./redis.conf:/usr/local/etc/redis/redis.conf-./logs/redis-node-6:/var/log/redisenvironment:-REDIS_PORT6379-REDIS_PASSWORD${REDIS_PASSWORD:-Redis123456}networks:redis-cluster-network:ipv4_address:172.20.0.16healthcheck:test:[CMD,redis-cli,-a,${REDIS_PASSWORD:-Redis123456},ping]interval:30stimeout:10sretries:3start_period:40srestart:unless-stopped# Redis Cluster 初始化服务redis-cluster-init:image:redis:7.2-alpinecontainer_name:redis-cluster-initdepends_on:-redis-node-1-redis-node-2-redis-node-3-redis-node-4-redis-node-5-redis-node-6networks:-redis-cluster-networkcommand:sh -c echo 等待Redis节点启动...; sleep 30;echo 检查节点健康状态...; for i in $$(seq 1 6); do redis-cli-h 172.20.0.1$$i-p 6379-a ${REDIS_PASSWORD:-Redis123456}ping 2/dev/null||echo 节点 $$i 未就绪; done; echo 创建Redis集群...; echo yes|redis-cli--cluster create 172.20.0.11:6379172.20.0.12:6379172.20.0.13:6379172.20.0.14:6379172.20.0.15:6379172.20.0.16:6379--cluster-replicas 1-a ${REDIS_PASSWORD:-Redis123456}; echo 验证集群状态...; redis-cli--cluster check 172.20.0.11:6379-a ${REDIS_PASSWORD:-Redis123456}; echo 集群信息:; redis-cli-h 172.20.0.11-p 6379-a ${REDIS_PASSWORD:-Redis123456}cluster info; echo 节点信息:; redis-cli-h 172.20.0.11-p 6379-a ${REDIS_PASSWORD:-Redis123456}cluster nodes; echo Redis集群初始化完成; restart:on-failure# Redis 集群管理工具redis-commander:image:rediscommander/redis-commander:latestcontainer_name:redis-cluster-webports:-8081:8081environment:-REDIS_HOSTSlocal:redis-node-1:6379:0:Redis123456,local:redis-node-2:6379:0:Redis123456,local:redis-node-3:6379:0:Redis123456-HTTP_USERadmin-HTTP_PASSWORD${REDIS_PASSWORD:-Redis123456}-REDIS_PORT6379-REDIS_PASSWORD${REDIS_PASSWORD:-Redis123456}depends_on:-redis-cluster-initnetworks:-redis-cluster-networkrestart:unless-stopped# Redis 监控工具redis-exporter:image:oliver006/redis_exporter:latestcontainer_name:redis-cluster-exporterports:-9121:9121command:---redis.addrredis://redis-node-1:6379---redis.addrredis://redis-node-2:6379---redis.addrredis://redis-node-3:6379---redis.password${REDIS_PASSWORD:-Redis123456}---log-formatjson---namespaceredis_clusterenvironment:-REDIS_PASSWORD${REDIS_PASSWORD:-Redis123456}depends_on:-redis-cluster-initnetworks:-redis-cluster-networkrestart:unless-stoppednetworks:redis-cluster-network:driver:bridgeipam:config:-subnet:172.20.0.0/16gateway:172.20.0.1volumes:redis-data-1:driver:localredis-data-2:driver:localredis-data-3:driver:localredis-data-4:driver:localredis-data-5:driver:localredis-data-6:driver:local2.2 环境变量配置 (.env)Spring Cloud全栈实战手撸企业级项目从入门到架构师# Redis 集群环境变量配置REDIS_PASSWORDRedis123456ClusterREDIS_CLUSTER_NAMEproduction-clusterREDIS_MAXMEMORY2gbREDIS_TIMEOUT5000REDIS_APPENDONLYyesREDIS_APPENDFSYNCeverysec# 网络配置REDIS_CLUSTER_SUBNET172.20.0.0/16REDIS_CLUSTER_GATEWAY172.20.0.1# 监控配置PROMETHEUS_ENABLEDtrueGRAFANA_ENABLEDtrue# 端口映射REDIS_PORT_START7001REDIS_CLUSTER_BUS_PORT_START17001REDIS_COMMANDER_PORT8081REDIS_EXPORTER_PORT9121三、自定义 Redis 配置文件3.1 redis.conf# Redis 集群配置文件 # 基于 Redis 7.2 版本 # 网络配置 bind 0.0.0.0 protected-mode no port 6379 tcp-backlog 511 timeout 0 tcp-keepalive 300 # 常规配置 daemonize no pidfile /var/run/redis_6379.pid loglevel notice logfile /data/redis.log databases 16 always-show-logo yes set-proc-title yes proc-title-template {title} {listen-addr} {server-mode} # 快照配置 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump.rdb rdb-del-sync-files no dir /data # 主从复制配置 replica-serve-stale-data yes replica-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-diskless-load disabled repl-disable-tcp-nodelay no replica-priority 100 acllog-max-len 128 # 安全配置 requirepass ${REDIS_PASSWORD} masterauth ${REDIS_PASSWORD} # 客户端配置 maxclients 10000 maxmemory 2gb maxmemory-policy allkeys-lru maxmemory-samples 5 lazyfree-lazy-eviction no lazyfree-lazy-expire no lazyfree-lazy-server-del no replica-lazy-flush no lazyfree-lazy-user-del no oom-score-adj no oom-score-adj-values 0 200 800 # 持久化配置 appendonly yes appendfilename appendonly.aof appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes aof-use-rdb-preamble yes # Lua 脚本配置 lua-time-limit 5000 # 慢查询日志 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 # 事件通知 notify-keyspace-events # 高级配置 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 hz 10 dynamic-hz yes aof-rewrite-incremental-fsync yes rdb-save-incremental-fsync yes jemalloc-bg-thread yes # 集群配置 cluster-enabled yes cluster-config-file /data/nodes.conf cluster-node-timeout 5000 cluster-replica-validity-factor 10 cluster-migration-barrier 1 cluster-require-full-coverage yes cluster-replica-no-failover no cluster-allow-reads-when-down no cluster-allow-pubsubshard-when-down no cluster-link-sendbuf-limit 0 cluster-announce-ip ${HOST_IP} cluster-announce-port 6379 cluster-announce-bus-port 16379 # 模块配置 loadmodule /usr/lib/redis/modules/redisearch.so loadmodule /usr/lib/redis/modules/rejson.so loadmodule /usr/lib/redis/modules/redisgraph.so loadmodule /usr/lib/redis/modules/redistimeseries.so loadmodule /usr/lib/redis/modules/redisbloom.so # TLS/SSL 配置 # tls-port 0 # tls-cert-file /etc/redis/certs/redis.crt # tls-key-file /etc/redis/certs/redis.key # tls-ca-cert-file /etc/redis/certs/ca.crt # tls-auth-clients no # tls-auth-clients optional # 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 20480 # tls-session-cache-timeout 300四、启动和部署脚本Spring Cloud全栈实战手撸企业级项目从入门到架构师4.1 启动脚本 (start-cluster.sh)#!/bin/bash# Redis Cluster 启动脚本# 支持 Docker 和 Docker Compose 部署set-e# 颜色定义RED\033[0;31mGREEN\033[0;32mYELLOW\033[1;33mBLUE\033[0;34mNC\033[0m# No Color# 日志函数log_info(){echo-e${BLUE}[INFO]${NC}$1}log_success(){echo-e${GREEN}[SUCCESS]${NC}$1}log_warn(){echo-e${YELLOW}[WARN]${NC}$1}log_error(){echo-e${RED}[ERROR]${NC}$1}# 检查依赖check_dependencies(){log_info检查系统依赖...# 检查 Dockerif!command-v docker/dev/null;thenlog_errorDocker 未安装exit1fi# 检查 Docker Composeif!command-v docker-compose/dev/null;thenlog_errorDocker Compose 未安装exit1filog_success依赖检查通过}# 创建目录结构create_directories(){log_info创建目录结构...mkdir-p ./data/{node1,node2,node3,node4,node5,node6}mkdir-p ./logs/{node1,node2,node3,node4,node5,node6}mkdir-p ./configmkdir-p ./ssl log_success目录创建完成}# 生成配置文件generate_configs(){log_info生成 Redis 配置文件...# 生成主配置文件cat./config/redis.confEOF # Redis 集群配置文件 bind 0.0.0.0 port 6379 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes requirepass ${REDIS_PASSWORD} masterauth ${REDIS_PASSWORD} EOF# 生成节点配置文件foriin{1..6};docat./config/redis-node-$i.confEOF # Redis 节点$i配置 bind 0.0.0.0 port 6379 cluster-enabled yes cluster-config-file /data/nodes.conf cluster-node-timeout 5000 appendonly yes appendfilename appendonly-node-$i.aof dbfilename dump-node-$i.rdb dir /data requirepass${REDIS_PASSWORD:-Redis123456}masterauth${REDIS_PASSWORD:-Redis123456}maxmemory 2gb maxmemory-policy allkeys-lru loglevel notice logfile /var/log/redis/redis.log protected-mode no EOFdonelog_success配置文件生成完成}# 启动 Redis 集群start_cluster(){log_info启动 Redis 集群...# 加载环境变量if[-f .env];thenlog_info加载环境变量...export$(grep-v^#.env|xargs)fi# 启动集群docker-compose up -d# 等待集群启动log_info等待集群启动...sleep10# 检查集群状态check_cluster_health log_successRedis 集群启动完成}# 检查集群健康状态check_cluster_health(){log_info检查集群健康状态...localretries10localwait_time5for((i1;iretries;i));dolog_info尝试$i/$retries检查集群状态...# 检查节点是否可访问ifdockerexecredis-cluster-node-1 redis-cli -a${REDIS_PASSWORD:-Redis123456}ping2/dev/null|grep-qPONG;then# 获取集群信息localcluster_info$(dockerexecredis-cluster-node-1 redis-cli -a${REDIS_PASSWORD:-Redis123456}cluster info2/dev/null)ifecho$cluster_info|grep-qcluster_state:ok;thenlog_success集群状态正常# 显示集群信息echoechoRedis 集群信息:echodockerexecredis-cluster-node-1 redis-cli -a${REDIS_PASSWORD:-Redis123456}cluster infoechoecho集群节点:dockerexecredis-cluster-node-1 redis-cli -a${REDIS_PASSWORD:-Redis123456}cluster nodesechoreturn0fifiif[$i-lt$retries];thenlog_info等待${wait_time}秒后重试...sleep$wait_timefidonelog_error集群健康检查失败return1}# 停止集群stop_cluster(){log_info停止 Redis 集群...docker-compose down log_successRedis 集群已停止}# 重启集群restart_cluster(){log_info重启 Redis 集群...stop_clustersleep5start_cluster}# 清理集群clean_cluster(){log_warn清理 Redis 集群数据...read-p确认要删除所有数据吗(y/n): -n1-rechoif[[$REPLY~ ^[Yy]$]];thendocker-compose down -vrm-rf ./data/* ./logs/* log_success集群数据已清理elselog_info取消清理操作fi}# 集群扩容scale_cluster(){log_info集群扩容...echo选择扩容方式:echo1) 增加主节点echo2) 增加从节点echo3) 退出read-p请选择 (1-3): choicecase$choicein1)add_master_node;;2)add_slave_node;;3)log_info退出扩容;;*)log_error无效选择;;esac}# 添加主节点add_master_node(){log_info添加主节点...# 获取下一个节点编号localnext_node$(($(ls-d ./data/node*2/dev/null|wc-l)1))# 创建数据目录mkdir-p ./data/node$next_nodemkdir-p ./logs/node$next_node# 生成节点配置cat./config/redis-node-$next_node.confEOF bind 0.0.0.0 port 6379 cluster-enabled yes cluster-config-file /data/nodes.conf cluster-node-timeout 5000 appendonly yes dir /data requirepass${REDIS_PASSWORD:-Redis123456}masterauth${REDIS_PASSWORD:-Redis123456}EOF# 更新 docker-compose.yml# 这里需要手动更新 docker-compose.yml 文件log_warn请手动更新 docker-compose.yml 文件添加新节点log_info然后运行: docker-compose up -d redis-node-$next_nodelog_info最后将新节点加入集群: docker exec redis-cluster-node-1 redis-cli --cluster add-node new_host:new_port existing_host:existing_port}# 备份集群backup_cluster(){log_info备份集群数据...localbackup_dir./backups/$(date%Y%m%d_%H%M%S)mkdir-p$backup_dir# 备份数据foriin{1..6};doifdockerps|grep-qredis-cluster-node-$i;thenlog_info备份节点$i数据...dockerexecredis-cluster-node-$iredis-cli -a${REDIS_PASSWORD:-Redis123456}savecp-r ./data/node$i$backup_dir/fidone# 备份配置cp-r ./config$backup_dir/cpdocker-compose.yml$backup_dir/cp.env$backup_dir/2/dev/null||true# 创建备份元数据cat$backup_dir/backup.infoEOF 备份时间:$(date)集群节点: 6 Redis 版本: 7.2 备份目录:$backup_dirEOF# 压缩备份tar-czf$backup_dir.tar.gz-C ./backups$(basename$backup_dir)log_success集群备份完成:$backup_dir.tar.gz}# 监控集群monitor_cluster(){log_info启动集群监控...echo选择监控方式:echo1) 实时监控echo2) 查看节点信息echo3) 查看内存使用echo4) 查看慢查询echo5) 返回read-p请选择 (1-5): choicecase$choicein1)dockerexec-it redis-cluster-node-1 redis-cli -a${REDIS_PASSWORD:-Redis123456}--stat;;2)dockerexecredis-cluster-node-1 redis-cli -a${REDIS_PASSWORD:-Redis123456}cluster nodes;;3)dockerexecredis-cluster-node-1 redis-cli -a${REDIS_PASSWORD:-Redis123456}info memory;;4)dockerexecredis-cluster-node-1 redis-cli -a${REDIS_PASSWORD:-Redis123456}slowlog get10;;5)return;;*)log_error无效选择;;esac}# 主菜单show_menu(){clearechoecho Redis Cluster 管理工具echoecho1) 启动集群echo2) 停止集群echo3) 重启集群echo4) 检查状态echo5) 集群扩容echo6) 备份集群echo7) 监控集群echo8) 清理集群echo9) 退出echo}# 主函数main(){# 检查依赖check_dependencies# 创建目录create_directories# 生成配置generate_configswhiletrue;doshow_menuread-p请选择操作 (1-9): choicecase$choicein1)start_cluster;;2)stop_cluster;;3)restart_cluster;;4)check_cluster_health;;5)scale_cluster;;6)backup_cluster;;7)monitor_cluster;;8)clean_cluster;;9)log_info退出管理工具exit0;;*)log_error无效选择请重新输入;;esacread-p按 Enter 键继续...done}# 执行主函数main$4.2 集群测试脚本 (test-cluster.sh)Spring Cloud全栈实战手撸企业级项目从入门到架构师#!/bin/bash# Redis Cluster 测试脚本set-e# 颜色定义RED\033[0;31mGREEN\033[0;32mYELLOW\033[1;33mBLUE\033[0;34mNC\033[0m# No Color# 日志函数log_info(){echo-e${BLUE}[INFO]${NC}$1;}log_success(){echo-e${GREEN}[SUCCESS]${NC}$1;}log_warn(){echo-e${YELLOW}[WARN]${NC}$1;}log_error(){echo-e${RED}[ERROR]${NC}$1;}# 加载环境变量if[-f .env];thenexport$(grep-v^#.env|xargs)fiREDIS_PASSWORD${REDIS_PASSWORD:-Redis123456}REDIS_HOST${REDIS_HOST:-localhost}PORTS(700170027003700470057006)# 测试连接test_connection(){log_info测试 Redis 集群连接...forportin${PORTS[]};doifredis-cli -h$REDIS_HOST-p$port-a$REDIS_PASSWORDping2/dev/null|grep-qPONG;thenlog_success节点$REDIS_HOST:$port连接成功elselog_error节点$REDIS_HOST:$port连接失败return1fidonereturn0}# 测试集群状态test_cluster_status(){log_info测试集群状态...localcluster_info$(redis-cli -h $REDIS_HOST -p7001-a$REDIS_PASSWORDcluster info2/dev/null)ifecho$cluster_info|grep-qcluster_state:ok;thenlog_success集群状态正常echo$cluster_inforeturn0elselog_error集群状态异常echo$cluster_inforeturn1fi}# 测试数据读写test_data_operations(){log_info测试数据读写操作...localtest_keytest:cluster:$(date%s)localtest_valuetest_value_$(date%s)# 写入数据ifredis-cli -h$REDIS_HOST-p7001-a$REDIS_PASSWORDset$test_key$test_value2/dev/null|grep-qOK;thenlog_success数据写入成功:$test_key$test_valueelselog_error数据写入失败return1fi# 读取数据localread_value$(redis-cli -h $REDIS_HOST -p7001-a$REDIS_PASSWORDget$test_key2/dev/null)if[$read_value$test_value];thenlog_success数据读取成功:$test_key$read_valueelselog_error数据读取失败return1fi# 删除数据ifredis-cli -h$REDIS_HOST-p7001-a$REDIS_PASSWORDdel$test_key2/dev/null|grep-q^1$;thenlog_success数据删除成功elselog_error数据删除失败return1fireturn0}# 测试集群重定向test_cluster_redirect(){log_info测试集群重定向...# 创建多个键确保它们分布在不同节点localkeys()foriin{1..100};dokeys(cluster:key:$i)donelocalsuccess_count0localfail_count0forkeyin${keys[]};do# 尝试在随机节点上设置值localrandom_port${PORTS[$RANDOM%${#PORTS[]}]}localresult$(redis-cli -h $REDIS_HOST -p $random_port -a$REDIS_PASSWORDset$keyvalue_$key21)ifecho$result|grep-qMOVED\|OK;then((success_count))else((fail_count))log_warn键$key在端口$random_port设置失败:$resultfidonelog_info重定向测试结果: 成功$success_count, 失败$fail_countif[$fail_count-eq0];thenlog_success集群重定向测试通过return0elselog_error集群重定向测试失败return1fi}# 测试故障转移test_failover(){log_info测试故障转移模拟主节点故障...# 获取当前主节点localmaster_nodes$(redis-cli -h $REDIS_HOST -p7001-a$REDIS_PASSWORDcluster nodes2/dev/null|grepmaster|head-3)localfirst_master$(echo$master_nodes|head-1|awk{print$2})if[-z$first_master];thenlog_error无法获取主节点信息return1filocalmaster_host$(echo$first_master|cut-d: -f1)localmaster_port$(echo$first_master|cut-d: -f2)log_info模拟主节点$master_host:$master_port故障...# 停止主节点容器localcontainer_name$(dockerps--format{{.Names}}|grep$master_port|head-1)if[-n$container_name];thenlog_info停止容器:$container_namedocker stop$container_name# 等待故障转移log_info等待故障转移 (30秒)...sleep30# 检查新的主节点localnew_master$(redis-cli -h $REDIS_HOST -p7002-a$REDIS_PASSWORDcluster nodes2/dev/null|grep$master_host:$master_port|grepslave)if[-n$new_master];thenlog_success故障转移成功: 原主节点$master_host:$master_port变为从节点elselog_error故障转移失败fi# 恢复节点log_info恢复节点...docker start$container_namesleep10elselog_error未找到对应的容器return1fireturn0}# 性能测试test_performance(){log_info运行性能测试...# 使用 redis-benchmark 测试log_info1. 测试 SET 操作...redis-benchmark -h$REDIS_HOST-p7001-a$REDIS_PASSWORD-tset-n10000-c50log_info2. 测试 GET 操作...redis-benchmark -h$REDIS_HOST-p7001-a$REDIS_PASSWORD-t get -n10000-c50log_info3. 测试流水线操作...redis-benchmark -h$REDIS_HOST-p7001-a$REDIS_PASSWORD-t ping,set,get -n10000-c50-P16log_success性能测试完成}# 运行所有测试run_all_tests(){log_info开始 Redis 集群完整测试...localtests_passed0localtests_failed0# 测试1: 连接测试iftest_connection;then((tests_passed))else((tests_failed))fi# 测试2: 集群状态测试iftest_cluster_status;then((tests_passed))else((tests_failed))fi# 测试3: 数据操作测试iftest_data_operations;then((tests_passed))else((tests_failed))fi# 测试4: 集群重定向测试iftest_cluster_redirect;then((tests_passed))else((tests_failed))fi# 测试5: 性能测试test_performanceechoecho测试结果汇总:echo通过:$tests_passedecho失败:$tests_failedechoif[$tests_failed-eq0];thenlog_success所有测试通过Redis 集群运行正常。return0elselog_error有$tests_failed个测试失败return1fi}# 主函数main(){echoecho Redis Cluster 测试工具echoecho1) 运行完整测试echo2) 测试连接echo3) 测试集群状态echo4) 测试数据操作echo5) 测试集群重定向echo6) 测试故障转移echo7) 性能测试echo8) 退出echoread-p请选择测试项目 (1-8): choicecase$choicein1)run_all_tests;;2)test_connection;;3)test_cluster_status;;4)test_data_operations;;5)test_cluster_redirect;;6)test_failover;;7)test_performance;;8)log_info退出测试工具exit0;;*)log_error无效选择exit1;;esac}# 执行主函数main$五、Kubernetes 部署方案Spring Cloud全栈实战手撸企业级项目从入门到架构师5.1 Redis Cluster Kubernetes 部署文件5.1.1 namespace.yamlapiVersion:v1kind:Namespacemetadata:name:redis-clusterlabels:name:redis-clustercomponent:databaseenvironment:production5.1.2 configmap.yamlapiVersion:v1kind:ConfigMapmetadata:name:redis-cluster-confignamespace:redis-clusterdata:redis.conf:|# Redis 集群配置 bind 0.0.0.0 port 6379 cluster-enabled yes cluster-config-file /data/nodes.conf cluster-node-timeout 5000 cluster-slave-validity-factor 10 cluster-migration-barrier 1 cluster-require-full-coverage yes appendonly yes appendfilename appendonly.aof appendfsync everysec auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb dir /data save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump.rdb maxmemory 2gb maxmemory-policy allkeys-lru maxmemory-samples 5 lazyfree-lazy-eviction no lazyfree-lazy-expire no lazyfree-lazy-server-del no replica-lazy-flush no lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events 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 hz 10 dynamic-hz yes aof-rewrite-incremental-fsync yes rdb-save-incremental-fsync yes5.1.3 secret.yamlapiVersion:v1kind:Secretmetadata:name:redis-cluster-secretnamespace:redis-clustertype:OpaquestringData:redis-password:Redis123456K8srequirepass:Redis123456K8smasterauth:Redis123456K8s5.1.4 service.yamlapiVersion:v1kind:Servicemetadata:name:redis-clusternamespace:redis-clusterlabels:app:redis-clustercomponent:databasespec:ports:-name:clientport:6379targetPort:6379-name:clusterport:16379targetPort:16379clusterIP:Noneselector:app:redis-cluster---apiVersion:v1kind:Servicemetadata:name:redis-cluster-headlessnamespace:redis-clusterlabels:app:redis-clustercomponent:databasespec:ports:-name:clientport:6379targetPort:6379-name:clusterport:16379targetPort:16379clusterIP:Noneselector:app:redis-cluster5.1.5 statefulset.yamlapiVersion:apps/v1kind:StatefulSetmetadata:name:redis-clusternamespace:redis-clusterlabels:app:redis-clustercomponent:databaseenvironment:productionspec:serviceName:redis-cluster-headlessreplicas:6selector:matchLabels:app:redis-clusterupdateStrategy:type:RollingUpdatepodManagementPolicy:OrderedReadytemplate:metadata:labels:app:redis-clustercomponent:databaseenvironment:productionannotations:prometheus.io/scrape:trueprometheus.io/port:9121prometheus.io/path:/metricsspec:affinity:podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:-weight:100podAffinityTerm:labelSelector:matchExpressions:-key:appoperator:Invalues:-redis-clustertopologyKey:kubernetes.io/hostnamecontainers:-name:redisimage:redis:7.2-alpineimagePullPolicy:IfNotPresentcommand:-redis-server-/etc/redis/redis.conf---requirepass-$(REDIS_PASSWORD)---masterauth-$(REDIS_PASSWORD)ports:-name:clientcontainerPort:6379-name:clustercontainerPort:16379env:-name:REDIS_PASSWORDvalueFrom:secretKeyRef:name:redis-cluster-secretkey:redis-password-name:POD_IPvalueFrom:fieldRef:fieldPath:status.podIPresources:requests:memory:2Gicpu:1000mlimits:memory:4Gicpu:2000mvolumeMounts:-name:redis-configmountPath:/etc/redis-name:redis-datamountPath:/data-name:redis-tmpmountPath:/tmplivenessProbe:exec:command:-redis-cli--a-$(REDIS_PASSWORD)-pinginitialDelaySeconds:30periodSeconds:10timeoutSeconds:5failureThreshold:3readinessProbe:exec:command:-redis-cli--a-$(REDIS_PASSWORD)-pinginitialDelaySeconds:5periodSeconds:5timeoutSeconds:3failureThreshold:3startupProbe:exec:command:-redis-cli--a-$(REDIS_PASSWORD)-pinginitialDelaySeconds:0periodSeconds:5timeoutSeconds:3failureThreshold:30securityContext:privileged:falsereadOnlyRootFilesystem:trueallowPrivilegeEscalation:falsecapabilities:drop:-ALLvolumes:-name:redis-configconfigMap:name:redis-cluster-config-name:redis-tmpemptyDir:{}volumeClaimTemplates:-metadata:name:redis-dataspec:accessModes:-ReadWriteOncestorageClassName:standardresources:requests:storage:20Gi5.1.6 job-init.yamlapiVersion:batch/v1kind:Jobmetadata:name:redis-cluster-initnamespace:redis-clusterspec:template:spec:containers:-name:redis-cluster-initimage:redis:7.2-alpinecommand:-/bin/sh--c-|echo 等待 Redis 节点启动... sleep 30echo 获取 Pod IP 地址... POD_IPS() for i in{0..5}; do IP$(getent hosts redis-cluster-$i.redis-cluster-headless.redis-cluster.svc.cluster.local|awk {print $1}) if[-n $IP]; then POD_IPS($IP:6379)echo 节点 $i IP:$IP fi done echo 创建 Redis 集群... echo yes|redis-cli--cluster create \ ${POD_IPS[]}\--cluster-replicas 1 \-a $(REDIS_PASSWORD) echo 验证集群状态... redis-cli--cluster check ${POD_IPS[0]}-a $(REDIS_PASSWORD) echo 集群信息: redis-cli-h ${POD_IPS[0]%:*}-p 6379-a $(REDIS_PASSWORD) cluster info echo 节点信息: redis-cli-h ${POD_IPS[0]%:*}-p 6379-a $(REDIS_PASSWORD) cluster nodes echo Redis 集群初始化完成env:-name:REDIS_PASSWORDvalueFrom:secretKeyRef:name:redis-cluster-secretkey:redis-passwordrestartPolicy:OnFailurebackoffLimit:3activeDeadlineSeconds:300六、监控和告警配置Spring Cloud全栈实战手撸企业级项目从入门到架构师6.1 Prometheus 监控配置# prometheus-config.ymlglobal:scrape_interval:15sevaluation_interval:15sscrape_configs:-job_name:redis-clusterstatic_configs:-targets:-redis-cluster-exporter:9121metrics_path:/metricsrelabel_configs:-source_labels:[__address__]target_label:instanceregex:(.*):.*replacement:${1}-job_name:redis-cluster-nodeskubernetes_sd_configs:-role:podnamespaces:names:-redis-clusterrelabel_configs:-source_labels:[__meta_kubernetes_pod_label_app]regex:redis-clusteraction:keep-source_labels:[__meta_kubernetes_pod_container_port_number]regex:6379action:keep-source_labels:[__meta_kubernetes_pod_ip]target_label:instancereplacement:${1}:6379-source_labels:[__meta_kubernetes_pod_name]target_label:pod-source_labels:[__meta_kubernetes_namespace]target_label:namespace6.2 Grafana 仪表板{dashboard:{id:null,title:Redis Cluster Monitoring,tags:[redis,cluster,database],timezone:browser,panels:[{id:1,title:Cluster Health,type:stat,targets:[{expr:redis_up,legendFormat:{{instance}}}],fieldConfig:{defaults:{thresholds:{steps:[{color:red,value:null},{color:green,value:1}]}}}},{id:2,title:Memory Usage,type:graph,targets:[{expr:redis_memory_used_bytes / 1024 / 1024,legendFormat:Used Memory (MB) - {{instance}}},{expr:redis_memory_max_bytes / 1024 / 1024,legendFormat:Max Memory (MB) - {{instance}}}]},{id:3,title:Commands per Second,type:graph,targets:[{expr:rate(redis_commands_processed_total[5m]),legendFormat:Commands/s - {{instance}}}]},{id:4,title:Connections,type:graph,targets:[{expr:redis_connected_clients,legendFormat:Connected Clients - {{instance}}}]},{id:5,title:Keyspace,type:graph,targets:[{expr:redis_db_keys,legendFormat:Keys - db{{db}}}]},{id:6,title:CPU Usage,type:graph,targets:[{expr:rate(redis_cpu_sys_seconds_total[5m]) * 100,legendFormat:System CPU % - {{instance}}},{expr:rate(redis_cpu_user_seconds_total[5m]) * 100,legendFormat:User CPU % - {{instance}}}]}],time:{from:now-6h,to:now}}}七、使用说明7.1 快速开始# 1. 克隆仓库gitclone https://github.com/your-repo/redis-cluster-docker.gitcdredis-cluster-docker# 2. 配置环境变量cp.env.example .env# 编辑 .env 文件设置密码和其他配置# 3. 启动集群chmodx start-cluster.sh ./start-cluster.sh# 4. 测试集群chmodx test-cluster.sh ./test-cluster.sh# 5. 访问管理界面# Redis Commander: http://localhost:8081# 用户名: admin# 密码: 你的REDIS_PASSWORD7.2 常用命令# 查看集群状态dockerexecredis-cluster-node-1 redis-cli -a你的密码cluster info# 查看集群节点dockerexecredis-cluster-node-1 redis-cli -a你的密码cluster nodes# 查看集群槽分配dockerexecredis-cluster-node-1 redis-cli -a你的密码cluster slots# 重启集群docker-compose restart# 查看日志docker-compose logs -f redis-node-1# 进入容器dockerexec-it redis-cluster-node-1sh# 备份集群docker-composeexecredis-cluster-node-1 redis-cli -a你的密码save7.3 故障处理# 1. 节点故障恢复# 如果某个节点故障重启该节点即可docker-compose restart redis-node-1# 2. 集群重新初始化# 如果集群配置损坏可以重新初始化docker-compose down -v ./start-cluster.sh# 3. 数据恢复# 从备份恢复数据tar-xzf backups/20240101_120000.tar.gzcp-r backups/20240101_120000/data/node1/* ./data/node1/# 重启集群# 4. 性能调优# 调整内存限制# 在 .env 文件中设置 REDIS_MAXMEMORY4gb# 重启集群八、安全和优化建议Spring Cloud全栈实战手撸企业级项目从入门到架构师8.1 安全配置# 安全配置最佳实践security:# 1. 强密码策略requirepass:复杂密码包含大小写数字特殊字符# 2. 禁用危险命令rename-command:FLUSHDB:FLUSHALL:CONFIG:KEYS:SHUTDOWN:# 3. 网络限制bind:0.0.0.0# 生产环境应绑定特定IPprotected-mode:yes# 4. SSL/TLS 加密tls-port:6380tls-cert-file:/path/to/redis.crttls-key-file:/path/to/redis.keytls-ca-cert-file:/path/to/ca.crt# 5. 客户端限制maxclients:10000timeout:300# 6. 慢查询日志slowlog-log-slower-than:10000slowlog-max-len:1288.2 性能优化# 性能优化配置performance:# 1. 内存优化maxmemory:4gbmaxmemory-policy:allkeys-lrumaxmemory-samples:5# 2. 持久化优化appendonly:yesappendfsync:everysecauto-aof-rewrite-percentage:100auto-aof-rewrite-min-size:64mb# 3. 网络优化tcp-keepalive:300tcp-backlog:511# 4. 集群优化cluster-node-timeout:5000cluster-replica-validity-factor:10# 5. 内核参数优化# 在宿主机上设置# echo never /sys/kernel/mm/transparent_hugepage/enabled# sysctl -w net.core.somaxconn65535# sysctl -w vm.overcommit_memory1这个 Redis 集群部署方案提供了完整的生产级解决方案包含 Docker Compose 部署、Kubernetes 部署、监控告警、备份恢复等功能可以直接用于生产环境。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

东莞外贸建站模板中国电子信息网

HTML页面嵌入大模型聊天窗口:前端集成最佳实践 在智能客服、企业知识库和个性化助手日益普及的今天,如何让网页用户像使用微信一样自然地与AI对话,已成为前端开发的新刚需。但现实往往骨感:API延迟高、部署流程复杂、中英文支持不…

张小明 2026/1/12 4:35:15 网站建设

网站建设系统服务机构门户网站怎么做才好看

——软件测试行业的法律盲区与合规路径 一、导言:技术革新带来的产权迷雾 随着ChatGPT、Codex等大模型深度融入测试工作流,AI生成的测试用例占比在2025年已达行业总量的37%(Gartner数据)。但当测试团队将"输入需求描述→获…

张小明 2026/1/11 15:17:22 网站建设

网站开发设备费用计入什么科目金融证券网站模板

5个核心策略:实现iOS应用完美跨设备兼容的完整方案 【免费下载链接】iOSProject iOS project of collected some demos for iOS App, use Objective-C 项目地址: https://gitcode.com/gh_mirrors/io/iOSProject 在当今移动生态中,iOS多设备兼容性…

张小明 2026/1/11 21:15:19 网站建设

网站开发实用吗网站维护源码

💡实话实说:CSDN上做毕设辅导的都是专业技术服务,大家都要生活,这个很正常。我和其他人不同的是,我有自己的项目库存,不需要找别人拿货再加价,所以能给到超低价格。摘要 随着旅游业的快速发展&a…

张小明 2026/1/12 8:38:27 网站建设

做地方门户网站怎样佛山网站建设多少钱

整体定位了解一个开源项目,最应该了解的就是其定位,或者说它要解决的问题域。夜莺的定位就是四个字:告警引擎。夜莺对接多种数据源(比如 Prometheus、VictoriaMetrics、MySQL、ClickHouse、Postgres、ElasticSearch)&a…

张小明 2026/1/12 22:59:54 网站建设

企业如何建设免费网站flash 3d 网站源码

5秒搞定B站缓存视频转换:从m4s到MP4的终极解决方案 【免费下载链接】m4s-converter 将bilibili缓存的m4s转成mp4(读PC端缓存目录) 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾为B站缓存视频无法在其他设备播放而烦恼?那…

张小明 2026/1/13 1:52:59 网站建设