写点什么

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

作者:乌龟哥哥
  • 2022 年 4 月 22 日
  • 本文字数:4491 字

    阅读完需:约 15 分钟

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 查看默认的网络



在启动容器时使用 --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 主从模式

概述:

主从复制说明,单一节点的 redis(单台服务器的 redis)容易面临的问题:


比如:****


1、机器故障。我们部署到一台 Redis 服务器,当发生机器故障时,需要迁移到另外一台服务器并且要保证数据是同步的。而数据是最重要的,如果你不在乎,基本上也就不会使用 Redis 了。


2、容量瓶颈。当我们有需求需要扩容 Redis 内存时,从 16G 的内存升到 64G,单机肯定是满足不了。当然,你可以重新买个 128G 的新机器。


要实现分布式数据库的更大的存储容量和承受高并发访问量,我们会将原来集中式数据库的数据分别存储到其他多个网络节点上。


Redis 为了解决这个单一节点的问题,也会把数据复制多个副本部署到其他节点上进行复制,实现 Redis 的高可用,实现对数据的冗余备份,从而保证数据和服务的高可用。


什么是主从复制?


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


默认情况下,每台 Redis 服务器都是主节点,且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。也就是说一台 redis 从服务只能属于一台 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 镜像



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 容器)



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



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 配置文件改动后的截图如下:



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 配置文件更改后的截图如下:



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
复制代码



3.7.2、从 redis 容器操作:


redis-cli ``#进入redis客户端` `使用get命令:get wzyl 或 使用keys命令:keys *
复制代码



注:上面的 keys * 命令不建议使用,除非你 redis 里面没有多少数据你可以使用 keys * 命令,如果 redis 里面有很多数据 使用 keys * 的话,会很慢。。会造成 redis 堵塞的。。


至此。。redis 主从搭建成功。。往 redis 主节点写数据的时候,会自动同步到配置的 redis 从节点里(同步会有延时,因为需要用到网络,1 秒钟之内会完成同步,大概也就几百毫秒的样子就可以了)实现了 redis 的读写分离。。这样写的操作可以写到主 redis 节点,读的操作可以读取从 redis 节点。。PS:一主一从搭建完了,一主多从应该也会了吧。。举一反三啊。。基于 docker 搭建 redis 主从都会了。。直接基于每一台服务器搭建 redis 主从就更简单了吧。。


3.8、使用 RedisDesktopManager 工具来连接到 docker 里面的 redis(我们就链接主 redis 这个容器里的 redis 吧)


119.3.220.26 是我服务器的公网 IP,记得换成你自己服务器的公网 IP,6380 是我在上面创建主 redis 容器的时候指定的 6380 端口,实际上链接的时候会自动将 6380 映射成 6379。。别直接上来就复制粘贴最后一点击测试发现各种 error。。


3.9、主从结构还有一种叫:树状主从结构


树状主从结构:就是从节点它不但可以复制我们的主节点的数据,它同时也可以做为其它从节点的主节点,继续向下复制。说白了就是主节点有从节点,但是从节点还有从节点****


那这种树状主从结构是为了解决什么问题?


主要就是避免主节点同步压力过大,造成性能干扰


树状主从结构示例图如下:


四、后记、尾声

本文中没有设置 redis 密码,你可以在配置文件中进行设置,如果设置了验证密码,那么从 redis 节点中的配置文件中也要找到对应的密码位置进行修改才能主从同步成功,在生产环境中不建议将 protected-mode yes 改为 no 并且会设置 redis 密码。。本文为了操作简单就没有设置密码这一步。


总结 redis 主从、哨兵、集群的概念:


【redis 主从】:


是备份关系, 我们操作主库,数据也会同步到从库。 如果主库机器坏了,从库可以上。就好比你 D 盘的片丢了,但是你移动硬盘里边备份有。


【redis 哨兵】:


哨兵保证的是 HA(高可用),保证特殊情况故障自动切换,哨兵盯着你的“redis 主从集群”,如果主库死了,它会告诉你新的老大是谁。


哨兵:主要针对 redis 主从中的某一个单节点故障后,无法自动恢复的解决方案。(哨兵 保证 redis 主从的高可用)


【redis 集群】:


集群保证的是高并发,因为多了一些兄弟帮忙一起扛。同时集群会导致数据的分散,整个 redis 集群会分成一堆数据槽,即不同的 key 会放到不不同的槽中。


集群主要针对单节点容量、高并发问题、线性可扩展性的解决方案。


集群:是为了解决 redis 主从复制中 单机内存上限和并发问题,假如你现在的服务器内存为 256GB,当达到这个内存时 redis 就没办法再提供服务,同时数据量能达到这个地步写数据量也会很大,容易造成缓冲区溢出,造成从节点无限的进行全量复制导致主从无法正常工作。

用户头像

乌龟哥哥

关注

正在努力寻找offer的大四小菜鸟 2021.03.16 加入

擅长 Hbuilder、VS Code、MyEclipse、AppServ、PS 等软件的安装与卸载 精通 Html、CSS、JavaScript、jQuery、Java 等单词的拼写 熟悉 Windows、Linux、 等系统的开关机 看–时间过得多快,不说了,去搬砖了

评论

发布
暂无评论
redis优化系列(一)基于docker搭建Redis主从_4月月更_乌龟哥哥_InfoQ写作社区