Docker Image Version
redis:7.0.11-alpine
主从介绍
Redis 除了持久化方案以外,可以改造成一主多从的多实例方式进行部署。这样往 Redis 主节点写入的数据,可以在极短的时间内同步到多个从节点,从而实现数据的多处备份。
方案意义
这个方案是后续 Redis Sentinel 和 Redis Cluster 实现的基石,Redis 高可用和高性能的方案均是在这个基础上加以实现的。
Docker Compose 启动
docker-compose -f replication.yml up -d
yaml 配置文件
version: '3.8'
services:
redis-master:
container_name: redis-master
image: redis:7.0.11-alpine
hostname: redis-master
restart: unless-stopped
ports:
- "6379:6379"
logging:
driver: json-file
options:
max-size: 100m
max-file: '3'
volumes:
- redis-master:/data
command:
- redis-server
- --bind
- "0.0.0.0"
- --port
- "6379"
- --requirepass
- "ChangeMe"
- --appendonly
- "yes"
- --masterauth
- "ChangeMe"
- --replica-announce-ip
- 127.0.0.1
- --replica-announce-port
- "6379"
redis-slave1:
container_name: redis-slave1
image: redis:7.0.11-alpine
hostname: redis-slave1
restart: unless-stopped
ports:
- "6380:6379"
logging:
driver: json-file
options:
max-size: 100m
max-file: '3'
volumes:
- redis-slave1:/data
command:
- redis-server
- --bind
- "0.0.0.0"
- --port
- "6379"
- --requirepass
- "ChangeMe"
- --appendonly
- "yes"
- --masterauth
- "ChangeMe"
- --replicaof
- "redis-master 6379"
- --replica-announce-ip
- 127.0.0.1
- --replica-announce-port
- "6380"
redis-slave2:
container_name: redis-slave2
image: redis:7.0.11-alpine
hostname: redis-slave2
restart: unless-stopped
ports:
- "6381:6379"
logging:
driver: json-file
options:
max-size: 100m
max-file: '3'
volumes:
- redis-slave2:/data
command:
- redis-server
- --bind
- "0.0.0.0"
- --port
- "6379"
- --requirepass
- "ChangeMe"
- --appendonly
- "yes"
- --masterauth
- "ChangeMe"
- --replicaof
- "redis-master 6379"
- --replica-announce-ip
- 127.0.0.1
- --replica-announce-port
- "6381"
volumes:
redis-master:
redis-slave1:
redis-slave2:
执行配置文件后,Docker 会自建一个名字为redis_default
的桥接网络,而 Redis 整个主从网络就是这个网络。在这个网络下,我们可以直接指定redis-master
、redis-slave1
和redis-slave2
三个主机名,这三个主机名字是可以相互ping
通的,这样我们就不用去指定无规律的 IP 地址了。
同时如果映射到外网,我们需要采用 NAT 的模式进行端口映射。即使用replica-announce-ip
和replica-announce-port
指定外网可访问的通信 IP 和端口,这样就能解决在 NAT 网络下,不同编程语言 connetor 访问的问题。
参数介绍
参数 | 简介 |
---|---|
masterauth | Redis 主从之间通信公共密码 |
replica-announce-ip | Redis 广播 IP,用来指定同步通信的 IP |
replica-announce-port | Redis 广播端口,用来指定同步通信的端口 |
replicaof | 指定 Redis 主节点的 IP 和端口,是从节点链接主节点的必须参数 |
主从信息状态查询
docker exec -it redis-master redis-cli -a ChangeMe info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=9478,lag=0
slave1:ip=127.0.0.1,port=6381,state=online,offset=9478,lag=0
master_failover_state:no-failover
master_replid:e9329bdf954bc724e2eda18388dc473f14f41dc9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:9478
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:9478
docker exec -it redis-slave1 redis-cli -a ChangeMe info replication
# Replication
role:slave
master_host:redis-master
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_read_repl_offset:9702
slave_repl_offset:9702
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:e9329bdf954bc724e2eda18388dc473f14f41dc9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:9702
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:9702
docker exec -it redis-slave2 redis-cli -a ChangeMe info replication
# Replication
role:slave
master_host:redis-master
master_port:6379
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_read_repl_offset:9800
slave_repl_offset:9800
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:e9329bdf954bc724e2eda18388dc473f14f41dc9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:9800
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:9800