热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java实现Redis主从复制的方法和步骤详解

主从复制a,方式一、新增redis6380.conf,加入slaveof192.168.1.1116379,在6379启动完后再启6380,完成配置;b

主从复制

a,方式一、新增redis6380.conf, 加入  slaveof 192.168.1.111 6379,  在6379启动完后再启6380,完成配置;

b,方式二、redis-server --slaveof 192.168.1.111 6379

c,查看状态:info replication

d,断开主从复制:在slave节点,执行6380:>slaveof no one

e,断开后再变成主从复制:6380:> slaveof 192.168.1.111 6379

f,数据较重要的节点,主从复制时使用密码验证: requirepass

e,从节点建议用只读模式slave-read-only=yes, 若从节点修改数据,主从数据不一致

h,传输延迟:主从一般部署在不同机器上,复制时存在网络延时问题,redis提供repl-disable-tcp-nodelay参数决定是否关闭TCP_NODELAY,默认为关闭

参数关闭时:无论大小都会及时发布到从节点,占带宽,适用于主从网络好的场景,

参数启用时:主节点合并所有数据成TCP包节省带宽,默认为40毫秒发一次,取决于内核,主从的同步延迟40毫秒,适用于网络环境复杂或带宽紧张,如跨机房

主从拓扑:支持单层或多层

A,一主一从:用于主节点故障转移从节点,当主节点的“写”命令并发高且需要持久化,可以只在从节点开启AOF(主节点不需要),这样即保证了数据的安全性,也避免持久化对主节点的影响

B, 一主多从:针对“读”较多的场景,“读”由多个从节点来分担,但节点越多,主节点同步到多节点的次数也越多,影响带宽,也加重主节点的稳定

5a47831696e576f6cc950afe2290e9c2.png

C,树状主从:一主多从的缺点(主节点推送次数多压力大)可用些方案解决,主节点只推送一次数据到从节点1,再由从节点2推送到11,减轻主节点推送的压力。

d6873164e430d4013fd6d32b7a45237a.png

复制原理

执行slave master port后,与主节点连接,同步主节点的数据,6380:>info replication:查看主从及同步信息

09f58dd44032b6f7efdc719e9398142b.png

数据同步:redis 2.8版本以上使用psync命令完成同步,过程分“全量”与“部分”复制

全量复制:一般用于初次复制场景(第一次建立SLAVE后全量)

部分复制:网络出现问题,从节占再次连主时,主节点补发缺少的数据,每次 数据增加同步

心跳:主从有长连接心跳,主节点默认每10S向从节点发ping命令,repl-ping-slave-period控制发送频率

哨兵机制

1,为什么要讲哨兵机制?

A,我们学习了redis的主从复制,但如果说主节点出现问题不能提供服务,需要人工重新把从节点设为主节点,还要通知我们的应用程序更新了主节点的地址,这种处理方式不是科学的,耗时费事

B,同时主节点的写能力是单机的,能力能限

C,而且主节点是单机的,存储能力也有限

其中2,3的问题在后面redis集群课会讲,第1个问题我们用哨兵机制来解决

2,主从故障如何故障转移(不满足高可用):

A,主节点(master)故障,从节点slave-1端执行 slaveof no one后变成新主节点

B,其它的节点成为新主节点的从节点,并从新节点复制数据

3,哨兵机制(sentinel)的高可用:

A,原理:当主节点出现故障时,由redis sentinel自动完成故障发现和转移,并通知应用方,实现高可用性。

b0604741d5c1a67e49be0b75572c321e.png

其实整个过程只需要一个哨兵节点来完成,首先使用Raft算法(感兴趣的同学可以查一下,其实就是个选举算法)实现选举机制,选出一个哨兵节点来完成转移和通知

哨兵有三个定时监控任务完成对各节点的发现和监控:

任务1,每个哨兵节点每10秒会向主节点和从节点发送info命令获取最拓扑结构图,哨兵配置时只要配置对主节点的监控即可,通过向主节点发送info,获取从节点的信息,并当有新的从节点加入时可以马上感知到

02df535ebdf96e338dce63bcf75647fc.png

任务2,每个哨兵节点每隔2秒会向redis数据节点的指定频道上发送该哨兵节点对于主节点的判断以及当前哨兵节点的信息,同时每个哨兵节点也会订阅该频道,来了解其它哨兵节点的信息及对主节点的判断,其实就是通过消息publish和subscribe来完成的;

c97fd5fbb55161b7ebf242ff269a5d29.png

任务3,每隔1秒每个哨兵会向主节点、从节点及其余哨兵节点发送一次ping命令做一次心跳检测,这个也是哨兵用来判断节点是否正常的重要依据

f03bd3b7965d3c895a803f21ed199c94.png

主观下线和客观下线:

主观下线:刚知道哨兵节点每隔1秒对主节点和从节点、其它哨兵节点发送ping做心跳检测,当这些心跳检测时间超过down-after-milliseconds时,哨兵节点则认为该节点错误或下线,这叫主观下线;这可能会存在错误的判断。

7e57e5872def43373cb4934015281201.png

客观下线:当主观下线的节点是主节点时,此时该哨兵3节点会通过指令sentinel is-masterdown-by-addr寻求其它哨兵节点对主节点的判断,当超过quorum(法定人数)个数,此时哨兵节点则认为该主节点确实有问题,这样就客观下线了,大部分哨兵节点都同意下线操作,也就说是客观下线

55fa071fb38b8b3f5ce7ebf32a970b8c.png

领导者哨兵选举流程:

a,每个在线的哨兵节点都可以成为领导者,当它确认(比如哨兵3)主节点下线时,会向其它哨兵发is-master-down-by-addr命令,征求判断并要求将自己设置为领导者,由领导者处理故障转移;

b,当其它哨兵收到此命令时,可以同意或者拒绝它成为领导者;

c,如果哨兵3发现自己在选举的票数大于等于num(sentinels)/2+1时,将成为领导者,如果没有超过,继续选举…………

0736cae580a70de7fdbb328067c853fa.png

故障转移机制

A,由Sentinel节点定期监控发现主节点是否出现了故障

sentinel会向master发送心跳PING来确认master是否存活,如果master在“一定时间范围”内不回应PONG 或者是回复了一个错误消息,那么这个sentinel会主观地(单方面地)认为这个master已经不可用了

2fe2cf8373c10a2b22526736e805a6ff.png

B,当主节点出现故障,此时3个Sentinel节点共同选举了Sentinel3节点为领导,负载处理主节点的故障转移,

a7b3642b6629333496035b8a54e64dd2.png

C,由Sentinel3领导者节点执行故障转移,过程和主从复制一样,但是自动执行

6d92118ea0081866d2892944a15c5a33.png

流程: 1,将slave-1脱离原从节点,升级主节点,

2,将从节点slave-2指向新的主节点

3,通知客户端主节点已更换

4,将原主节点(oldMaster)变成从节点,指向新的主节点

D,故障转移后的redis sentinel的拓扑结构图

c9dca938e9548ace509133cd1d4ee5db.png

哨兵机制-故障转移详细流程

A,过滤掉不健康的(下线或断线),没有回复过哨兵ping响应的从节点

B,选择salve-priority从节点优先级最高(redis.conf)

C,选择复制偏移量最大,指复制最完整的从节点

5f61421b0c1a13b52051c48d6764b715.png

如何安装和部署Reids Sentinel?

我们以3个Sentinel节点、2个从节点、1个主节点为例进行安装部署

184b7692dbd98daf1820f9983de8c842.png

1,前提:先搭好一主两从redis的主从复制,和之前复制搭建一样,搭建方式如下:

A主节点6379节点(/usr/local/bin/conf/redis6379.conf):修改 requirepass 12345678,注释掉#bind 127.0.0.1

B从节点redis6380.conf和redis6381.conf:修改 requirepass 12345678 ,注释掉#bind 127.0.0.1, 加上masterauth 12345678 ,加上slaveof 127.0.0.1 6379

注意:当主从起来后,主节点可读写,从节点只可读不可写

2,redis sentinel哨兵机制核心配置(也是3个节点):

/usr/local/bin/conf/sentinel_26379.conf

/usr/local/bin/conf/sentinel_26380.conf

/usr/local/bin/conf/sentinel_26381.conf

将三个文件的端口改成: 26379   26380   26381

然后:sentinel monitor mymaster 190.168.1.111 6379 2  //监听主节点6379

sentinel auth-pass mymaster 12345678     //连接主节点时的密码

三个配置除端口外,其它一样。

3,哨兵其它的配置:只要修改每个sentinel.conf的这段配置即可:

sentinel monitor mymaster 192.168.1.10 6379 2  //监控主节点的IP地址端口,sentinel监控的master的名字叫做mymaster

2代表,当集群中有2个sentinel认为master死了时,才能真正认为该master已经不可用了

sentinel auth-pass mymaster 12345678  //sentinel连主节点的密码

sentinel config-epoch mymaster 2  //故障转移时最多可以有2从节点同时对新主节点进行数据同步

sentinel leader-epoch mymaster 2

sentinel failover-timeout mymasterA 180000//故障转移超时时间180s,

a,如果转移超时失败,下次转移时时间为之前的2倍;

b,从节点变主节点时,从节点执行slaveof no one命令一直失败的话,当时间超过180S时,则故障转移失败

c,从节点复制新主节点时间超过180S转移失败

sentinel down-after-milliseconds mymasterA 300000//sentinel节点定期向主节点ping命令,当超过了300S时间后没有回复,可能就认定为此主节点出现故障了……

sentinel parallel-syncs mymasterA 1 //故障转移后,1代表每个从节点按顺序排队一个一个复制主节点数据,如果为3,指3个从节点同时并发复制主节点数据,不会影响阻塞,但存在网络和IO开销

4,启动sentinel服务:

./redis-sentinel conf/sentinel_26379.conf &

./redis-sentinel conf/sentinel_26380.conf &

./redis-sentinel conf/sentinel_26381.conf &

关闭:./redis-cli -h 192.168.1.111 -p 26379 shutdown

5,测试:kill -9 6379  杀掉6379的redis服务

看日志是分配6380 还是6381做为主节点,当6379服务再启动时,已变成从节点

假设6380升级为主节点:进入6380>info replication     可以看到role:master

打开sentinel_26379.conf等三个配置,sentinel monitor mymaster 127.0.0.1 6380 2

打开redis6379.conf等三个配置, slaveof 192.168.1.111 6380,也变成了6380

注意:生产环境建议让redis Sentinel部署到不同的物理机上。

重要:sentinel monitor mymaster 192.168.1.111 6379 2//切记将IP不要写成127.0.0.1

不然使用JedisSentinelPool取jedis连接的时候会变成取127.0.0.1 6379的错误地址

注:我们稍后要启动四个redis实例,其中端口为6379 的redis设为master,其他两个设为slave 。所以mymaster 后跟的是master的ip和端口,最后一个’2’代表只要有2个sentinel认为master下线,就认为该master客观下线,选举产生新的master。通常最后一个参数不能多于启动的sentinel实例数。

哨兵sentinel个数为奇数,选举嘛,奇数哨兵个才能选举成功,一般建议3个



推荐阅读
  • 电商高并发解决方案详解
    本文以京东为例,详细探讨了电商中常见的高并发解决方案,包括多级缓存和Nginx限流技术,旨在帮助读者更好地理解和应用这些技术。 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • MySQL InnoDB 存储引擎索引机制详解
    本文深入探讨了MySQL InnoDB存储引擎中的索引技术,包括索引的基本概念、数据结构与算法、B+树的特性及其在数据库中的应用,以及索引优化策略。 ... [详细]
  • 解决PHP项目在服务器无法抓取远程网页内容的问题
    本文探讨了在使用PHP进行后端开发时,遇到的一个常见问题:即在本地环境中能够正常通过CURL获取远程网页内容,但在服务器上却无法实现。我们将分析可能的原因并提供解决方案。 ... [详细]
  • CentOS下ProFTPD的安装与配置指南
    本文详细介绍在CentOS操作系统上安装和配置ProFTPD服务的方法,包括基本配置、安全设置及高级功能的启用。 ... [详细]
  • 本文详细介绍了如何正确设置Shadowsocks公共代理,包括调整超时设置、检查系统限制、防止滥用及遵守DMCA法规等关键步骤。 ... [详细]
  • 本文详细介绍了如何搭建一个高可用的MongoDB集群,包括环境准备、用户配置、目录创建、MongoDB安装、配置文件设置、集群组件部署等步骤。特别关注分片、读写分离及负载均衡的实现。 ... [详细]
  • Logging all MySQL queries into the Slow Log
    MySQLoptionallylogsslowqueriesintotheSlowQueryLog–orjustSlowLog,asfriendscallit.However,Thereareseveralreasonstologallqueries.Thislistisnotexhaustive:Belowyoucanfindthevariablestochange,astheyshouldbewritteninth ... [详细]
  • 在Qt框架中,信号与槽机制是一种独特的组件间通信方式。本文探讨了这一机制相较于传统的C风格回调函数所具有的优势,并分析了其潜在的不足之处。 ... [详细]
  • 本文详细记录了腾讯ABS云平台的一次前端开发岗位面试经历,包括面试过程中遇到的JavaScript相关问题、Vue.js等框架的深入探讨以及算法挑战等内容。 ... [详细]
  • 深入解析Dubbo:使用与源码分析
    本文详细介绍了Dubbo的使用方法和源码分析,涵盖其架构设计、核心特性和调用流程。 ... [详细]
  • Kubernetes 1.9.0 Alpha.1 发布公告 [Kubernetes 最新动态]
    近日,Kubernetes 社区发布了两个新版本:1.8.0 RC.1 和 1.9.0 Alpha.1。这是 k8s 1.9.0 的首次发布,自 v1.8.0 Alpha.3 以来进行了大量更新,共提交了 279 次。 ... [详细]
  • 驱动程序的基本结构1、Windows驱动程序中重要的数据结构1.1、驱动对象(DRIVER_OBJECT)每个驱动程序会有唯一的驱动对象与之对应,并且这个驱动对象是在驱 ... [详细]
  • Spring Boot + RabbitMQ 消息确认机制详解
    本文详细介绍如何在 Spring Boot 项目中使用 RabbitMQ 的消息确认机制,包括消息发送确认和消息接收确认,帮助开发者解决在实际操作中可能遇到的问题。 ... [详细]
author-avatar
糖在嘴里甜在心离_636
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有