关于redis的主从、哨兵、集群

2023-11-10

开发十年,就只剩下这套Java开发体系了 >>>   hot3.png

 

关于redis主从、哨兵、集群的介绍网上很多,这里就不赘述了。

一、主从

通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重启会从硬盘上加载数据。 
。但是由于数据是存储在一台服务器上的,如果这台服务器出现硬盘故障等问题,也会导致数据丢失。为了避免单点故障,通常的做法是将数据库复制多个副本以部署在不同的服务器上,这样即使有一台服务器出现故障,其他服务器依然可以继续提供服务。为此, Redis 提供了复制(replication)功能,可以实现当一台数据库中的数据更新后,自动将更新的数据同步到其他数据库上。
在复制的概念中,数据库分为两类,一类是主数据库(master),另一类是从数据库[1] (slave)。主数据库可以进行读写操作,当写操作导致数据变化时会自动将数据同步给从数据库。而从数据库一般是只读的,并接受主数据库同步过来的数据。一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。
主从数据库的配置
master  slave 
主不用配置,从redis的conf文件加入 slaveof ip port 就可以了 
或者从redis启动时  redis-server --port 6380 --slaveof 127.0.0.1 6379 
    从数据库一般是只读,可以改为可写,但写入的数据很容易被主同步没,所以还是只读就可以。 
也可以在运行是使用slaveof ip port命令,停止原来的主,切换成刚刚设置的主  slaveof no one会把自己变成主

复制原理
当从数据库启动时,会向主数据库发送sync命令,主数据库接收到sync后开始在后台报错快照rdb,在保存快照期间受到的命名缓存起来,当快照完成时,主数据库会将快照和缓存的命令一块发送给从。复制初始化结束。
之后,主每受到1个命令就同步发送给从。 
当出现断开重连后,2.8之后的版本会将断线期间的命令传给重数据库。增量复制

主从复制是乐观复制,当客户端发送写执行给主,主执行完立即将结果返回客户端,并异步的把命令发送给从,从而不影响性能。也可以设置至少同步给多少个从主才可写。 
无硬盘复制:如果硬盘效率低将会影响复制性能,2.8之后可以设置无硬盘复制,repl-diskless-sync yes

二、哨兵

当主数据库遇到异常中断服务后,开发者可以通过手动的方式选择一个从数据库来升格为主数据库,以使得系统能够继续提供服务。然而整个过程相对麻烦且需要人工介入,难以实现自动化。 为此,Redis 2.8中提供了哨兵工具来实现自动化的系统监控和故障恢复功能。
哨兵的作用就是监控redis主、从数据库是否正常运行,主出现故障自动将从数据库转换为主数据库。

顾名思义,哨兵的作用就是监控Redis系统的运行状况。它的功能包括以下两个。

    (1)监控主数据库和从数据库是否正常运行。 
    (2)主数据库出现故障时自动将从数据库转换为主数据库。

可以用info replication查看主从情况 
例子: 
1主2从  1哨兵,可以用命令起也可以用配置文件里 
可以使用双哨兵,更安全, 
redis-server --port 6379 
redis-server --port 6380 --slaveof 192.168.0.167 6379 
redis-server --port 6381 --slaveof 192.168.0.167 6379


redis-sentinel sentinel.conf 
哨兵配置文件 
    sentinel.conf 
        sentinel monitor mymaster 192.168.0.167 6379 1 

其中mymaster表示要监控的主数据库的名字,可以自己定义一个。这个名字必须仅由大小写字母、数字和“.-_”这 3 个字符组成。后两个参数表示主数据库的地址和端口号,这里我们要监控的是主数据库6379。
注意:

    1、使用时不能用127.0.0.1,需要用真实IP,不然java程序通过哨兵会连到java程序所在的机器(127.0.0.1 )

    2、配置哨兵监控一个系统时,只需要配置其监控主数据库即可,哨兵会自动发现所有复制该主数据库的从数据库

 

这样哨兵就能监控主6379和从6380、6381,一旦6379挂掉,哨兵就会在2个从中选择一个作为主,根据优先级选,如果一样就选个id小的,当6379再起来就作为从存在。

主从切换过程:

(1)      slave leader升级为master 
(2)      其他slave修改为新master的slave 
(3)      客户端修改连接 
(4)      老的master如果重启成功,变为新master的slave


哨兵监控1主2从,停掉主,哨兵会选出1个从作为主,变成1主1从。然而当我把原来的主再起来,它不会作为从,只是个独立的节点。

如果在新的主刚被选出来时,我把原来的主起来,它就能成为新主的从节点。 
如果在新的主选出来过一会再起原来的主,就不能成为新主的从节点 
或者在老的主起来后,重启哨兵也能把它变成从,哨兵配置文件里有,哨兵会执行“+convert-to-slave”

这很奇怪,我也没弄明白是怎么回事。

三、集群

即使使用哨兵,redis每个实例也是全量存储,每个redis存储的内容都是完整的数据,浪费内存且有木桶效应。为了最大化利用内存,可以采用集群,就是分布式存储。即每台redis存储不同的内容,
共有16384个slot。每个redis分得一些slot,hash_slot = crc16(key) mod 16384 找到对应slot,键是可用键,如果有{}则取{}内的作为可用键,否则整个键是可用键
集群至少需要3主3从,且每个实例使用不同的配置文件,主从不用配置,集群会自己选。

修改每个实例的配置文件:

    cluster-enabled yes  --开启集群

    cluster-config-file nodes-6382.conf --集群配置文件名,每个实例配置的要不同,redis会根据文件名自动新建

用集群工具创建集群:
我们可以用集群工具进行集群,该工具是redis源码包中,用ruby编写,所以需要先安装ruby。

1、安装rubygems

yum install ruby 
yum install rubygems  
gem install redis

2、把6个redis实例都起来,每个实例的集群都打开。

3、redis安装目录的src执行./redis-trib.rb create --replicas 1 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385

提示信息如下

Connecting to node 127.0.0.1:6380: OK 
Connecting to node 127.0.0.1:6381: OK 
Connecting to node 127.0.0.1:6382: OK 
Connecting to node 127.0.0.1:6383: OK 
Connecting to node 127.0.0.1:6384: OK 
Connecting to node 127.0.0.1:6385: OK 
>>> Performing hash slots allocation on 6 nodes... 
Using 3 masters: 
127.0.0.1:6380 
127.0.0.1:6381 
127.0.0.1:6382 
Adding replica 127.0.0.1:6383 to 127.0.0.1:6380 
Adding replica 127.0.0.1:6384 to 127.0.0.1:6381 
Adding replica 127.0.0.1:6385 to 127.0.0.1:6382 
M: d4f906940d68714db787a60837f57fa496de5d12 127.0.0.1:6380 slots:0-5460 (5461 slots) master 
M: b547d05c9d0e188993befec4ae5ccb430343fb4b 127.0.0.1:6381 slots:5461-10922 (5462 slots) master 
M: 887fe91bf218f203194403807e0aee941e985286 127.0.0.1:6382 slots:10923-16383 (5461 slots) master
S: e0f6559be7a121498fae80d44bf18027619d9995 127.0.0.1:6383 replicates d4f906940d68714db787a60837f57fa496de5d12 
S: a61dbf654c9d9a4d45efd425350ebf720a6660fc 127.0.0.1:6384 replicates b547d05c9d0e188993befec4ae5ccb430343fb4b 
S: 551e5094789035affc489db267c8519c3a29f35d 127.0.0.1:6385 replicates 887fe91bf218f203194403807e0aee941e985286 
Can I set the above configuration? (type 'yes' to accept):

输入yes,这样集群就建立了。

登录任一台redis,执行 info cluster,提示cluster_enabled:1

集群过程:

首先redis-trib.rb会以客户端的形式尝试连接所有的节点,并发送PING命令以确定节点能够正常服务。如果有任何节点无法连接,则创建失败。同时发送 INFO 命令获取每个节点的运行ID以及是否开启了集群功能(即cluster_enabled为1)。 准备就绪后集群会向每个节点发送 CLUSTER MEET命令,格式为 CLUSTER MEET ip port,这个命令用来告诉当前节点指定ip和port上在运行的节点也是集群的一部分,从而使得6个节点最终可以归入一个集群。

然后redis-trib.rb会分配主从数据库节点,分配的原则是尽量保证每个主数据库运行在不同的IP地址上,同时每个从数据库和主数据库均不运行在同一IP地址上,以保证系统的容灾能力

3主3从,当1个主故障,大家会给对应的从投票,把从立为主,若没有从数据库可以恢复则redis集群就down了。down后,启动原来的主或从,就可以恢复继续使用了。

客户端连接:

使用redis-cli -c -p 任意一个端口

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于redis的主从、哨兵、集群 的相关文章

  • SignalR 无法连接到 SSL 上的 Azure Redis

    我目前在 Azure 上托管我的 redis 缓存服务器 并让 signalR 依赖它作为骨干 使用以下内容 GlobalHost DependencyResolver UseRedis 服务器 端口 密码 eventKey 这可以在端口
  • Redis Docker compose无法处理RDB格式版本10

    我无法在 docker compose 文件中启动 redis 容器 我知道docker compose文件没问题 因为我的同事可以成功启动项目 我读到有一个删除 dump rdb 文件的解决方案 但我找不到它 我使用Windows机器 任
  • 使用 Sentinels 升级 Redis 的最佳实践?

    我有 3 个 Redis 节点 由 3 个哨兵监视 我进行了搜索 文档似乎不清楚如何最好地升级此类配置 我目前使用的是 3 0 6 版本 我想升级到最新的 5 0 5 我对这方面的程序有几个疑问 升级两个大版本可以吗 我在我们的暂存环境中执
  • 有没有办法用Lettuce自动发现Redis集群中新的集群节点IP

    我有一个Redis集群 3主3从 运行在一个库伯内斯簇 该集群通过Kubernetes 服务 Kube 服务 我将我的应用程序服务器连接到 Redis 集群 使用Kube 服务作为 URI 通过 Redis 的 Lettuce java 客
  • Spring Data JPA Redis:无法编写基于自定义方法的查询

    我已经使用 Redis 配置了 Spring Data JPA 并使用RedisRepositorieswith 提供了类似的方法find findAll 所有这些方法似乎都工作得很好 但我无法编写我的自定义方法 RedisEntity f
  • Laravel 所有会话 ID 与 Redis 驱动程序

    在我的应用程序中 我希望允许某些用户能够注销除他 她之外的所有其他用户 当会话驱动程序设置为文件时 我已经完成了此功能 但现在我使用 redis 作为会话驱动程序 并且我无法找到任何方法来列出所有当前会话 就像我在文件时所做的那样司机 问题
  • redis dump.rdb / 保存小文件

    Context 我正在使用redis 数据库小于 100 MB 但是 我想进行每日备份 我也在 Ubuntu Server 12 04 上运行 当输入 redis cli save 我不知道 dump rdb 保存到哪里 因为 redis
  • Redis+Docker+Django - 错误 111 连接被拒绝

    我正在尝试使用 Redis 作为使用 Docker Compose 的 Django 项目的 Celery 代理 我无法弄清楚我到底做错了什么 但尽管控制台日志消息告诉我 Redis 正在运行并接受连接 事实上 当我这样做时 docker
  • 如何将“.csv”数据文件导入Redis数据库

    如何将 csv 数据文件导入 Redis 数据库 csv 文件中包含 id 时间 纬度 经度 列 您能否向我建议导入 CSV 文件并能够执行空间查询的最佳方法 这是一个非常广泛的问题 因为我们不知道您想要什么数据结构 您期望什么查询等等 为
  • Laravel 异常队列最大尝试次数超出

    我创建了一个应用程序来向多个用户发送电子邮件 但在处理大量收件人时遇到问题 该错误出现在failed jobs table Illuminate Queue MaxAttemptsExceededException App Jobs ESe
  • 节点应用程序之间共享会话?

    我目前有两个独立的节点应用程序在两个不同的端口上运行 但共享相同的后端数据存储 我需要在两个应用程序之间共享用户会话 以便当用户通过一个应用程序登录时 他们的会话可用 并且他们似乎已登录到另一个应用程序 在本例中 它是一个面向公众的网站和一
  • 当 Jedis 与 Spring Data 一起使用时,为什么数据会以奇怪的键存储在 Redis 中?

    我将 Spring Data Redis 与 Jedis 一起使用 我正在尝试存储带有密钥的哈希值vc list id 我能够成功插入到redis 但是 当我使用 redis cli 检查密钥时 我没有看到密钥vc 501381 相反我看到
  • Spring Data Redis 覆盖默认序列化器

    我正在尝试创建一个RedisTemplatebean 将具有更新的值序列化器来序列化对象JSONredis 中的格式 Configuration class RedisConfig Bean name redisTemplate Prima
  • ServiceStack.Redis:无法连接:sPort:

    我经常得到 ServiceStack Redis 无法连接 sPort 0 或 ServiceStack Redis 无法连接 sPort 50071 或其他端口号 当我们的网站比较繁忙时 就会出现这种情况 Redis 本身看起来很好 CP
  • 为什么单个 Redis 实例不是线程安全的?

    https github com xetorthio jedis wiki Getting started https github com xetorthio jedis wiki Getting started 在多线程环境中使用Jed
  • Web API 缓存 - 如何使用分布式缓存实现失效

    我有一个 API 目前不使用任何缓存 我确实有一个正在使用的中间件 它可以生成缓存标头 Cache Control Expires ETag Last Modified 使用https github com KevinDockx HttpC
  • 如何通过ARM模板输出返回Redis的primaryKey?

    我正在尝试借助下面列出的 ARM 模板来部署 Redis 然后返回其主密钥 Azure 门户中 Redis 的 访问密钥 gt 主 下可用的秘密字符串 但是 我从管道 AzureResourceManagerTemplateDeployme
  • 为什么我们需要 Redis 来运行 CKAN?

    我想知道为什么我们需要 Redis 服务器来运行 CKAN 如果需要 为什么 我如何使用 CKAN 配置它 附注 我正在 RHEL7 中运行我的 ckan 实例 Update Redis 已成为一项要求从CKAN 2 7开始 https d
  • redis能完全取代mysql吗?

    简单的问题 我是否可以使用 redis 而不是 mysql 来处理各种 Web 应用程序 社交网络 地理位置服务等 IT 领域没有什么是不可能的 但有些事情可能会变得极其复杂 将键值存储用于全文搜索之类的事情可能会非常痛苦 另外 据我所知
  • Microsoft.Extensions.Caching.Redis 选择与 db0 不同的数据库

    一个关于了解使用哪个redis数据库以及如何配置它的问题 我有一个默认值ASP NET Core Web 应用程序和默认配置的本地redis服务器 含15个数据库 通过包管理控制台我已经安装了 Install Package Microso

随机推荐

  • python之计算系统空闲内存、列表字典相互转换

    python之计算系统空闲内存 usr bin env python coding utf8 Time 2017 11 30 14 25 Author hantong File count free memory py 统计linux系统空
  • element date-picker range类型时间选择器 限制选中前后7天的时间的方法

    实现效果 代码
  • 使用webpack-bundle-analyzer分析uni-app 的微信小程序包大小(HbuilderX运行)

    1 找到vue config js 文件 如果找不到 则在项目根目录下 跟pages json同一个目录下 创建一个JS文件 命名为vue config js 2 安装webpack bundle analyzer 官方网站 https g
  • Java连接数据库警告WARN: Establishing SSL connection without server's identity ......

    今天搭了个框架 发现数据库发出了警告 Fri Mar 23 13 49 33 CST 2018 WARN Establishing SSL connection without server s identity verification
  • python乱码怎么办_解决python发送邮件乱码问题

    使用python发邮件很简单 但是遇到乱码问题很烦恼 乱码问题有几种 有发件人名称乱码 有标题乱码 也有正文乱码的问题 一 发件人名称乱码 要解决发件人名称乱码问题 必须使用Header 如下代码 from email header imp
  • 记忆化搜索简介

    记忆化搜索 算法上依然是搜索的流程 但是搜索到的一些解用动态规划的那种思想和模式作一些保存 一般说来 动态规划总要遍历所有的状态 而搜索可以排除一些无效状态 更重要的是搜索还可以剪枝 可能剪去大量不必要的状态 因此在空间开销上往往比动态规划
  • 【IDEA】Idea 报错 Module was compiled with an incompatible version of Kotlin. The binary version of its

    1 场景1 提示 在项目本地DEBUG或者build的时候报了以下错误 kotlin stdlib common kotlin module Module was compiled with an incompatible version
  • vant的中文的文档

    vant的中文的文档 拿走把小傻瓜 https vant contrib gitee io vant zh CN 但是本着点赞自愿 收藏吃灰 还是多少可以支持一下
  • TCP连接的状态详解以及故障排查

    1 TCP状态 了解TCP之前 先了解几个命令 linux查看tcp的状态命令 1 netstat nat 查看TCP各个状态的数量 2 lsof i port 可以检测到打开套接字的状况 3 sar n SOCK 查看tcp创建的连接数
  • C++中非常好用的泛型函数

    1 泛型函数 泛型函数结合lambda函数可以实现很多功能如 将序列中的每个负数替换为其绝对值 transform vi begin vi end vi begin int x return x lt 0 x x 查找第一个长度大于等于sz
  • Camera ISP

    1 ISP工作原理 ISP Image Signal Processor 即图像信号处理 主要作用是对前端图像传感器输出的信号做后期处理 依赖于 ISP 才能在不同的光学条件下都能较好的还原现场细节 景物通过 Lens 生成的光学图像投射到
  • 微信小程序- 选择器 合并时间和日期

    https developers weixin qq com miniprogram dev component picker html 从底部弹起的滚动选择器 类型有普通选择器 多列选择器 时间选择器 日期选择器 省市区选择器 没有现成的
  • Unity3D打包时,编译错误

    最近打包Unity3D的APK包时 报编译错误 Failed to compile Java code to DEX D Work Parkour branches 20131219 box360 Temp StagingArea gt j
  • VLC裁剪和移植到S3C6410

    1 由于项目需求 这几天在折腾VLC 需要将它裁剪并移植到PowerPC上 由于板子没有到 先在6410上跑 目前从需求看我们只要VLC作为一个server即可 先贴配置 如下 几乎disable掉所有东东 bin sh for arm C
  • Loki搭建日志收集系统

    Loki 什么是Loki Loki是受Prometheus启发的水平可扩展 高度可用的多租户日志聚合系统 他被设计为非常经济高效且易于操作 它不索引日志内容 而是为每个日志流设置一组标签 Loki文档网址 https grafana com
  • 牛客面试必刷TOP101——二分查找排序

    列表 二分查找 I BM17 二维数组中的查找 BM18 寻找峰值 BM19 组中的逆序对 BM20 旋转数组的最小数字 BM21 比较版本号 BM22 二分查找 I BM17 原题 请实现无重复数字的升序数组的二分查找 给定一个 元素升序
  • 不可控器件——电力二极管(电导调制效应)

    电力二极管 也被称之为半导体整流器 是不可控器件 原理简单 工作可靠 以半导体PN结为基础 PN结是由一个N型掺杂区和一个P型掺杂区紧密接触所构成的 由于两者的多子是不同的 会造成两者的多子向另一个方向做扩散运动 到对方区域形成少数载流子
  • 分库分表?如何做到永不迁移数据和避免热点?

    本文经授权转载自今日头条号 老顾聊技术 原文地址 www toutiao com i6677459303055491597 一 前言 中大型项目中 一旦遇到数据量比较大 小伙伴应该都知道就应该对数据进行拆分了 有垂直和水平两种 垂直拆分比较
  • VMware ESXi网络配置

    目录 一 ESXi网络配置方法 二 虚拟机网络配置方法 一 ESXi网络配置方法 1 搭建完成ESXi平台后 即可为它设置系统IP 如下图 在此界面按F2 输入用户名密码后进入配置界面 2 左侧菜单栏可以看到 Configure Manag
  • 关于redis的主从、哨兵、集群

    开发十年 就只剩下这套Java开发体系了 gt gt gt 关于redis主从 哨兵 集群的介绍网上很多 这里就不赘述了 一 主从 通过持久化功能 Redis保证了即使在服务器重启的情况下也不会损失 或少量损失 数据 因为持久化会把内存中数