初步认识Zookeeper

单体架构——>分布式架构

单体架构

分布式架构

分布式架构下,当服务越来越多,对应机器的数量越来越多,单靠人工来管理和维护服务及地址的配置地址越来越困难。单点故障开始凸显,一旦服务路由或者负载均衡服务器宕机,依赖它的所有服务均失效。

此时,需要一个能够动态注册获取服务信息的地方,来统一管理服务名称其对应的服务器列表,称之为服务配置中心

服务器配置中心

服务提供者在启动时,将其提供的服务名称、服务地址注册服务配置中心

服务消费者通过服务配置中心获得需要调用的服务的机器列表

通过相应的负载均衡算法,选取其中一台服务器进行调用;

当服务器宕机或下线时,相应的机器需要能够动态的从服务器配置中心移除,并通知相应的服务消费者。否则服务消费者就有可能因为调用到已经失效服务而发生错误。在这个过程中,服务消费者只有在第一次调用时需要查询服务配置中心,然后将查到的信息缓存到本地,后面调用直接使用本地缓存的服务地址列表信息,而不需要重新发起请求到服务配置中心去获取相应的服务地址列表,直到服务的地址列表有变更(机器上线或下线)

这种结构解决了之前负载均衡设备所导致的单点故障问题,并且大大减轻了服务配置中心的压力

中间件

zookeeper  、eurek、consul、Apollo

什么是zookeeper

zookeeper 是一个开源的分布式协调服务,由雅虎公司创建,是google chubby的开源实现。zookeeper的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来, 构成一个高效可靠的原语集(由若干条指令组成的,完成 一定功能的一个过程),并且以一些简单可用的接口提供给用户使用 zookeeper。

zookeeper 的安装部署

下载安装包

http://apache.fayea.com/zookeeper/

解压

tar -zxvf 解压

复制zoo_sample.cfg 为zoo.cfg

cd zookeeper-3.4.10/conf

cp zoo_sample.cfg zoo.cfg

zoo.cfg

dataDir 表示数据文件存放的路径

启动zookeeper 服务端

cd zookeeper-3.4.10/bin/

sh zkServer.sh start

启动动zookeeper 客户端

sh zkCli.sh

常用命令

帮助

help

启动ZK服务:

bin/zkServer.sh start

查看ZK服务状态:

bin/zkServer.sh status

停止ZK服务:

bin/zkServer.sh stop

重启ZK服务:

bin/zkServer.sh restart

连接服务器

zkCli.sh -timeout 0 -r -server ip:port

示例代码

创建orderservice节点 value 为0

create /orderservice 0

查看节点

ls /

查看orderservice 节点

ls /orderservice

在orderservice 下创建节点

create /orderservice/wsdl 1

删除节点(删除必须一层一层的删除)

delete /orderservice/wsdl

获取数据

get /orderservice

创建/orderservice/wsdl节点,value 为wrh

create /orderservice/wsdl wrh

获取节点的值

get /orderservice/wsdl

创建节点

-s:顺序节点 SEQUENCE

-e:临时节点 EPHEMERAL

创建临时节点

create -e /temp temp

临时节点,会话断开,临时节点会消失

创建有序节点

create /seq seq

create -s /seq/ 1

/seq/0000000002

create -s /seq/ 2

/seq/0000000002

查看有序节点

ls /seq[0000000001, 0000000000, 0000000003, 0000000002]

加入事件

get /wrh true

set /wrh value

集群环境安装

在集群环境中, 各个节点有三个角色,

leader,follower,observer

三台机器分别修改zoo.cfg

修改端口

格式:server.id =IP:PORT:PORT

server.1 =192.168.15.134:8888:9999

server.2 =192.168.15.139:8888:9999

server.3 =192.168.15.140:8888:9999

8888 :访问zookeeper 的端口

9999: 重新选举leader 的端口

server.id =ip:port1 :port2

  • id 是一个数字,表示这个是第几号服务器, 指的是server ID,用来标识该机器在集群中的机器序号

  • ip 是这个服务器的ip地址

  • port1 表示的是这个服务器与集群中的leader服务器交换信息的端口

  • port2 表示的是万一集群中的leader 服务器挂了,需要一个端口来重新选举,选出一个新的leader, 而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于ip 是一样的,所以不同的zookeeper 实例通信端口不能一样,所以要给他们分配不同的端口。

集群模式下,每台机器都需要感知到整个集群是由哪几台服务器组成的,在配置文件中,需要将所有的zookeeper 服务器实例进行添加。如:server.id =ip:port1 :port2

 

在datadir 目录,新建myid

在每台zookeeper 机器上,我们都需要在数据目录(dataDir)下创建一个myid 文件,内容为每台机器的server id 数字,如server.1 的myid 文件内容就是1. 必须确保每个服务器的myid 文件中的数字不同,并且和自己所在机器的zoo.cfg 中的server.id 保持一致,id的范围1-255

 

集群时启动zookeeper 可能会出现异常

java.net.NoRouteToHostException: 没有到主机的路由 (Host unreachable)

需关闭防火墙

systemctl stop firewalld

zoo.cfg 配置文件分析

ZooKeeper使用的基本时间单位(以毫秒为单位)。它用于做心跳,最小会话超时将是tickTime的两倍。

tickTime =2000

初始化 10个tickTime, 最大同步初始化时间

initLimit=10

Leader 和follower 心跳检测的一个最大延迟

syncLimit=5

数据文件目录

dataDir =/tmp/zookeeper

对外开放的客户端端口

clientPort=2181

http://zookeeper.apache.org/doc/r3.4.10/zookeeperStarted.html

节点的stat 信息

如果没有修改过的话,创建事务id 和 更新事务id 是一样的

cZxid = 0x100000004 //创建事务idctime = Sun Dec 16 03:21:30 CST 2018

mZxid = 0x100000004 //更新事务id

mtime = Sun Dec 16 03:21:30 CST 2018

pZxid = 0x100000004 //子节点最后一次修改的事物id ,只有子节点变更以后才会产生pxid的影响

cversion = 0 //乐观锁的概念 当前节点的子节点的版本号

dataVersion = 0 //当前数据内容的版本号

aclVersion = 0 //当前节点ACL权限变更的版本号 这个三个版本号用来控制数据的并发性的

ephemeralOwner = 0x0 //创建临时节点才会有的 绑定当前会话的信息

dataLength = 1 //当前数据的长度

numChildren = 0 //当前子节点的数量

 

集群角色

 

会话状态

 

配置中心

 

负载均衡

 

注册中心

 

 

ACL

ACL 权限控制,类似linux 权限控制

CREATE/READ/WRITE/DELTE/ADMIN

Watcher 机制

zookeeper 节点的特性

  • 同级节点的唯一性

  • 临时节点和持久化节点

    • 在会话建立的会话周期中,创建的临时节点,会话结束后会自动删除

  • 有序节点和无序节点

  • 节点会存在父子关系,必须有先后

  • 临时节点下不能存在子节点

 

posted @ 2018-12-16 15:43  冰雪柔情的天空  阅读(921)  评论(0)    收藏  举报