zk不适合注册中心原因

Zookeeper因其CP特性,在面对网络分区时牺牲可用性以保证一致性,这使其不适合大规模服务注册。高TPS需求、弱服务健康检查、无数据缓存、复杂客户端交互和异常处理,都限制了它在服务发现场景的应用。ZAB协议和强一致性设计更适合分布式协调,而非服务发现对可用性的高要求。
摘要由CSDN通过智能技术生成

Zookeeper不适合做注册中心

在 CAP 模型中,zookeeper 是 CP,意味着面对网络分区时,为了保持一致性,他是不可用的。

因为 zookeeper 是一个分布式协调系统,他的核心算法是 Zab,所有设计都是为了一致性。

1、当注册中心的服务规模超过一定数量的时候,zk不能很好的工作,不能支持很高的tps和TCP长连接

2、zk的写请求是不是可扩展的

3、zk提供的Service Health Check功能很弱,基于zk的session活性检查和临时节点监听机制上,不能真正反应服务的健康状态

4、zk原生客户端没有提供数据缓存机制,当注册中心宕机的时候,会造成服务不可用

5、zk原生客户端不好用,难以掌握Client/Session状态机,zk的客户端和服务端交互协议不简单,比如:TCP长连接Session管理,Ephemeral Znode(临时节点),Event&Notification(事件订阅通知),ping(心跳检测)

6、复杂的异常处理,ConnectionLossException和Disconnected事件

ZooKeeper应该 “The King Of Coordination for Big Data”!大数据协调之王

ZAB协议(zookeeper原子广播协议),崩溃恢复模式(群首选举协议,),原子广播模式(消息广播协议,类似于两阶段提交协议)

  • znode,分为持久节点和临时节点,节点都有一个是否有序的属性。临时节点TCP连接断开后,就会被删除。
  • 可以设置znode的事件监听(watch)。
  • 客户端主要有zkclient,curator
  • 节点数据最大可设置为1M
  • 2181默认服务端口,3888默认选举端口,leader会监听2888端口,follower连接leader
  • leader(群首),follower(追随者),observer(观察者)
  • 独立模式,仲裁模式(集群模式)
  • 事务是有序的zxid64位,低32位是单调递增的,高32表示leader的周期
  • 节点权限READ,WRITE,CREATE,DELETE,ADMIN
  • 内置鉴权模式,world,auth,digest,ip,super

ZK 作为注册中心探讨

作为一个分布式协同服务,ZooKeeper 非常好,

但是对于 Service 发现服务来说就不合适了,因为对于 Service 发现服务来说就算是返回了包含不实的信息的结果也比什么都不返回要好。

所以当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接 down 掉不可用。

但是 zk 会出现这样一种情况,当 master 节点因为网络故障与其他节点失去联系时,剩余节点会重新进行 leader 选举。问题在于,选举 leader 的时间太长,30 ~ 120s,且选举期间整个zk集群都是不可用的,这就导致在选举期间注册服务瘫痪。

在云部署的环境下,因网络问题使得 zk 集群失去 master 节点是较大概率会发生的事,虽然服务能够最终恢复,但是漫长的选举时间导致的注册长期不可用是不能容忍的。

所以说,作为注册中心,可用性的要求要高于一致性!

在 CAP 模型中,Zookeepe 整体遵循一致性(CP)原则,即在任何时候对 Zookeeper 的访问请求能得到一致的数据结果,但是当机器下线或者宕机时,不能保证服务可用性。

那为什么 Zookeeper 不使用最终一致性(AP)模型呢?

因为这个依赖 Zookeeper 的核心算法是 ZAB,所有设计都是为了强一致性。这个对于分布式协调系统,完全没没有毛病,但是你如果将 Zookeeper为分布式协调服务所做的一致性保障,用在注册中心,或者说服务发现场景,这个其实就不合适。

zookeeper 注册发现过程

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spark Thrift是一种用于将Apache Spark与Hive Metastore集成的工具。它允许我们通过Hive SQL语法来执行Spark SQL查询,并通过JDBC/ODBC接口提供对外的访问。 要将Spark Thrift注册到ZooKeeper(zk),我们需要进行以下步骤: 1. 启动ZooKeeper:首先,我们需要确保ZooKeeper已经正确安装和启动。可以通过命令行输入`zkServer.sh start`(在Linux上)或`zkServer.bat` start(在Windows上)来启动ZooKeeper。 2. 配置Spark Thrift:我们需要在Spark Thrift的配置文件中指定ZooKeeper的地址和端口号。可以通过编辑Spark Thrift的`spark-thrift-shim.conf`文件来完成。在配置文件中,找到`spark.sql.hive.thriftServer.singleSession`选项,并将其设置为`true`。然后,找到`hive.zookeeper.quorum`选项,并将其值设置为ZooKeeper的地址和端口号,例如`localhost:2181`。保存并关闭配置文件。 3. 启动Spark Thrift:运行Spark Thrift Server,它将作为一个单独的进程运行。可以使用以下命令启动Spark Thrift: ``` ./sbin/start-thriftserver.sh --master <master-url> ``` `<master-url>`是Spark的Master的URL,例如`spark://localhost:7077`。 4. 验证注册:启动Spark Thrift后,它将自动在ZooKeeper注册。我们可以使用ZooKeeper客户端工具(例如`zkCli.sh`)连接到ZooKeeper,并查看Spark Thrift的注册情况。 ``` ./bin/zkCli.sh -server localhost:2181 ``` 在ZooKeeper的命令行中,使用`ls`命令列出ZooKeeper的节点。 ``` ls /spark/sql ``` 如果`spark-thrift-server`节点存在并包含一些子节点,就表示Spark Thrift成功注册到了ZooKeeper。 通过以上步骤,我们就可以将Spark Thrift成功注册到ZooKeeper,从而可以通过JDBC/ODBC接口访问并执行Spark SQL查询。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值