主从模式
客户端可对主数据库进行读写操作,对从数据库进行读操作,主数据库写入的数据会实时自动同步给从数据库。
工作机制:
- slave启动后,向master发送SYNC命令,master接收到SYNC命令后通过bgsave保存快照,并使用缓冲区记录保存快照这段时间内执行的写命令
- master将保存的快照文件发送给slave,并继续记录执行的写命令
- slave接收到快照文件后,加载快照文件,载入数据
- master快照发送完后开始向slave发送缓冲区的写命令,slave接收命令并执行,完成复制初始化
- 此后master每次执行一个写命令都会同步发送给slave,保持master与slave之间数据的一致性
优缺点
优点:
- master能自动将数据同步到slave,可以进行读写分离,分担master的读压力
- master、slave之间的同步是以非阻塞的方式进行的,同步期间,客户端仍然可以提交查询或更新请求
缺点:
- 不具备自动容错与恢复功能,master或slave的宕机都可能导致客户端请求失败,需要等待机器重启或手动切换客户端IP才能恢复
- master宕机,如果宕机前数据没有同步完,则切换IP后会存在数据不一致的问题
- 难以支持在线扩容,Redis的容量受限于单机配置
集群搭建
目录结构如上图
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
验证
进入redis-master容器
进入 redis-slave-1 容器
master 读写, slave 只读