核心服务-注册中心

前言

本文以ZK为例介绍下注册中心

ZK功能

文件系统

数据存储是文件机制非文件存储
所有节点在zk中都是一个树

通知机制

通过watch tcp长连接实现

分布式程序协调服务

节点选主

图1
图1
上图是应该基于zk选主的模式

zk内部主从模式:本身主节点挂了 使用ZAB协议选主 

配置管理

zk的叶子节点当然也可以存储超时时间等配置信息 只是不优雅

粗力度分布式锁

zk和etcd都可以做分布式锁 
etcd社区比较活跃 性能较好

主备高可用切换

主节点挂了 从节点选主的过程 类似图1

主挂了 zk心跳知道主挂了
从3个slave节点中 选择主
谁写成功 谁就是主

服务注册发现

注册和发现不是zk擅长的 用的比较多
前面几点才是zk擅长的 但用的不多

服务注册和发现产品比较

1、ZAB是Paxos轻量级实现
2、Euraka追求数据最终一致性 所以不需要一致性保证
(apollo配置中心内部是用euraka做的)
3、多数据中心就是多机房
在多个机房中只部署了一套zk
一旦出现了网络划分 整个zk节点就不可用
只有consul可用 基于同步协议Gossip来做的
redis cluster也是用的Gossip协议来实现的
(Gosship 是明文传呼 可以先加密数据再通过该协议传输或者内部服务之间明文传输也没有关系)
4、所有CP模型都是支持KV存储的
5、

a、zk服务健康检查其实很弱
仅仅支持心跳 实质tcp层面的ping
服务假死情况 它发现不了
b、consual服务健康检测做的比较好
c、euraka最弱
默认配置不支持 必须要显示做一些配置
d、metrics 埋的一些点 记录请求响应时间 耗时情况


Long Polling

zk不是服务发现领域最佳选择

1、服务注册发现是AP模型 ZK是CP模型

2、几百台zk集群 最多1000台 没有问题
超过了一定的数量比如几万台 zk就会不堪重负

服务注册发现是AP模型还是CP模型?要从数据一致性需求分析

注册中心作用:丢给注册中心一个 server name返回一个对应的ip和port

如果调用方获取到的服务器给的ip不一样 会有什么影响?

服务注册发现对数据一致性要求不高 最终一致性即可

在多个机房中只部署了一套zk 一旦出现了网络划分 整个zk节点就不可用

假设 机房3突然和机房2和机房1的网络断了
即机房3出现了网络分区 网络划分
机房间网络划分
机房3 机房内还是通的
理论层zk集群还可以用
实际情况整个zk集群都不可用了

一旦网络发生分区 就会选举多个主节点 就会不一致了

原因是

ServerB2作为新服务 此时注册ZK不成功
因为机房3中的ZK节点已经脱离了ZK集群
不能通过ZK对服务进行扩容、重启、部署

期望的效果

期望的是跨机房不可用但机房3中的ServiceA调用ServiceB是可以用的

虽然说有多机房 很多情况下更鼓励在同一个机房内服务之间调用
机房内服务调用 服务内响应延迟会变的很低
服务每个机房都成了孤岛 每个机房调用只拿到本机房的服务列表
反而有更好的服务链路调用效果
千万不能因为自身的任何问题 破坏了服务之间的联通性

原生ZK

但原生的ZK同机房的服务调用也不可用
因为ZK是CP模型
为了保证网络分区下P (脑裂下)C一致性 A的可用性也让它不可用

ZK存储了大量的信息

1、写到zk里面的任何一个写操作 为了保证cp 
都会在从节点上都会在写一份

2、keepalive 、心跳信息、节点注册 全部都会在集群中同步

3、服务发布大量注册写请求

4、毫秒级服务健康状态的写请求

ZK集群最多支持1000台

zk是分布式的
根据paxios协议 选zk主 zk从
zk主 是写入单点 不能水平扩展
从节点可以扩展 
类似mysql 主从
主只能有一个
zk集群规模不能很多 1000台撑死了
集群有1万台 就会不堪负载

根据业务功能 垂直拆分集群?


根据业务功能 垂直拆分集群

58 房产、招聘、二手车

房产有自己的zk集群
招有自己的zk集群
二手车有自己的zk集群

破坏了公司整体服务的连通性

彼此不可以调用了

业务整合联通性不可预知

比如搜索业务1000台机器zk
推荐业务1000台机器zk

若将搜索和推荐做一个集群

zk 2000台 就不行了

为什么zk 到1000台就不行了?

有大量的持久化存储和事务

其实不需要存储 目的是为了做cp 所以存储了

ZK 2PC 两阶段提交事务

leader和其他节点数据提交 全部是二阶段提交 2PC(Propose ACK Commit)
强一致性 每一步都是2pc 同步阻塞写

ZK探活机制

track机制即tcp长连接 向网络发一个ping命令

logic1服务死了 zk不知道
因为zk的KeepAline机制太弱了 太浅层了

应该怎么处理?

1、tcp活性探测即每隔段时间心跳检测 如果服务死了就踢出
2、服务健康与否的逻辑开放给服务方 让服务方自定义
zk server只管服务方定制的状态
具体死活 zk不需要判断

注册中心容灾

zk原生客户端有很多问题


zk clinet和zk server很多情况下是弱依赖
很多情况下 不需要与zk强依赖

zk的ip节点存在本地 每次启动会从zk拉取
如果拉不到 用本地ip

需要强依赖的场景就是服务发布、上下线、扩容

zk原生客户端没有缓存数据机制(没有缓存ip列表)

综上:zk完全不适合做注册中心

ZK使用场景

低频事务适合(tps低的)

这些组件的分布式协调器都是zk

如何模拟网络异常

zk集群其中一台机器网络断掉或防火墙进出设置下

如果模拟服务假死

在业务逻辑层while(True)

自研数据中心如何设计

注册中心业务流程及熔断机制

1、服务管理平台:服务展示、调用关系展示(梳理服务之间调用关系)以及入口、参数配置(超时时间、熔断规则、降级规则、IP:Port)、控制中心注册信息、
有自己的db存储
2、服务发现不需要直接连接控制中心
3、熔断极端情况下 熔断不了 影响也不大 可损
4、
服务管理平台不需要和业务逻辑层交互
业务逻辑层需要和服务管理平台交互
(服务质量情况 监控 流量情况)
5、服务控制:注册信息存储、指令下发
6、控制中心(服务版本信息、ip:port、服务名称) 无状态化 多个节点 多个控制中心之间 指令同步
控制中心多个节点服务相互探活
7、全部都是服务集群 熔断其中一台数据访问层
推送给业务逻辑层的所有集群
8、服务发现方第一次获取服务列表 若拿不到就采用本地配置
上线的时候 肯定是知道 下游是哪一台
拿到的信息更新本地配置
9、推送指令有没有到达业务逻辑层?
ccp和控制中心通讯 
长连接推送 
给ack
没有给ack再推送
10、服务管理平台也会在内存中缓存一份
缓存有脏数据 无所谓 流量不均衡而已
11、服务管理平台还是控制中心 全是去中心化的
12、熔断是针对api粒度的

服务权重配置

机器配置高 允许流量高 权重配置高些 比如10 其他就是8

服务分组

物理隔离

后续

后续会推出配置中心实践
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页