docker-compose部署Redis主从哨兵

1. 主从复制概述

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。

默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

主从复制的作用

主从复制的作用主要包括:

  1. 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
  2. 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
  3. 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
  4. 高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础

2. 实验环境

[root@k8s-master docker]# systemctl status firewalld iptables
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

● iptables.service - IPv4 firewall with iptables
   Loaded: loaded (/usr/lib/systemd/system/iptables.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

[root@k8s-master docker]# sestatus
SELinux status:                 disabled

[root@k8s-master docker]# docker -v
Docker version 18.06.1-ce, build e68fc7a

[root@k8s-master docker]# docker inspect redis:6.2.5|grep REDIS_VERSION
                "REDIS_VERSION=6.2.5",

  

3. 架构

典型的哨兵架构图如下所示:

它由两部分组成,哨兵节点和数据节点:

  • 哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的redis节点,不存储数据。
  • 数据节点:主节点和从节点都是数据节点。

4. 部署主从

目的:1个主节点、2个从节点和3个哨兵节点

4.1 准备

# 安装docker-compose
yum install docker-compose -y

4.2 Master/Slave部署

# 创建redis-compose老家
mkdir /home/Docker/docker-compose/redis && cd /home/Docker/docker-compose/redis

# redis docker-compose.yml
[root@hadoop4 redis]# cat docker-compose.yml 
version: '3'
services:
  master:
    image: redis
    container_name: redis-master
    command: redis-server --requirepass 123456  --masterauth 123456
    ports:
      - 6380:6379
  slave1:
    image: redis
    container_name: redis-slave-1
    ports:
      - 6381:6379
    command:  redis-server --slaveof redis-master 6379 --requirepass 123456 --masterauth 123456
  slave2:
    image: redis
    container_name: redis-slave-2
    ports:
      - 6382:6379
    command: redis-server --slaveof redis-master 6379 --requirepass 123456 --masterauth 123456

注意,如果设置了Redis客户端访问密码requirepass, 那么也要设置相同的副本集同步密码masterauth。
另外我们后面使用哨兵模式能够完成故障转移,现有的Master可能会变成Slave,故在当前Master容器中也要携带masterauth参数。

执行docker-compose up -d会产生3个Redis容器,分别映射到宿主机6380、6381、6382端口, 默认连接在redis-default网桥。

4.3 哨兵部署

很明显我们即将搭建的Sentinel容器需要能访问到以上3个容器,故需要在形成Sentinel的Dokcer-compose 使用外置的redis-default网桥。

[root@hadoop4 sentinel]# pwd
/home/Docker/docker-compose/redis/sentinel
[root@hadoop4 sentinel]# cat docker-compose.yml 
version: '3'
services:
  sentinel1:
    image: redis
    container_name: redis-sentinel-1
    ports:
      - 26379:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - ./sentinel1.conf:/usr/local/etc/redis/sentinel.conf
  sentinel2:
    image: redis
    container_name: redis-sentinel-2
    ports:
    - 26380:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - ./sentinel2.conf:/usr/local/etc/redis/sentinel.conf
  sentinel3:
    image: redis
    container_name: redis-sentinel-3
    ports:
      - 26381:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - ./sentinel3.conf:/usr/local/etc/redis/sentinel.conf
networks:
  default:
    external:
      name: redis_default

创建哨兵文件,将如下内容拷贝进去

[root@hadoop4 sentinel]# cat sentinel1.conf 
port 26379
dir /tmp
sentinel monitor mymaster 172.18.0.3 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

注意,以上 172.18.0.3是之前Redis Master/slave启动之后Master节点的IP,通过docker inspect [containerIP]获取, 这里我们要配合设置Master/Slave访问密码。

复制两份sentinel1.conf文件,容器挂载需要

# 启动容器
docker-compose up -d

docker ps 容器显示如下

[root@hadoop4 sentinel]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                NAMES
0bf5fd88b0b2        redis               "docker-entrypoint.s…"   About an hour ago   Up About an hour    6379/tcp, 0.0.0.0:26380->26379/tcp   redis-sentinel-2
27e22208cef7        redis               "docker-entrypoint.s…"   About an hour ago   Up About an hour    6379/tcp, 0.0.0.0:26379->26379/tcp   redis-sentinel-1
a67bac1aca69        redis               "docker-entrypoint.s…"   About an hour ago   Up About an hour    6379/tcp, 0.0.0.0:26381->26379/tcp   redis-sentinel-3
16333f8c1787        redis               "docker-entrypoint.s…"   About an hour ago   Up About an hour    0.0.0.0:6381->6379/tcp               redis-slave-1
26e186d4d9d9        redis               "docker-entrypoint.s…"   About an hour ago   Up About an hour    0.0.0.0:6382->6379/tcp               redis-slave-2
a8368ebdfcbb        redis               "docker-entrypoint.s…"   About an hour ago   Up About an hour    0.0.0.0:6380->6379/tcp               redis-master

5. 验证

进入redis-master容器查看主从关系

[root@hadoop4 redis]# docker exec -it redis-master bash
root@a8368ebdfcbb:/data# redis-cli -h localhost
localhost:6379> auth 123456
OK
localhost:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.18.0.2,port=6379,state=online,offset=7043,lag=0
slave1:ip=172.18.0.4,port=6379,state=online,offset=7043,lag=0
master_failover_state:no-failover
master_replid:94386248d441ecd4bfab9933e2eb4ff597943a87
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:7043
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:7043

至此,完成redis主从哨兵搭建,已经测试过了,这里就不举例了。

 

参考文章:https://www.cnblogs.com/guolianyu/p/10239913.html

     https://www.cnblogs.com/kismetv/p/9236731.html

             https://blog.csdn.net/qq_24641227/article/details/93520057

                  docker-compose一键部署redis一主二从三哨兵模式(含密码,数据持久化) - Old-凯 - 博客园 (cnblogs.com)

        docker-compose搭建redis哨兵集群 - 有态度的马甲 - 博客园 (cnblogs.com)

        docker-compose.yml · 雷兴庆/redis-sentinel - 码云 - 开源中国 (gitee.com)

 

posted @ 2020-06-04 11:35  MegaloBox  阅读(773)  评论(0编辑  收藏  举报