# docker-compose-redis-cluster **Repository Path**: jiekewang/docker-compose-redis-cluster ## Basic Information - **Project Name**: docker-compose-redis-cluster - **Description**: 基于docker compose部署redis集群,三主三从 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2023-11-28 - **Last Updated**: 2023-12-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ```sh # 启动docker服务 https://docs.docker.com systemctl start docker # 查看docker服务状态 systemctl status docker # 修改系统配置,避免重启后丢失修改 vi /etc/sysctl.conf vm.overcommit_memory = 1 # 配置系统立即生效(临时) sysctl vm.overcommit_memory=1 # 修改redisinsight目录的所有者,避免启动服务时没有权限 chown -R 1001 redisinsight # 后台启动服务 docker-compose up -d # 创建集群(六节点,一个集群,三个分片,没分片一个副本) docker exec -it redis-1 redis-cli -p 7001 -a mypassword --cluster create redis1:6379 redis2:6379 redis3:6379 redis4:6379 redis5:6379 redis6:6379 --cluster-replicas 1 --cluster-yes # 使用集群模式连接redis集群 docker exec -it redis-1 redis-cli -c -h redis-1 -p 6379 -a mypassword # 查看集群详情 cluster nodes # 查看docker compose项目日志 docker-compose logs -f -t --tail=20 ``` **Redis配置文件说明** ```nginx port 6379 # 设置监听端口 bind 0.0.0.0 # 设置监听地址 protected-mode no # 关闭保护模式 # daemonize yes # 后台运行,容器中必须前台运行 cluster-enabled yes # 开启集群模式 cluster-config-file nodes.conf # 集群配置文件名称 cluster-node-timeout 5000 # 集群节点失联判定为故障的超时时间 appendonly yes # 开启AOF aof-use-rdb-preamble yes # 开启混合持久化模式 appendfsync everysec # AOF每秒持久化一次 appendfilename "appendonly-cluster.aof" # AOF文件名称 auto-aof-rewrite-min-size 64mb # AOF重写最小大小 auto-aof-rewrite-percentage 100 # AOF重写的文件大小变更比例 requirepass "mypassword" # 对外服务提供的验证密码 masterauth "mypassword" # 节点间验证的密码 databases 1 # 指定逻辑数据库的多少(集群模式只能有一个逻辑库,还原的时候,这个值需要与备份的库保持一致,否则无法还原) slowlog-log-slower-than 1000 # 执行时间超过该阈值的命令,即为慢查询 slowlog-max-len 1024 # 日志最多保存的条数,采取先进先出的淘汰策略 ``` **Nginx配置文件说明** ```nginx user nobody; # Nginx服务程序默认以nobody身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限 worker_processes auto; # 工作进程数量,可配置成服务器内核数 * 2,这里配置自动;auto只与当前cpu物理核心数一致,通常用于低配服务器,一般不建议超过8; worker_cpu_affinity 00000001 00000010 00000100 00001000; # 设置nginx工作线程的cpu亲和力,减少上下文切换,一般上限为8个,再增加性能不升反降 worker_priority 0; # 指定 worker 子进程的 nice 值,以调整运行 Nginx 的优先级,通常设定为负值,以优先调用 Nginx;120-10=110,110就是最终的优先级;Linux 默认进程的优先级值是120,值越小越优先; nice 值范围为 -20 到 +19 。应用的默认优先级值是120加上 nice 值等于它最终的值,这个值越小,优先级越高。 worker_rlimit_nofile 1024; # 指定worker子进程可以打开的最大文件句柄数,可以理解成每个worker子进程的最大连接数量。 # daemon off; # 指定 Nginx 的运行方式,前台还是后台,前台用于调试,后台用于生产;默认是on,后台运行模式;容器中需要使用前台模式; events { use epoll; # 使用epoll的I/O模型(如果你不知道Nginx该使用哪种轮询方法,会自动选择一个最适合你操作系统的) worker_connections 1024; # 每个子进程的最大连接数为1024 accept_mutex on; # 是否打开负载均衡互斥锁,默认是off关闭的,这里推荐打开;设置网路连接序列化,防止惊群现象发生,默认为on; multi_accept on; # 设置一个进程是否同时接受多个网络连接,默认为off } stream { # 定义nginx四层工作模式(传输层,物链网传会表应) upstream redis_cluster { # 配置上游组,并设置别名 server redis1:6379; # 配置上游的所有服务节点,再次可以配置lb策略(例如:ip_hash、weight),失败策略,重试策略,上线、下线、备用; server redis2:6379; server redis3:6379; server redis4:6379; server redis5:6379; server redis6:6379; } server { # 定义服务 listen 6379; # 定义服务监听端口 proxy_pass redis_cluster; # 定义代理的上游目标 proxy_socket_keepalive on; # 与上游建立连接'成功'后,对tcp连接的'健康探活' proxy_timeout 3s; # https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_timeout proxy_connect_timeout 1s; # https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_connect_timeout } } ``` **Docker Compose配置文件说明** ```yaml version: '3' # 版本,与安装的docker、docker compose的版本有关,一般安装最近的版本,使用3就好了;https://docs.docker.com/compose/compose-file/compose-versioning/ networks: # 定义网络 redisclusternet: # 网络别名 driver: bridge # 网络类型 ipam: # ip地址管理 config: # 网络配置 - subnet: 10.0.0.0/16 # 定义子网 services: # 定义服务 redis1: # 服务别名 container_name: redis-1 # 容器名称 image: redis:${REDIS_VER} # 镜像名称,镜像名称:镜像标签 volumes: # 挂载数据局卷 - ./configs/redis-1.conf:/etc/redis/redis.conf:rw # 挂载映射,容器外部文件或目录:容器内部文件或目录:访问方式,rw(读写),ro(只读) - ./data/node1:/data:rw command: # 启动命令 - redis-server - /etc/redis/redis.conf networks: # 服务网络定义 redisclusternet: # 通过网络别名指定需要加入的网络 ipv4_address: 10.0.0.11 # 指定容器的ip地址 logging: # 日志配置 driver: "json-file" # 日志驱动 options: # 日志选项 max-size: "200m" # 日志单文件最大大小 max-file: "3" # 最大日志文件数量 redis2: container_name: redis-2 image: redis:${REDIS_VER} volumes: - ./configs/redis-2.conf:/etc/redis/redis.conf:rw - ./data/node2:/data:rw command: - redis-server - /etc/redis/redis.conf networks: redisclusternet: ipv4_address: 10.0.0.12 logging: driver: "json-file" options: max-size: "200m" max-file: "3" redis3: container_name: redis-3 image: redis:${REDIS_VER} volumes: - ./configs/redis-3.conf:/etc/redis/redis.conf:rw - ./data/node3:/data:rw command: - redis-server - /etc/redis/redis.conf networks: redisclusternet: ipv4_address: 10.0.0.13 logging: driver: "json-file" options: max-size: "200m" max-file: "3" redis4: container_name: redis-4 image: redis:${REDIS_VER} volumes: - ./configs/redis-4.conf:/etc/redis/redis.conf:rw - ./data/node4:/data:rw command: - redis-server - /etc/redis/redis.conf networks: redisclusternet: ipv4_address: 10.0.0.14 logging: driver: "json-file" options: max-size: "200m" max-file: "3" redis5: container_name: redis-5 image: redis:${REDIS_VER} volumes: - ./configs/redis-5.conf:/etc/redis/redis.conf:rw - ./data/node5:/data:rw command: - redis-server - /etc/redis/redis.conf networks: redisclusternet: ipv4_address: 10.0.0.15 logging: driver: "json-file" options: max-size: "200m" max-file: "3" redis6: container_name: redis-6 image: redis:${REDIS_VER} volumes: - ./configs/redis-6.conf:/etc/redis/redis.conf:rw - ./data/node6:/data:rw command: - redis-server - /etc/redis/redis.conf networks: redisclusternet: ipv4_address: 10.0.0.16 logging: driver: "json-file" options: max-size: "200m" max-file: "3" nginx_proxy: container_name: redis-nginx-proxy image: nginx:1.25.3-alpine ports: # 定义端口映射 - 6379:6379 # 指定端口映射,宿主机端口:容器内部端口 volumes: - ./configs/nginx.conf:/etc/nginx/nginx.conf:ro depends_on: # 指定依赖的服务,依赖的服务全部启动后,才会启动当前服务 - redis1 - redis2 - redis3 - redis4 - redis5 - redis6 networks: redisclusternet: ipv4_address: 10.0.0.240 logging: driver: "json-file" options: max-size: "200m" max-file: "3" redisinsight: container_name: redisinsight image: redislabs/redisinsight:latest ports: - 8001:8001 volumes: - ./redisinsight:/db:rw depends_on: - nginx_proxy networks: redisclusternet: ipv4_address: 10.0.0.241 logging: driver: "json-file" options: max-size: "200m" max-file: "3" ```