原文来自:https://blog.csdn.net/c295477887/article/details/52487621

关于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了。

客户端连接:
使用redis-cli -c -p 任意一个端口
--------------------- 
作者:黄河边上的牧马人 
来源:CSDN 
原文:https://blog.csdn.net/c295477887/article/details/52487621 
版权声明:本文为博主原创文章,转载请附上博文链接!

redis主从、哨兵、集群的区别相关推荐

  1. redis 主从 哨兵 集群 及原理

    1.主从哨兵 1.主从哨兵架构图: 此图为最常见的一主两从结构,一个master主机,两个slave主机.每台主机上都运行着两个进程: redis-server 服务,处理redis正常的数据操作与响 ...

  2. redis 主从 哨兵 集群部署

    介绍 Redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统.和Memcache类似,但很大程度补偿了Memcache的不足,它支持存储的value类型相对更多,包括stri ...

  3. Redis主从哨兵集群模式概念以及搭建

    目录 前言 一.Redis使用准备工作 1.1.下载redis 1.2.安装redis 二.Redis部署 2.1.单节点模式部署 2.2.主从模式部署 2.2.1 主从模式的感念: 2.2.2 主从 ...

  4. Redis主从哨兵集群

    更多精彩内容请关注 微信公众号:LifeSmile 个人网站:www.lifesmile.cn Redis:Redis主从复制哨兵机制及集群搭建 Redis主从复制 什么是主从复制 持久化保证了即使R ...

  5. Redis 主从及集群

    Redis 系列笔记: 第一篇:Redis 基础命令 第二篇:Redis 常见应用场景 第三篇:Redis Cluster集群搭建 第四篇:Redis 主从及哨兵搭建 第五篇:Redis 主从及集群 ...

  6. Redis sentinel哨兵集群

    Redis sentinel哨兵集群 sentinel(sen/te/nou) redis哨兵集群 作用:可以实现类似mysql的mha的相关操作,实时监控redis各个数据库的运行情况,并且在主库停 ...

  7. 如何保证 Redis 高可用和高并发(主从+哨兵+集群)

    1. 概述 Redis 作为一种高性能的内存数据库,普遍用于目前主流的分布式架构系统中.为了提高系统的容错率,使用多实例的 Redis 也是必不可免的,但同样复杂度也相比单实例高出很多. 那么如何保证 ...

  8. Redis分片主从哨兵集群,原理详解,集群的配置安装,8大数据类型,springboot整合使用

    文章目录 Redis介绍 Redis分片 Redis主从 Redis哨兵 Redis集群 Redis持久化策略 RDB AOF 持久化方案选择 Redis内存策略 LRU算法 LFU算法 Random ...

  9. redis学习-主从-哨兵集群-redis-cluster简单日记

    1.linux下redis安装及部署 redis安装包与ruby安装包下载 (转)Linux下Redis的安装与部署 2.常用命令及简单配置注解 redis-server redis.conf: 启动 ...

  10. Redis面试 - 哨兵集群实现高可用

    Redis 哨兵集群实现高可用 哨兵的介绍 sentinel,中文名是哨兵.哨兵是 redis 集群机构中非常重要的一个组件,主要有以下功能: 集群监控:负责监控 redis master 和 sla ...

最新文章

  1. Python Day26:多态、封装、内置函数:__str__、__del__、反射(反省)、动态导入模块...
  2. 【 MATLAB 】MATLAB帮助文档中对 MP 算法以及 OMP 算法的讲解(英文版)
  3. 十种MySQL报错注入
  4. mysql 2进制 安装_mysql二进制安装
  5. android开发入门与实践_Electron从入门到实践,前端开发者开发桌面App的最佳选择...
  6. cmake 安装mysql5.6_CMAKE安装MYSQL 5.6.10
  7. 第2章[2.8] Ext JS的控制器类型及使用
  8. import org.eclipse.californium.scandium.DTLSConnector;
  9. sourceTree把当前分支合并到远程分支
  10. Drool规则引擎详解(一)
  11. LoRa 信噪比和接收灵敏度
  12. 51单片机用c语言在液晶1602上显示汉字,51单片机LCD1602显示汉字(中文)源程序...
  13. 苹果pencil有必要买吗?强烈推荐几款苹果平替笔
  14. 洞察·分析·管理 | 解读良品铺子的客户体验管理三部曲
  15. ubuntu18.04环境下为UR3配置MoveIt!运动学插件IKFAST(一)
  16. Representation Learning 表示学习(简单笔记)
  17. SQL分析在2020年度第一季度的购买人数,销售金额,客单价,客单件人均购买频次(时间函数、分组汇总、常用指标计算)
  18. Java工程师 Java基础面试题集合类(Day06)
  19. 智能云时代,谁来守护我们的安全?
  20. 当前京东数据平台用到spark 的五种方式

热门文章

  1. MySQL 服务无法启动。 服务没有报告任何错误。 请键入 NET HELPMSG 3534 以获得更多的帮助。...
  2. 自定义表单提交后返回上一页修改
  3. ASP.NET MVC:自定义 Route 生成小写 Url(转)
  4. java 封装返回json数据
  5. 终于把tomcat给搞定了
  6. linux下高可用性群集和负载均衡群集的实现
  7. 如何更改static控件的字体大小
  8. android.mk ifeq使用介绍,Makefile中的ifeq 多条件使用
  9. 《算法图解》之狄克斯特拉算法
  10. Intel DPDK 源代码分析