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}
文档更新时间: 2019-07-26 21:04   作者:李延召