| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> Redis 主从搭建和哨兵搭建 -> 正文阅读 |
|
[大数据]Redis 主从搭建和哨兵搭建 |
主从? 主从搭建是后面哨兵和集群的基础,虽然生产环境很少使用。 我们就以一主两从来搭建。我这里就用一台机器来搭建了。 1:复制一份redis.conf配置文件命名为redis-6380.conf 2:修改配置文件中的如下配置:
同上,复制一份6381的配置文件,注意,dir目录要提前创建出来,不然会报错,如果启动成功,可以通过ps -ef | grep redis查看到三个实例了。 用-p 端口号可以连上这三个server.
其中6379是主服务,用来写命令操作,写入之后在从服务6380,6381客户端都可以查询到。 Redis 主从工作原理1:如果为master配置了一个slave,无论这个slvae是否是第一次连接上master,它都会发送一个PSYNC命令给master请求复制数据。 2:master收到PSYNC命令后,会通过bgsave生成当时的rdb快照,master会继续接收客户端发送的命令请求,它会把这个期间可能修改数据集的请求缓存在内存中。当rdb快照生成之后会发送slave实例,slave用这个rdb快照放到自己的数据目录下并加载到内存中。 3:master生成快照发送给slave期间缓存在内存中的命令,会再次发送给slave。 4:当master和slave因为某些原因断开的时候,slave能够自动重连Master,Master如果并发收到多个slave连接请求,它只会进行一次持久化,而不是一个连接一次,然后再把这一份持久化的数据发送给多个并发连接的slave。 主从复制(全量复制)流程图数据部分复制当master和slave断开重连之后,一般都会对整份数据进行复制。但是从redis2.8版本开始,redis改用可以支持部分数据复制的命令PSYNC去master同步数据,slave与master能够在网络连接断开重连后只进行部分数据复制(断点续传)。 master会在其内存中创建一个复制数据用的缓存队列,缓存最近一段时间的数据,master和它所有的slave都维护了复制的数据下标offset和master的进程id,因此,当网络连接断开后,slave会请求master继续进行未完成的复制,从所记录的数据下标开始。如果master进程id变化了,或者从节点数据下标offset太旧了,已经不在master的缓存队列里面了,那么将会进行一次全量的数据复制。 主从复制(部分复制,断点续传)流程图:?如果有很多从节点,为了缓解主从复制风暴(多个从节点同时复制主节点导致主节点压力过大),可以做如下架构,让部分从节点与从节点同步数据。 ?哨兵高可用架构?sentinel哨兵是特殊的redis服务,不提供读写服务,主要用来监控redis实例节点。哨兵模式架构下client端第一次从哨兵找出redis的主节点,后续就直接访问redis的主节点,不会每次都通过sentinel代理访问redis主节点,当redis的主节点发生变化,哨兵会第一时间感知到,并且将新的redis主节点通知给client端(这里面redis的client端一般都实现了订阅功能,订阅sentinel发布的节点变动消息) 哨兵架构搭建步骤: 从上面架构图可以看出,哨兵集群只要主从集群的的基础上搭建一个哨兵集群就可以了。 哨兵实例使用的是sentinel.conf 1: 复制一份sentinel.conf 为sentinel-26379.conf 3:修改如下配置
? 4:启动哨兵实例
按照上面的方式再启动两个哨兵实例 启动完成,有三个redis服务实例,三个sentinel实例。 ?使用:src/redis-cli -p 6380 进入到6380的这个redis客户端,执行info命令 ?展示的信息里面有一项Replication, 可以看到当前这个实例的角色是slave,主节点是6379端口的实例。 src/redis-cli -p 26380 去看下哨兵实例的信息 在最后一行显示哨兵的实例数只有一个,并没有其它哨兵节点的信息。说明哨兵之间并没有发生通信,这样就不会发生选举事情。? 至于为什么出现这样的情况,和哨兵使用的配置文件有关,这边启动的三个哨兵实例都是直接复制文件来的,里面有个关键配置:sentinel myid 来标识不同哨兵实例,三个实例是同一个值,这里把它都注释掉重新启动哨兵实例,让其自动生成。 ?这样启动之后,在任一个哨兵配置文件的最后可以看到其它哨兵的信息: ?在SpringBoot项目中访问redis操作实践下:引入依赖:
相关yml配置:
刚开始的时候,哨兵和主从集群是正常的,可以在redis实例的客户端都能看到放入的数据,当我们把redis的Master节点Kill掉之后,程序就会报错,因为sentinel实例选举新的master节点需要时间,这段时间本地还是尝试连接之前的master节点,所以会连接失败。
?等到sentinel选举出来新的master节点之后,会重新连接上:Reconnected to 127.0.0.1:6380
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/16 1:56:19- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |