Redis 使用docker搭建集群环境(主从模式)

分类:软件编程
阅读:75
作者:majingjing
发布:2021-11-30 23:27

主从模式

image-20211130214556444

客户端可对主数据库进行读写操作,对从数据库进行读操作,主数据库写入的数据会实时自动同步给从数据库。

工作机制:

  1. slave启动后,向master发送SYNC命令,master接收到SYNC命令后通过bgsave保存快照,并使用缓冲区记录保存快照这段时间内执行的写命令
  2. master将保存的快照文件发送给slave,并继续记录执行的写命令
  3. slave接收到快照文件后,加载快照文件,载入数据
  4. master快照发送完后开始向slave发送缓冲区的写命令,slave接收命令并执行,完成复制初始化
  5. 此后master每次执行一个写命令都会同步发送给slave,保持master与slave之间数据的一致性

优缺点

优点:
  1. master能自动将数据同步到slave,可以进行读写分离,分担master的读压力
  2. master、slave之间的同步是以非阻塞的方式进行的,同步期间,客户端仍然可以提交查询或更新请求
缺点:
  1. 不具备自动容错与恢复功能,master或slave的宕机都可能导致客户端请求失败,需要等待机器重启或手动切换客户端IP才能恢复
  2. master宕机,如果宕机前数据没有同步完,则切换IP后会存在数据不一致的问题
  3. 难以支持在线扩容,Redis的容量受限于单机配置

集群搭建

image-20211130225832662

目录结构如上图
docker-compose.yml 内容
version: '3'
services:
  master:
    image: redis:6.2.6
    container_name: redis-master
    command: redis-server  --requirepass 12345678  --masterauth 12345678
    ports:
      - 6380:6379
    networks:
      - majj
  slave1:
    image: redis:6.2.6
    container_name: redis-slave-1
    ports:
      - 6381:6379
    command:  redis-server --slaveof redis-master 6379 --masterauth 12345678  --requirepass 12345678
    networks:
      - majj
  slave2:
    image: redis:6.2.6
    container_name: redis-slave-2
    ports:
      - 6382:6379
    command: redis-server --slaveof redis-master 6379 --masterauth 12345678 --requirepass 12345678
    networks:
      - majj

networks:
  majj:
    external:
      name: majj
执行 命令 docker-compose up -d
apple@Marion  ~/Documents/works/poc/Redis-docker/redis  docker-compose up -d
WARNING: Found orphan containers (redis) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Pulling master (redis:6.2.6)...
6.2.6: Pulling from library/redis
Digest: sha256:619af14d3a95c30759a1978da1b2ce375504f1af70ff9eea2a8e35febc45d747
Status: Downloaded newer image for redis:6.2.6
Recreating redis-master  ... done
Recreating redis-slave-2 ... done
Recreating redis-slave-1 ... done
 apple@Marion  ~/Documents/works/poc/Redis-docker/redis 

验证

image-20211130230607255

进入redis-master容器

image-20211130231126602

进入 redis-slave-1 容器

image-20211130231413744

master 读写, slave 只读

image-20211130232437616

image-20211130232528536