我们使用的redis,单机的绝对做不到高可用的,万一单机的redis宕机了,就没有备用的了,我们可以采用集群的方式来保证我们的高可用操作。

主从架构

  

  大致就是这样的,一个主节点,两个从节点(一般两个就可以了)

主从工作原理

  如果你为master配置了一个slave,不管这个slave是否是第一次连接上Master,它都会发送一个SYNC命 令(redis2.8版本之前的命令)给master请求复制数据。 master收到SYNC命令后,会在后台进行数据持久化通过bgsave生成最新的rdb快照文件,持久化期间, master会继续接收客户端的请求,它会把这些可能修改数据集的请求缓存在内存中。当持久化进行完毕以 后,master会把这份rdb文件数据集发送给slave,slave会把接收到的数据进行持久化生成rdb,然后再加载到内存中。然后master再将之前缓存在内存中的命令发送给slave。 当master与slave之间的连接由于某些原因而断开时,slave能够自动重连Master,如果master收到了多 个slave并发连接请求,它只会进行一次持久化,而不是一个连接一次,然后再把这一份持久化的数据发送 给多个并发连接的slave。 当master和slave断开重连后,一般都会对整份数据进行复制。但从redis2.8版本开始,master和slave断开重连后支持部分复制。

  我们在上述文字中可以得出,我们的master得到了SYNC命令以后,还是会继续接收我们客户端的命令的,或者说,我们的slave第一次全量复制了,而第二次就不再需要全量复制了,那么就提到了我们的数据部分复制

数据部分复制

  从2.8版本开始,slave与master能够在网络连接断开重连后只进行部分数据复制。 master会在其内存中创建一个复制数据用的缓存队列,缓存最近一段时间的数据,master和它所有的 slave都维护了复制的数据下标offset和master的进程id,因此,当网络连接断开后,slave会请求master 继续进行未完成的复制,从所记录的数据下标开始。如果master进程id变化了,或者从节点数据下标 offset太旧,已经不在master的缓存队列里了,那么将会进行一次全量数据的复制。

  那么我们实际搭建一下我们的redis主从架构。

1.首先我们准备三台已经安装好redis的服务器,不会安装的小伙伴可以回到我以后的博客去看一下,超详细https://www.cnblogs.com/cxiaocai/p/11674716.html

2.修改我们的主节点和从节点配置,将protected-mode no修改为yes,大概在88行,将我们bind 127.0.0.1修改为bind 0.0.0.0,启动一下我们的主节点,然后分别测试一下从节点的服务器是否可以连接我们的主节点(我怕你们防火墙开着),输入$ redis-cli -h  主节点IP   -p  主节点redis端口 。

[root@iZm5ec3zn3tzdvp7ttnnosZ redis-5.0.5]# ./src/redis-cli -h 47.104.129.103 -p 6379
47.104.129.103:6379>

注意:我们需要保证主节点和从节点是可以互通的

3.确保可以连接了,我们来配置从节点,我们全局搜索一下replica-read-only 改为replica-read-only yes(搜不到自己写上replica-read-only yes)大概在326行,表示从节点只读不写。在replica‐read‐only yes上面设置replicaof 47.104.129.103 6379。

# administrative / dangerous commands.
replicaof 47.104.129.103 6379
replica-read-only yes
# Replication SYNC strategy: disk or socket.

4.启动从节点,在主节点写入,查看从节点是否得到数据。

配置完成,over~!

哨兵架构

  其实我们的主从架构只保证了数据的一致性,但是还是解决不了我们的高可用,我们的master节点宕机了,我们的服务还是不可用的。没有Zookeeper的选举机制,我们来看看我们的哨兵架构。

哨兵就是保证我们的master不会宕机,当master宕机以后,他会主动选举出来一个节点作为我们的master。

  sentinel哨兵是特殊的redis服务,不提供读写服务,主要用来监控redis实例节点。 哨兵架构下client端第一次从哨兵找出redis的主节点,后续就直接访问redis的主节点,不会每次都通过 sentinel代理访问redis的主节点,当redis的主节点发生变化,哨兵会第一时间感知到,并且将新的redis 主节点通知给client端(这里面redis的client端一般都实现了订阅功能,订阅sentinel发布的节点变动消息)

  配置起来也是很简单的,还是我们上一次的主从架构,然后加上我们的哨兵集群。

1.准备好我们刚才搭建完成的主从架构

2.准备三个以上的服务器(推荐奇数个服务器,有内部选举),安装我们的Redis,需要服务器之间都相通,上面主从说过

3.修改我们的sentinel.conf文件

daemonize yes #允许后台启动
sentinel monitor mymaster 192.168.0.60 6379 2 # 设置连接我们的redis主从master 2表示服务器的数目/2取整数+1

4.输入src/redis‐sentinel sentinel.conf启动我们的程序,这时我们的端口是26379。注意:这里的启动不再是src/redis‐server。

5.输入src/redis‐cli进入客户端,输入info,即可查看我们的sentinel 信息。

  哨兵模式也就很简单的配置好了,是在主从的基础之上搭建的,我们之前的主从架构,当我们的master宕机以后,redis也就算是宕机了,不会有任何选举机制,但是我们的哨兵会有一个选举机制,当我们的master宕机以后,我们的哨兵集群会主动选举一个master,然后告知我们的客户端,哪个是新的master。即使我们的曾经的master重新启动了,那也恢复不到主节点了,只能当做从节点(redis集群会详细说这个选举)

Redis集群架构

  我们的哨兵架构,几乎可以做到了我们的要实现的高可用,但是哨兵的选举还是需要时间的,而且中间会阻塞客户端的请求,假如我们的选举消耗了1秒(实际可能几秒,高则几十秒),就在这1秒的时候来了客户端的请求,那个请求也是不可用的,并且我们的读写的节点实际还是单节点的,这时我们有了更好的方案,我们的Redis集群架构,并且现在Redis的集群架构做的也很成熟了。

  也就是我们Redis的集群其实就是一个个小的主从结合在一起(官方建议小于1000个小主从),变成了我们的Redis集群,每个小主从也就是我们的Redis数据分片,每个小主从的数据存储是不一样的,内部是有一套他自己的运算规则的。我们还是先来看一下如何配置,上文提过的简单的我就直接过了啊。

  1.准备9台服务器,保证互通,下载解压。

  2.编辑我们的redis.conf文件

    (1)daemonize yes # 设置后台启动,大概在136行

    (2)cluster-enabled yes # 是否开启集群模式,大概在832行

    (3)cluster-config-file nodes‐8001.conf #集群节点信息文件,这里800x最好和port对应上,方便后期查找。大概在840行

    (4)cluster-node-timeout 5000 # 节点离线超时时间,5000毫秒,大概在846行

    (5)bind 0.0.0.0 #去掉bind绑定访问ip信息,大概在69行

    (6)protected-mode no #关闭保护模式,大概在88行

    (7)appendonly yes # 打开AOF,大概在699行

    (8)requirepass xiaocai #设置redis访问密码,大概在507行

    (9)masterauth xiaocai # 设置集群节点间访问密码,跟上面一致,大概在293行

  3. 配置完成全部启动./src/redis-server redis.conf 检查是否启动成ps -ef|grep redis。我们会看到这样的信息

这里显示cluster,说到这我们只差最后一步了。

  4.我们在任意服务器输入./src/redis-cli -a xiaocai --cluster create --cluster-replicas 2 172.31.179.185:6379 172.31.179.178:6379 172.31.179.184:6379 172.31.179.183:6379 172.31.179.180:6379 172.31.179.181:6379 172.31.179.182:6379 172.31.179.179:6379 172.31.179.177:6379命令,意思是要组建我们的集群环境了,-a后面是密码xiaocai,--cluster-replicas 2这个数字2表示我们每个主节点有几个从节点,一般来说前三个IP会设置为master,输入之后会有确认信息。我们会看到这样的信息,我们输入yes继续

  静静等待一会(时间也不会太久,时间太久的,你去检查一下网络之间互通吗),当我们出现【ok】的画面也就是成功了。

    5.我们随便找一个客户端输入./src/redis-cli -a xiaocai,进入我们的客户端,输入cluster info,就可以查看到节点信息

我们看到cluster_known_nodes:9就是我们一共拥有多少节点,cluster_size:3就是我们拥有多少组主从架构。配置完成~!

扩展:输入cluster nodes还可以查看我们的节点关联信息。

  我们在刚才输入我们的cluster info时,我们看到了一个16384,其实就是一个Redis集群的片区,我们在单节点来执行set命令时,并不一定会成功,你可以尝试不同的key试一下,这就是我们的Redis分片区的存储,当你的key属于那个片区下,就会存储到哪个小主从内,其余的并不需要重复存储。在输入cluster nodes时会返回我们的片区信息。片区是从0开始计算,最大到16383的。

  今天就说到这里吧,下次我们说下java代码来操作我们的Redis。

最进弄了一个公众号,小菜技术,欢迎大家的加入



java架构之路-(Redis专题)Redis的主从、哨兵和集群的更多相关文章

  1. Redis主从哨兵和集群搭建

    主从配置 哨兵配置 集群配置 1.主从: 国王和丞相,国王权力大(读写),丞相权利小(读) 2.哨兵: 国王和王子,国王死了(主服务挂掉),王子继位(从服务变主服务) 3.集群: 国王和国王,一个国王 ...

  2. java架构之路-(Redis专题)SpringBoot连接Redis超简单

    上次我们搭建了Redis的主从架构,哨兵架构以及我们的集群架构,但是我们一直还未投入到实战中去,这次我们用jedis和springboot两种方式来操作一下我们的redis 主从架构 如何配置我上次已 ...

  3. java架构之路-(Redis专题)聊聊大厂那些redis

    上几次说了redis的主从,哨兵,集群配置,但是内部的选举一直没说,先来简单说一下选举吧. 集群选举 redis cluster节点间采取gossip协议进行通信,也就是说,在每一个节点间,无论主节点 ...

  4. [转帖]java架构之路-(面试篇)JVM虚拟机面试大全

    java架构之路-(面试篇)JVM虚拟机面试大全 https://www.cnblogs.com/cxiaocai/p/11634918.html   下文连接比较多啊,都是我过整理的博客,很多答案都 ...

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

    关于redis主从.哨兵.集群的介绍网上很多,这里就不赘述了. 一.主从 通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重 ...

  6. 关于redis主从|哨兵|集群模式

    关于redis主从.哨兵.集群的介绍网上很多,这里就不赘述了. 一.主从 通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重 ...

  7. redis主从|哨兵|集群模式

    关于redis主从.哨兵.集群的介绍网上很多,这里就不赘述了. 一.主从 通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重 ...

  8. 关于redis的主从、哨兵、集群(转)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/c295477887/article/de ...

  9. Redis主从同步、哨兵、集群

    什么是主从同步(复制) 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器.前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点 ...

  10. Redis主从配置,哨兵,集群的设计原理

    一 前言 谈到Redis服务器的高可用,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制. 哨兵(Sentinel):可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转 ...

随机推荐

  1. idea解决This file is indented with tabs instead of 4 spaces

    idea上面总是弹出 解决方法: File -> Settings -> Editor -> Code Style -> Java -> Tabs and Indents ...

  2. kafka经典入门

    问题导读 1.Kafka独特设计在什么地方?2.Kafka如何搭建及创建topic.发送消息.消费消息?3.如何书写Kafka程序?4.数据传输的事务定义有哪三种?5.Kafka判断一个节点是否活着有 ...

  3. JWT简明介绍

    JSON Web Token一种数据格式,用来表示Token.具有可扩展.防篡改.能够在URL中安全传输的特性,已经形成标准,定义在rfc7519. JSON Web Token (JWT) is a ...

  4. Jmeter介绍和安装

    Apache JMeter™应用开源软件,100%纯Java应用程序,设计用于负载功能测试和性能测试.它最初是为测试Web应用程序而设计的,但后来扩展到其他测试函数中. 安装步骤:1.安装JDK 8版 ...

  5. SQLServer之MAX() 函数

    MAX() 函数 MAX 函数返回一列中的最大值.NULL 值不包括在计算中. SQL MAX() 语法 SELECT MAX(column_name) FROM table_name 注释:MIN ...

  6. 使用Spring中的PropertyPlaceholderConfigurer读取文件

    目录 一. 简介 二. XML 方式 三. Java 编码方式 一. 简介 大型项目中,我们往往会对我们的系统的配置信息进行统一管理,一般做法是将配置信息配置与一个cfg.properties 的文件 ...

  7. SpringBoot起飞系列-日志使用(四)

    一.SpringBoot中的日志组件 日志是一个系统中不可缺少的组件.在项目中,我们常用的日志组件有JUL.JCL.Jboss-logging.logback.log4j.log4j2.slf4j.. ...

  8. Docker下实战zabbix三部曲之二:监控其他机器

    在上一章<Docker下实战zabbix三部曲之一:极速体验>中,我们快速安装了zabbix server,并登录管理页面查看了zabbix server所在机器的监控信息,但是在实际场景 ...

  9. MyEclipse中的web项目之前有个感叹号

    java web项目有感叹号说明导入的jar包存在问题 或者环境配置不正确 解决办法是点击项目-->Build path -->configure Build Path 然后来到Libra ...

  10. Android [启动方式:standard singleTop singleTask singleInstance]

    栈顶Activity是当前正在显示的. 以A.B举例 1.standard 不同的Activity都存放在同一个栈中,每次创建实例都会堆放到栈顶,逐次返回直至退出. 创建实例B 创建实例A 点击返回时 ...