tcp和grpc的keep-alive:https://blog.csdn.net/zhaominpro/article/details/103127023
协议:
一致性算法:强一致;最终一致; 区别在于:(重点在于获取更新后的数据)强一致发现失败就踢掉,能够保证所有节点都被更新上。所以获取数据时就能保证都能够不管访问那一台,都能获取到更新后的数据。 最终一致:在一定的时间后,访问所有机器,能获取到更新后的数据。 raft协议:其实就是理解的 哨兵模式;强一致性算法 paxos算法:一致性协议,比较难; distro:最终一致性算法; gossip:最终一致性算法; renew(eureka):最终一致性算法;
CAP:c(一致性),A(可用性),p(分区容错) AP:当网络分区后,为了保证可用性,系统B可以返回旧值,保证可用 CP:当网络分区后,为了保证一致性,可以拒绝请求,保证一致性
zk是cp,当发现客户端挂掉后,把客户端踢掉;一致性协议:ZAB协议。 eureka是ap,当发现客户端挂掉后,仍然提供服务;renew协议(自己开发的) nacos:distro(AP)最终一致性。raft:强一致性。 ap就是最终一致性的;cp就是强一致性的;
强一致性和最终一致性:https://blog.csdn.net/qq_43183527/article/details/101929099
nacos选择的协议:raft和distro
distro协议(给服务注册用的):
客户端请求时,如果长时间不响应,请求其他服务器。 Nacos 每个节点是平等的都可以处理写请求,同时把新数据同步到其他节点。? 每个节点只负责部分数据,定时发送自己负责数据的校验值到其他节点来保持数据一致性。?? 每个节点独立处理读请求,及时从本地发出响应
数据初始化: 新加入的节点全量拉取数据,从所有节点。
数据校验: 服务器之间有联系,相互发送心跳信息。心跳信息:本地保存的数据元信息(元信息比较重要,数据量很小)。 这个心跳的作用: 告诉大家自己活着。 检查自己信息是否是正确的。如果不正确,全量拉取一波
写操作来临时: 客户端发送写操作时,是随机选取的,他知道所有的服务端地址,随机选一个。 服务端收到请求后,先通过filter。 filter作用: 拦截到请求后,查看下该客户端的责任节点。如果是自己,直接给controller处理 如果不是,转发给这个责任节点。
责任节点上的controller对请求进行处理
服务器定期进行sync任务,把本机负责的示例信息同步给其他机器。
读操作: 直接从本机拉取数据,快速响应。
总结: 1. 当该节点接收到属于该节点负责的实例的写请求时,直接写入。 2. 当该节点接收到不属于该节点负责的实例的写请求时,将在集群内部路由,转发给对应的节点,从而完成读写。 3. 当该节点接收到任何读请求时,都直接在本机查询并返回(因为所有实例都被同步到了每台机器上)。
nacos服务器寻址: 文件寻址:每个服务器下保存着一个cluster.conf的文件,文件内容就是ip地址列表。 当启动的时候,发现这个配置文件被改动了,就需要修改集群下所有机器的配置文件。nacos内部有文件变动检测中心,会重新读取文件内容。 这里就需要一个操作,修改集群下所有机器的配置文件。这个操作nacos没去做,需要手动去做的 地址服务器寻址
服务发现模块: spring-cloud-nacos自动注册:https://www.cnblogs.com/kjcc/p/13932926.html
临时节点和持久化节点。 区别: 临时节点类似于业务客户端,可以发送心跳给服务端的。 持久化节点类似于redis,mysql节点。不能发送心跳。 这两个区别在健康检查的时候。 临时节点可以自己发送心跳,服务端只需要统计信息就好。 持久化节点需要服务端去探测,发送一个ack报文,收到回复后需要根据回复内容调用不同的接口。同时需要关注线程池,重试等机制。
负载均衡: 客户端负载均衡,服务端负载均衡 ribbon是客户端负载均衡 nacos是服务端和服务端负载均衡
配置中心客户端获取配置源码:https://www.cnblogs.com/dyg0826/p/11404678.html
distro协议源码解析:Nacos 2.0源码分析-Distro协议概览 - 不会发芽的种子 - 博客园
|