Docker部署Redis集群----第三节(docker-redis集群主从复制【上】实现篇)

发布时间 2023-10-27 16:31:05作者: 我是小太阳,发光

1、redis的集群方式有哪些?

  • 主从复制
  • 哨兵集群
  • redis-cluster集群

本节课我们主要讲解主从复制,现在大家手上是否有一台属于自己的云服务器了呢,今天我们要做的就是在云服务器上搭建我们的第一个集群主从复制。
在讲之前,首先我们来了解下为什么要用集群模式以及集群模式的优点、给我们的项目带来了哪些重要的特性。

1、为什么要是使用redis集群模式?

答:Redis是内存数据库,因此它的读取速度相比MySql等把数据存储在真实的硬盘里要快的多,同时Redis也是最好的Cache工具,在大型网站中热点数据量的请求【秒杀、双十一】等等都是非常巨大的,而正常情况下数据存储量的大小不能超过主机的内存,进而在这种高访问量也就是我们经常谈起的高并发场景时很容易照成数据的溢出至瓶颈受到限制,对于大型网站来说这是非常致命的。显然单机就无法满足我们的业务需求了。反之如果你的网站每天的pv量也就几百、几千、几万的话也就没有必要做集群,因为没有意义反而也是一种浪费,单机模式足够了。

2、什么是主从复制?

答:就是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。默认情况下,每台Redis服务器都是主节点,且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。给大家画个图来理解下:

3、主从复制有什么作用?

答:①:数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

②:故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。换句话说就是主服务器挂掉了,从服务器顶上去。

③:负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。

说到这里,大家对集群应该有比较深刻的了解了那么我们就来开始动手搭建吧【这里我会一步步的分享给大家】

如果有大牛在这里看到以下比较啰嗦的讲解,希望理解。因为每个想学的人,基础是不一样的,能把最好的容易理解的东西献给大家,是我的荣幸。谢谢各位的捧场。大家关注我的专栏后面会有很多精彩的内容等着大家,分享给你们。

话不多说开始进入我们的正题:

准备工作:
只要一台服务器【仅此而已就这么简单】。
是不是有人会疑问:不是说主从吗?怎么就用一台服务器啊?是的,我们是用来学习的要那么多的服务器干嘛呢,我们用Docker来部署Redis的主从,让大家充分理解Docker的魅力,从此让你走上Docker的不寻常之路。

2、动起手来跟着我一起做【不要偷懒只会复制哦】

我们开始。。。

1、主从复制节点规划->搭建一主三从

容器名称                容器IP地址           映射端口号                 服务运行模式
Redis-master           172.60.0.2         6382 -> 6379              Master
Redis-slave3           172.60.0.3         6383 -> 6379              Slave3
Redis-slave4           172.60.0.4         6384 -> 6379              Slave4
Redis-slave5           172.60.0.5         6385 -> 6379              Slave5

2、配置容器网络

为什么要配置容器网络呢?
答:这里我们用的一台服务器做模拟集群,所以我们用端口映射的方法来实现集群的部署也就是“桥接网络”,一定要理解容器和宿主机的关系,宿主机简单理解就是你这台主服务器,主服务器与内部里容器之间是相互独立的,我们继续往下讲解,后面会结合结构图来深化大家对容器网络的认识。

明白了以后,再给大家普及下网络的类型:(这里做过虚拟机搭建的会比较属性)

执行命令docker network ls不难发现,docker 有三种网络类型

①bridge:桥接网络,默认情况下启动的Docker容器,都是使用 bridge,Docker安装时创建的桥接网络,每次Docker容器重启时,会按照顺序获取对应的IP地址,这个就导致重启下,Docker的IP地址就变了

②host:主机网络,使用 --network=host,此时,Docker 容器的网络会附属在主机上,两者是互通的。在容器中运行一个Web服务,监听8080端口,则主机的8080端口就会自动映射到容器中,因为容器的端口与宿主机的端口相同时,则宿主机的该端口就会被占用,那么宿主机的该端口就不能再使用了,是比较恶心的,但是有另外的一个好处就是客户端可以直接通过宿主机的ip访问到我们的容器。这里我们来看一张图片来更好地理解bridge和host两个网络

 

③none:无指定网络,使用 --network=none ,docker 容器就不会分配局域网的IP

3、指定自定义网络

为什么要采用自定义网络?

答:前面刚解释过,因为我们将采用桥接的网络来配置我们的容器,如果不指定,一但容器重启ip地址就会改变,直接导致我们的构建的容器网络失效。

4、接下里我们开始创建属于我们自己的网络。

执行下面的命令开始创建:
[root@instance-rttngj1u ~]# docker network create  --subnet=172.60.0.0/16  mynetwork
创建完成以后执行下面的命令查看mynetwork网络是否已经创建成功
[root@instance-rttngj1u ~]# docker network ls

5、创建Dockerfile

为什么要创建Dockerfile?

答:Dockerfile是创建镜像的基础,有了镜像我们方可构建容器。这个上节课中已经讲解了十六个基本指令的使用了,如有不了解的可以查看上一节课的内容

这里我们单独创建个目录结构来存放Dockerfile文件
[root@instance-rttngj1u ~]# mkdir -p /usr/docker
进入到docker目录创建Dockerfile
[root@instance-rttngj1u docker]# touch Dockerfile
对Dockerfile进行编辑模式vi或vim
FROM centos:latest
#基于最新的镜像centos
MAINTAINER logic
#构建该镜像的作者
RUN groupadd -r redis && useradd  -r -g redis redis
#添加redis用户和用户组
RUN yum -y update &&  yum -y install epel-release && yum -y install redis && yum -y install net-tools
#更新yum源 && 安装Linux的epel的yum源的命令 && 安装redis && 安装工具
EXPOSE 6379
#定义端口

Dockerfile的内容如下

注意:开始构建redis镜像(还记得上节课说的吗?一定要保证Dockerfile上下文的干净,不要构建一个臃肿的镜像)

开始创建我们的镜像文件:
[root@instance-rttngj1u docker]# docker build -t redis .
注意:这个点,这个点很重要表示的是上下文关系且与redis中间有个空格,
构建完成之后
执行命令下面的命令查看我们刚刚构建的镜像
[root@instance-rttngj1u docker]# docker images -a
好了我们的第一个redis镜像这么简单的构建成功了。
紧接着开始配置我们的主从集群就是我们的容器
回看我们刚刚准备的主从节点
主节点:(redis-master)
[root@instance-rttngj1u docker]# docker run -itd  --name  redis-master  --net mynetwork  -p 6382:6379  --ip 172.60.0.2  redis
三个从节点:(redis-slave)
从节点我们注重标识比如redis-slave3===>6383:6379===>172.60.0.3
[root@instance-rttngj1u docker]# docker run -itd  --name  redis-slave3  --net mynetwork  -p 6383:6379  --ip 172.60.0.3  redis
[root@instance-rttngj1u docker]# docker run -itd  --name  redis-slave4  --net mynetwork  -p 6384:6379  --ip 172.60.0.4  redis
[root@instance-rttngj1u docker]# docker run -itd  --name  redis-slave5  --net mynetwork  -p 6385:6379  --ip 172.60.0.5  redis
然后执行查询容器命令
[root@instance-rttngj1u docker]# docker ps -a
结果如下图:

这里给大家普及讲解下各个参数的使用说明:

-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-p: 端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--ip: 为容器制定一个固定的ip
--net: 指定网络模式

参考文献:

6、开始配置主从复制并启用

执行启动容器的命令
[root@instance-rttngj1u docker]# docker exec -it redis-master bash
注意当执行该命令后这就会发生改变是因为我们现在所进入的主题是容器而不是当前的宿主机了如下图
:继续配置主节点master的redis的配置
1、修改ip的监听模式:
大概在61行改写成
bind 0.0.0.0 目的允许所有的ip都能访问,因为我们要主节点和从节点不是同一个ip
2、修改redis的保护模式:
大概在80行改写成proctected-mode no
这样做的目的是允许我们在连接时就不用输入密码了,就可以直接访问了,毕竟我们是用来做测试的,不是生成
环境,所以这里就无所谓了,但是生成环境的话 必须是为yes的
好了然后我们就可以保存退出了
3、修改三个从节点的redis配置(同样先进入容器)
同样分别进入三个从节点的容器中,改写绑定的端口为bind 0.0.0.0,关闭redis的保护模式
关键的一点来了265行
修改 slaveof <masterip> <masterport>为slaveof <主节点ip> <主节点端口>
那么三个从节点分别在相应的redis.conf里修改为:
slaveof  172.60.0.2 6379
保存退出,下面就开始见证奇迹的时刻
分别进入各自的容器并启动redis的客户端进入客户端的命令如下:
[root@90e5a51dda7f /]# redis-server /etc/redis.conf &
[root@90e5a51dda7f /]# redis-cli
127.0.0.1:6379> 
这样就成功启动redis里
接下来我们在master节点上存一个数据试试,然后看从节点是否能读取到
①、执行命令:
127.0.0.1:6379> set try success
②、在从节点执行获取命令
127.0.0.1:6379> get try
结论:如果能获取到值说明你成功了,或则就是你的配置有问题