代写代码的平台,如何优化移动端网站,找哪里做网站,没有网站怎么做CPC目录
一、ZooKeeper是什么
二、ZooKeeper的工作机制
三、ZooKeeper特点
四、ZooKeeper数据结构
五、ZooKeeper应用场景
5.1统一命名服务
5.2统一配置管理
5.3统一集群管理
5.4服务器动态上下线
5.5软负载均衡
六、ZooKeeper的选举机制
6.1第一次启动选举机制
6.2非…目录
一、ZooKeeper是什么
二、ZooKeeper的工作机制
三、ZooKeeper特点
四、ZooKeeper数据结构
五、ZooKeeper应用场景
5.1统一命名服务
5.2统一配置管理
5.3统一集群管理
5.4服务器动态上下线
5.5软负载均衡
六、ZooKeeper的选举机制
6.1第一次启动选举机制
6.2非第一次启动选举机制
七、zookeeper集群部署
7.1环境准备
7.2下载安装包
7.3安装 Zookeeper
7.4修改配置文件
7.5拷贝配置好的 Zookeeper 配置文件到其他机器上
7.6在每个节点上创建数据目录和日志目录
7.7在每个节点的dataDir指定的目录下创建一个 myid 的文件
7.8配置 Zookeeper 启动脚本
7.9设置开机自启
7.10分别启动 Zookeeper
7.11查看当前状态 一、ZooKeeper是什么
Zookeeper是一个开源的分布式的为分布式框架提供协调服务的Apache项目
二、ZooKeeper的工作机制
Zookeeper从设计模式角度来理解是一个基于观察者模式设计的分布式服务管理框架它负责存储和管理大家都关心的数据然后接受观察者的注册一旦这些数据的状态发生变化Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。也就是说
Zookeeper 注册中心文件系统 通知机制 工作机制 1、每个服务端上线时需要到zookeeper集群注册信息 2、客户端从zookeeper集群获取在线服务端信息列表并监听 3、服务端上线下线时zookeeper需要更新列表信息并通知客户端 4、客户端接收到通知重新获取zookeeper在线服务器列表 三、ZooKeeper特点
1Zookeeper一个领导者Leader多个跟随者Follower组成的集群 2Zookeeper集群中只要有半数以上节点存活Zookeeper集群就能正常服务所以Zookeeper适合安装奇数台服务器 3全局数据一致每个Server保存一份相同的数据副本Client无论连接到哪个Server数据都是一致的。 4更新请求顺序执行来自同一个Client的更新请求按其发送顺序依次执行即先进先出。 5数据更新原子性一次数据更新要么成功要么失败。 6实时性在一定时间范围内Client能读到最新数据。
四、ZooKeeper数据结构
ZooKeeper数据模型的结构与Linux文件系统很类似整体上可以看作是一棵树每个节点称做一个ZNode。每一个ZNode默认能够存储1MB的数据每个ZNode都可以通过其路径唯一标识。 五、ZooKeeper应用场景 提供的服务包括 统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等 5.1统一命名服务
在分布式环境下经常需要对应用/服务进行统一命名便于识别。例如IP不容易记住而域名容易记住。
5.2统一配置管理
1分布式环境下配置文件同步非常常见。一般要求一个集群中所有节点的配置信息是一致的比如Kafka集群。对配置文件修改后希望能够快速同步到各个节点上。 2配置管理可交由ZooKeeper实现。可将配置信息写入ZooKeeper上的一个Znode。各个客户端服务器监听这个Znode。一旦Znode中的数据被修改ZooKeeper将通知各个客户端服务器。
5.3统一集群管理
1分布式环境中实时掌握每个节点的状态是必要的。可根据节点实时状态做出一些调整。 2ZooKeeper可以实现实时监控节点状态变化。可将节点信息写入ZooKeeper上的一个ZNode。监听这个ZNode可获取它的实时状态变化。
5.4服务器动态上下线
客户端能实时洞察到服务器上下线的变化
5.5软负载均衡
在Zookeeper中记录每台服务器的访问数让访问数最少的服务器去处理最新的客户端请求这边最小连接调度算法嘛
六、ZooKeeper的选举机制
6.1第一次启动选举机制 1服务器1启动发起一次选举。服务器1投自己一票。此时服务器1票数一票不够半数以上
3票选举无法完成服务器1状态保持为LOOKING
2服务器2启动再发起一次选举。服务器1和2分别投自己一票并交换选票信息此时服务器1
发现服务器2的myid比自己目前投票推举的服务器1大更改选票为推举服务器2。此时服务器
1票数0票服务器2票数2票没有半数以上结果选举无法完成服务器12状态保持LOOKING
3服务器3启动发起一次选举。此时服务器1和2都会更改选票为服务器3
此次投票结果服务器1为0票服务器2为0票服务器3为3票。
此时服务器3的票数已经超过半数服务器3当选Leader。
服务器12更改状态为FOLLOWING服务器3更改状态为LEADING
4服务器4启动发起一次选举。此时服务器123已经不是LOOKING状态不会更改选票信息。
交换选票信息结果服务器3为3票服务器4为1票。此时服务器4服从多数更改选票信息为服务器3并更改状态为FOLLOWING
5服务器5启动同4一样当小弟 比较服务器的myid大小谁的myid越大则获取其他节点的选票当选票数量超过服务器节点数量的半数以后则当选leader其他节点为follower。即使有新的更大myid节点加入集群也不变此时比票数 1. 1服务器1启动后发起一次选举。 2服务器1投自己一票此时服务器1只有一票不够半数以上选举无法完成 3此时服务器1状态为Looking
------------------------------------------------
2. 1服务器2启动再发起一次选举。 2服务器1和2分别投服务器2一票服务器更改刚刚投自己的一票 3此时服务器1为0票服务器2为2票没有半数选举不成功 4此时服务器1和2状态为Looking
------------------------------------为什么1会投2因为服务器2的id比服务器1大所以服务器1会投服务器2
------------------------------------------------------
3. 1服务器3启动发起选举。 2服务器1和2会更改选票投给服务器3 3此时服务器3为3票以超过半数服务器3当选为领导者 4此时服务器1和2状态为跟随者服务器3为领导者
-------------------------------------------------------
4. 1之后服务器启动会发起选举 2虽然后面的服务器myid都比服务器3大 3但是此时服务器3已经是领导者了服务器123不会更改选票信息了 4之后的服务器都将是服务器3的跟随者 6.2非第一次启动选举机制 当zooKeeper 集群中的一台服务器出现以下两种情况之一时就会开始进入Leader选举 服各装初始化启动服务器运行期间无法和Leader保持连接。
而当一台机器进入Leader选举流程时当前集群也可能会处于以下两种状态
集群中本来就已经存在一个Leader
对于已经存在Leader的情况机器试图去选举Leader时会被告知当前服务器的Leader信息对于该机器来说仅仅需要和Leader机器建立连接并进行状态同步即可。
集群中确实不存在Leader。
假设zooKeeper由5台服务器组成SID分别为1、2、3、4、5ZXID分别为8、8、8、7、7并且此时sID为3的服务器是Leader。某一时刻3和5服务器出现故障因此开始进行Leader选举。
选举leader规则
1.EPOCH大的直接胜出
2.EPOCH相同事务id大的胜出
3.事务id相同服务器id大的胜出
SID服务器ID。用来唯一标识一台ZooKeeper集群中的机器每台机器不能重复和myid一致。表示服务器的唯一标志id
ZXID事务ID。ZXID是一个事务ID用来标识一次服务器状态的变更。在某一时刻集群中的每台机器的ZXID值不一定完全一致这和ZooKeeper服务器对于客户端“更新请求”的处理逻辑速度有关。表示处理任务的数量
Epoch每个Leader任期的代号。没有Leader时同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加表示参与选举的次数
七、zookeeper集群部署 准备 3 台服务器做 Zookeeper 集群 主机名ip地址安装软件系统版本zk_kfk1192.168.246.7apache-zookeeper-3.5.7-bin.tar.gzcentos7zk_kfk2192.168.246.9apache-zookeeper-3.5.7-bin.tar.gzcentos7zk_kfk3192.168.246.12apache-zookeeper-3.5.7-bin.tar.gzcentos7 7.1环境准备 三台主机同时操作安装这边仅展示一台 关闭防火墙、防护
systemctl stop firewalld
systemctl disable firewalld
setenforce 0 安装 JDK
#非最小化安装的机器一般都默认安装的
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
java -version 修改主机名、添加主机映射 7.2下载安装包 #下载安装包官方下载地址https://archive.apache.org/dist/zookeeper/ cd /opt
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/apache-zookeeper-3.5.7-bin.tar.gz 7.3安装 Zookeeper
tar xf apache-zookeeper-3.5.7-bin.tar.gz
mv apache-zookeeper-3.5.7-bin /usr/local/zookeeper-3.5.7 7.4修改配置文件
cd /usr/local/zookeeper-3.5.7/conf/
cp zoo_sample.cfg zoo.cfgvim zoo.cfg
----------------------------------------------------tickTime2000 #通信心跳时间Zookeeper服务器与客户端心跳时间单位毫秒
initLimit10 #Leader和Follower初始连接时能容忍的最多心跳数tickTime的数量这里表示为10*2s
syncLimit5 #Leader和Follower之间同步通信的超时时间这里表示如果超过5*2sLeader认为Follwer死掉并从服务器列表中删除Follwer
dataDir/usr/local/zookeeper-3.5.7/data #修改指定保存Zookeeper中的数据的目录目录需要单独创建
dataLogDir/usr/local/zookeeper-3.5.7/logs #添加指定存放日志的目录目录需要单独创建
clientPort2181 #客户端连接端口配置文件末尾
#添加集群信息
server.1192.168.246.7:3188:3288
server.2192.168.246.9:3188:3288
server.3192.168.246.12:3188:3288-------------------------------------------------------------------------------------
server.AB:C:D
●A是一个数字表示这个是第几号服务器。集群模式下需要在zoo.cfg中dataDir指定的目录下创建一个文件myid这个文件里面有一个数据就是A的值Zookeeper启动时读取此文件拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。
●B是这个服务器的地址。
●C是这个服务器Follower与集群中的Leader服务器交换信息的端口。
●D是万一集群中的Leader服务器挂了需要一个端口来重新进行选举选出一个新的Leader而这个端口就是用来执行选举时服务器相互通信的端口 cd /usr/local/zookeeper-3.5.7/conf/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg dataDir/usr/local/zookeeper-3.5.7/data
dataLogDir/usr/local/zookeeper-3.5.7/logs server.1192.168.246.7:3188:3288
server.2192.168.246.9:3188:3288
server.3192.168.246.12:3188:3288 7.5拷贝配置好的 Zookeeper 配置文件到其他机器上
scp /usr/local/zookeeper-3.5.7/conf/zoo.cfg 192.168.246.9:/usr/local/zookeeper-3.5.7/conf/
scp /usr/local/zookeeper-3.5.7/conf/zoo.cfg 192.168.246.12:/usr/local/zookeeper-3.5.7/conf/ 7.6在每个节点上创建数据目录和日志目录
mkdir /usr/local/zookeeper-3.5.7/data
mkdir /usr/local/zookeeper-3.5.7/logs
7.7在每个节点的dataDir指定的目录下创建一个 myid 的文件
echo 1 /usr/local/zookeeper-3.5.7/data/myid
echo 2 /usr/local/zookeeper-3.5.7/data/myid
echo 3 /usr/local/zookeeper-3.5.7/data/myid 7.8配置 Zookeeper 启动脚本
vim /etc/init.d/zookeeper #!/bin/bash
#chkconfig:2345 20 90
#description:Zookeeper Service Control Script
ZK_HOME/usr/local/zookeeper-3.5.7
case $1 in
start)echo ---------- zookeeper 启动 ------------$ZK_HOME/bin/zkServer.sh start
;;
stop)echo ---------- zookeeper 停止 ------------$ZK_HOME/bin/zkServer.sh stop
;;
restart)echo ---------- zookeeper 重启 ------------$ZK_HOME/bin/zkServer.sh restart
;;
status)echo ---------- zookeeper 状态 ------------$ZK_HOME/bin/zkServer.sh status
;;
*)echo Usage: $0 {start|stop|restart|status}
esac 7.9设置开机自启
chmod x /etc/init.d/zookeeper
chkconfig --add zookeeper7.10分别启动 Zookeeper
service zookeeper start 7.11查看当前状态
service zookeeper status //拷贝配置好的 Zookeeper 配置文件到其他机器上
scp /usr/local/zookeeper-3.5.7/conf/zoo.cfg 192.168.246.9:/usr/local/zookeeper-3.5.7/conf/
scp /usr/local/zookeeper-3.5.7/conf/zoo.cfg 192.168.10.22:/usr/local/zookeeper-3.5.7/conf///在每个节点上创建数据目录和日志目录
mkdir /usr/local/zookeeper-3.5.7/data
mkdir /usr/local/zookeeper-3.5.7/logs//在每个节点的dataDir指定的目录下创建一个 myid 的文件
echo 1 /usr/local/zookeeper-3.5.7/data/myid
echo 2 /usr/local/zookeeper-3.5.7/data/myid
echo 3 /usr/local/zookeeper-3.5.7/data/myid//配置 Zookeeper 启动脚本
vim /etc/init.d/zookeeper
#!/bin/bash
#chkconfig:2345 20 90
#description:Zookeeper Service Control Script
ZK_HOME/usr/local/zookeeper-3.5.7
case $1 in
start)echo ---------- zookeeper 启动 ------------$ZK_HOME/bin/zkServer.sh start
;;
stop)echo ---------- zookeeper 停止 ------------$ZK_HOME/bin/zkServer.sh stop
;;
restart)echo ---------- zookeeper 重启 ------------$ZK_HOME/bin/zkServer.sh restart
;;
status)echo ---------- zookeeper 状态 ------------$ZK_HOME/bin/zkServer.sh status
;;
*)echo Usage: $0 {start|stop|restart|status}
esac// 设置开机自启
chmod x /etc/init.d/zookeeper
chkconfig --add zookeeper//分别启动 Zookeeper
service zookeeper start//查看当前状态
service zookeeper status