热门标签 | 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个



推荐阅读
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 本文探讨了 Spring Boot 应用程序在不同配置下支持的最大并发连接数,重点分析了内置服务器(如 Tomcat、Jetty 和 Undertow)的默认设置及其对性能的影响。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 本文介绍了如何利用npm脚本和concurrently工具,实现本地开发环境中多个监听服务的同时启动,包括HTTP服务、自动刷新、Sass和ES6支持。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 本文探讨了在 ASP.NET MVC 5 中实现松耦合组件的方法。通过分离关注点,应用程序的各个组件可以更加独立且易于维护和测试。文中详细介绍了依赖项注入(DI)及其在实现松耦合中的作用。 ... [详细]
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社区 版权所有