当前位置: 首页 > news >正文

Redis_主从复制、哨兵模式、集群模式详解

Redis的主从复制

为什么Redis要引入主从复制?what?
在这里博主为小伙伴们简单的做下解释,可以了解一下
实际生产环境下,单机的redis服务器是无法满足实际的生产需求的。

第一,单机的redis服务器很容易发生单点故障,即使redis提供了各种持久化的方法来避免数据的丢失,但是物理上的故障(硬盘损毁等)还是无法完全避免的。
第二,如果对单台机器的性能进行纵向拓展,无论是CPU,内存还是磁盘容量都很容易达到瓶颈,无法满足实际需求。

针对这些问题,redis提供了**复制(replication)**的功能,通过"主从(一主多从)"和"集群(多主多从)"的方式对redis的服务进行水平扩展,用多台redis服务器共同构建一个高可用的redis服务系统。

搭建步骤

在Redis的主从模型下,主服务器既可以读也可以写,而从服务器原则上只允许读操作。接下来我们讲解一下主从复制的搭建。
(如果不懂得搭建Redis可以去看博主之前的文章Redis下载安装教程(详细步骤))
(在这里我们准备三台装有Redis的机器并保证初始数据保持一致)

  1. 克隆2台Redis机器,并编辑redis.conf
3台机器都要编辑绑定ip地址
bind 0.0.0.0
  1. 主机正常启动,并关闭防火墙
systemctl stop firewalldredis-server /etc/redis/redis.conf
  1. 配置从机,编辑redis.conf
在 port 6379 后添加如下配置
slaveof 主机ip  redis端口号
#示例如下:
slaveof 192.168.240.134 6380
  1. 启动从机
redis-server /etc/redis/redis.conf
  1. 查看主从信息
#登录主库 redis-cli
info replication

Redis的哨兵模式

先来说一下哨兵模式的基础性小知识,感兴趣的可以做下了解
主从复制解决了数据备份的问题,但是如果主节点宕机,仍需要运维手动进行主从切换。要在主从复制下实现故障恢复的自动化,就需要使用Redis的哨兵(Sentinel)模式。

哨兵是一个独立于数据服务器的进程,用于监控redis数据服务器的状态,当主从模式下最关键的主服务器出现故障时,能够被哨兵自动的察觉。同时哨兵会在剩余的从服务器中**“选举”**出新的主服务器,达到自动化恢复系统服务的目的。
在这里插入图片描述
哨兵本身也要考虑单点故障的问题,所以Redis Sentinel一般由3~5个节点组成,这样即使挂了个别哨兵节点,哨兵整体还可以正常工作。
客户端来连接集群时,会首先连接 sentinel,通过 sentinel 来查询主节点的地址,然后再去连接主节点进行数据交互。当主节点发生故障时,客户端会重新向 sentinel 要地址,sentinel 会将最新的主节点地址告诉客户端。如此应用程序将无需重启即可自动完成节点切换。

通过如下图,演示故障切换的过程:

在这里插入图片描述
从上图可以看到主节点挂掉了,原先的主从复制也断开了,客户端和损坏的主节点也断开了。从节点被提升为新的主节点,其它从节点开始和新的主节点建立复制关系。客户端通过新的主节点继续进行交互。

在这里插入图片描述
Sentinel 会持续监控已经挂掉了主节点。待它恢复后,原先挂掉的主节点现在变成了从节点,从新的主节点那里建立复制关系。

搭建步骤

(配置3个Redis(1主2从),3个哨兵)
(下面主机ip为192.168.146.23)

  1. 配置主从复制
    主机配置redis.conf:
bind 127.0.0.1
修改为:
bind 机器ip

从机1配置redis.conf:

bind 127.0.0.1 修改为:bind 0.0.0.0
并添加配置:slaveof 主节点ip  端口号
示例:slaveof 192.168.146.23 6379

从机2配置redis.conf:

bind 127.0.0.1 修改为:bind 0.0.0.0
并添加配置:slaveof 主节点ip  端口号
示例:slaveof 192.168.146.23 6379

重复执行redis-server /etc/redis/redis.conf 启动3个redis实例。

  1. 配置哨兵
    哨兵1配置sentinel.conf:
添加bind 当前机器ip
将 sentinel monitor mymaster 127.0.0.1 6379 2
修改为 sentinel monitor mymaster 192.168.146.23 6379 2

哨兵2配置sentinel.conf:

添加bind 当前机器ip
将 sentinel monitor mymaster 127.0.0.1 6379 2
修改为 sentinel monitor mymaster 192.168.146.23 6379 2

哨兵3配置sentinel.conf:

添加bind 当前机器ip
将 sentinel monitor mymaster 127.0.0.1 6379 2
修改为 sentinel monitor mymaster 192.168.146.23 6379 2

重复执行redis-sentinel /etc/redis/sentinel.conf 启动3个哨兵。

  1. 连接哨兵,查看redis主从信息
redis-cli -h 哨兵ip -p 26379
比如: redis-cli -h 192.168.146.26 -p 26379
执行info命令# Server
redis_version:5.0.10
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:87154668b9be1de7
redis_mode:sentinel
os:Linux 3.10.0-862.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:4.8.5
process_id:5489
run_id:ffec09007fa40ab368227ca757fea7c1deeab585
tcp_port:26379
uptime_in_seconds:349
uptime_in_days:0
hz:11
configured_hz:10
lru_clock:8401446
executable:/root/redis-sentinel
config_file:/etc/redis/sentinel.conf# Clients
connected_clients:3
client_recent_max_input_buffer:2
client_recent_max_output_buffer:0
blocked_clients:0# CPU
used_cpu_sys:3.608731
used_cpu_user:0.556983
used_cpu_sys_children:0.000000
used_cpu_user_children:0.000000# Stats
total_connections_received:4
total_commands_processed:933
instantaneous_ops_per_sec:2
total_net_input_bytes:53617
total_net_output_bytes:7440
instantaneous_input_kbps:0.03
instantaneous_output_kbps:0.01
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
expired_stale_perc:0.00
expired_time_cap_reached_count:0
evicted_keys:0
keyspace_hits:0
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:0
migrate_cached_sockets:0
slave_expires_tracked_keys:0
active_defrag_hits:0
active_defrag_misses:0
active_defrag_key_hits:0
active_defrag_key_misses:0# Sentinel 这里可以看到主节点信息
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.146.23:6379,slaves=2,sentinels=3

关掉主节点,然后过几秒刷新info,可以看到选举后的新的主节点信息。

Redis的集群模式

Redis 的哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下仍存在如下的问题:

  • 单个redis主节点的写并发有限
  • 单个redis接收所有的数据,最终回导致内存太大,内存太大回导致rdb文件过大,从很大的rdb文件中同步恢复数据会很慢

为此,Redis提供了Redis Cluster(集群)来解决这些问题。集群实现了 Redis 的分布式存储,也就是说每台 Redis 节点上存储不同的内容,Redis中多个节点共同担起存储数据的任务。

Redis Cluster 中整个数据库被划分为 16384 个slots(槽),数据库中每一个键都属于这16384中的一个,集群中的每个节点负责其中一部分槽位。
当 Redis Cluster 的客户端来连接集群时,它也会得到一份集群的槽位配置信息。这样当客户端要查找某个 key 时,可以直接定位到目标节点。
可以认为Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。

搭建步骤

为了配置一个redis cluster,官方建议我们我们需要准备至少6台redis.其中至少3个主节点:既然有3个主节点,而一个主节点搭配至少一个从节点,因此至少得6台redis

  1. 准备6台机器(安装redis并且保证初始数据纯净),并关闭防火墙和selinux
  2. 配置6个节点:都是编辑redis.conf
主节点1:192.168.146.31
bind 当前机器ip
cluster-enabled yes 主节点2:192.168.146.32
bind 当前机器ip
cluster-enabled yes 主节点3:192.168.146.33
bind 当前机器ip
cluster-enabled yes 从节点1:192.168.146.34
bind 当前机器ip
cluster-enabled yes从节点2:192.168.146.35
bind 当前机器ip
cluster-enabled yes从节点3:192.168.146.36
bind 当前机器ip
cluster-enabled yes
  1. 启动6台Redis,并在每个节点上执行flushall命令(目的是清空redis中原有的数据)
  2. 执行以下命令,创建Redis集群
# --cluster-replicas 1 表示从节点的个数,每个主节点配置1个从节点
[root@localhost opt]#redis-cli --cluster create 192.168.146.31:6379 192.168.146.32:6379
192.168.146.33:6379 192.168.146.34:6379 192.168.146.35:6379 192.168.146.36:6379 --clusterreplicas 1
redis-cli --cluster create 192.168.252.31:6379 192.168.252.32:6379 192.168.252.33:6379
192.168.252.34:6379 192.168.252.35:6379 192.168.252.36:6379 --cluster-replicas 1
如果出现以下错误
>>> Creating cluster
[ERR] Node 192.168.146.31:6379 is not empty. Either the node already knows other nodes
(check with CLUSTER NODES) or contains some key in database 0.
解决方案: 在每台机器上执行 flushall 命令
另外可以通过:cluster reset命令重置集群
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.146.31:6379
192.168.146.32:6379
192.168.146.33:6379
Adding replica 192.168.146.34:6379 to 192.168.146.31:6379
Adding replica 192.168.146.35:6379 to 192.168.146.32:6379
Adding replica 192.168.146.36:6379 to 192.168.146.33:6379
M: 3c8b6b84a16516c6fcccdcc2025fa656420d5c6c 192.168.146.31:6379
slots:0-5460,5798,6257,11921 (5464 slots) master
M: e98a7244dac95763902b11ad5a2689cfd0231350 192.168.146.32:6379
slots:741,5461-10922,11921 (5464 slots) master
M: f9efde9fbe682281602331c523d670e0a2d4c659 192.168.146.33:6379
slots:741,5798,6257,10923-16383 (5464 slots) master
S: d02eb5f1f321520104197eb3b4cc7ffa74a843af 192.168.146.34:6379
replicates 3c8b6b84a16516c6fcccdcc2025fa656420d5c6c
S: e9d037bdddfe4a9f0f29d7d28727f09d6d07c550 192.168.146.35:6379
replicates e98a7244dac95763902b11ad5a2689cfd0231350
S: 1bc1c56b3260469b8c3ddb13eb5f6e25f88abb7c 192.168.146.36:6379
replicates f9efde9fbe682281602331c523d670e0a2d4c659
Can I set the above configuration? (type 'yes' to accept): 输入yes
最终看到如下输出:
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
[OK] All 16384 slots covered.
  1. 链接集群
redis-cli [-p 端口号] -c 

相关文章:

Redis_主从复制、哨兵模式、集群模式详解

Redis的主从复制 为什么Redis要引入主从复制?what? 在这里博主为小伙伴们简单的做下解释,可以了解一下 实际生产环境下,单机的redis服务器是无法满足实际的生产需求的。 第一,单机的redis服务器很容易发生单点故障&am…...

关于神舟-战神TA5NS系统重装问题

加装固态卡在log处无法开机问题 下面是我的步骤 1.按f7选择pe安装系统,然后发现卡在战神log处不转动 2.下载驱动 TA5NS驱动地址 下载RAID驱动(如果没有私信我,我网盘里有),拷到u盘中,然后进入pe系统里面…...

前端大文件上传webuploader(react + umi)

使用WebUploader还可以批量上传文件、支持缩略图等等众多参数选项可设置,以及多个事件方法可调用,你可以随心所欲的定制你要的上传组件。 分片上传 1.什么是分片上传 分片上传,就是将所要上传的文件,按照一定的大小,将…...

人大金仓(kingbase)数据库常用sql命令

一. 字段 1. 添加 alter table book add column book_id varchar not null, book_title varchar(10) default ;2. 删除 alter table book drop book_id, book_title;// 外键时 alter table book drop book_id, book_title cascade;3. 修改类型 alter table book alter colu…...

HashMap相关专题

前置知识:异或运算 异或运算介绍 异或有什么神奇之处(应用)? (1)快速比较两个值 (2)我们可以使用异或来使某些特定的位翻转,因为不管是0或者是1与1做异或将得到原值的相…...

threejs WebGLRenderer 像素比对画布大小的影响

官方文档 - WebGLRenderer .setPixelRatio ( value : number ) : undefined 设置设备像素比。通常用于避免HiDPI设备上绘图模糊 .setSize ( width : Integer, height : Integer, updateStyle : Boolean ) : undefined 将输出canvas的大小调整为(width, height)并考虑设备像素比…...

RocketMQTemplate.send() 与 RocketMQTemplate.syncSend() 方法详解

Apache RocketMQ 是一款强大的分布式消息中间件,与 Spring Boot 集成后,通过 RocketMQTemplate 提供了多种方法来发送消息。其中,send() 和 syncSend() 是两个常用的发送消息方法,本文将深入探讨它们的区别以及详细解释这两个方法…...

波奇学C++:类型转换和IO流

隐式类型转换 int i0; double pi; 强制类型转换 int* pnullptr; int a(int)p; 单参数构造函数支持隐式类型转换 class A { public:A(string a):_a(a){} private:string _a; }; A a("xxxx"); //"xxx" const char* 隐式转换为string 多参数也可以通过{…...

集成开发环境 PyCharm 的安装【侯小啾python基础领航计划 系列(二)】

集成开发环境PyCharm的安装【侯小啾python基础领航计划 系列(二)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…...

Java核心知识点整理大全27-笔记(已完结)

目录 30. 云计算 30.1.1. SaaS 30.1.2. PaaS 30.1.3. IaaS 30.1.4. Docker 30.1.4.1. 概念 30.1.4.2. Namespaces 30.1.4.3. 进程(CLONE_NEWPID 实现的进程隔离) 30.1.4.4. Libnetwork 与网络隔离 30.1.4.5. 资源隔离与 CGroups 30.1.4.6. 镜像与 UnionFS 30.1.4.7.…...

1. 使用poll或epoll创建echo服务器

1. 说明&#xff1a; 此篇博客主要记录一种客户端实现方式&#xff0c;和两种使用poll或者epoll分别创建echo服务器的方式&#xff0c;具体可看代码注释&#xff1a; 2. 相关代码&#xff1a; 2.1 echoClient.cpp #include <iostream> #include <cstdio> #incl…...

【对象数组根据属性排序】

// sort使用的排序方法 // 传入对象数组用于排序的对象的属性,升序/降序 function compare(property, sortType "asc") {debugger// 如果不是 asc,desc,不做下一步比较if (!(sortType "desc" || sortType "asc")) {return;}return function (…...

BACnet I/O模块:楼宇自动化的未来选择

在楼宇自动化领域&#xff0c;BACnet通信协议在确保设备之间无缝高效的数据交换方面发挥着至关重要的作用。该领域使用广泛的协议是BACnet。它使传感器、执行器和控制器等设备能够相互通信&#xff0c;从而促进工业过程的自动化。 BACNET介绍 BACnet是专门为楼宇自动化和控制系…...

android项目实战之使用框架 集成多图片、视频的上传

效果图 实现方式&#xff0c;本功能使用PictureSelector 第三方库 。作者项目地址&#xff1a;https://github.com/LuckSiege/PictureSelector 1. builder.gradle 增加 implementation io.github.lucksiege:pictureselector:v3.11.1implementation com.tbruyelle.rxpermissio…...

MyBatis查询优化:枚举在条件构建中的妙用

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…...

Isaac Sim教程04 Isaac Sim的高级使用

Isaac Sim 高级使用 版权信息 Copyright 2023 Herman YeAuromix. All rights reserved.This course and all of its associated content, including but not limited to text, images, videos, and any other materials, are protected by copyright law. The author holds…...

《数据结构、算法与应用C++语言描述》-线索二叉树的定义与C++实现

_23Threaded BinaryTree 可编译运行代码见&#xff1a;GIithub::Data-Structures-Algorithms-and-Applications/_24Threaded_BinaryTree 线索二叉树定义 在普通二叉树中&#xff0c;有很多nullptr指针被浪费了&#xff0c;可以将其利用起来。 首先我们要来看看这空指针有多少…...

删除误提交的 git commit

背景描述 某次的意外 commit 中误将密码写到代码中并且 push 到了 remote repo 里面, 本文将围绕这个场景讨论如何弥补. 模拟误提交操作 在 Gitee 创建一个新的 Repo, clone 到本地 git clone https://gitee.com/lpwm/myrepo.git创建两个文件, commit 后 push 到 remote 作…...

机器学习---pySpark案例

1、统计PV&#xff0c;UV 1.if __name__ __main__: 2. conf SparkConf() 3. conf.setMaster("local") 4. conf.setAppName("test") 5. sc SparkContext(confconf) 6. 7. #pv 8. sc.textFile("./pvuv").map(lambda line:(l…...

【链表Linked List】力扣-24 两两交换链表中的节点

目录 题目描述 解题过程 题目描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;he…...

企业微信协议开发,API接口调用

产品说明 一、 hook版本&#xff1a;企业微信hook接口是指将企业微信的功能封装成dll&#xff0c;并提供简易的接口给程序调用。通过hook技术&#xff0c;可以在不修改企业微信客户端源代码的情况下&#xff0c;实现对企业微信客户端的功能进行扩展和定制化。企业微信hook接口…...

代码随想录算法训练营 ---第五十五天

今天是 动态规划&#xff1a;编辑距离问题。 第一题&#xff1a; 简介&#xff1a; 动态规划五部曲&#xff1a; 1.确定dp数组的含义 dp[i][j] 表示以下标i-1为结尾的字符串s&#xff0c;和以下标j-1为结尾的字符串t&#xff0c;相同子序列的长度为dp[i][j]。 2.确定递推公…...

【Intel/Altera】 全系列FPGA最新汇总说明,持续更新中

前言 2023年11月14日英特尔 FPGA中国技术日&#xff0c;Intel刚发布了新的FPGA系列&#xff0c;官网信息太多&#xff0c;我这里结合以前的信息&#xff0c;简单汇总更新一下&#xff0c;方便大家快速了解Intel/Altera FPGA家族。 目录 前言 Altera和Intel 型号汇总 1. Agi…...

利用flask将yolov5算法封装成在线推理服务

本脚本主要参考了yolov5工程文件夹下面的detect.py,将yolov5算法封装成了一个在线的推理服务,可以接受app请求,然后推理图片,并将检测结果以json返回,该服务可以供数据标注平台请求。 from flask import * import shutil import json import os import pynvml import pand…...

vue3父子传值实现弹框功能

在Vue3中&#xff0c;我们可以通过 provide 和 inject 来实现父子组件之间的数据传递&#xff0c;这也适用于实现弹框功能。下面是一个简单的例子&#xff1a; 父组件代码&#xff1a; <template><div><button click"showDialog">打开弹框</b…...

C++入门【2-C++ 数据类型】

C 数据类型 使用编程语言进行编程时&#xff0c;需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着&#xff0c;当您创建一个变量时&#xff0c;就会在内存中保留一些空间。 您可能需要存储各种数据类型&#xff08;比如字符型、宽字符型、整型…...

按照官网文档 通过useExtendedLib扩展库 引入WeUI,报错 组件未定义 | 解决办法

检查开发者工具版本是否过老 参考博客 不要使用 游客模式&#xff0c;游客模式不支持&#xff0c;请注册Appid 使用。 注意 扩展库方式 和 npm 方式不能同时使用&#xff0c;会有相应报错...

Chat-GPT原理

Chat-GPT原理核心:基于Transformer 架构 ​ 以下是参考文献的部分截图原文说明&#xff1a; ​ Transformers are based on the “attention mechanism,” which allows the model to pay more attention to some inputs than others, regardless of where they show up in t…...

GODOC命令无效,原因是需要手动安装

在看《GO程序设计语言》这本书&#xff0c;按照其中的内容&#xff0c;想看下GO自带的包的文档。 书中讲&#xff0c;可以直接输入GoDOC命令来打开一个服务器&#xff0c;从而可以用浏览器访问文档库。输入命令后&#xff0c;系统提示找不到该命令。 查了资料后才发现&#xff…...

忽略python运行出现的大量警告

添加以下代码即可 import warnings warnings.filterwarnings(ignore)...

时时彩网站开发出售/百度获客平台

判断插入值是否重复&#xff1a;事务和存储过程优化CREATE PROCEDURE IR_rb_User_UpdateUser( UserID int, Name nvarchar(50), Email nvarchar(100), Password nvarchar(20), RoleID int, iSuccess int output)ASset iSu…...

做个网站跳转链接怎么做/排名推广网站

抛开高频套利交易模式不谈&#xff0c;致力于捕捉日内趋势的波段交易模式应作为日内交易系统的首选策略。对于趋势跟踪的方法&#xff0c;最为简单有效的策略仍应当是突破交易。 在大波动行情发生的必经之路守株待兔&#xff0c;是成功实现趋势跟踪的有效路径。其实&#xff0…...

做网站ui主要研究内容/正能量网站地址链接免费

使用小程序 自带的api my.getLocation 如果你用的模拟器的话 提起需要定义一个位置 my.getLocation({type:1, // 传入type 没有type 或者type0的情况下 是没有城市的success(res) {my.alert({title:你所在的城市是res.city});}})...

服装网站源码php/搜索引擎优化关键词的处理

RelativeLayout&#xff1a;基于其他控件&#xff08;包括同容器中控件和容器(父)控件&#xff09;的layout 相对于容器控件&#xff08;父控件&#xff09; android:layout_alignParentLeft"true" 将控件的左边缘和父控件的左边缘对齐 RelativeLayout andro…...

长沙做营销型网站公司/百合seo培训

客户端文件自动备份到服务器 内容精选换一换用户可以在公有云MRS集群以外的节点上使用客户端&#xff0c;在使用客户端前需要安装客户端。如果集群外的节点已安装客户端且只需要更新客户端&#xff0c;请使用安装客户端的用户例如root。针对MRS 3.x之前版本的集群&#xff0c;需…...

青岛知名网站建设公司/百度推广登录平台网址

导读&#xff1a;一直以来&#xff0c;众多学校教学以及公司开发环境所使用Visual Studio .NET Framework版本多不相同&#xff0c;本文作者比较了.NET Framework多个版本之间的区别&#xff0c;方便各位选择和切换.NET Framework。 版本号发布日期Visual Studio的版本Windows上…...