1.没有日志分析系统
1.1运维痛点
1.运维要不停的查看各种日志。
2.故障已经发生了才看日志(时间问题。)
3.节点多,日志分散,收集日志成了问题。
4.运行日志,错误等日志等,没有规范目录,收集困难。
1.2环境痛点
1.开发人员不能登陆线上服务器查看详细日志。
2.各个系统都有日志,日志数据分散难以查找。
3.日志数据量大,查询速度慢,数据不够实时。
1.3解决痛点
1.收集(Logstash、filebeat)
2.存储(Elasticsearch、Redis、Kafka)
3.搜索+统计+展示(Kibana)
4.报警,数据分析(Zabbix)
2.ElkStack介绍
对于日志来说,最常见的需求就是收集、存储、查询、展示,开源社区正好有相对应的开源项目:logstash(收集)、elasticsearch(存储+搜索)、kibana(展示),我们将这三个组合起来的技术称之为ELKStack,所以说ELKStack指的是Elasticsearch、Logstash、Kibana技术栈的结合,一个通用的架构如下图所示:
3.ElkStack环境
1.node1和node2为elasticsearch集群(不部署Logstash)
2.node3收集对象,Nginx、java、tcp、syslog等日志
3.node4将logstash日志写入Redis,减少程序对elasticsearch依赖性,同时实现程序解耦以及架构扩展。
4.被收集主机需要部署Logstash。
主机名 | IP | JVAM | 内存 | 服务 |
---|---|---|---|---|
linux-node2 | 192.168.6.241 | 4G | 8G | Elasticsearch、Kibana |
linux-node3 | 192.168.6.242 | 4G | 8G | Elasticsearch、Kibana |
linux-node4 | 192.168.6.243 | 2G | 4G | Logstash、服务及程序日志 |
linux-node5 | 192.168.6.244 | 2G | 4G | Logstash、Redis(消息队列) |
4.ElkStack部署
Elasticsearch、需要Java环境,所以直接使用yum安装。
1.在node2和node3上安装java
[root@linux-node2 ~]# yum install java -y
[root@linux-node2 ~]# java -version
java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)
2.在node2和node3上安装elasticsearch
[root@linux-node2 ~]# yum install elasticsearch-5.3.3.rpm
3.yum安装需要配置limits
[root@linux-node2 ~]# vim /etc/security/limits.conf
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
4.1 配置Elasticsearch
[root@linux-node2 ~]# mkdir /elk
[root@linux-node2 ~]# chown -R elasticsearch.elasticsearch /elk
[root@linux-node2 ~]# vim /etc/elasticsearch/elasticsearch.yml
[root@linux-node2 ~]# grep ^[a-Z] /etc/elasticsearch/elasticsearch.yml
cluster.name: mycluster #集群名称
node.name: linux-node1 #节点的名称
path.data: /elk/data #数据存放路径
path.logs: /elk/logs #日志存放日志
bootstrap.memory_lock: true #不使用swap分区,锁住内存
network.host: 192.168.6.241 #允许访问的IP
http.port: 9200 #elasticsearch访问端口
discovery.zen.ping.unicast.hosts: ["192.168.6.241", "192.168.6.242"] #单播(配置一台即可,生产可以使用组播方式)
linux-node3配置一个相同的节点,通过组播进行通信,会通过cluster进行查找,如果无法通过组播查询,修改成单播即可
配合锁内存使用
[root@linux-node2 ~]# echo 'vm.swappiness=0' >>/etc/sysctl.conf
[root@linux-node2 ~]# sysctl -p
4.2 修改内存限制,并同步配置文件
内存限制
[root@linux-node2 ~]# vim /usr/lib/systemd/system/elasticsearch.service
LimitMEMLOCK=infinity #去掉注释,可以最大化使用内存
[root@linux-host2 ~]# vim /etc/elasticsearch/jvm.options
22 -Xms2g
23 -Xmx2g #最小和最大内存限制,为什么最小和最大设置一样大?
https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html
#官方配置文档最大建议30G以内。
同步配置文件
[root@linux-host2~]#scp /etc/elasticsearch/elasticsearch.yml 192.168.6.242:/etc/elasticsearch/
[root@linux-node3 ~]# grep ^[a-Z] /etc/elasticsearch/elasticsearch.yml
cluster.name: mycluster #集群名称
node.name: linux-node2 #节点的名称
path.data: /elk/data #数据存放路径
path.logs: /elk/logs #日志存放日志
bootstrap.memory_lock: true #不使用swap分区,锁住内存
network.host: 192.168.6.242 #允许访问的IP
http.port: 9200 #elasticsearch访问端口
discovery.zen.ping.unicast.hosts: ["192.168.6.241", "192.168.6.242"]
在centos6.x下需要设置
[root@linux-host2 ~]# vim /etc/security/limits.d/90-nproc.conf
* soft nproc 2048
4.3 运行Elasticsearch
1.启动elasticsearch
[root@linux-host2~] systemctl restart elasticsearch.service
[root@linux-host2~] systemctl status elasticsearch.service
[root@linux-host2~] netstat -lntup
2.访问:elasticsearch_url: “http://es-mon-1:9200"
{
"name" : "es-node2",
"cluster_name" : "escluster",
"cluster_uuid" : "ioQpH0c0QherZmFQmWY-Yw",
"version" : {
"number" : "5.3.3",
"build_hash" : "65e26e6",
"build_date" : "2017-05-22T12:03:12.318Z",
"build_snapshot" : false,
"lucene_version" : "6.4.2"
},
"tagline" : "You Know, for Search"
}
4.3Elasticsearch插件
1.安装Elasticsearch集群管理插件
yum install -y npm
cd /usr/local/src/
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head/
npm install grunt -save
ll node_modules/grunt
npm install
npm run start &
2.修改elasticsearch配置允许
[root@linux-node2 ~]# grep ^[a-Z] /etc/elasticsearch/elasticsearch.yml
cluster.name: escluster
node.name: es-node1
path.data: /elk/data
path.logs: /elk/logs
bootstrap.memory_lock: true
network.host: 0.0.0.0
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.6.241", "192.168.6.242"]
http.cors.enabled: true #在后面加这两行
http.cors.allow-origin: "*" #在后面加这两行
3.CORS是什么
wiki上的解释是 Cross-origin resource sharing (CORS) is a mechanism that allows restricted resources ,即跨域访问。 这个字段默认为false,在Elasticsearch安装集群之外的一台机上用Sense、Head等监控插件访问Elasticsearch是不允许的。这个字段最早可以追溯到1.4.x版本,而非5.x特有。 具体这个http.cors.x字段还有哪些用途和用法,见下表:
参数 | 说明 |
---|---|
http.cors.enabled | 是否支持跨域,默认为false |
http.cors.allow-origin | 当设置允许跨域,默认为*,表示支持所有域名,如果我们只是允许某些网站能访问,那么可以使用正则表达式。比如只允许本地地址。 |
http.cors.max-age | 浏览器发送一个“预检”OPTIONS请求,以确定CORS设置。最大年龄定义多久的结果应该缓存。默认为1728000(20天) |
http.cors.allow-methods | 允许跨域的请求方式,默认OPTIONS,HEAD,GET,POST,PUT,DELETE |
http.cors.allow-headers | 跨域允许设置的头信息,默认为X-Requested-With,Content-Type,Content-Length |
http.cors.allow-credentials | 是否返回设置的跨域Access-Control-Allow-Credentials头,如果设置为true,那么会返回给客户端。 |
5 Elasticsearch操作技巧
通过shell命令获取集群状态
[root@linux-node2 ~]# curl –sXGET http://192.168.6.241:9200/_cluster/health?pretty=true
curl: (6) Could not resolve host: xn--sxget-xu3b; Name or service not known
{
"cluster_name" : "escluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 2,
"number_of_data_nodes" : 2,
"active_primary_shards" : 6,
"active_shards" : 12,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
设置分片
[root@linux-node2 ~]# curl -XPUT 192.168.6.241:9200/_template/my_template -d '{ "template":"*", "settings":{ "index":{ "number_of_shards":6,"number_of_replicas":1} } }'
{"acknowledged":true}
删除索引
[root@linux-node2 ~]# curl -XDELETE http://192.168.6.241:9200/test
{"acknowledged":true}