Bootstrap

Docker搭建Redis主从集群

什么是Redis主从复制?

主从复制:是指将一台Redis服务的数据,复制到其他Redis服务器上。前者称为主节点(master),后者称为从节点(slave)。数据的复制是单向的,只能从主节点到从节点。默认情况下,每一台Redis服务都是主节点,一个主节点可以有多个从节点(也可以没有),但一个从节点只能有一个主节点。
在这里插入图片描述

为什么要使用Redis主从复制?

假设只有一台Redis服务,这就是单机模式。

第一个问题是当服务器宕机,数据丢失,如果数据很重要,那会造成很大的损失。

第二个问题是内存问题,一台服务器的内存是会达到峰值的,一台服务器也不可能无限升级。

针对上述问题,我们需要准备多台服务器,配置主从复制。将数据保存在多台服务器上,并且保证每台服务器的数据是同步的。即使有一台服务器宕机,也不影响用户的使用。redis可以继续实现高可用,同时实现数据的冗余备份。

主从复制的工作原理?

从节点slave 启动时,向 master 发送 sync 命令,以实现增量复制。
mater(主库)接到 sync 请求,会在后台保存快照,也就是实现 RDB 持久化,并将快照
期间接收到命令缓存起来。
快照完成后,master(主库)会将快照文件和所有的缓存的命令发送给 slave(从库)。
slave(从库)接收后,会载入快照文件并执行缓存的命令,从而完成复制的初始化。
在数据库使用阶段,master(主库)会自动把每次收到的写命令同步到从服务器。

Redis 乐观复制策略

Redis 采用乐观复制的策略,允许一定时间内主从数据库的内容不同,当然最终的数据
会相同。此策略保证了 Redis 性能,在进行复制时,master(主库)并不阻塞,继续处理 client的请求。
但是 Redis 同样提供了配置用来限制只有当数据至少同步给指定数量的slave(从库)时,
saster(主库)才可写,否则返回错误。配置是:min-slaves-to-write、min-slaves-max-lag。

基于docker搭建Redis主从复制

编写DockerFile

FROM centos:7
RUN groupadd -r redis && useradd  -r -g redis redis
RUN yum -y update &&  yum -y install epel-release && yum -y install redis && yum -y install net-tools
EXPOSE 6379

将编写好的Dockerfile文件上传到linux服务器

了解docker网络模式(为接下来的主从配置搭建做准备)

docker安装后,默认会创建下面三种网络类型

  • bridge:桥接网络

  • 默认情况下启动的docker容器,都是使用 bridge,docker安装时创建的桥接网络,每次docker容器重启时,会按照顺序获取对应的IP地址,这个就导致重启下,docker的IP地址就变了(桥接网络模式也可以,就是通过端口映射访问到容器里面的redis,不过本文选择用下面的自定义网络模式)

  • none:无指定网络

    • docker 容器就不会分配局域网的IP
  • host: 主机网络

    • docker容器的网络会附属在主机上,两者是互通的。例如,在容器中运行一个Web服务,监听8080端口,则主机的8080端口就会自动映射到容器中

在启动容器时使用 --network bridge 指定网络类型

指定自定义网络

因为默认的网络不能制定固定的地址,所以我们将创建自定义网络,并指定网段:172.10.0.0/16 并命名为mynetwork,这里选择了172.10.0.0/16网段,当然你也可以指定其他任意空闲的网段。将名字命名为mynetwork,你也可以换成其它的任意名字。具体创建指令如下:

创建一个mynetwork网络 并指定网段(子网)为:172.10.0.0/16(执行这一步,下面要用到该网络

docker network create --subnet=172.10.0.0/16 mynetwork

查看所有的网络

docker network ls

在这里插入图片描述

开始搭建Redis主从复制

使用Dockerfile文件构建一个redis镜像(注意后面有一个点)

docker build -t redis .

可以使用docker images查看刚刚构建完成的redis镜像
在这里插入图片描述

运行docker容器

docker run -itd --name redis-master --net mynetwork -p 6380:6379 --ip 172.10.0.2 redis
docker run -itd --name redis-slave --net mynetwork -p 6381:6379 --ip 172.10.0.3 redis

参数解释:

-i: 以交互模式运行容器,通常与 -t 同时使用

-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用

-d: 后台运行容器,并返回容器ID;

–name: 为创建的容器命名

–net: 指定网络模式(这里指定刚才创建的自定义网络模式)

-p: 端口映射,格式为:主机(宿主)端口:容器端口

–ip: 为容器制定一个固定的ip

redis 镜像名称

运行成功后使用docker ps 查看正在运行中的容器(查看我们上面创建的两个一主一从的redis容器)

在这里插入图片描述

可以使用docker network inspect mynetwork命令查看容器的ip地址等相关信息

在这里插入图片描述

分别进入主redis容器和从redis容器 修改redis.conf配置文件

格式: docker exec -it 你生成的主redis容器ID 或 容器名字

docker exec -it 5fbbf533c2c0 bash

修改/etc下的配置文件( redis.conf )

进入vim编辑器

vim /etc/redis.conf
# vim 不行的使用vi命令
vi /etc/redis.conf
bind 127.0.0.1 #注释这一行
protected-mode no (#将保护模式修改为no)
daemonize yes #(设置为守护进程,把no改为yes)

退出容器的命令

exit

启用主从模式的三种方式

  • 在从服务器的redis.conf配置文件中加入主服务器(本文使用这种方式)
# 格式 slaveof <masterip> <masterport>
slaveof 172.10.0.2 6379 
  • 启动命令

    redis-server启动命令后加入 --slaveof

  • 客户端命令

  • Redis服务器启动后,直接通过客户端执行命令:slaveof ,则该Redis实例成为从节点

  • 通过 info replication 命令可以看到复制的一些参数信息)

分别启动主从redis容器里面的redis服务

redis-server /etc/redis.conf &

进入redis客户端

redis-cli

在redis客户端内查看主从信息

info replication

在主redis容器中写入key

set name ls

在这里插入图片描述

在从redis中查看key

get name

在这里插入图片描述

redis可视化连接

服务器公网IP:redis主机端口

;