ES集群:
http://10.11.67.32:9200/
http://10.11.67.33:9200/
http://10.11.67.32:9200/_plugin/head/
http://10.11.67.33:9200/_plugin/kopf
kibana服务器:
http://10.11.67.32:5601/
kafka集群:
10.11.67.19 kafka-1
10.11.67.20 kafka-2
10.11.67.21 kafka-3
生产服务器
web-server:10.11.67.69
Kafka消息队列中间件介绍
Apache kafka是消息中间件的一种,是一种分布式的,基于发布/订阅的消息系统。能实现一个为处理实时数据提供一个统一、高吞吐、低延迟的平台,且拥有分布式的,可划分的,冗余备份的持久性的日志服务等特点。kafka是一个消息队列服务器。kafka服务称为broker(中间人), 消息发送者称为producer(生产者), 消息接收者称为consumer(消费者);通常我们部署多个broker以提供高可用性的消息服务集群.典型的是3个broker;消息以topic的形式发送到broker,消费者订阅topic,实现按需取用的消费模式;创建topic需要指定replication-factor(复制数目, 通常=broker数目);每个topic可能有多个分区(partition), 每个分区的消息内容不会重复
业务层可以直接写入到kafka队列中,不用担心elasticsearch的写入效率问题
Kafka的术语
kafka-broker:中间人
webserver/logstash-producer:消息生产者/消息发送者
elasticsearch-consumer:消费者
logs-topic:话题
replication-facter:复制数目-中间人存储消息的副本数=broker数目
一个topic有多个分区partition:
Partition:为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体(多个partition间)的顺序。在kafka中,一个partition中的消息只会被group中的一个consumer消费(同一时刻);一个Topic中的每个partions,只会被一个consumer消费,不过一个consumer可以同时消费多个partitions中的消息。
一、ES集群安装配置
1、ES1的部署
1.安装java-1.8.0以及依赖包(每台服务器都安装JAVA)
[root@elk-node1 ~]# yum -y install epel-release
[root@elk-node1 ~]# yum install -y java-1.8.0 git wget lrzsz
缓存该包–downloadonly --downloaddir=./
2.获取es软件包
[root@elk-node1 ~]# wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.3.tar.gz
[root@elk-node1 ~]# tar -xf elasticsearch-1.7.3.tar.gz -C /usr/local
[root@elk-node1 ~]# ln -sv /usr/local/elasticsearch-1.7.3 /usr/local/elasticsearch
3.修改配置文件
cluster.name: es-cluster 组播的名称地址
node.name: “es-node1” 节点名称,不能和其他节点重复
node.master: true 节点能否被选举为master
node.data: true 节点是否存储数据
index.number_of_shards: 5 索引分片的个数
index.number_of_replicas: 1 分片的副本个数
path.conf: /usr/local/elasticsearch/config 配置文件的路径
path.data: /data/es/data 数据目录路径
path.work: /data/es/worker 工作目录路径
path.logs: /usr/local/elasticsearch/logs 日志文件路径
path.plugins: /data/es/plugins 插件路径
bootstrap.mlockall: true 内存不向swap交换
http.enabled: true 启用http
示例文件elasticsearch.yml
4.创建相关目录
[root@elk-node1 ~]# mkdir /data/es/{data,worker,plugins} -pv
5.获取es服务管理脚本
[root@elk-node1 ~]# git clone https://github.com/elastic/elasticsearch-servicewrapper.git
elasticsearch-servicewrapper.tar请使用tar解包后使用
[root@elk-node1 ~]# mv elasticsearch-servicewrapper/service /usr/local/elasticsearch/bin/
[root@elk-node1 ~]# /usr/local/elasticsearch/bin/service/elasticsearch install
Detected RHEL or Fedora :
Installing the Elasticsearch daemon . .
然后就会在/etc/init.d/目录下,自动安装上es的管理脚本啦
6.启动es ,并检查其服务是否正常
运行内存要给2G,否则服务启动之后没有端口号
[root@elk-node1 ~]# systemctl start elasticsearch
[root@elk-node1 ~]# systemctl enable elasticsearch
[root@elk-node1 ~]# ss -nlpt | grep -E “9200|9300”
浏览器访问:http://10.11.67.32:9200/
2、ES2的部署
1.安装java-1.8.0以及依赖包
[root@elk-node2 ~]# yum install -y epel-release
[root@elk-node2 ~]# yum install -y java-1.8.0 git wget lrzsz
2.es1节点好啦,我们直接把目录复制到es2
[root@elk-node1 ~]# scp -r /usr/local/elasticsearch-1.7.3 192.168.0.111:/usr/local/
[root@elk-node2 ~]# ln -sv /usr/local/elasticsearch-1.7.3 /usr/local/elasticsearch
[root@elk-node2 ~]# /usr/local/elasticsearch/bin/service/elasticsearch install
[root@elk-node2 ~]# vim /usr/local/elasticsearch/config/elasticsearch.yml
node.name: “es-node2” #节点名称,不能和其他节点重复
[root@elk-node2 ~]# systemctl start elasticsearch
[root@elk-node2 ~]# systemctl enable elasticsearch
3、ES1、ES2安装管理插件
es官方提供一个用于管理es的插件,可清晰直观看到es集群的状态,以及对集群的操作管理,安装方法如下:
[root@elk-node1 ~]# /usr/local/elasticsearch/bin/plugin -i mobz/elasticsearch-head
[root@elk-node2 ~]# /usr/local/elasticsearch/bin/plugin -i mobz/elasticsearch-head
Installed mobz/elasticsearch-head into /data/es/plugins/head
浏览器访问验证插件
http://10.11.67.32:9200/_plugin/head/
http://10.11.67.33:9200/_plugin/head/
至此,es集群的部署完成
2.Logstash 向es集群写数据(测试)
[root@web-server local]# vim /usr/local/logstash/etc/logstash.conf
input {
stdin { }
}
output {
elasticsearch {
hosts => ["10.11.67.32","10.11.67.33"]
}
}
配置文件语法检查
[root@web-server local]# /usr/local/logstash/bin/logstash -f /usr/local/logstash/etc/logstash.conf --configtest --verbose
Configuration OK
启动logstash,输出提示,查看es集群head插件
[root@web-server local]# /usr/local/logstash/bin/logstash -f /usr/local/logstash/etc/logstash.conf
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
sunlizhen
Default settings used: Filter workers: 1
Logstash startup completed
ok.上图已经看到logstash,已 正常的工作.
3.下面演示一下如何收集系统日志(测试)
编写配置文件
[root@web-server ~]# vim /usr/local/logstash/etc/logstash2.conf
input {
file {
path => "/var/log/messages" #这是日志文件的绝对路径
start_position => "beginning" #这个表示从 messages 的第一行读取,即文件开始处
}
}
output {
elasticsearch {
hosts => [ "10.11.67.32:9200" , "10.11.67.33:9200" ]
index => "system-messages-%{+YYYY-MM}" #这里将按照这个索引格式来创建索引
}
}
启动logstash
[root@web-server ~]# /usr/local/logstash/bin/logstash -f /usr/local/logstash/etc/logstash2.conf --configtest --verbose
Configuration OK
[root@web-server ~]# vim /usr/local/logstash/etc/logstash2.conf
查看es集群head插件
ok,系统日志我们已经成功的收集,并且已经写入到es集群中,那上面的演示是logstash直接将日志写入到es集群中的
如果量大的话需要加上消息队列来缓解es集群的压力。所以这里我选用了kafka ;下面就在三台server上面安装kafka集群
二、在生产服务器上部署Logstash收集日志
1.downloads 软件包
[root@web-server ~]# yum install -y epel-release
[root@web-server ~]# yum install -y java-1.8.0
[root@web-server ~]# wget https://download.elastic.co/logstash/logstash/logstash-2.0.0.tar.gz
[root@web-server ~]# tar -xf logstash-2.0.0.tar.gz -C /usr/local
[root@web-server ~]# cd /usr/local/
[root@web-server local]# ln -sv logstash-2.0.0 logstash
[root@web-server local]# mkdir /usr/local/logstash/{logs,etc}
2.Logstash 向es集群写数据(测试)
[root@web-server local]# vim /usr/local/logstash/etc/logstash.conf
input {
stdin { }
}
output {
elasticsearch {
hosts => [“10.11.67.32”,“10.11.67.33”]
}
}
配置文件语法检查
[root@web-server local]# /usr/local/logstash/bin/logstash -f /usr/local/logstash/etc/logstash.conf --configtest --verbose
Configuration OK
启动logstash,输出提示,查看es集群head插件
[root@web-server local]# /usr/local/logstash/bin/logstash -f /usr/local/logstash/etc/logstash.conf
3.下面演示一下如何收集系统日志(测试)
编写配置文件
[root@web-server ~]# vim /usr/local/logstash/etc/logstash2.conf
input {
file {
path => “/var/log/messages” #这是日志文件的绝对路径
start_position => “beginning” #这个表示从 messages 的第一行读取,即文件开始处
}
}
output {
elasticsearch {
hosts => [ “10.11.67.32:9200” , “10.11.67.33:9200” ]
index => “system-messages-%{+YYYY-MM}” #这里将按照这个索引格式来创建索引
}
}
启动logstash
[root@web-server ~]# /usr/local/logstash/bin/logstash -f /usr/local/logstash/etc/logstash2.conf --configtest --verbose
Configuration OK
[root@web-server ~]# vim /usr/local/logstash/etc/logstash2.conf
查看es集群head插件
ok,系统日志我们已经成功的收集,并且已经写入到es集群中,那上面的演示是logstash直接将日志写入到es集群中的
如果量大的话需要加上消息队列来缓解es集群的压力。所以这里我选用了kafka ;下面就在三台server上面安装kafka集群
三、Kafka集群安装配置
kafka1、kafka2、kafka3
配置java
[root@kafka-1 ~]# yum install -y epel-release
[root@kafka-2 ~]# yum install -y epel-release
[root@kafka-3 ~]# yum install -y epel-release
[root@kafka-1 ~]# yum install -y java-1.8.0
[root@kafka-2 ~]# yum install -y java-1.8.0
[root@kafka-3 ~]# yum install -y java-1.8.0
在搭建kafka集群时,需要提前安装zookeeper集群,当然kafka已经自带zookeeper程序只需要解压并且安装配置就行了
1、kafka1
1.获取软件包
[root@elk-node1 ~]# wget http://mirror.rise.ph/apache/kafka/0.8.2.1/kafka_2.11-0.8.2.1.tar.gz
[root@kafka-1 ~]# tar -xf kafka_2.11-0.8.2.1.tgz -C /usr/local/
[root@kafka-1 ~]# cd /usr/local/
[root@kafka-1 local]# ln -sv kafka_2.11-0.8.2.1 kafka
2.配置zookeeper集群
[root@kafka-1 local]# vim /usr/local/kafka/config/zookeeper.properties
dataDir=/data/zookeeper
clientPort=2181
tickTime=2000
initLimit=20
syncLimit=10
server.2=10.11.67.19:2888:3888
server.3=10.11.67.21:2888:3888
maxClientCnxns=0
dataDir=/data/zookeeper
clientPort=2181
tickTime=2000
这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
initLimit=20
initLimit:LF初始通信时限
集群中的follower服务器(F)与leader服务器(L)之间 初始连接 时能容忍的最多心跳数(tickTime的数量)此配置表示,允许 follower (相对于 leader 而言的“客户端”)连接 并同步到 leader 的初始化连接时间,它以 tickTime 的倍数来表示。当超过设置倍数的 tickTime 时间,则连接失败
syncLimit=10
syncLimit:LF同步通信时限
集群中的follower服务器(F)与leader服务器(L)之间 请求和应答 之间能容忍的最多心跳数(tickTime的数量)此配置表示, leader 与 follower 之间发送消息,请求 和 应答 时间长度。如果 follower 在设置的时间内不能与leader 进行通信,那么此 follower 将被丢弃。
server.2=192.168.0.112:2888:3888
2888 端口:表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;
3888 端口:表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader ,而这个端口就是用来执行选举时服务器相互通信的端口。
server.3=192.168.0.113:2888:3888
server.4=192.168.0.115:2888:3888
maxClientCnxns=0
maxClientCnxns选项,如果不设置或者设置为0,则每个ip连接zookeeper时的连接数没有限制
3.创建zookeeper所需要的目录
[root@kafka-1 local]# mkdir /data/zookeeper -p
4.创建myid文件
在/data/zookeeper目录下创建myid文件,里面的内容为数字,用于标识主机,如果这个文件没有的话,zookeeper是没法启动的
[root@kafka-1 local]# echo 2 > /data/zookeeper/myid
以上就是zookeeper集群的配置,下面等我配置好kafka之后直接复制到其他两个节点即可
5.kafka配置
[root@kafka-1 local]# vim /usr/local/kafka/config/server.properties
2、Kafka2&Kafka3
将kafka1(zookeeper)的程序目录全部拷贝至其他两个节点
[root@kafka-1 local]# scp -r /usr/local/kafka 10.11.67.21:/usr/local/
[root@kafka-1 local]# scp -r /usr/local/kafka 10.11.67.20:/usr/local/
修改两个节点的配置,注意这里除了以下两点不同外,都是相同的配置
zookeeper 的配置kafka2和kafka3
mkdir /data/zookeeper -p
echo “x” > /data/zookeeper/myid x为3或4
kafka 的配置kafka2和kafka3
vim /usr/local/kafka/config/server.properties
broker.id=x x为3或4
host.name=10.11.67…xx
3、启动Zookeeper
先启动zookeeper集群,才能启动kafka(关闭反过来)
按照顺序来,kafka1 –> kafka2 –>kafka3
zookeeper启动命令
[root@kafka-1 ~]# /usr/local/kafka/bin/zookeeper-server-start.sh /usr/local/kafka/config/zookeeper.properties &
[root@kafka-2 ~]# /usr/local/kafka/bin/zookeeper-server-start.sh /usr/local/kafka/config/zookeeper.properties &
[root@kafka-3 ~]# /usr/local/kafka/bin/zookeeper-server-start.sh /usr/local/kafka/config/zookeeper.properties &
zookeeper停止的命令
/usr/local/kafka/bin/zookeeper-server-stop.sh
如果zookeeper有问题 nohup的日志文件会非常大,把磁盘占满,
这个zookeeper服务可以通过自己些服务脚本来管理服务的启动与关闭
后面两台执行相同操作,在启动过程当中会出现以下报错信息
由于zookeeper集群在启动的时候,每个结点都试图去连接集群中的其它结点,先启动的肯定连不上后面还没启动的,所以上面日志前面部分的异常是可以忽略的。通过后面部分可以看到,集群在选出一个Leader后,最后稳定了
其他节点也可能会出现类似的情况,属于正常
zookeeper服务检查
4、验证.启动kafka
[root@kafka-1 ~]# nohup /usr/local/kafka/bin/kafka-server-start.sh /usr/local/kafka/config/server.properties &
[root@kafka-1 ~]# nohup /usr/local/kafka/bin/kafka-server-start.sh /usr/local/kafka/config/server.properties &
[root@kafka-1 ~]# nohup /usr/local/kafka/bin/kafka-server-start.sh /usr/local/kafka/config/server.properties &
/usr/local/kafka/bin/kafka-server-stop.sh #kafka停止的命令
跟zookeeper服务一样,如果kafka有问题 nohup的日志文件会非常大,把磁盘占满,这个kafka服务同样可以通过自己些服务脚本来管理服务的启动与关闭
[root@kafka-1 ~]# ss -ntal | grep 9092
5、下面我们将webserver1上面的logstash的输出改到kafka上面进行测试
[root@web-server ~]# vim /usr/local/logstash/etc/logstash3.conf
input {
file {
type => “system-message”
path => “/var/log/messages”
start_position => “beginning”
}
}
output {
kafka {
bootstrap_servers => “10.11.67.19:9092,10.11.67.20:9092,10.11.67.21:9092”
topic_id => “system-messages” #这个将作为主题的名称,将会自动创建
compression_type => “snappy” #压缩类型
}
}
[root@web-server ~]# /usr/local/logstash/bin/logstash -f /usr/local/logstash/etc/logstash3.conf --configtest --verbose
[root@web-server ~]# /usr/local/logstash/bin/logstash -f /usr/local/logstash/etc/logstash3.conf
验证数据是否写入到kafka,检查是否生成一个system-messages的主题
[root@kafka-1 ~]# /usr/local/kafka/bin/kafka-topics.sh --list --zookeeper 10.11.67.19:2181
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
system-messages
成功
四、Kafka集群部署logstash
kafka1&kafka2&kafka3安装logstash
[root@kafka-1 ~]# wget https://download.elastic.co/logstash/logstash/logstash-2.0.0.tar.gz
[root@kafka-1 ~]# tar -xf logstash-2.0.0.tar.gz -C /usr/local
[root@kafka-1 ~]# tar -xf logstash-2.0.0.tar.gz -C /usr/local
[root@kafka-1 ~]# cd /usr/local/
[root@kafka-1 local]# ln -sv logstash-2.0.0 logstash
“logstash” -> “logstash-2.0.0”
[root@kafka-1 local]# mkdir /usr/local/logstash/{logs,etc}
三台kafak编写logstash配置文件
[root@kafka-1 local]# vim /usr/local/logstash/etc/logstash.conf
input {
kafka {
zk_connect => “10.11.67.19,10.11.67.20:2181,10.11.67.21:2181” #消费者们
topic_id => “system-messages”
codec => plain
reset_beginning => false
consumer_threads => 5
decorate_events => true
}
}
output {
elasticsearch {
hosts => [“10.11.67.32:9200”,“10.11.67.33:9200”]
index => “test-system-messages-%{+YYYY-MM}” #区分之前实验,新名字“test-system-messages-%{+YYYY-MM}”
}
}
webserver1上写入测试内容
[root@web-server ~]# >/var/log/messages
[root@web-server ~]# echo “我将通过kafka集群达到es集群1234” >> /var/log/messages
[root@web-server ~]# /usr/local/logstash/bin/logstash -f /usr/local/logstash/etc/logstash3.conf
三台kafka启动logstash(注意顺序1>2>3)
[root@kafka-1 local]# /usr/local/logstash/bin/logstash -f /usr/local/logstash/etc/logstash.conf
[root@kafka-2 local]# /usr/local/logstash/bin/logstash -f /usr/local/logstash/etc/logstash.conf
[root@kafka-3 local]# /usr/local/logstash/bin/logstash -f /usr/local/logstash/etc/logstash.conf
查看es管理界面