ELK日志分析系统+zookeeper
一、zookeeper简介
1、zookeeper概念
ZooKeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务,它提供了一项基本服务:分布式锁服务。分布式应用可以基于它实现更高级的服务,实现诸如同步服务、配置维护和集群管理或者命名的服务。
Zookeeper服务自身组成一个集群,2n+1个(奇数)服务允许n个失效,集群内一半以上机器可用,Zookeeper就可用。
假设 3台机器组成的集群,可以有允许一台失效,如果有2台失效,这个集群就不可用,1<1.5,一般的搭建zookeeper集群时,以奇数台机器来搭建。目的:是为了提高容错能允许多损失一台。
2、zookeeper数据结构
ZooKeeper数据模型的结构与Linux文件系统很类似,整体上可以看作是一棵树,每个节点称做一个ZNode。每一个ZNode默认能够存储1MB的数据,每个ZNode都可以通过其路径唯一标识。
二、zookeeper工作机制
Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。也就是说 Zookeeper =文件系统+通知机制。
1、zookeeper特点
(1)Zookeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群。
(2)Zookeepe集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。所以Zookeeper适合安装奇数台服务器。
(3)全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的。
(4)更新请求顺序执行,来自同一个Client的更新请求按其发送顺序依次执行,即先进先出。
(5)数据更新原子性,一次数据更新要么成功,要么失败。
(6)实时性,在一定时间范围内,Client能读到最新数据。
2、zookeeper应用场景
提供的服务包括:统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。
统一命名服务
在分布式环境下,经常需要对应用/服务进行统一命名,便于识别。例如:IP不容易记住,而域名容易记住。
统一配置管理
(1)分布式环境下,配置文件同步非常常见。一般要求一个集群中,所有节点的配置信息是一致的,比如Kafka集群。对配置文件修改后,希望能够快速同步到各个节点上。
(2)配置管理可交由ZooKeeper实现。可将配置信息写入ZooKeeper上的一个Znode。各个客户端服务器监听这个Znode。一旦 Znode中的数据被修改,ZooKeeper将通知各个客户端服务器。
统一集群管理
(1)分布式环境中,实时掌握每个节点的状态是必要的。可根据节点实时状态做出一些调整。
(2)ZooKeeper可以实现实时监控节点状态变化。可将节点信息写入ZooKeeper上的一个ZNode。监听这个ZNode可获取它的实时状态变化。
服务器动态上下线
客户端能实时洞察到服务器上下线的变化。
软负载均衡
在Zookeeper中记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户端请求。
三、zookeeper集群部署
官方下载地址:https://archive.apache.org/dist/zookeeper/
实验环境:
准备3台机器做zookeeper集群
192.168.10.130
192.168.10.132
192.168.10.133
1、安装前先关闭防火墙 核心防护
[root@node1 ~]#setenforce 0
setenforce: SELinux is disabled
[root@node1 ~]#systemctl stop firewalld
2、安装JDK
[root@node1 ~]#yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
3、安装zookeeper
[root@node1 ~]#cd /opt/
[root@node1 opt]#tar -zxf apache-zookeeper-3.5.7-bin.tar.gz
[root@node1 opt]#mv apache-zookeeper-3.5.7-bin /usr/local/zookeeper-3.5.7
4、修改配置文件
[root@node1 opt]#cd /usr/local/zookeeper-3.5.7/conf/
[root@node1 conf]#cp zoo_sample.cfg zoo.cfg
[root@node1 conf]#vim zoo.cfg
#保存退出
5、创建数据目录和日志目录(三台机子都需要创建)
[root@node1 opt]#mkdir /usr/local/zookeeper-3.5.7/data
[root@node1 opt]#mkdir /usr/local/zookeeper-3.5.7/logs
[root@node1 opt]#
DataDir指定的目录下创建一个 myid 的文件(三台都需要创建)
[root@node1 opt]#echo 1 > /usr/local/zookeeper-3.5.7/data/myid
[root@node2 opt]#echo 2 > /usr/local/zookeeper-3.5.7/data/myid
[root@node3 opt]#echo 3 > /usr/local/zookeeper-3.5.7/data/myid
6、配置Zookeeper启动脚本
[root@node1 opt]#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
[root@node1 opt]#chmod +x /etc/init.d/zookeeper
[root@node1 opt]#chkconfig --add zookeeper
[root@node1 opt]#service zookeeper start #切记三台机子都配置完脚本再启动
四、消息队列概述
1、为什么要使用消息队列
主要原因是由于在高并发环境下,同步请求来不及处理,请求往往会发生阻塞。比如大量的请求并发访问数据库,导致行锁表锁,最后请求线程会堆积过多,从而触发 too many connection 错误,引发雪崩效应。
我们使用消息队列,通过异步处理请求,从而缓解系统的压力。消息队列常应用于异步处理,流量削峰,应用解耦,消息通讯等场景。
当前比较常见的 MQ 中间件有:ActiveMQ、RabbitMQ、RocketMQ、Kafka 等。
2、消息队列好处
(1)解耦
允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。
(2)可恢复性
系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。
(3)缓冲
有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况。
(4)灵活性 & 峰值处理能力
在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。
(5)异步通信
很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。
同步就相当于是 当客户端发送请求给服务端,在等待服务端响应的请求时,客户端不做其他的事情。
异步就相当于当客户端发送给服务端请求时,在等待服务端响应的时候,客户端可以做其他的事情。这样即节约时间,也提高了效率。
五、Kafka简介
1、Kafka概念
Kafka 是最初由 Linkedin 公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于 Zookeeper 协调的分布式消息中间件系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景,比如基于 hadoop 的批处理系统、低延迟的实时系统、Spark/Flink 流式处理引擎,nginx 访问日志,消息服务等等,用 scala 语言编写,Linkedin 于 2010 年贡献给了 Apache 基金会并成为顶级开源项目。
2、Kafka定义
kafka 是一个分布式的基于发布/订阅模式的消息队列(MQ,Message Queue),主要应用于大数据实时处理领域。
3、Kafka特性
●高吞吐量、低延迟
Kafka 每秒可以处理几十万条消息,它的延迟最低只有几毫秒。每个 topic 可以分多个 Partition,Consumer Group 对 Partition 进行消费操作,提高负载均衡能力和消费能力。
●可扩展性
kafka 集群支持热扩展
●持久性、可靠性
消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
●容错性
允许集群中节点失败(多副本情况下,若副本数量为 n,则允许 n-1 个节点失败)
●高并发
支持数千个客户端同时读写
4、Kafka应用场景
日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等。
消息系统:解耦和生产者和消费者、缓存消息等。
用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。
运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。
流式处理:比如spark streaming和storm
5、Kafka消息队列通信的模式
(1)点对点模式,一对一消费者主动拉取数据,消息收到后消息清除
消息生产者生产消息发送到消息队列中,然后消息消费者从消息队列中取出并且消费消息。
消息被消费以后,消息队列中不再有存储,所以消息消费者不可能消费到已经被消费的消息。
消息队列支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。
(2)发布订阅模式,一对多,又叫观察者模式,消费者消费数据之后不会清除消息
消息生产者(发布)将消息发布到 topic 中,同时有多个消息消费者(订阅)消费该消息。
和点对点方式不同,发布到 topic 的消息会被所有订阅者消费。
发布/订阅模式是定义对象间一种一对多的依赖关系,使得每当一个对象(目标对象)的状态发生改变,
则所有依赖于它的对象(观察者对象)都会得到通知并自动更新。
6、Kafka架构原理
Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据,具有高性能、持久化、多副本备份、横向扩展能力。
需要注意的一点是,消息写入leader后,follower是主动的去leader进行同步的!producer采用push模式将数据发布到broker,每条消息追加到分区中,顺序写入磁盘,所以保证同一分区内的数据是有序的!
分区的主要目的是:
方便扩展:因为一个topic可以有多个partition,所以我们可以通过扩展机器去轻松的应对日益增长的数据量。
提高并发:以partition为读写单位,可以多个消费者同时消费数据,提高了消息的处理效率。
六、部署Kafka
官方下载地址:http://kafka.apache.org/downloads.html
实验环境:
192.168.10.130
192.168.10.132
192.168.10.133
1、安装Kafka
[root@node1 opt]#tar zxf kafka_2.13-2.7.1.tgz
[root@node1 opt]#mv kafka_2.13-2.7.1 /usr/local/kafka
2、修改配置文件
[root@node1 opt]#cd /usr/local/kafka/config/ #切换到指定目录
[root@node1 config]#cp server.properties{,.bak} #备份
[root@node1 config]#vim server.properties
#改完保存退出
3、修改环境变量
[root@node1 config]#vim /etc/profile
export KAFKA_HOME=/usr/local/kafka
export PATH=$PATH:$KAFKA_HOME/bin
[root@node1 config]#source /etc/profile
4、配置Kafka脚本
[root@node1 config]#vim /etc/init.d/kafka
#!/bin/bash
#chkconfig:2345 22 88
#description:Kafka Service Control Script
KAFKA_HOME='/usr/local/kafka'
case $1 in
start)
echo "---------- Kafka 启动 ------------"
${KAFKA_HOME}/bin/kafka-server-start.sh -daemon ${KAFKA_HOME}/config/server.properties
;;
stop)
echo "---------- Kafka 停止 ------------"
${KAFKA_HOME}/bin/kafka-server-stop.sh
;;
restart)
$0 stop
$0 start
;;
status)
echo "---------- Kafka 状态 ------------"
count=$(ps -ef | grep kafka | egrep -cv "grep|$$")
if [ "$count" -eq 0 ];then
echo "kafka is not running"
else
echo "kafka is running"
fi
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
esac
[root@node1 config]#chmod +x /etc/init.d/kafka
[root@node1 config]#chkconfig --add kafka #设置开机自启
5、分别启动Kafka,并创建topic
[root@node1 config]#service kafka start
[root@node1 config]#kafka-topics.sh --create --zookeeper 192.168.10.130:2181,192.168.10.132:2181,192.168.10.133:2181 --replication-factor 2 --partitions 3 --topic test
测试topic
[root@node1 config]#kafka-console-producer.sh --broker-list 192.168.10.130:9092,192.168.10.132:9092,192.168.10.133:9092 --topic test #发布消息
[root@node2 config]# kafka-console-consumer.sh --bootstrap-server 192.168.10.130:9092,192.168.10.132:9092,192.168.10.133:9092 --topic test --from-beginning
#消费消息
#查看当前服务器中的所有 topic
kafka-topics.sh --list --zookeeper 192.168.10.130:2181,192.168.10.132:2181,192.168.10.133:2181
#查看某个 topic 的详情
kafka-topics.sh --describe --zookeeper 192.168.10.130:2181,192.168.10.132:2181,192.168.10.133:2181
#修改分区数
kafka-topics.sh --zookeeper 192.168.10.130:2181,192.168.10.132:2181,192.168.10.133:2181 --alter --topic test --partitions 6
#删除 topic
kafka-topics.sh --delete --zookeeper 192.168.10.130:2181,192.168.10.132:2181,192.168.10.133:2181 --topic test