使用docker 搭建redis的主从复制

时间:2022-07-24
本文章向大家介绍使用docker 搭建redis的主从复制,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Redis 在我的项目中,主要用作缓存消息队列。小的项目可以使用单机版,大点的项目或者稍微注重高可用的时候可以考虑使用Redis 集群。

Redis 集群有三种模式: 主从复制(redis2.8版本之前的模式)、哨兵(sentinel)模式以及redis cluster模式(redis3.0版本之后)。

为什么要Redis主从复制?

1.高可用数据备份,当一个节点挂掉时,数据因为有备份,可恢复。

2.适用于高并发场景,负载均衡,所有客户端都访问一个节点肯定会影响Redis工作效率,有了主从以后,可以作为读写分离,即查询操作通过查询从节点来完成,写入访问主节点。

重要

Redis主从复制的注意事项

1.一个master可以有多个slave,默认配置下,master节点可以进行读和写,slave节点只能进行读操作,写操作被禁止。

2.不要修改配置让slave节点支持写操作,没有意义,原因一,写入的数据不会被同步到其他节点;原因二,当master节点修改同一条数据后,slave节点的数据会被覆盖掉。

3.slave节点挂了不影响其他slave节点的读和master节点的读和写,重新启动后会将数据从master节点同步过来,master节点挂了以后,不影响slave节点的读,Redis将不再提供写服务,master节点启动后Redis将重新对外提供写服务。

4.master节点挂了以后,redis就不能对外提供写服务了,因为剩下的slave不能成为master。这个缺点影响是很大的,尤其是对生产环境来说,是一刻都不能停止服务的,所以一般的生产坏境是不会单单只有主从模式的。所以有了哨兵(sentinel)模式。

实例:单机使用docker 搭建redis主从复制

建议大家学习下docker ,非常简单的,简单的几条命令就可以搭建环境,docker帮我们屏蔽了很多编译、安装困难。使用docker-compose 搭建,下面给出docker-compose.yml

version: '3.6'
services:
  master:
    image: redis
    container_name: redis-master
    restart: always
    command: redis-server --port 6379 --requirepass master123  --appendonly yes
    ports:
      - 6379:6379
    volumes:
      - ./data/master:/data

  slave1:
    image: redis
    container_name: redis-slave-1
    restart: always
    command: redis-server --slaveof master 6379 --port 6380  --requirepass slave123 --masterauth master123  --appendonly yes
    ports:
      - 6380:6380
    volumes:
      - ./data/slave1:/data


  slave2:
    image: redis
    container_name: redis-slave-2
    restart: always
    command: redis-server --slaveof master 6379 --port 6381  --requirepass slave456 --masterauth master123  --appendonly yes
    ports:
      - 6381:6381
    volumes:
      - ./data/slave2:/data
其中:
--slaveof master 6379 设置从节点的关键语句,master指主节点的hostname
--requirepass slave456 设置密码
--appendonly yes 开启持久化,默认是AOF 模式

运行结果:

[root@master docker-compose]# ls
data  docker-compose.yml
[root@master docker-compose]# docker-compose up -d
Starting redis-master  ... done
Starting redis-slave-2 ... done
Starting redis-slave-1 ... done
[root@master docker-compose]# docker ps -a
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS                    PORTS                              NAMES
1934a4e65a80        redis                   "docker-entrypoint.s…"   5 hours ago         Up 9 seconds              6379/tcp, 0.0.0.0:6380->6380/tcp   redis-slave-1
422a708f7a1f        redis                   "docker-entrypoint.s…"   5 hours ago         Up 9 seconds              6379/tcp, 0.0.0.0:6381->6381/tcp   redis-slave-2
07f8c1393f08        redis                   "docker-entrypoint.s…"   5 hours ago         Up 9 seconds              0.0.0.0:6379->6379/tcp             redis-master
[root@master docker-compose]#

使用 redis客户端工具RedisDesktopManager,当在master 上写入一个 key时,slave1和slave2 上也会有数据通过过来。