redis优化系列基于docker搭建Redis主从

壮心未与年俱老,死去犹能作鬼雄。这篇文章主要讲述redis优化系列基于docker搭建Redis主从相关的知识,希望能为你提供帮助。
一、开胃小菜(前期准备工作):1、准备一台Linux服务器并安装及启动docker 本文使用的是:CentOS 7.6 x64
2、准备一个Dockfile文件 用来构建redis镜像,该文件我会在下面提供
Dockerfile文件:Dockerfile.zip自行下载解压后将文件上传到服务器。本文将该文件上传到服务器的路径:/root
3、启动系统的iptables,一般不需要更改该规则文件,如果下面步骤提示报相关网络错误,上网查一下即可解决
4、本系列博文使用的redis版本:3.2.12
二、了解docker网络模式(为接下来的主从配置搭建做准备)Docker安装后,默认会创建下面三种网络类型
docker network ls 查看默认的网络

redis优化系列基于docker搭建Redis主从

文章图片

在启动容器时使用 --network bridge 指定网络类型
bridge:桥接网络
默认情况下启动的Docker容器,都是使用 bridge,Docker安装时创建的桥接网络,每次Docker容器重启时,会按照顺序获取对应的IP地址,这个就导致重启下,Docker的IP地址就变了(桥接网络模式也可以,就是通过端口映射访问到容器里面的redis,不过本文选择用下面的自定义网络模式)
none:无指定网络
使用 --network=none ,docker 容器就不会分配局域网的IP
host: 主机网络
使用 --network=host,此时,Docker 容器的网络会附属在主机上,两者是互通的。
例如,在容器中运行一个Web服务,监听8080端口,则主机的8080端口就会自动映射到容器中
2.2、指定自定义网络,设置容器的固定IP(下面的Redis主从搭建选择用自定义网络)
因为默认的网络不能制定固定的地址,所以我们将创建自定义网络,并指定网段: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

redis优化系列基于docker搭建Redis主从

文章图片

/***伟大的分割线****/
三、开始搭建Redis主从模式 概述:
【redis优化系列基于docker搭建Redis主从】主从复制说明,单一节点的redis(单台服务器的redis)容易面临的问题:
比如:

1、机器故障。我们部署到一台 Redis 服务器,当发生机器故障时,需要迁移到另外一台服务器并且要保证数据是同步的。而数据是最重要的,如果你不在乎,基本上也就不会使用 Redis 了。
2、容量瓶颈。当我们有需求需要扩容 Redis 内存时,从 16G 的内存升到 64G,单机肯定是满足不了。当然,你可以重新买个 128G 的新机器。
要实现分布式数据库的更大的存储容量和承受高并发访问量,我们会将原来集中式数据库的数据分别存储到其他多个网络节点上。
Redis 为了解决这个单一节点的问题,也会把数据复制多个副本部署到其他节点上进行复制,实现 Redis的高可用,实现对数据的冗余备份,从而保证数据和服务的高可用。
什么是主从复制?
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。

默认情况下,每台Redis服务器都是主节点,且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。也就是说一台redis从服务只能属于一台redis主服务。
redis优化系列基于docker搭建Redis主从

文章图片

主从复制的作用:
主从复制的作用主要包括:
1、数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
2、故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
3、负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
4、读写分离:可以用于实现读写分离,主库写、从库读,读写分离不仅可以提高服务器的负载能力,同时可根据需求的变化,改变从库的数量;
5、高可用基石(基础):除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
具体操作步骤如下:
3.1、进入到root目录下(具体换成你自己的路径),并使用Dockerfile文件构建redis镜像
#进入到root目录下``cd` `/root/` `#使用Dockerfile文件构建一个redis镜像(注意后面有一个点)``docker build -t redis .

可以使用docker images查看刚刚构建完成的redis镜像
redis优化系列基于docker搭建Redis主从

文章图片

3.2、使用此构建生成的redis镜像创建容器(创建2个redis容器 一主一从)
#主redis,该容器命名为redis-master 使用mynetwork网络 端口映射6380对应容器内部端口的6379 指定容器固定IP:172.10.0.2 使用redis镜像来生成容器并在后台运行``docker run -itd --name redis-master --net mynetwork -p 6380:6379 --ip 172.10.0.2 redis` `#从redis,该容器命名为redis-slave 使用mynetwork网络 端口映射6381对应容器内部端口的6379 指定容器固定IP:172.10.0.3 使用redis镜像来生成容器并在后台运行``docker run -itd --name redis-slave --net mynetwork -p 6381:6379 --ip 172.10.0.3 redis

可以使用docker ps 查看正在运行中的容器(查看我们上面创建的两个一主一从的redis容器)
redis优化系列基于docker搭建Redis主从

文章图片

可以使用docker network inspect mynetwork命令查看容器的ip地址等相关信息
redis优化系列基于docker搭建Redis主从

文章图片

3.3、分别进入主redis容器和从redis容器 修改redis.conf配置文件
#1、主redis容器redis.conf配置文件改动``使用docker ``exec``命令进入容器里面:docker ``exec` `-it 你生成的主redis容器ID 或 容器名字 ``/bin/bash` `本文中的对应命令为(容器``id``方式):docker ``exec` `-it e4fbae61823b ``/bin/bash``本文中的对应命令为(容器名字方式):docker ``exec` `-it redis-master ``/bin/bash` `修改redis.conf配置文件 ``vi` `/etc/redis``.conf``#将bind 127.0.0.1注释 或 改为bind 0.0.0.0 表示允许任何ip连接该redis服务,同时将protected-mode yes 改为 protected-mode no 表示关闭保护模式` `#2、从redis容器redis.conf配置文件改动(和主redis的改动一样,唯一区别就是进入容器的时候,要进入从redis容器也就是容器id或容器名字不一样了 不过还是演示下吧。。)``使用docker ``exec``命令进入容器里面:docker ``exec` `-it 你生成的从redis容器ID 或 容器名字 ``/bin/bash` `本文中的对应命令为(容器``id``方式):docker ``exec` `-it a172d66c4e4d ``/bin/bash``本文中的对应命令为(容器名字方式):docker ``exec` `-it redis-slave ``/bin/bash` `修改redis.conf配置文件 ``vi` `/etc/redis``.conf``#将bind 127.0.0.1注释 或 改为bind 0.0.0.0 表示允许任何ip连接该redis服务,同时将protected-mode yes 改为 protected-mode no 表示关闭保护模式

redis.conf配置文件改动后的截图如下:
redis优化系列基于docker搭建Redis主从

文章图片

redis优化系列基于docker搭建Redis主从

文章图片

3.4、启用主从模式(有三种方式):
(1)redis.conf配置文件(本文使用这种方式)
在从服务器的配置文件中加入:slaveof < masterip> < masterport>
(2)启动命令
redis-server启动命令后加入 --slaveof < masterip> < masterport>
(3)客户端命令
Redis服务器启动后,直接通过客户端执行命令:slaveof < masterip> < masterport> ,则该Redis实例成为从节点
通过 info replication 命令可以看到复制的一些参数信息
3.5、从redis容器中的redis.conf的redis配置文件加入配置信息,完成主从同步(别忘了 你要进入从redis容器里面)
vi` `/etc/redis``.conf` `将 ``# slaveof < masterip> < masterport> 改为 slaveof 172.10.0.2 6379 也就是上面创建主redis容器是指定的主redis容器的固定IP地址。如果你和我的不一样,记得换成你自己设置的

从redis容器的里的redis.conf配置文件更改后的截图如下:
redis优化系列基于docker搭建Redis主从

文章图片

3.6、分别启动主从redis容器里面的redis服务(再次提醒。。别忘了进入主从redis容器里面启动)
#主从redis容器里面启动redis服务都用以下这个命令即可``redis-server ``/etc/redis``.conf & ``#启动redis服务 & 表示以后台守护进程方式启动(就是启动了后 在后台默默的服务)

3.7、测试主从同步是否搭建成功(提醒啊。。别忘了进入主从redis容器里面进行操作。。真是操碎了心。。)
3.7.1、主redis容器操作:
redis-cli ``#进入redis客户端``set` `wzyl 123 ``#创建一个key

redis优化系列基于docker搭建Redis主从

文章图片

3.7.2、从redis容器操作:
redis-cli ``#进入redis客户端` `使用get命令:get wzyl 或 使用keys命令:keys *

redis优化系列基于docker搭建Redis主从

文章图片

注:上面的keys 命令不建议使用,除非你redis里面没有多少数据你可以使用keys 命令,如果redis里面有很多数据 使用keys * 的话,会很慢。。会造成redis堵塞的。。
至此。。redis主从搭建成功。。往redis主节点写数据的时候,会自动同步到配置的redis从节点里(同步会有延时,因为需要用到网络,1秒钟之内会完成同步,大概也就几百毫秒的样子就可以了)实现了redis的读写分离。。这样写的操作可以写到主redis节点,读的操作可以读取从redis节点。。PS:一主一从搭建完了,一主多从应该也会了吧。。举一反三啊。。基于docker搭建redis主从都会了。。直接基于每一台服务器搭建redis主从就更简单了吧。。
3.8、使用RedisDesktopManager工具来连接到docker里面的redis(我们就链接主redis这个容器里的redis吧)
redis优化系列基于docker搭建Redis主从

文章图片

119.3.220.26是我服务器的公网IP,记得换成你自己服务器的公网IP,6380是我在上面创建主redis容器的时候指定的6380端口,实际上链接的时候会自动将6380映射成6379。。别直接上来就复制粘贴最后一点击测试发现各种error。。
3.9、主从结构还有一种叫:树状主从结构
树状主从结构:就是从节点它不但可以复制我们的主节点的数据,它同时也可以做为其它从节点的主节点,继续向下复制。说白了就是主节点有从节点,但是从节点还有从节点

那这种树状主从结构是为了解决什么问题?
主要就是避免主节点同步压力过大,造成性能干扰
树状主从结构示例图如下:
redis优化系列基于docker搭建Redis主从

文章图片

四、后记、尾声本文中没有设置redis密码,你可以在配置文件中进行设置,如果设置了验证密码,那么从redis节点中的配置文件中也要找到对应的密码位置进行修改才能主从同步成功,在生产环境中不建议将protected-mode yes 改为 no 并且会设置redis密码。。本文为了操作简单就没有设置密码这一步。
总结redis主从、哨兵、集群的概念:
【redis主从】:
是备份关系, 我们操作主库,数据也会同步到从库。 如果主库机器坏了,从库可以上。就好比你 D盘的片丢了,但是你移动硬盘里边备份有。
【redis哨兵】:
哨兵保证的是HA(高可用),保证特殊情况故障自动切换,哨兵盯着你的“redis主从集群”,如果主库死了,它会告诉你新的老大是谁。
哨兵:主要针对redis主从中的某一个单节点故障后,无法自动恢复的解决方案。(哨兵 保证redis主从的高可用)
【redis集群】:
集群保证的是高并发,因为多了一些兄弟帮忙一起扛。同时集群会导致数据的分散,整个redis集群会分成一堆数据槽,即不同的key会放到不不同的槽中。
集群主要针对单节点容量、高并发问题、线性可扩展性的解决方案。
集群:是为了解决redis主从复制中 单机内存上限和并发问题,假如你现在的服务器内存为256GB,当达到这个内存时redis就没办法再提供服务,同时数据量能达到这个地步写数据量也会很大,容易造成缓冲区溢出,造成从节点无限的进行全量复制导致主从无法正常工作。

    推荐阅读