Redis 集群-主从复制(基于Docker Compose)

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

更多关于Docker及Docker Compose的知识可以进入该链接

Redis 单机

读取能力
写的速度
Redis 单机
110000次/s
81000次/s

Redis 主从复制

一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。Master不管Slave, Slave去找Master,Slave与Slave之间是无法进行通讯的。

Redis Master 读写
Redis Slave 只读
Redis Slave 只读

同步的工作方式如下:

​ 主机启动后台保存过程以生成RDB文件。同时,它开始缓冲从客户端收到的所有新写命令。后台保存完成后,主数据库将数据库文件传输到从数据库从数据库将其保存在磁盘上,然后将其加载到内存中。然后,主服务器将所有缓冲的命令发送到副本。这是作为命令流完成的,并且与Redis协议本身的格式相同。

Slave Master SYNC请求 1 创建快照、缓冲快照生成期间的写命令 2 loop 同步快照 3 载入快照、解析快照 4 loop 缓冲快照同步期间的写命令 5 loop 同步写命令缓冲 6 载入写命令缓冲 7 loop 同步增量 8 Slave Master

1.创建文件夹,进入该文件夹

# 创建文件夹
$ mkdir -p docker/redis/

#进入文件夹
$ cd docker/redis/

2.创建docker-compose.yml文件
也可直接下载我写好的docker-compose.yml文件

$ vim docker-compose.yml

docker-compose.yml内容如下:

# 撰写规范
version: '3.8'

# 定义容器
services:

  # 名称
  redis_master:
    # 镜像名称
    image: redis
    # 容器名称
    container_name: redis_master
    # 跟随容器启动
    restart: always
    # 环境变量
    environment:
      - "TZ=Asia/Shanghai"
    # 端口映射 主机端口:容器端口
    ports:
      - "6379:6379"
    # 启动后默认执行命令
    # 设置密码 --requirepass 123456
    command:
      redis-server --requirepass 123456

  # 名称
  redis_slave_1:
    # 镜像名称
    image: redis
    # 容器名称
    container_name: redis_slave_1
    # 跟随容器启动
    restart: always
    # 环境变量
    environment:
      - "TZ=Asia/Shanghai"
    # 端口映射 主机端口:容器端口
    ports:
      - "6380:6379"
    # 启动后默认执行命令
    # 将当前服务器转变为指定服务器的从属服务器 --slaveof host port
    # 设置密码 --requirepass 123456
    # Master服务器密码 --masterauth 123456
    command:
      redis-server --slaveof redis_master 6379 --requirepass 123456 --masterauth 123456

  # 名称
  redis_slave_2:
    # 镜像名称
    image: redis
    # 容器名称
    container_name: redis_slave_2
    # 跟随容器启动
    restart: always
    # 环境变量
    environment:
      - "TZ=Asia/Shanghai"
    # 端口映射 主机端口:容器端口
    ports:
      - "6381:6379"
    # 启动后默认执行命令
    # 将当前服务器转变为指定服务器的从属服务器 --slaveof host port
    # 设置密码 --requirepass 123456
    # Master服务器密码 --masterauth 123456
    command:
      redis-server --slaveof redis_master 6379 --requirepass 123456 --masterauth 123456

docker-compose.yml撰写规范(version)是根据docker版本不同,而有所不同的。

$ sudo docker --version
Docker version 19.03.8, build afacb8b7f0

以下是对应关系:撰写文件版本和升级

Compose file format Docker Engine release
Compose specification 19.03.0+
3.8 19.03.0+
3.7 18.06.0+
3.6 18.02.0+
3.5 17.12.0+
3.4 17.09.0+
3.3 17.06.0+
3.2 17.04.0+
3.1 1.13.1+
3.0 1.13.0+
2.4 17.12.0+
2.3 17.06.0+
2.2 1.13.0+
2.1 1.12.0+
2.0 1.10.0+
1.0 1.9.1.+

3.docker-compose.yml启动管理的容器

$ sudo docker-compose up -d 

Creating network "redis_default" with the default driver
Creating redis_slave_2 ... done
Creating redis_slave_1 ... done
Creating redis_master  ... done

4.查看由docker-compose管理的容器

$ sudo docker-compose ps

    Name                   Command               State           Ports         
-------------------------------------------------------------------------------
redis_master    docker-entrypoint.sh redis ...   Up      0.0.0.0:6379->6379/tcp
redis_slave_1   docker-entrypoint.sh redis ...   Up      0.0.0.0:6380->6379/tcp
redis_slave_2   docker-entrypoint.sh redis ...   Up      0.0.0.0:6381->6379/tcp

5.查看容器运行状态

$ sudo docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
9af1bfa762ce        redis               "docker-entrypoint.s…"   16 seconds ago      Up 14 seconds       0.0.0.0:6379->6379/tcp   redis_master
dc9280698682        redis               "docker-entrypoint.s…"   16 seconds ago      Up 14 seconds       0.0.0.0:6380->6379/tcp   redis_slave_1
d9a9a2aa0dd3        redis               "docker-entrypoint.s…"   16 seconds ago      Up 14 seconds       0.0.0.0:6381->6379/tcp   redis_slave_2

6.进入容器redis_master,查看主从复制状态

$ sudo docker exec -it 9af1bfa762ce bash

root@9af1bfa762ce:/data# redis-cli 
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.19.0.2,port=6379,state=online,offset=112,lag=0
slave1:ip=172.19.0.3,port=6379,state=online,offset=112,lag=0
master_replid:0031d2325bc01f3e25c6a962c1abb14655dcf3e3
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:112
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:112
127.0.0.1:6379> exit
root@9af1bfa762ce:/data# exit
exit

  • redis-cli:进入redis。
  • auth "123456":密码登录
  • info replication:查看主从复制信息。

在此处我们可以看到connected_slaves:2,这意味着有两台从机连接。slave0slave1便是两台从机的信息。

7.关闭并删除容器

$ sudo docker-compose down

Stopping redis_master  ... done
Stopping redis_slave_2 ... done
Stopping redis_slave_1 ... done
Removing redis_master  ... done
Removing redis_slave_2 ... done
Removing redis_slave_1 ... done
Removing network redis_default

Logo

一站式虚拟内容创作平台,激发创意,赋能创作,进入R空间,遇见同道,让优质作品闪耀发光。​

更多推荐