【专栏】实践篇08| All in docker!动手搭建Redis集群

news2024/11/26 0:47:40

关注公众号:【离心计划】,一起逃离舒适圈 

Redis专栏合集

【专栏】01| Redis夜的第一章

【专栏】基础篇02| Redis 旁路缓存的价值

【专栏】基础篇03| Redis 花样的数据结构

【专栏】基础篇04| Redis 该怎么保证数据不丢失(上)

【专栏】基础篇05| Redis 该怎么保证数据不丢失(下)

【专栏】核心篇06| Redis 存储高可用背后的模式

【专栏】核心篇07| Redis “jio”美的集群模式

前言

    上一节我们详细地介绍了Redis的几种集群模式,这一节我们尝试动手搭建一下哨兵和Redis Cluster模式,实际感受一下这两种集群模式。

环境搭建

All in docker,使用docker-compose容器编排工具管理,方便演示

安装docker

curl -sSL https://get.daocloud.io/docker | sh// 验证sudo docker -v

安装docker-compose

sudo curl --proxy "https://ntproxy.qa.nt.ctripcorp.com:8080" -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-composesudo chmod +x /usr/local/bin/docker-composesudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose// 验证sudo docker-compose version

主从+哨兵

    由于哨兵之间需要进行投票选举,因此我们基于docker需要容器之间通信,我们统一使用虚拟网卡分配新的ip给每个容器,不走宿主机网卡,所以我们先创建虚拟网卡:  

docker network create redis-cluster

    查看网卡信息

sudo docker network inspect redis-cluster

    然后我们先部署一主两从,编写docker-compose.yml,文件主要是创建了三个实例容器,并开启aof,分别映射到主机6379到6381三个端口上,并通过刚才创建的虚拟网卡进行通信和和分配ip

version: '1.0'services:  master:    image: redis    container_name: redis-master    restart: always    command: redis-server  --appendonly yes    ports:      - 6379:6379  slave1:    image: redis    container_name: redis-slave-1    restart: always    command: redis-server --slaveof redis-master 6379  --appendonly yes    ports:      - 6380:6379  slave2:    image: redis    container_name: redis-slave-2    restart: always    command: redis-server --slaveof redis-master 6379  --appendonly yes    ports:      - 6381:6379networks:  default:    external:      name: redis-cluster

    然后启动容器​​​​​​​

sudo docker-compose up -d//查看启动容器docker-compose ps

    我们先验证一下主从复制是否正常,先进入master容器,set一个key然后到从库6380上查看下是否存在这个key​​​​​​​

sudo docker exec -it redis-master /bin/bashredis-cli127.0.0.1:6379> set name masonOK127.0.0.1:6379> get name"mason"redis-cli -h 10.130.45.51 -p 638010.130.45.51:6380> get name"mason"

    验证没问题后我们开始部署哨兵实例,哨兵是特殊的Redis实例,因此我们先下载配置文件,并修改其中关于监控目标的实例地址信息,其中hostip设置成主机ip或者设置成主库在虚拟网卡上的ip也是可以的​​​​​​​

wget http://download.redis.io/redis-stable/sentinel.conf##修改配置sentinel monitor mymaster <hostip> 6379 2

    然后创建一个sentinel文件夹,将这个配置文件复制三份,sentinel1.conf、sentinel2.conf、sentinel3.conf,在sentinel文件夹下创建docker-compose.yml(注意不要和上面的主从yml文件放在一起),这边我们创建三个哨兵实例​​​​​​​

version: '1.0'services:  sentinel1:    image: redis    container_name: redis-sentinel-1    restart: always    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    restart: always    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.confnetworks:  default:    external:      name: redis-cluster

    然后我们启动这三个实例

sudo docker-compose up -d

可以选一个哨兵容器id查看下启动日式

sudo docker logs <containerId>

 

    现在我们已经分配了主从和哨兵,可以看看虚拟网卡上的分配情况

    然后我们就要验证一下主库下线后的主从切换,我们直接停掉主实例的容器,然后观察哨兵的日志。​​​​​​​

sudo docker stop redis-mastersudo docker logs <containerId>

    我们可以看到sdown表示主观下线,主观下线后收集了其他哨兵的判断,odown表示客观下线,3/2表示投票超过了一半。vote-for-leader表示在进行哨兵leader选举,switch-master表示切换新主库的目标,我们可以看到选举了172.18.0.2为新主库,为了验证我们再次进入新主库容器,重复上面主从复制的验证,就可以验证是否切换正常。​​​​​​​

sudo docker exec -it redis-slave-2 /bin/bash
root@c64db57b993f:/data# redis-cli 
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> 
root@c64db57b993f:/data# redis-cli -h 172.18.0.4 -p 6379
172.18.0.4:6379> get age
"18"

Redis Cluster

    cluster模式属于分片模式,我们直接编写shell脚本来帮助我们部署docker,首先我们还是创建一个配置模板:redis-cluster.templ​​​​​​​

#端口port ${PORT}#非保护模式protected-mode no#启用集群模式cluster-enabled yes cluster-config-file nodes.conf #超时时间cluster-node-timeout 5000 #集群各节点IP地址cluster-announce-ip 10.130.45.51 #集群节点映射端口 cluster-announce-port ${PORT} #集群总线端口 cluster-announce-bus-port 1${PORT} #开启aof持久化策略appendonly yes#后台运行#daemonize yes#进程号存储pidfile /var/run/redis_${PORT}.pid

    然后是shell脚本clusterStart.sh,主要就是批量创建配置文件以及集群实例​​​​​​​

start_port=6379;
end_port=6393;
for port in $(seq $start_port $end_port);
do
  mkdir -p /home/redis/node-${port}/conf
  PORT=${port} envsubst < ./redis-cluster.templ > /home/redis/node-${port}/conf/redis.conf
  mkdir -p /home/redis/node-${port}/data;
done
for port in $(seq $start_port $end_port);
do
   docker run -it -d -p ${port}:${port} -p 1${port}:1${port} \
  --privileged=true -v /home/redis/node-${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
  --privileged=true -v /home/redis/node-${port}/data:/data \
  --restart always --name redis-${port} --net redis-cluster \
  --sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf
done

    顺便写一个clusterStop.sh批量停止​​​​​​​

start_port=6379;
end_port=6393;
for port in $(seq $start_port $end_port);
do
  docker stop redis-${port}
  docker rm redis-${port}
done

    我们配置三主+两从模式,首先进入一个实例容器,并执行cluster命令进行主从分配

sudo docker exec -it redis-6379 bash
redis-cli --cluster create 172.18.0.2:6379 172.18.0.3:6380 172.18.0.4:6381 172.18.0.5:6382 172.18.0.6:6383 172.18.0.7:6384 172.18.0.8:6385 172.18.0.9:6386 172.18.0.10:6387 --cluster-replicas 2

    cluster nodes 查看节点信息

    然后主从复制的测试和我们上面哨兵一样,主从切换也是选择一台master并停止该容器​​​​​​​

sudo docker stop redis-6380sudo docker exec -it redis-6379 bash

    发现redis-6380主动被我们下线后,切换了6385这台之前的从库作为了新主库,可以再进行一下主从验证。

小结

    这一节我们基于docker搭建了两种集群模式,还剩下像codis这些中心化集群模式,大家感兴趣可以自己尝试去动手搭建使用一下。当然,真正的生产集群下会有更多异常的问题出现,比如cluster模式由于去中心化每个实例时间需要保持频繁的消息同步,因此当集群数量偏大时就会有一定的通信开销;或者说由于实例假死导致的脑裂等问题都是由于引入了集群复杂度导致的,这些问题都值得思考,后续有机会也会在专栏中详解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/84034.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(附源码)Spring Boot的网上作业管理系统 毕业设计 612317

基于Spring Boot的网上作业管理系统 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现…

【正点原子FPGA连载】第三十三章OV5640摄像头HDMI显示实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第三十三章OV564…

02-Neo4j-CQL

02-Neo4j-CQL&#xff1a; 1、CQL简介 CQL代表Cypher查询语言。 像Oracle数据库具有查询语言SQL&#xff0c;Neo4j具有CQL作为查询语言。 Neo4j CQL 它是Neo4j图形数据库的查询语言。它是一种声明性模式匹配语言它遵循SQL语法。它的语法是非常简单且人性化、可读的格式。 …

具有成本效益的深度信任网络的智能LEACH的多级动态优化(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 能量利用率是能量受限无线传感器网络&#xff08;WSN&#xff09;的关键属性&#xff0c;它直接影响网络的寿命。LEACH&#x…

C++入门篇之 注释语法什么写

&#x1f4d2;博客主页&#xff1a; ​​开心档博客主页​​ &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐留言&#x1f4dd; &#x1f4cc;本文由开心档原创&#xff01; &#x1f4c6;51CTO首发时间&#xff1a;&#x1f334;2022年12月12日&#x1f334; ✉…

python+requests接口自动化测试框架实例详解教程

前段时间由于公司测试方向的转型&#xff0c;由原来的web页面功能测试转变成接口测试&#xff0c;之前大多都是手工进行&#xff0c;利用postman和jmeter进行的接口测试&#xff0c;后来&#xff0c;组内有人讲原先web自动化的测试框架移驾成接口的自动化框架&#xff0c;使用的…

windows下Qt 5的安装与编译打包

环境与版本 操作系统&#xff1a;windows 10 Qt版本&#xff1a;5.14.2&#xff0c;最后一个有独立安装包的版本&#xff0c;下载地址&#xff1a;archive/qt/5.14/5.14.2 IDE&#xff1a;自带的qt-creator 4.11.1&#xff0c;也可以自行下载其他版本4.14.2&#xff0c;下载…

Mybatis实现增删改查

准备工作&#xff1a;建立项目&#xff0c;连接数据库MySQL&#xff0c;安装Mybatix插件 数据库代码准备&#xff1a; -- 删除tb_brand表 drop table if exists tb_brand; -- 创建tb_brand表 create table tb_brand (-- id 主键id int primary key auto_increment,…

itop3568开发板旋转uboot logo和内核logo

修改设备树 rk_android11.0_sdk/kernel/arch/arm64/boot/dts/rockchip/topeet_rk3568_lcds.dtsi 文件。如果配套的屏幕是 LVDS 7 寸屏幕或者 LVDS10.1 寸 1024*600 屏幕或者 LVDS10.1 寸 1280*800 屏幕&#xff0c;修改如下所示。 &route_lvds{ status "okay"; …

使用Postman+JMeter进行简单的接口测试

以前每次学习接口测试都是百度&#xff0c;查看相关人员的实战经验&#xff0c;没有结合自己公司项目接口真正具体情况。 这里简单分享一下公司项目Web平台的一个查询接口&#xff0c;我会使用2种工具Postman和JMeter如何对同一个接口做调试。 准备工作 首先&#xff0c;登录公…

GATK Germline_SNP_INDEL_2.0 分析遗传病(耳聋)

GATK Germline_SNP_INDEL_2.0 分析遗传病&#xff08;耳聋&#xff09; 一、本文是Gatk Germline spns-indels Pipeline 分析遗传病(耳聋)的升级版&#xff0c;目的是提供开箱即用的分析流程&#xff0c;尽可能简化部署和迁移。 更新内容如下&#xff1a; 人类参考基因组以及…

RTSP 媒体协议流的录制方案及其覆盖策略详解

前言 在安防和监控领域&#xff0c;RTSP 媒体协议流有很广泛的使用。本文将介绍一种针对 RTSP 媒体流的录制方案及其相应的覆盖策略。据我所知&#xff0c;声网的实时录制功能支持三种模式&#xff0c;分别是云端录制、本地服务端录制和页面录制&#xff0c;今天我们介绍的录制…

[基因遗传算法]进阶之六:VRP的进阶经典问题的解码如何写

文章目录一、CVRP二、MDCVRP2.1 解的编码分析2.2 代码2.3 分割展示三、VRPTW四、MDVRPTW4. 1 解的编码分析4.2 解的代码4.3 结果展示4. 4 MDVRPTW的计算适应度4.5 MDVRPTWd的结果展示图一、CVRP 见博文《[基因遗传算法]进阶之三:实践CVRP》 二、MDCVRP 参考资料:《Python实现…

Qt的场景图Scene Graph

叫场景树更合适&#xff0c;本质不是图。QML场景中的Qt Quick项目将填充QSGNode实例树。 场景图是Qt Quick 2.0引入的&#xff0c;建立在要绘制的内容是已知的基础上。所有QML项目均使用场景图进行渲染&#xff0c;场景图的默认实现是与OpenGL紧密相关的低级高性能渲染堆栈。 …

谈谈前端性能优化-面试版

前言 当我们去面试的时候&#xff0c;很大概率会被面试官问这么一个问题&#xff1a;你有尝试过对项目做性能优化吗&#xff1f;或者你了解哪些性能优化的方法&#xff1f;听到这个问题的你可能是这样的&#xff1a; 似曾相识但又说不清楚&#xff0c;往往只能零散地说出那么几…

Go string原理简析

引入 当查看string类型的变量所占的空间大小时&#xff0c;会发现是16字节&#xff08;64位机器&#xff09;。 str : "hello"fmt.Println(unsafe.Sizeof(str)) // 16也许你会好奇&#xff0c;为什么是16字节&#xff0c;它的底层存储模型是什么样子的。 源码分析 …

焦脱镁叶绿酸-a修饰量子点/荧光/药物/小分子抑制剂/上转换纳米颗粒/树枝状聚合物

小编在这里为大家分享的科研内容是焦脱镁叶绿酸-a修饰量子点/荧光/药物/小分子抑制剂/上转换纳米颗粒/树枝状聚合物的相关研究&#xff0c;来看&#xff01; 焦脱镁叶绿酸-a简介&#xff1a; 焦脱镁叶绿素-a是产物叶绿素a通过脱甲氧羰基、去植物醇、去Mg后的产物。该类物质具有…

day19【代码随想录】删除字符串中的所有相邻重复项、逆波兰表达式求值、滑动窗口最大值、前 K 个高频元素、数组中的第K个最大元素

文章目录前言一、删除字符串中的所有相邻重复项&#xff08;力扣047&#xff09;二、逆波兰表达式求值&#xff08;力扣150&#xff09;三、滑动窗口最大值&#xff08;力扣239&#xff09;四、前 K 个高频元素&#xff08;力扣347&#xff09;五、数组中的第K个最大元素&#…

MyBatis系列---crud返回值

目录1. service与mapper2. 更新操作3. 查询操作3.1. 返回值存储3.2. 简单映射3.3. ResultSet 的预处理3.4. 确定 ResultMap3.5. 创建映射结果对象3.6. 自动映射3.7. 存储对象3.8. 返回结果为单行数据3.9. 返回结果为多行数据3.10. 结论1. service与mapper mybatis一般与spring…

深度活体模型带交互模型版

🍿*★,*:.☆欢迎您/$:*.★* 🍿