搭建Redis主从集群和哨兵

news2024/10/6 12:33:06

说明:单机的Redis存在许多的问题,如数据丢失问题、高并发问题、故障恢复问题、海量数据的存储能力问题,针对这四个问题,对应解决方式有:数据持久化(参考:http://t.csdn.cn/SSyBi)、搭建主从集群、Redis哨兵和搭建分片集群;

本文介绍搭建Redis主从集群和哨兵,用以解决单机Redis的并发问题和故障恢复问题。操作系统是CentOS 7,远程连接工具是WindTerm。

单机安装

首先,先安装单机的Redis

第一步:下载Redis压缩包

可在官网(https://redis.io/download/#redis-downloads)下载,下载完成后将压缩包复制到云服务器或者Linux虚拟机里;

在这里插入图片描述

我这里放在/tmp/essay目录下

在这里插入图片描述

第二步:安装Redis所需的依赖

我安装过了,首次安装需要一点时间

yum install -y gcc tcl

在这里插入图片描述

第三步:解压

tar -xvf redis-6.2.4.tar.gz

在这里插入图片描述

第四步:编译

进入redis目录

cd redis-6.2.4

执行编译命令

make && make install

全程没有爆红,就是编译完成

在这里插入图片描述

在这里插入图片描述

第五步:修改配置文件

需要修改两个地方,一个是绑定地址(75行),默认是127.0.0.1,本地访问,需要修改为0.0.0.0,表示任意IP访问;

在这里插入图片描述

第二个是数据库数量(327行),默认是16,我们设置为1;

在这里插入图片描述

可通过下面的命令查看配置文件中对应的配置是否已经更改

grep -rina "关键字" 文件

可以看到地址已经修改了,可是数据库数量没有更改过来
在这里插入图片描述

修改完之后再看,已经修改完成

在这里插入图片描述

第六步:启动测试

redis-server redis.conf

可以看到,Redis可以正常启动;
在这里插入图片描述

如果出现了端口被占用的情况,可使用下面两个命令,查看端口被占用的进程PID,再强制结束该进程;

ps -ef |grep 端口号

kill -9 进程ID

在这里插入图片描述

关闭Redis(ctrl+c),开始搭建主从集群

在这里插入图片描述

主从集群

结构图

在这里插入图片描述

第一步:复制配置文件

将redis.conf配置文件拷贝三份,修改文件中对应的端口号(如8001、8002、8003),模拟三台Redis服务器;

注意,需要在Redis的目录外面操作;

# 创建三个目录,以端口号命名
mkdir 8001 8002 8003

# 复制redis配置文件到三个文件夹中
echo 8001 8002 8003 | xargs -t -n 1 cp redis-6.2.4/redis.conf

在这里插入图片描述

第二步:修改对应的端口号

修改对应目录下的配置文件中的端口号,注意路径,我这里的是/tmp/essay

sed -i -e 's/6379/8001/g' -e 's/dir .\//dir \/tmp\/essay\/8001\//g' 8001/redis.conf
sed -i -e 's/6379/8002/g' -e 's/dir .\//dir \/tmp\/essay\/8002\//g' 8002/redis.conf
sed -i -e 's/6379/8003/g' -e 's/dir .\//dir \/tmp\/essay\/8003\//g' 8003/redis.conf

在这里插入图片描述

第三步:绑定IP

修改每个目录里的配置文件,使每个Redis绑定一个固定IP,避免多个IP造成的混乱(如果是虚拟机操作);

printf '%s\n' 8001 8002 8003 | xargs -I{} -t sed -i '1a replica-announce-ip IP' {}/redis.conf

我这里改成自己云服务的内网IP,如果是虚拟机操作的话,那么改成自己虚拟机的IP就可以;

在这里插入图片描述

第四步:启动

可以创建三个窗口,分别启动这三个Redis

# 第1个
redis-server 8001/redis.conf
# 第2个
redis-server 8002/redis.conf
# 第3个
redis-server 8003/redis.conf

在这里插入图片描述

第五步:关联主从关系

此时,三台Redis服务器是相互独立的,没有主从关系。需要进入到对应的客户端里,建立主从关系;

# 指定端口进入对应的redis客户端
redis-cli -p 端口号
# 在子节点中设置master节点
slaveof master节点的IP 端口号
# 在master节点中查看子节点信息
info replication

例如设置8001为master节点,8002、8003均为8001的子节点

在这里插入图片描述

在master节点的redis日志中,可以看到另外两个节点发过来的同步请求同步信息;

同样,在另外两个子节点也可以看到对应的日志信息;

在这里插入图片描述

如果无法关联主从关系,检查一下三个redis.conf文件中的这行配置是否已经设置为0.0.0.0

在这里插入图片描述

第六步:使用

正如前面所说,搭建主从集群,可以解决高并发问题,这是通过读写分离实现的。

  • 子节点没有写能力,只有读能力;

  • master节点有读写能力;

在这里插入图片描述

小结

通过搭建主从集群,实现读写分离,可解决高并发问题。

另外,值得一提的是:

(1)主从集群可以设置临时和永久两种模式,上面通过命令行的方式设置的是临时模式,重启redis服务后失效。想要设置永久模式,可将命令写在对应的redis.conf配置文件中。

(2)在redis 5.0以后,新增了replicaof命令,效果与slaveof一样。

Redis哨兵

结构图

在这里插入图片描述

第一步:创建文件

在essay目录下,创建三个目录(s1、s2、s3),分别表示三个哨兵,端口号分别是28001、28002、28003;

# 创建三个目录
mkdir s1 s2 s3

进入s1目录,创建sentinel.conf文件,文件内容如下,补充上IP地址

# 创建sentinel.conf文件
touch sentinel.conf
port 28001
sentinel announce-ip IP地址
sentinel monitor mymaster IP地址 8001 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
dir "/tmp/essay/s1"

在这里插入图片描述

第二步:复制文件到其他目录

在essay目录下,将s1中的文件复制一份到另外两个文件夹中

echo s2 s3 | xargs -t -n 1 cp s1/sentinel.conf

在这里插入图片描述

第三步:修改配置文件

修改另外两个配置文件中的端口号

sed -i -e 's/28001/28002/g' -e 's/s1/s2/g' s2/sentinel.conf
sed -i -e 's/28001/28003/g' -e 's/s1/s3/g' s3/sentinel.conf

在这里插入图片描述

第四步:启动哨兵

分别启动三个哨兵

# 第1个
redis-sentinel s1/sentinel.conf
# 第2个
redis-sentinel s2/sentinel.conf
# 第3个
redis-sentinel s3/sentinel.conf

通过日志信息,可以看到哨兵已经监测到了前面的主从集群

在这里插入图片描述

第五步:使用

手动尝试把8001master节点宕机,查看另外两个子节点是否可以异常恢复;

在这里插入图片描述

(8002端口Redis:可以发现,8002有关于8001、8003的请求同步日志,说明此时8002成为新的master节点)

在这里插入图片描述

(8003端口Redis:可以看到8001宕机后,8003连接数次失败后,转为连接8002,说明此时8002称为新的master节点)
在这里插入图片描述

查看哨兵日志,可以看到详细的日志记录,表明8001宕机后,8002称为了新的master节点;

(哨兵日志图片.png)

如果此时8001重新上线,将作为8002的子节点

在这里插入图片描述

小结

通过增加哨兵,可以解决单机Redis故障问题

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

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

相关文章

07-尚硅谷大数据技术之Spark源码

1. 环境准备(Yarn 集群) 搭建Spark on Yarn集群 3.3 Yarn 模式 独立部署(Standalone)模式由 Spark 自身提供计算资源,无需其他框架提供资源。这种方式降低了和其他第三方资源框架的耦合性,独立性非常强。但…

C#鼠标拖拽,移动图片实例

最近工作需要做一个鼠标可以拖拽移动图片的功能。 写了几个基本功能,勉强能用。这里记录一下。欢迎大神补充。 这个就是完成的功能。 下边的绿色是一个pictureBox,白色框也是一个pictureBox,他们二者是子父级关系。 绿色是父级&#xff0c…

网约车订单自助测试演进与落地实践

1► 业务背景 网约车业务作为滴滴的核心业务,系统架构复杂、整个订单链路涉及众多下游服务,整体迭代频率高,同时在产品形态上通过不同品类提供差异化服务能力,整体品类从最初的专车、快车延展到如今多个品类,这就导致在…

Android 分别使用Java和Kotlin给Textview设置第三方字体、APP全局字体、 Android X字体设置

前言 本文介绍Android实现全局设置自定义字体和局部设置自定义字体即单个TextView设置字体,同时也提供了一些优秀的三方字体框架,基本可以满足开发者对字体设置的全部要求。 使用自定义字体前后效果图 一、assets是什么? 首先需要了解Andr…

【11】STM32·HAL库开发-STM32CubeMX简介、安装 | 新建STM32CubeMX工程步骤

目录 1.STM32CubeMX简介(了解)2.STM32CubeMX安装(了解)2.1STM32CubeMX软件获取2.1.1获取Java软件2.1.2获取STM32CubeMX软件 2.2搭建Java运行环境2.3安装STM32CubeMX软件(必须先2.2再2.3)2.4下载和关联STM32…

若依cloud(RuoYi-Cloud)新增业务模块和功能模块增删改查演示

前言 看了几篇文章感觉都不太满意,索性自己来写一篇。 一、后端 后端新建业务模块流程大致如下: 1、后端新建一个(在ruoyi-module模块下)业务模块,仿照已有的模块将此模块配置好,例如仿照系统模块&…

6、PHP语法要点(1)

PHP的语法跟C语言还是类似的。 1、变量不用定义即可直接使用。 2、函数外定义的变量为全局变量。global 关键字用于函数内访问全局变量。 3、static 用于保持函数内局部变量的值。但在函数外依然不能访问。 4、PHP 将所有全局变量存储在一个名为 $GLOBALS[index] 的数组中。…

GptFu0k——ChatGpt连接源爬取器

最近ChatGPT的热度下去了,但是我相信,很多真正需要的人还是一直在用的,为了解决ChatGPT账号的问题还有网络连接问题,通常会花费大量时间去寻找,为了解决这个棘手的问题,GptFu0k横空出世,全网爬取…

提高LLaMA-7B的数学推理能力

概述 这篇文章探讨了利用多视角微调方法提高数学推理的泛化能力。数学推理在相对较小的语言模型中仍然是一个挑战,许多现有方法倾向于依赖庞大但效率低下的大语言模型进行知识蒸馏。研究人员提出了一种避免过度依赖大语言模型的新方法,该方法通过有效利…

Ctfshow Crypto全

目录 各种各样的编码 crypto0(凯撒) crypto2(jsfuck) crypto3(aaencode) crypto4(知p q e求d) crypto5(知p q e c求d) crypto6(Rabbit) crypto7(Ook!) crypto8(BrainFuck) crypto9(serpent) crypto10(quoted-printable) crypto11(md5) crypto12(埃特巴什码) cryp…

AI Chat 设计模式:8. 门面(外观)模式

本文是该系列的第八篇,采用问答式的方式展开,问题由我提出,答案由 Chat AI 作出,灰色背景的文字则主要是我的一些思考和补充。 问题列表 Q.1 请介绍一下门面模式A.1Q.2 该模式由哪些角色组成呢A.2Q.3 举一个门面模式的例子A.3Q.4…

vue的computed复习

1.复杂 data 的处理方式 三个案例:  案例一:我们有两个变量: firstName 和 lastName ,希望它们拼接之后在界面上显示;  案例二:我们有一个分数: score  当 score 大于 60 的时候&#xf…

云拨测全面升级丨单次拨测低至 0.001 元

作者:少焉 随着云原生、微服务技术的发展,可观测需求变得越来越强烈,作为可观测技术的重要能力之一,云拨测(Synthetics Monitor)由于其零侵入、开箱即用、主动式监测手段,也受到很多用户的青睐…

arcgis建筑物平均高度

主要用到相交和属性表的汇总功能。 路网 建筑物栋 相交结果 右键,bh列汇总 原始块有392,这里只有389,说明有的地块没有建筑,所以应该将表连接到原始街区上检查是否合理,以及随机验证一个结果是否正确。 连接结果&…

【问题总结】基于docker-compose实现nginx转发redis

目录: 文章目录 需求简介:Q1: nginx的http模块和http模块有什么不同Q2: 可以都使用stream模块进行配置吗 Docker环境下如何转发1 修改docker-compose2 修改nginx.conf3 测试连接 需求简介: 需要在192.168.3.11的ngnix上,转发192.…

wordpress 导入数据后 为什么总是跳转到安装页面

在WordPress导入数据后跳转到安装页面的问题可能由以下原因引起: 数据库连接问题:在导入数据之前,确保您的WordPress配置文件中的数据库连接信息正确且完整。打开 wp-config.php 文件,确保数据库的名称、用户名、密码和主机信息是…

springboot整合spring security的简单入门案例

一 工程结构 二 配置操作 2.1 pom文件配置 <!-- Spring Security依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency> 2.2 config配置 Config…

vue中预览pdf

情况一 如果后端返回的pdf地址&#xff0c;粘贴到浏览器的url框中&#xff0c;可以在浏览器中直接进行预览的&#xff0c;那么我们就用window.open&#xff0c;或 a标签&#xff0c;或iframe标签通过设置src进行预览即可 法1&#xff1a;可以直接使用window.open&#xff08;…

css学习知识总结

一、css与html连接&#xff1a; 可以将css语句放在html内部&#xff0c;一般放在<head>之下&#xff0c;定义在<style>中&#xff0c;格式一般是一个“.”然后加上一个“名称”再加上一个“{}”&#xff0c;再在“{}”内部定义具体的语句。 二、调整元素 2.1 字体…

网络 socket

文章目录 概念和 TCP、UDP 区别和 HTTP 区别 概念 为网络通信提供的接口&#xff0c;定义了应用程序如何访问网络资源、如何发送和接收数据等&#xff0c;Socket 是一个包含了IP地址和端口号的组合&#xff0c;当一个应用程序想要与另一个应用程序通信时&#xff0c;它会向特定…