ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

一条 docker run 搞定 Redis:别再编译了,集装箱才是真香

一条 docker run 搞定 Redis:别再编译了,集装箱才是真香 文章目录容器部署 redisdocker 容器方式安装容器部署基础容器部署 redisdocker 容器方式安装# 启动Redis容器映射6379端口数据挂载到/data/redis目录docker run 启动容器--name redis指定容器名为redis-p 6379:6379把宿主6379端口映射到容器6379-d 后台运行-v /data/redis:/data把宿主目录挂载到容器/data末尾redis为镜像名[rootlocalhost ~]# docker run --name redis -p 6379:6379 -d -v /data/redis:/data redis# 进入容器查看Redis服务信息docker exec redis redis-cli info serverdocker exec进入运行中的容器redis执行命令redis-cli连接容器内Redisinfo server查看服务信息[rootlocalhost ~]# docker exec redis redis-cli info server# Serverredis_version:8.6.0# 容器内Redis版本号为8.6.0redis_git_sha1:00000000 redis_git_dirty:1 redis_build_id:a7d515010e105f80 redis_mode:standalone# 运行模式为单机(standalone)os:Linux4.18.0-553.6.1.el8.x86_64 x86_64 arch_bits:64 monotonic_clock:POSIX clock_gettime multiplexing_api:epoll atomicvar_api:c11-builtin gcc_version:14.2.0 process_id:1# Redis进程号为1容器内的1号进程process_supervised:no run_id:a2ee2aa49069ff42d23ca8d46f82d3ac61f1d385 tcp_port:6379# Redis监听端口为6379server_time_usec:1770950461439156 uptime_in_seconds:109# 容器内Redis已运行109秒uptime_in_days:0 hz:10 configured_hz:10 lru_clock:9342781 executable:/data/redis-server config_file: io_threads_active:0 listener0:nametcp,bind*,bind-::*,port6379默认 Redis 容器可以支持远程连接。# 在容器中设置键值docker exec redis redis-cli set name ma进入容器redis执行redis-cliset写入键name值为ma[rootlocalhost ~]# docker exec redis redis-cli set name maOK# 写入成功# 再写入键age值为18[rootlocalhost ~]# docker exec redis redis-cli set age 18OK# 写入成功# 获取键值docker exec redis redis-cli get name在容器内读取键name的值[rootlocalhost ~]# docker exec redis redis-cli get namema# 键name的值# 读取键age的值[rootlocalhost ~]# docker exec redis redis-cli get age18# 键age的值# 手动保存数据到磁盘docker exec redis redis-cli save在容器内执行save将数据同步持久化为RDB快照[rootlocalhost ~]# docker exec redis redis-cli saveOK# 保存成功# 查看挂载目录下的持久化文件ls /data/redis/ -1查看宿主挂载目录-1表示每行列出一个文件[rootlocalhost ~]# ls /data/redis/ -1dump.rdb# RDB持久化快照文件容器部署基础# 编辑docker-compose编排文件定义6节点Redis集群3主3从自定义bridge网段[rootdocker ~]# vim docker-compose.ymlversion:2.27# compose文件版本networks:redis-cluster-net:# 自定义集群网络名称driver:bridge# 网络驱动类型bridge桥接ipam:config:-subnet:192.168.109.0/24# 自定义网段services:# Master1 192.168.109.21redis-21:image:redis:latest# 使用redis最新镜像container_name:redis-21# 容器名称restart:always# 容器退出总是自动重启ports:-6379:6379# redis业务端口映射-16379:16379# redis集群总线端口映射networks:redis-cluster-net:ipv4_address:192.168.109.21# 指定容器固定IPvolumes:-./node21/data:/data# 数据持久化挂载目录command:redis-server # 启动redis服务 --bind 0.0.0.0 # 允许所有地址访问 --port 6379 # redis服务端口 --cluster-enabled yes # 开启集群模式 --cluster-config-file nodes.conf # 集群节点配置文件 --cluster-node-timeout 5000 # 节点超时时间5000ms --cluster-announce-ip 192.168.109.21 # 集群对外宣告IP --cluster-announce-port 6379 # 集群对外宣告业务端口 --cluster-announce-bus-port 16379 # 集群对外宣告总线端口 --appendonly yes # 开启AOF持久化 --protected-mode no # 关闭保护模式# Master2 192.168.109.22redis-22:image:redis:latest# 使用redis最新镜像container_name:redis-22# 容器名称restart:always# 容器退出总是自动重启ports:-6380:6379# redis业务端口映射-16380:16379# redis集群总线端口映射networks:redis-cluster-net:ipv4_address:192.168.109.22# 指定容器固定IPvolumes:-./node22/data:/data# 数据持久化挂载目录command:redis-server # 启动redis服务 --bind 0.0.0.0 # 允许所有地址访问 --port 6379 # redis服务端口 --cluster-enabled yes # 开启集群模式 --cluster-config-file nodes.conf # 集群节点配置文件 --cluster-node-timeout 5000 # 节点超时时间5000ms --cluster-announce-ip 192.168.109.22 # 集群对外宣告IP --cluster-announce-port 6379 # 集群对外宣告业务端口 --cluster-announce-bus-port 16379 # 集群对外宣告总线端口 --appendonly yes # 开启AOF持久化 --protected-mode no # 关闭保护模式# Master3 192.168.109.23redis-23:image:redis:latest# 使用redis最新镜像container_name:redis-23# 容器名称restart:always# 容器退出总是自动重启ports:-6381:6379# redis业务端口映射-16381:16379# redis集群总线端口映射networks:redis-cluster-net:ipv4_address:192.168.109.23# 指定容器固定IPvolumes:-./node23/data:/data# 数据持久化挂载目录command:redis-server # 启动redis服务 --bind 0.0.0.0 # 允许所有地址访问 --port 6379 # redis服务端口 --cluster-enabled yes # 开启集群模式 --cluster-config-file nodes.conf # 集群节点配置文件 --cluster-node-timeout 5000 # 节点超时时间5000ms --cluster-announce-ip 192.168.109.23 # 集群对外宣告IP --cluster-announce-port 6379 # 集群对外宣告业务端口 --cluster-announce-bus-port 16379 # 集群对外宣告总线端口 --appendonly yes # 开启AOF持久化 --protected-mode no # 关闭保护模式# Slave1 192.168.109.25 主192.168.109.21redis-25:image:redis:latest# 使用redis最新镜像container_name:redis-25# 容器名称restart:always# 容器退出总是自动重启ports:-6382:6379# redis业务端口映射-16382:16379# redis集群总线端口映射networks:redis-cluster-net:ipv4_address:192.168.109.25# 指定容器固定IPvolumes:-./node25/data:/data# 数据持久化挂载目录command:redis-server # 启动redis服务 --bind 0.0.0.0 # 允许所有地址访问 --port 6379 # redis服务端口 --cluster-enabled yes # 开启集群模式 --cluster-config-file nodes.conf # 集群节点配置文件 --cluster-node-timeout 5000 # 节点超时时间5000ms --cluster-announce-ip 192.168.109.25 # 集群对外宣告IP --cluster-announce-port 6379 # 集群对外宣告业务端口 --cluster-announce-bus-port 16379 # 集群对外宣告总线端口 --appendonly yes # 开启AOF持久化 --protected-mode no # 关闭保护模式# Slave2 192.168.109.26 主192.168.109.22redis-26:image:redis:latest# 使用redis最新镜像container_name:redis-26# 容器名称restart:always# 容器退出总是自动重启ports:-6383:6379# redis业务端口映射-16383:16379# redis集群总线端口映射networks:redis-cluster-net:ipv4_address:192.168.109.26# 指定容器固定IPvolumes:-./node26/data:/data# 数据持久化挂载目录command:redis-server # 启动redis服务 --bind 0.0.0.0 # 允许所有地址访问 --port 6379 # redis服务端口 --cluster-enabled yes # 开启集群模式 --cluster-config-file nodes.conf # 集群节点配置文件 --cluster-node-timeout 5000 # 节点超时时间5000ms --cluster-announce-ip 192.168.109.26 # 集群对外宣告IP --cluster-announce-port 6379 # 集群对外宣告业务端口 --cluster-announce-bus-port 16379 # 集群对外宣告总线端口 --appendonly yes # 开启AOF持久化 --protected-mode no # 关闭保护模式# Slave3 192.168.109.24 主192.168.109.23redis-24:image:redis:latest# 使用redis最新镜像container_name:redis-24# 容器名称restart:always# 容器退出总是自动重启ports:-6384:6379# redis业务端口映射-16384:16379# redis集群总线端口映射networks:redis-cluster-net:ipv4_address:192.168.109.24# 指定容器固定IPvolumes:-./node24/data:/data# 数据持久化挂载目录command:redis-server # 启动redis服务 --bind 0.0.0.0 # 允许所有地址访问 --port 6379 # redis服务端口 --cluster-enabled yes # 开启集群模式 --cluster-config-file nodes.conf # 集群节点配置文件 --cluster-node-timeout 5000 # 节点超时时间5000ms --cluster-announce-ip 192.168.109.24 # 集群对外宣告IP --cluster-announce-port 6379 # 集群对外宣告业务端口 --cluster-announce-bus-port 16379 # 集群对外宣告总线端口 --appendonly yes # 开启AOF持久化 --protected-mode no # 关闭保护模式# 后台启动docker compose容器创建并启动6个redis节点[rootdocker ~]# docker compose up -d# 进入redis容器执行集群创建--cluster-replicas 1 代表每个主节点1个从节点[rootdocker ~]# docker exec -it redis-21 redis-cli --cluster create \192.168.109.21:6379\192.168.109.22:6379\192.168.109.23:6379\192.168.109.24:6379\192.168.109.25:6379\192.168.109.26:6379\--cluster-replicas1Performinghashslots allocation on6nodes...# 对6个节点分配哈希槽Master[0]-Slots0-5460# master0分配槽位0~5460Master[1]-Slots5461-10922# master1分配槽位5461~10922Master[2]-Slots10923-16383# master2分配槽位10923~16383Adding replica192.168.109.25:6379 to192.168.109.21:6379# 给21主分配从25Adding replica192.168.109.26:6379 to192.168.109.22:6379# 给22主分配从26Adding replica192.168.109.24:6379 to192.168.109.23:6379# 给23主分配从24M: a3ce222784b489291224a2e9bd7f7119ceab88a2192.168.109.21:6379 slots:[0-5460](5461slots)master# 21为主节点持有0-5460槽M: 9e21f0ff2cf173f64018e40f981d1226cc941ece192.168.109.22:6379 slots:[5461-10922](5462slots)master# 22为主节点持有5461-10922槽M: 7fbeeae0072a00c5125db1de7b264d63464740a9192.168.109.23:6379 slots:[10923-16383](5461slots)master# 23为主节点持有10923-16383槽S: 3a4df342f4b660cbc7cc1dcd23ccce82a0000004192.168.109.24:6379 replicates 7fbeeae0072a00c5125db1de7b264d63464740a9# 24是23的从节点S: bac22197690ef5d24dedf7c348bbdf1c04410523192.168.109.25:6379 replicates a3ce222784b489291224a2e9bd7f7119ceab88a2# 25是21的从节点S: 7e7b6eb95bdc497ab018099ab9680a8f811da39a192.168.109.26:6379 replicates 9e21f0ff2cf173f64018e40f981d1226cc941ece# 26是22的从节点Can Isetthe above configuration?(typeyesto accept):yes# 输入yes确认集群配置Nodes configuration updated# 更新节点配置Assign a different config epoch to eachnode# 为每个节点分配配置纪元Sending CLUSTER MEET messages tojointhe cluster# 发送meet消息节点互相握手Waitingforthe cluster tojoin.Performing Cluster Check(usingnode192.168.109.21:6379)# 使用21节点校验集群M: a3ce222784b489291224a2e9bd7f7119ceab88a2192.168.109.21:6379 slots:[0-5460](5461slots)master1additional replica(s)M: 9e21f0ff2cf173f64018e40f981d1226cc941ece192.168.109.22:6379 slots:[5461-10922](5462slots)master1additional replica(s)M: 7fbeeae0072a00c5125db1de7b264d63464740a9192.168.109.23:6379 slots:[10923-16383](5461slots)master1additional replica(s)S: 7e7b6eb95bdc497ab018099ab9680a8f811da39a192.168.109.26:6379 slots:(0slots)slave replicates 9e21f0ff2cf173f64018e40f981d1226cc941ece S: 3a4df342f4b660cbc7cc1dcd23ccce82a0000004192.168.109.24:6379 slots:(0slots)slave replicates 7fbeeae0072a00c5125db1de7b264d63464740a9 S: bac22197690ef5d24dedf7c348bbdf1c04410523192.168.109.25:6379 slots:(0slots)slave replicates a3ce222784b489291224a2e9bd7f7119ceab88a2[OK]All nodes agree about slots configuration.# 所有节点槽位配置一致Checkforopenslots...# 检查未分配的槽位Check slots coverage...# 校验槽位完整覆盖[OK]All16384slots covered.# 全部16384个哈希槽分配完成集群就绪验证# 进入redis-21容器的redis-cli客户端连接集群节点[rootdocker ~]# docker exec -it redis-21 redis-cli127.0.0.1:6379cluster info cluster_state:ok# 集群状态正常okcluster_slots_assigned:16384# 已分配哈希槽总数cluster_slots_ok:16384# 正常可用槽位全部16384cluster_slots_pfail:0# 疑似故障槽数量cluster_slots_fail:0# 确认故障槽数量cluster_known_nodes:6# 集群识别总节点数6个cluster_size:3# 集群主节点数量3cluster_current_epoch:6# 集群当前配置纪元cluster_my_epoch:1# 当前节点配置纪元cluster_stats_messages_ping_sent:182# 发送ping消息数量cluster_stats_messages_pong_sent:189# 发送pong消息数量cluster_stats_messages_sent:371# 发送集群消息总数cluster_stats_messages_ping_received:184# 收到ping消息数量cluster_stats_messages_pong_received:185# 收到pong消息数量cluster_stats_messages_meet_received:5# 收到meet握手消息数量cluster_stats_messages_received:374# 接收集群消息总数total_cluster_links_buffer_limit_exceeded:0 cluster_slot_migration_active_tasks:0 cluster_slot_migration_active_trim_running:0 cluster_slot_migration_active_trim_current_job_keys:0 cluster_slot_migration_active_trim_current_job_trimmed:0 cluster_slot_migration_stats_active_trim_started:0 cluster_slot_migration_stats_active_trim_completed:0 cluster_slot_migration_stats_active_trim_cancelled:0127.0.0.1:6379cluster nodes 9e21f0ff2cf173f64018e40f981d1226cc941ece192.168.109.22:637916379 master -017915371589612connected5461-10922# redis22主节点槽5461-109227fbeeae0072a00c5125db1de7b264d63464740a9192.168.109.23:637916379 master -017915371580003connected10923-16383# redis23主节点槽10923-163837e7b6eb95bdc497ab018099ab9680a8f811da39a192.168.109.26:637916379 slave 9e21f0ff2cf173f64018e40f981d1226cc941ece017915371590002connected# redis2622的从节点a3ce222784b489291224a2e9bd7f7119ceab88a2192.168.109.21:637916379 myself,master -001connected0-5460# 当前节点redis21主节点槽0-54603a4df342f4b660cbc7cc1dcd23ccce82a0000004192.168.109.24:637916379 slave 7fbeeae0072a00c5125db1de7b264d63464740a9017915371595663connected# redis2423的从节点bac22197690ef5d24dedf7c348bbdf1c04410523192.168.109.25:637916379 slave a3ce222784b489291224a2e9bd7f7119ceab88a2017915371599701connected# redis2521的从节点127.0.0.1:6379#关闭redis-22测试模拟主节点故障验证集群自动故障转移[rootdocker ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 259842ca88ac redis:latestdocker-entrypoint.s…17minutes ago Up17minutes0.0.0.0:6382-6379/tcp, :::6382-6379/tcp,0.0.0.0:16382-16379/tcp, :::16382-16379/tcp redis-25 b9d2dd1c92fc redis:latestdocker-entrypoint.s…17minutes ago Up17minutes0.0.0.0:6384-6379/tcp, :::6384-6379/tcp,0.0.0.0:16384-16379/tcp, :::16384-16379/tcp redis-24 d7dab0f3763e redis:latestdocker-entrypoint.s…17minutes ago Up17minutes0.0.0.0:6381-6379/tcp, :::6381-6379/tcp,0.0.0.0:16381-16379/tcp, :::16381-16379/tcp redis-23 ecd46faaa291 redis:latestdocker-entrypoint.s…17minutes ago Up17minutes0.0.0.0:6380-6379/tcp, :::6380-6379/tcp,0.0.0.0:16380-16379/tcp, :::16380-16379/tcp redis-22 c79770bcdfd5 redis:latestdocker-entrypoint.s…17minutes ago Up17minutes0.0.0.0:6383-6379/tcp, :::6383-6379/tcp,0.0.0.0:16383-16379/tcp, :::16383-16379/tcp redis-26 c41129c6226f redis:latestdocker-entrypoint.s…17minutes ago Up17minutes0.0.0.0:6379-6379/tcp, :::6379-6379/tcp,0.0.0.0:16379-16379/tcp, :::16379-16379/tcp redis-21# 停止redis-22容器模拟主节点宕机故障[rootdocker ~]# docker stop redis-22redis-22# 查看全部容器包括停止状态确认redis22已经退出[rootdocker ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 259842ca88ac redis:latestdocker-entrypoint.s…18minutes ago Up18minutes0.0.0.0:6382-6379/tcp, :::6382-6379/tcp,0.0.0.0:16382-16379/tcp, :::16382-16379/tcp redis-25 b9d2dd1c92fc redis:latestdocker-entrypoint.s…18minutes ago Up18minutes0.0.0.0:6384-6379/tcp, :::6384-6379/tcp,0.0.0.0:16384-16379/tcp, :::16384-16379/tcp redis-24 d7dab0f3763e redis:latestdocker-entrypoint.s…18minutes ago Up18minutes0.0.0.0:6381-6379/tcp, :::6381-6379/tcp,0.0.0.0:16381-16379/tcp, :::16381-16379/tcp redis-23 ecd46faaa291 redis:latestdocker-entrypoint.s…18minutes ago Exited(0)11seconds ago redis-22 c79770bcdfd5 redis:latestdocker-entrypoint.s…18minutes ago Up18minutes0.0.0.0:6383-6379/tcp, :::6383-6379/tcp,0.0.0.0:16383-16379/tcp, :::16383-16379/tcp redis-26 c41129c6226f redis:latestdocker-entrypoint.s…18minutes ago Up18minutes0.0.0.0:6379-6379/tcp, :::6379-6379/tcp,0.0.0.0:16379-16379/tcp, :::16379-16379/tcp redis-21# 再次查看集群节点信息观察故障转移结果redis26升级为主节点127.0.0.1:6379cluster nodes 9e21f0ff2cf173f64018e40f981d1226cc941ece192.168.109.22:637916379 master,fail -179153763818617915376370002connected# redis22标记fail故障7fbeeae0072a00c5125db1de7b264d63464740a9192.168.109.23:637916379 master -017915377450003connected10923-16383# redis23主节点正常7e7b6eb95bdc497ab018099ab9680a8f811da39a192.168.109.26:637916379 master -017915377453927connected5461-10922# 原从节点redis26自动升级为主接管5461-10922槽a3ce222784b489291224a2e9bd7f7119ceab88a2192.168.109.21:637916379 myself,master -001connected0-5460# 当前节点redis21主节点正常3a4df342f4b660cbc7cc1dcd23ccce82a0000004192.168.109.24:637916379 slave 7fbeeae0072a00c5125db1de7b264d63464740a9017915377464033connected# redis24为23从节点bac22197690ef5d24dedf7c348bbdf1c04410523192.168.109.25:637916379 slave a3ce222784b489291224a2e9bd7f7119ceab88a2017915377458971connected# redis25为21从节点
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表