[TOC]
zookeeper动物管理员全局把控。提供了配置管理、服务发现等服务。其本身也是可以集群化的。实现上是基于观察者模式。不想eureka/consul等同类产品需要心跳机制。他本身支持观察与主动触发机制;千里之行始于足下,我们已经探索了eureka、consul两个服务注册的中间件了。今天我们继续学习另外一个作为服务注册的服务。
本文将从zookeeper单机到集群的安装讲解;在从集群leader选举机制的讲解及数据同步的梳理。到最终的基于zookeeper实现的配置管理及分布式锁的应用。从点到面在到应用带你体会一把过山车
简介
==
中心化
服务
特点
中心化
CAP
eureka
peer to peer 每个eureka服务默认都会向集群中其他server注册及拉去信息
去中心化
AP
consul
通过其中节点病毒式蔓延至整个集群
多中心化
CP
zookeeper
一个leader多个followes
中心化
CP
事务
--
downlaod
========
单机安装
====
tar -zxvf apache-zookeeper-3.5.9-bin.tar.gz
cp zoo_sample.cfg zoo.cfg
集群搭建
====
mkdir {zk1,zk2,zk3}
, 首先创建zk1,zk2,zk3三个文件夹存放zkserver.1=192.168.44.130:28881:38881
server.2=192.168.44.130:28882:38882
server.3=192.168.44.130:28883:38883
server.1=192.168.44.139:28881:38881
Cli连接
=====
zkCli.sh -server 192.168.44.131:1181
可以连接zk服务
集群容错
====
Master选举
①、zk1启动时,这个时候集群中只有一台服务就是zk1。此时zk1给集群投票自然被zk1自己获取。 此时zk1有一票 ②、zk2启动时,zk1,zk2都会都一票给集群。因为进群中zk1(myid)小于zk2(myid),所以这两票被zk2获取。这里为什么会是zk2获取到呢。zookeeper节点都一份坐标zk=(myid,zxid);myid是每个zk服务配置的唯一项。zxid是zk服务的一个64位内容。高32没master选举一次递增一次并同时清空低32位。低32位是每发生一次数据事务递增一次。所以zxid最高说明此zk服务数据越新。 ③、zk2获得两票后,此时已经获得了集群半数以上的票数,少数服从多数此时zk2已经是准leader了同时zk1切换为following 。此时zk1已经是zk2的跟班了 ④、zk3启动时,按道理zk3应该会收到三票。但是因为zk1已经站队到zk2了。zk2作为准leader是不可能给zk3投票的。所以zk3最多只有自己一票,zk3明知zk2获得半数以上,已经是民意所归了。所以zk3为了自己的前途也就将自己的一票投给了zk2.
①、zk2服务挂了,这个时候zk1,zk3立马切换为looking状态,并分别对集群内其他服务进行投票 ②、zk1收到自己的和其他服务投过来的票(1,0)、(3,0) 。zk1会斟酌这两张票,基于我们提到的算法num=10*zxid+myid ,所以zk1会将(3,0)这张票投入计数箱中 ③、zk3收到两种票(3,0)、(1,0),同样会将(3,0)投入计数箱 ④、最终统计zk3获得两票胜出。
数据同步
特色功能
====
服务治理
<!-- SpringBoot整合zookeeper客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
spring:
cloud:
zookeeper:
connect-string: 192.168.44.131:2181
http://localhost/order/getpayment/123
可以看到结果是负载均衡了。配置管理
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-config</artifactId>
</dependency>
spring:
application:
name: cloud-payment-service
profiles:
active: dev
cloud:
zookeeper:
connect-string: 192.168.44.131:2181
config:
enabled: true
root: config
profileSeparator: ','
discovery:
enabled: true
enabled: true
key
解释
spring.application.name
服务名
spring.profiles
环境名
spring.cloud.enabled
用于激活config自动配置
spring.cloud.zookeeper.config.root
zookeeper根路径
spring.cloud.zookeeper.profilSeparator
key分隔符
@Component
@ConfigurationProperties(prefix = "spring.datasources")
@Data
@RefreshScope
public class Db {
private String url;
}
/${spring.cloud.zookeeper.root}/${spring.application.name}${spring.cloud.zookeeper.profileSeparator}${spring.profiles}/${实际的key}
@RefreshScope
, 这个注解是cloud提供的。包括到后面的config配置中心都离不开这个注解/config/cloud-payment-services/spring.datasources.url
,我们需要create /config
然后create /config/cloud-payment-services
在创建最后的内容。localhost:8001/payment/getUrl
获取内容。然后通过set /config/cloud-payment-services/spring.datasources.url helloworld
在刷新接口就可以看到最新的helloworld了。这里不做演示。/config/cloud-payment-services=spring.datasources.url=hello
zkui安装使用
zkui
,顾名思义他是zookeeper可视化工具。我们直接下载github源码。nohup java -jar zkui-2.0-SNAPSHOT-jar-with-dependencies.jar &
后台启动就行了。默认端口9090分布式锁
分布式锁常用在共享资源的获取上。在分布式系统的中我们需要协调每个服务的调度。如果不进行控制的话很大程度会造成资源的浪费甚至是资源溢出。常见的就是我们的库存。
隔离级别
隔离级别
现象
read uncommit
读未提交
产生脏读
read commited
读已提交
幻读(insert、delete)、不可重复读(update)
repeatable read
可重复度
幻读
serializable
串行化
无问题、效率变慢
CuratorFramework
、InterProcessMutex
两个类CuratorFramework client = CuratorFrameworkFactory.newClient("192.168.44.131:2181", new ExponentialBackoffRetry(1000, 3));
client.start();
InterProcessMutex mutex = new InterProcessMutex(client, "/config/test");
long s = System.currentTimeMillis();
boolean acquire = mutex.acquire(100, TimeUnit.SECONDS);
if (acquire) {
long e = System.currentTimeMillis();
System.out.println(e - s+"@@@ms");
System.out.println("lock success....");
}
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。