kafka学习之ZOOKEEPER-kafka

ZOOKEEPER-kafka

Zookeeper是一个开源的分布式应用程序协调服务,是用来保证数据在集群间的事务一致性。
Zookeeper应用场景: 集群分布式锁,集群统一命名服务,分布式协调服务

Zookeeper角色与特性

Leader: 接受所有Follower的提案请求并统一协调发起提案的投票,负责与所有的Follower进行内部数据交换
Follower: 直接为客户端服务并参与提案的投票,同时与Leader 进行数据交换
Observer: 直接为客户端服务但并不参与提案的投票,同时也与Leader 进行数据交换

Zookeeper角色与选举
服务在启动的时候是没有角色的(LOOKING),角色是通过选举产生的-选举产生一个Leader,剩下的是Follower

选举Leader原则
集群中超过半数机器投票选择Leader-假如集群中拥有n台服务器,那么Leader必须得到(n/2+1)的投票

Zookeeper的高可用

如果Leader死亡,重新选举Leader,如果死亡的机器数量达到一半,则集群挂掉
如果无法得到足够的投票数量,就重新投票,如果参与投票的机器不足n/2+1,则集群停止工作
如果Follower死亡过多,剩余机器不足n/2+1,则集群也会停止工作,Observer不计算在投票总设备数量里面

Zookeeper可伸缩扩展性原理与设计

Leader:所有写相关操作
Follower:读操作与响应Leader提议。
0bserver:不参与投票的服务器
    -0bserver可以接受客户端的连接,并将写请求转发给Leader 节点。
    -但Leader 节点不会要求0bserver参加投票,仅仅在上述第3步那样,和其他服务节点一起得到投票结果
observer优势
0bserver的扩展,给Zookeeper的可伸缩性带来了全新的景象。加入很多0bserver节点,无须担心严重影响写吞吐量。0bserver提升读性能的可伸缩性,并且还提供了提供了广域网能力但Observer并非是无懈可击,因为协议中的通知阶段,仍然与服务器的数量呈线性关系。但是这里的串行开销非常低。因此,可以认为在通知服务器阶段不会成为瓶颈

zookeeper集群搭建

[root@hdp ~]# yum install -y java-1.8.0-openjdk-devel
[root@hdp ~]# tar xf zookeeper-3.4.13.tar.gz
[root@hdp ~]# mv zookeeper-3.4.13 /usr/local/zookeeper
[root@hdp ~]# cd /usr/local/zookeeper/conf/
[root@hdp conf]# cp zoo_sample.cfg zoo.cfg
[root@hdp conf]# vim zoo.cfg
# 配置文件最后添加
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
server.4=hdp:2888:3888:observer
[root@hdp conf]# for i in  node{1..3};do rsync -aXSH --delete /usr/local/zookeeper ${i}:/usr/local/;done

创建myid

创建datadir指定的目录mkdir /tmp/zookeeper,在目录下创建myid文件,文件内容为主机运行id
myid文件中只有一个数字,server.id中的id与myid中的id必须对应,server.1=node-01:2888:3888
id的范围是1~255,请确保每个server的id都是唯一的

所有节点均要配置myid,启动服务

[root@hdp ~]# mkdir /tmp/zookeeper
[root@hdp ~]# echo 4 > /tmp/zookeeper/myid
[root@hdp ~]# /usr/local/zookeeper/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@hdp ~]# jps
13812 QuorumPeerMain			#所有节点都需要有
[root@hdp ~]# /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: observer			#observer
[root@node1 ~]# /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower			#follower
[root@hdp ~]# cat zkstats      //验证的小脚本,方便验证 上面的状态
#!/bin/bash
function getzkstat(){
    exec 2>/dev/null
    exec 8<>/dev/tcp/$1/2181
    echo stat >&8
    Msg=$(cat <&8 |grep -P "^Mode:")
    exec 8<&-
    printf "%15s " $1
    echo -e "${Msg:-Mode: \x1b[31mNULL\x1b[0m}"
}

if (( $# == 0 ));then
    echo "${0##*/} zk1 zk2 zk3 ... ..."
else
    for i in $@;do
        getzkstat ${i}
    done
fi
[root@hdp ~]# chmod +x zkstats
[root@hdp ~]# ./zkstats hdp node1 node2 node3
            hdp Mode: observer
          node1 Mode: follower
          node2 Mode: follower
          node3 Mode: leader

#关掉leader后再次查询如下, node-0002开机后启动zookeeper会自动恢复到集群里
zookeeper集群本身具有很好的高可用特性leader死亡后会重新选举新的leader,这个过程完全是自动的,不需要人工干预,fllower是多个节点,其中部分死亡后其他节点还可以继续工作不管是leader还是fllower,死亡的总数不能达到(n/2)台,否则集群挂起,observer不计算在高可用里面

[root@hdp ~]# yum install -y socat
[root@hdp ~]# socat - TCP:node1:2181		# - 标准输入输出,tcp协议,2181端口
ruok		//输入
imok		//自动输出

Kafka
使用消息队列的好处:解耦、冗余、异步通信、提高扩展性,流量削峰、缓冲、保证顺序,灵活。

1)解耦
允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。
2)可恢复性
系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所
以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。
3)缓冲
有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致
的情况。
4)灵活性 & 峰值处理能力
在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。
如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列
能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。
5)异步通信
很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户
把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要
的时候再去处理它们。

Kafka角色与集群结构

-producer:生产者,负责发布消息
-consumer: 消费者,负责读取处理消息
-topic:	  消息的类别
-Broker:   Kafka集群包含一个或多个服务器
-Kafka:   将元数据信息保存在Zookeeper中
-broker:  会在zookeeper注册并保持相关的元数据更新

kafka集群安装

1、安装配置 kafka,并同步给其他主机

[root@hdp ~]# yum install -y java-1.8.0-openjdk-devel
[root@hdp ~]# tar zxf kafka_2.12-2.1.0.tgz
[root@hdp ~]# mv kafka_2.12-2.1.0 /usr/local/kafka
[root@hdp ~]# for i in  node{1..3};do rsync -aXSH --delete /usr/local/kafka ${i}:/usr/local/;done

2、修改 node-0001,node-0002,node-0003 配置文件并启动服务

[root@node1 ~]# vim /usr/local/kafka/config/server.properties
21   broker.id=1				#每台不同
123  zookeeper.connect=node1:2181,node2:2181,node3:2181
[root@node3 ~]# /usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties		//节点上都需要启动
[root@node3 ~]# jps
12525 Kafka

创建topic验证

[root@node1 ~]# /usr/local/kafka/bin/kafka-topics.sh --create --partitions 1 --replication-factor 1 --zookeeper localhost:2181 --topic mymsg
Created topic "mymsg".

验证

[root@node-0001 ~]# /usr/local/kafka/bin/kafka-topics.sh --create --partitions 1 --replication-factor 1 --zookeeper localhost:2181 --topic mymsg	#创建mymsg一个topic

你可能感兴趣的:(kafka,运维,kafka)