Zookeeper(六)-选主-概念分析

Zookeeper(六)-选主-概念分析,第1张

zk通过Multi-Paxos思想实现分布式一致性,Multi-Paxos为了解决Paxos需要2轮RPC通讯(准备阶段和接受阶段)往返消息多、耗性能、延迟大的问题引入了Leader-Follower-Learner模式;考虑到高可用性,有Leader就会涉及选举Leader的问题,本节就来分析下zk是如何实现选主的;

以三个节点同时启动为例:

以3个节点中Server1作为Follower重启为例:

以4个节点中Server4作为Leader宕机为例:

Leader :一个zk集群同一时刻只有一个Leader,所有写 *** 作必须通过Leader完成,然后再广播给其他服务器
Follower :一个zk集群同一时刻有多个Follower。Follower可以直接处理读请求,但是写请求需要转发给Leader处理,同时负责在Leader处理写请求时对请求进行投票;
Observer :功能跟Follower类似,但是没有投票权;

Looking :寻找Leader状态,处于该状态的服务器会发起选主;
Following :跟随者状态,表明当前服务器是Follower;
Leading :领导者状态,表明当前服务器是Leader;
Observing :观察者状态,表明当前服务器是Observer;

Listenerrun 监听2888端口,阻塞在ServerSocketaccept,等待其他服务器请求创建连接;
RecvWorkerrun 阻塞在DataInputStreamread,获取对应服务器发送的投票信息;
SendWorkerrun 阻塞在ArrayBlockingQueuepoll,获取待发送消息,发送给对应服务器;
WorkerReceiverrun 阻塞在recvqueuepoll,获取RecvWorkerrun中接收的投票消息Notification;
WorkerSenderrun 阻塞在sendqueuepoll,获取待发送ToSend到SendWorkerrun进行处理;
QuorumPeerrun 集群模式启动过程中选举结束后,根据当前服务器状态进行之后的异步流程处理;

LinkedBlockingQueue<ToSend> sendqueue FastLeaderElection中的请求发送队列,存放的是ToSend;

LinkedBlockingQueue<Notification> recvqueue FastLeaderElection中的请求接受队列,存放的是Notification;

ConcurrentHashMap<Long, SendWorker> senderWorkerMap sid -> 当前服务器到该sid的SendWorker;每个服务器会跟比自己sid小的服务器创建一个SendWorker用于投票选主时发送投票信息;
ConcurrentHashMap<Long, ArrayBlockingQueue<ByteBuffer>> queueSendMap sid -> 当前服务器需要发送到该sid的投票消息的队列;WorkerSenderrun中会根据不同sid把对用的选票信息放入对应的ArrayBlockingQueue中;
ConcurrentHashMap<Long, ByteBuffer> lastMessageSent sid->最后一次发送到该sid的投票信息;
ArrayBlockingQueue<Message> recvQueue WorkerReceiverrun中接收到的投票信息,解析字节流转成Message放到recvQueue中;

zk选主涉及6个线程、多个集合,过程比较饶,必须要先把选主的流程和各个线程、集合的作用等搞清楚,不然理解起来比较难。下一节通过源码来具体分析选主的实现;
------ over ------

不可以,modbuspoll是仿真调试工具,不提供链接,但是可以用Virtual Serial Port Driver 90在一台电脑里创建虚拟机,实现链接的目的
Modbus学习必备的三大神器分别是ModbusPoll、ModbusSlave及VSPD,可以非常方便的进行modbus调试
ModbusPoll软件主要用于仿真Modbus主站或Modbus客户端
ModbusSlave软件主要用于仿真Modbus从站或Modbus服务器
而VSPD全称Configure Virtual Serial Port Driver,是用来给电脑创建虚拟串口使用的。
Modbus Poll :Modbus主机仿真器,用于测试和调试Modbus从设备。该软件支持ModbusRTU、ASCII、TCP/IP。用来帮助开发人员测试Modbus从设备,或者其它Modbus协议的测试和仿真。它支持多文档接口,即,可以同时监视多个从设备/数据域。每个窗口简单地设定从设备ID,功能,地址,大小和轮询间隔。你可以从任意一个窗口读写寄存器和线圈。如果你想改变一个单独的寄存器,简单地双击这个值即可。或者你可以改变多个寄存器/线圈值。提供数据的多种格式方式,比如浮点、双精度、长整型(可以字节序列交换)。
Modbus Slave: Modbus从设备仿真器,可以仿真32个从设备/地址域。每个接口都提供了对EXCEL报表的OLE自动化支持。主要用来模拟Modbus从站设备,接收主站的命令包,回送数据包。帮助Modbus通讯设备开发人员进行Modbus通讯协议的模拟和测试,用于模拟、测试、调试Modbus通讯设备。可以32个窗口中模拟多达32个Modbus子设备。与Modbus Poll的用户界面相同,支持功能01, 02, 03, 04, 05, 06, 15, 16, 22和23,监视串口数据。
Virtual Serial Port Driver 90 虚拟com端口工具
Virtual Serial Port Driver 90使用
Modbus调试需要需要两台电脑联机或者上位机与下位机进行调试。有了这个工具后就可以在一个电脑上虚拟出两个连接的com端口,就可以在一台电脑上进行调试。
安装过程一直点next即可,这里不再阐述,安装完成之后打开软件,主体是下图
我们分成两个部分,左边是虚拟串口的设置,右边是虚拟串口的添加
注意添加虚拟串口时尽量选择较大的COM口,因为较小的COM口可能被电脑的键盘,鼠标,U盘等设备占用,会出现冲突。
我这里选择COM10跟COM11 点击Add virtual pair在左边就可以看到建立的虚拟串口。
在此电脑----右键----管理----设备管理器->端口中查看是否新加了两个端口:
Modbus Poll使用
安装过程一直点next即可,安装完成之后破解一下(输一下密钥,很简单),软件界面如下图所示。
状态框:
Tx = 0表示向主站发送数据帧次数,图中为0次;
Err = 0表示通讯错误次数,图中为0次;
ID = 1表示模拟的Modbus子设备的设备地址,图中地址为1;
F = 03表示所使用的Modbus功能码,图中为03功能码;
SR = 1000ms表示发送周期,1S一次。
红字部分,表示当前的错误状态,“No Connection”表示未连接状态。
单击Setup----Read/Write Definition… 或者按F8进行参数设置,会d出参数设置对话框。
Slave ID为要访问的Modbus从机的地址,
Function 功能码的选择,
Address 为寄存器起始地址,根据功能码的不同,访问地址不同
Quantity:为访问寄存器个数,
Scan Rate为读取数据周期,轮询发送,单位毫秒,
Modbus协议同时规定了二十几种功能码,但是常用的只有8种,用于对存储区的读写,如下表所示:
功能码 功能说明
01H 读取输出线圈
02H 读取输入线圈
03H 读取保持寄存器
04H 读取输入寄存器
05H 写入单线圈
06H 写入单寄存器
0FH 写入多线圈
10H 写入多寄存器
当然我们用的最多的就是03和06 一个是读取数据,一个是修改数据。
关于功能码以及寄存器地址
看这篇讲解原理的文章:
详解Modbus通信协议—清晰易懂
点击Display可以设置数据的显示方式,默认为Signed方式(16进制无符号二进制),数据范围为-32768~32767
点击 Connection -> Connect或者按“F3”进行连接
端口主从机分别选择我们虚拟出来的com10和com11端口,其他选项如波特率9600,比特位8,校验位1,无等价位等可以保持不变,然后点击确定进行连接,未连接成功窗口第二行会给出提示信息。
Response Timeout,表示读取超时时间,从站在超时时间内没有返回数据,则认为通讯失败。
Delay Between Polls,每次扫描的最小间隔时间,默认为20ms。
Remote Modbus Server,表示TCP/IP模式时的终端从站设备的网络设置。
IP Address,表示TCP/IP模式时从站IP地址。
Port,表示TCP模式时从站网络端口
Connect Timeout 表示TCP链接超时时间
IPV4/IPV6

1 E1: 无效的功能代码
2 E2: 无效的地址
3 E3: 无效的数据值
4 E4: 无效的响应
5 E5: 无法访问设备
6 E6: 设备响应超时
7 E7: 数据校验错误
8 E8: 无法打开串口
9 E9: 无法关闭串口
10 E10: 无法设置串口参数
11 E11: 无法发送数据
12 E12: 无法接收数据
13 E13: 串口缓冲区溢出
14 E14: 无法解析数据
15 E15: 无效的请求
16 E16: 无效的响应长度
17 E17: 无法连接到服务器
18 E18: 无法发送请求
19 E19: 无法接收响应
20 E20: 无效的服务器响应

二、配置ntp服务器端
restrict 0000 mask 0000 nomodify notrap noquery
restrict 1921681660 mask 2552552550 nomodify
restrict 127001
server 2107214544 prefer
server 12712710
fudge 12712710 stratum 8
driftfile /var/lib/ntp/drift
keys /etc/ntp/keys
说明:关于权限设定部分
权限的设定主要以 restrict 这个参数来设定,主要的语法为:
restrict IP地址 mask 子网掩码 参数
其中 IP 可以是IP地址,也可以是 default ,default 就是指所有的IP
参数有以下几个:
ignore :关闭所有的 NTP 联机服务
nomodify:客户端不能更改服务端的时间参数,但是客户端可以通过服务端进行网络校时。
notrust :客户端除非通过认证,否则该客户端来源将被视为不信任子网
noquery :不提供客户端的时间查询
注意:如果参数没有设定,那就表示该 IP (或子网)没有任何限制!
三、查看NTP服务的运行状况
#watch ntpq -p
参数说明:
remote: 它指的就是本地机器所连接的远程NTP服务器
refid: 它指的是给远程服务器(eg 1936019975)提供时间同步的服务器
st: 远程服务器的层级别(stratum) 由于NTP是层型结构,有顶端的服务器,多层的Relay Server再到客户端 所以服务器从高到低级别可以设定为1-16 为了减缓负荷和网络堵塞,原则上应该避免直接连接到级别为1的服务器的
t: 这个我也不知道啥意思^_^
when: 我个人把它理解为一个计时器用来告诉我们还有多久本地机器就需要和远程服务器进行一次时间同步
poll: 本地机和远程服务器多少时间进行一次同步(单位为秒) 在一开始运行NTP的时候这个poll值会比较小,那样和服务器同步的频率也就增加了,可以尽快调整到正确的时间范围之后poll值会逐渐增大,同步的频率也就会相应减小
reach: 这是一个八进制值,用来测试能否和服务器连接每成功连接一次它的值就会增加
delay: 从本地机发送同步要求到服务器的round trip time
offset: 这是个最关键的值, 它告诉了我们本地机和服务器之间的时间差别 offset越接近于0,我们就和服务器的时间越接近
jitter: 这是一个用来做统计的值 它统计了在特定个连续的连接数里offset的分布情况 简单地说这个数值的绝对值越小我们和服务器的时间就越精确
四、客户端配置
ntpdate 192168166100
LINUX做为客户端自动同步时间
如果想定时进行时间校准,可以使用crond服务来定时执行。
编辑 /etc/crontab 文件
加入下面一行:
30 8 root /usr/sbin/ntpdate 192168166100; /sbin/hwclock -w #19216801是NTP服务器的IP地址
然后重启crond服务
service crond restart
这样,每天 8:30 Linux 系统就会自动的进行网络时间校准。
WINDOWS 需要打开windows time服务和RPC的二个服务
如果在打开windows time 服务,时报 错误1058,进行下面 *** 作
1运行 cmd 进入命令行,然后键入
w32tm /register 进行注册
正确的响应为:W32Time 成功注册。
2如果上一步正确,用 net start "windows time" 或 net start w32time 启动服务。
五、报错说明
当用ntpdate -d 来查询时会发现导致 no server suitable for synchronization found 的错误的信息有以下2个:
错误1Server dropped: Strata too high
在ntp客户端运行ntpdate serverIP,出现no server suitable for synchronization found的错误。
在ntp客户端用ntpdate –d serverIP查看,发现有“Server dropped: strata too high”的错误,并且显示“stratum 16”。而正常情况下stratum这个值得范围是“0~15”。
这是因为NTP server还没有和其自身或者它的server同步上。
以下的定义是让NTP Server和其自身保持同步,如果在/ntpconf中定义的server都不可用时,将使用local时间作为ntp服务提供给ntp客户端。
server 12712710 fudge
12712710 stratum 8
在ntp server上重新启动ntp服务后,ntp server自身或者与其server的同步的需要一个时间段,这个过程可能是5分钟,在这个时间之内在客户端运行ntpdate命令时会产生no server suitable for synchronization found的错误。
那么如何知道何时ntp server完成了和自身同步的过程呢?
在ntp server上使用命令:
# watch ntpq -p
出现画面:
Every 20s: ntpq -p Thu Jul 10 02:28:32 2008
remote refid st t when poll reach delay offset jitter
==============================================================================
1921683022 LOCAL(0) 8 u 22 64 1 2113 179133 0001
LOCAL(0) LOCAL(0) 10 l 21 64 1 0000 0000 0001
注意LOCAL的这个就是与自身同步的ntp server。
注意reach这个值,在启动ntp server服务后,这个值就从0开始不断增加,当增加到17的时候,从0到17是5次的变更,每一次是poll的值的秒数,是64秒5=320秒的时间。
如果之后从ntp客户端同步ntp server还失败的话,用ntpdate –d来查询详细错误信息,再做判断。
错误2Server dropped: no data
从客户端执行netdate –d时有错误信息如下:
transmit(1921683022)
transmit(1921683022)
transmit(1921683022)
transmit(1921683022)
transmit(1921683022)
1921683022: Server dropped: no data
server 1921683022, port 123

28 Jul 17:42:24 ntpdate[14148]: no server suitable for synchronization found
出现这个问题的原因可能有2:
1检查ntp的版本,如果你使用的是ntp42(包括42)之后的版本,在restrict的定义中使用了notrust的话,会导致以上错误。
使用以下命令检查ntp的版本:
# ntpq -c version
下面是来自ntp官方网站的说明:
The behavior of notrust changed between versions 41 and 42
In 41 (and earlier) notrust meant "Don't trust this host/subnet for time"
In 42 (and later) notrust means "Ignore all NTP packets that are not cryptographically authenticated" This forces remote time servers to authenticate themselves to your (client) ntpd
解决:
把notrust去掉。
2检查ntp server的防火墙。可能是server的防火墙屏蔽了upd 123端口。
可以用命令
#iptables INPUT -p udp -m udp --dport 123 -j ACCEPT
如果觉得麻烦就直接把防火墙停掉
#service iptables stop
来关掉iptables服务后再尝试从ntp客户端的同步,如果成功,证明是防火墙的问题,需要更改iptables的设置。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/12659543.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-27
下一篇 2023-05-27

发表评论

登录后才能评论

评论列表(0条)

保存