Zookeeper
- Zookeeper是一个开源的分布式应用程序协调服务
- Zookeeper是用来保证数据在集群间的事务一致性
- Zookeeper应用场景
– 集群分布式锁
– 集群统一命名服务
– 分布式协调服务
官网文档:http://zookeeper.apache.org/
角色
- Leader : 接受所有的Follower的提案请求并统一协调发起提案的投票,负责与所有的Follower进行内部数据交换
- Follower : 直接为客户端服务并参与提案的投票,同时与leader进行数据交换
- Observer : 直接为客户端服务但并不参与提案的投票,同时也与Leader进行数据交换 ,
选举
- 服务的启动的时候是没有角色的(LOOKING)
- 角色是通过选举产生的
- 选举产生一个Leader,剩下的是Follower
- 选举原则
– 集群中超过半数机器投票选择Leader
– 假如集群中拥有n台服务器,那么Leader必须得到n/2+1台服务器的投票(服务器台数最好是奇数) - 如果Leader死亡,重新选举Leader
- 如果死亡的机器数量达到一半,则集群挂掉
- 如果无法得到足够的投票数量,就重新发起投票,如果参与投票的机器不足n/2+1.则集群通知工作
- 如果Follower死亡过多,剩余机器不足n/2+1,则集群也会停止工作
- Observer不计算在投票总设备数量里面
Zookeeper原理与设计
Zookeeper安装
安装Zookeeper
编辑/etc/hosts ,所有集群主机可以相互 ping 通(在hadoop01上面配置,同步到node1,node2,node3)
vim /etc/hosts
192.168.1.60 hadoop01
192.168.1.61 node1
192.168.1.62 node2
192.168.1.63 node3
for i in {62..64}
do
scp /etc/hosts 192.168.1.$i:/etc/
done //同步配置
hosts 100% 253 639.2KB/s 00:00
hosts 100% 253 497.7KB/s 00:00
hosts 100% 253 662.2KB/s 00:00
所有主机安装 java-1.8.0-openjdk-devel
zookeeper 解压拷贝到 /usr/local/zookeeper
tar -xf zookeeper-3.4.13.tar.gz
mv zookeeper-3.4.13 /usr/local/zookeeper
配置文件改名,并在最后添加配置
cd /usr/local/zookeeper/conf/
ls
configuration.xsl log4j.properties zoo_sample.cfg
cp zoo_sample.cfg zoo.cfg
chown root.root zoo.cfg
vim zoo.cfg
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
server.4=nn01:2888:3888:observer
拷贝 /usr/local/zookeeper 到其他集群主机
for i in node{1..3}
do
rsync -aXSH --delete /usr/local/zookeeper $i:/usr/local/ &
done
所有主机
创建 mkdir /tmp/zookeeper
创建 myid 文件,id 必须与配置文件里主机名对应的 server.(id) 一致
echo 4 >/tmp/zookeeper/myid
ssh node1 'echo 1 >/tmp/zookeeper/myid'
ssh node2 'echo 2 >/tmp/zookeeper/myid'
ssh node3 'echo 3 >/tmp/zookeeper/myid'
启动服务,单启动一台无法查看状态,需要启动全部集群以后才能查看状态,每一台上面都要手工启动
/usr/local/zookeeper/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
注意:刚启动zookeeper查看状态的时候报错,启动的数量要保证半数以上,这时再去看就成功了
查看状态
/usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: observe
/usr/local/zookeeper/bin/zkServer.sh stop
#关闭之后查看状态其他服务器的角色
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
yum -y install telnet
telnet node3 2181
Trying 192.168.1.24...
Connected to node3.
Escape character is '^]'.
ruok #发送
imokConnection closed by foreign host. #imok回应的结果
利用 api 查看状态hadoop01上操作
/usr/local/zookeeper/bin/zkServer.sh start
vim api.sh
#!/bin/bash
function getstatus(){
exec 9<>/dev/tcp/$1/2181 2>/dev/null
echo stat >&9
MODE=$(cat <&9 |grep -Po "(?<=Mode:).*")
exec 9<&-
echo ${MODE:-NULL}
}
for i in node{1..3} nn01;do
echo -ne "${i}\t"
getstatus ${i}
done
chmod 755 api.sh
./api.sh
node1 follower
node2 leader
node3 follower
hadoop01 observer
Kafka集群
- Kafka是什么
– Kafka是由LinkedIn开发的一个分布式的消息系统
– Kafka是使用的Scala编写
– Kafka是一种消息中间件 - 为什么使用Kafka
– 解耦,冗余,提高扩展性,缓冲
– 保证顺序,灵活,削峰填谷
– 异步通信 - Kafka角色与集群结构
– producer : 生产者,负责发布消息
– consumer : 消费者,负责读取处理消息
– topic : 消息的类别
– Parition : 每个Topic包括一个或多个partition
– Broker : Kafka集群包括一个或多个服务器 - Kafka通过Zookeeper管理集群配置,选举Leader
- Kafka集群的安装配置
– Kafka集群的安装配置依赖Zookeeper,搭建Kafka集群之前,请先创建好一个可用的Zookeeper集群
– 安装Openjdk运行环境
– 同步Kafka拷贝到所有集群主机
– 修改配置文件
– 启动与验证
解压 kafka 压缩包
Kafka在node1,node2,node3上面操作即可
tar -xf kafka_2.12-2.1.0.tgz
把 kafka 拷贝到 /usr/local/kafka 下面
mv kafka_2.12-2.1.0 /usr/local/kafka
修改配置文件 /usr/local/kafka/config/server.properties
cd /usr/local/kafka/config
vim server.properties
broker.id=22
zookeeper.connect=node1:2181,node2:2181,node3:2181
拷贝 kafka 到其他主机,并修改 broker.id ,不能重复
for i in node{2..3}
do
rsync -aXSH --delete /usr/local/kafka $i:/usr/local/
done
vim /usr/local/kafka/config/server.properties
#node2主机修改
broker.id=23
vim /usr/local/kafka/config/server.properties
#node3主机修改
broker.id=24
启动 kafka 集群(node1,node2,node3启动)
/usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
jps #出现kafka
26483 DataNode
27859 Jps
27833 Kafka
26895 QuorumPeerMain
验证配置,node1创建一个 topic
/usr/local/kafka/bin/kafka-topics.sh --create --partitions 1 --replication-factor 1 --zookeeper node3:2181 --topic aa
Created topic "aa".
模拟生产者,node2发布消息
/usr/local/kafka/bin/kafka-console-producer.sh \
--broker-list node2:9092 --topic aa #写一个数据
ccc
ddd
模拟消费者,node3接收消息
/usr/local/kafka/bin/kafka-console-consumer.sh \
--bootstrap-server node1:9092 --topic aa #这边会直接同步
ccc
ddd
注意:kafka比较吃内存