Linux大型架构——ELK解决方案

文件描述符
   0 代表标准输入   1 代表标准输出      2 代表错误输出
   定义一个重定向文件描述符

exec 数字>f1

   使用一个重定向文件描述符

echo asd >& 数字

   删除文件描述符

exec 数字>&-

   用重定向脚本达成curl命令的功能

#!/bin/bash
URL=${1:-"www.baidu.com"}
exec 9<>/dev/tcp/$URL/80
echo -ne "GET / HTTP/1.1\r\n" >&9
echo -ne "Host: $URL\r\n" >&9
echo -ne "User-Agent:curl" >&9
echo -e "\r\n" >&9

cat <&9

ELK

    定义: ELK是一整套解决方案,是三个软件产品的首字母缩写,很多公司都在使用,如:Sina、携程、华为、美团等

ELK分别代表 对比LAMP中的组键
E Elasticsearch(ES) 负责日志检索和储存 M mysql数据库
L Logstash 负责日志的收集和分析、处理 P php解释器
K Kibana 负责日志的可视化 A apache网页

    总的数据流程是: Logstash收集日志把数据处理完插入到Elasticsearch数据库中,然后Kibana读取Elasticsearch做成页面反馈给用户

    解决问题:分布式日志数据集中式查询和管理、系统监控,包含系统硬件和应用各个组件的监控、故障排查、安全信息和事件管理、报表功能


Elasticsearch
   ElasticSearch简称ES,是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful API 的Web接口
   Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便

   主要特点
     1. 实时分析
     2. 分布式实时文件存储,并将每一个字段都编入索引
     3. 文档导向,所有的对象全部是文档
     4. 高可用性,易扩展,支持集群(Cluster)、分片和复制(Shards 和 Replicas)
     5. 接口友好,支持JSON
     6. 没有典型意义的事务
     7. 是一种面向文档的数据库
     8. 没有提供授权和认证特性

   相关概念

Node 装有一个ES服务器的节点
Cluster 有多个Node组成的集群
Document 一个可被搜索的基础信息单元
Index 拥有相似特征的文档的集合
Type 一个索引中可以定义一种或多种类型
Filed 是ES的最小单位,相当于数据的某一列
Shards 索引的分片,每一个分片就是一个Shard
Replicas 索引的拷贝


ES与关系型数据库的对比
   在ES中,文档归属于一种 类型(type),而这些类型存在于索引(index)中,类比传统关系型数据库

  DB -> Databases -> Tables -> Rows -> Columns
  关系型 -> 数据库 -> 表 -> 行 -> 列

  ES -> Indices -> Types -> Documents -> Fields
  ES -> 索引 -> 类型 -> 文档 -> 域(字段)

ES集群组建的原理流程
    首先,单台服务器会根据配置启动基本基本配置,然后根据配置中的集群机器的域名去网络中寻找,当寻找到其中一个,就会自动加入到其所在的集群,然后如果找不到设置的几个服务器,那么就会自己成为一个独立的集群。


安装ES集群

    0. 配置DNS服务,如果没有,下面的域名可以直接用IP代替,不过还是要设置主机名

    1. 安装JDK

yum install -y java-1.8.0-openjdk

    2. 安装软件包,资源包中分享了这个包

rpm -ivh elasticsearch-2.3.4.rpm

    3. 修改配置文件/etc/elasticsearch/elasticsearch.yml

sed -i '/cluster.name:/ccluster.name: 集群名称' /etc/elasticsearch/elasticsearch.yml
sed -i "/node.name:/cnode.name: ${HOSTNAME}(这只是一个节点名,可以自定义,只要不重复即可)" /etc/elasticsearch/elasticsearch.yml
sed -i '/network.host:/cnetwork.host: 0.0.0.0' /etc/elasticsearch/elasticsearch.yml
sed -i '/discovery.zen.ping.unicast.hosts:/cdiscovery.zen.ping.unicast.hosts: ["集群中的域名1","集群中的域名2","集群中的域名n"]' /etc/elasticsearch/elasticsearch.yml

    4. 启动服务

systemctl restart elasticsearch
systemctl enabled elasticsearch

    5. 检查服务

curl http://集群中任意一个域名:9200/_cluster/health?pretty

# 查看里面的 cluster_name 看是否和自己设定的集群名称相同
# 查看里面的 "status" 的值是不是 "green",这表示集群正常
# 查看里面的 number_of_nodes 看个数是否等同于集群中的机器数,如果不是排查每个机器,哪个机器是1,那么它就是自主独立出来的,让这机器重启elasticsearch服务即可

   *. 使用ansible批量对多台机器进行部署

# 下面是用与ansible-playbook批量管理集群的yaml文件
---
- hosts: es
  remote_user: root
  tasks:
    - name: install JDK
      yum:
        name: java-1.8.0-openjdk
        state: present
    - copy:
        src: /root/elasticsearch-2.3.4.rpm
        dest: /mnt/elas.rpm
        owner: root
        group: root
        mode: 0644
    - shell: rpm -ivh /mnt/elas.rpm
    - lineinfile:
        path: /etc/elasticsearch/elasticsearch.yml
        regexp: 'cluster.name:'
        line: "cluster.name: 集群名称"
    - lineinfile:
        path: /etc/elasticsearch/elasticsearch.yml
        regexp: 'node.name:'
        line: "node.name: ${HOSTNAME}"
    - lineinfile:
        path: /etc/elasticsearch/elasticsearch.yml
        regexp: 'network.host:'
        line: "network.host: 0.0.0.0"
    - lineinfile:
        path: /etc/elasticsearch/elasticsearch.yml
        regexp: 'discovery.zen.ping.unicast.hosts:'
        line: 'discovery.zen.ping.unicast.hosts: ["集群中的域名1","集群中的域名2","集群中的域名n"]'
    - service:
        name: elasticsearch
        state: started
    - service:
        name: elasticsearch
        enabled: yes

注意点:
    1. 在配置文件中discovery.zen.ping.unicast.hosts的值后面不需要写全所有机器的域名,只需要写2到3个。
       不过,如果没写全,就有一个风险,拿就是,如果写在配置中的机器没有启动服务,这时候想加入集群的机器启动服务,那么它将会自己组成一个独立的集群。
   - -  所以,如果测试发现number_of_nodes个数不对,那就是这个问题所致的。

    2. 在配置文件中cluster.name,所有机器的集群名称要相同,查找集群用的域名组也要是一样的。也就是说,除了node.name每个机器不同,其他的配置必须一模一样,不然容易出一些莫名其妙的问题


安装插件

    使用命令: 

# 网络源安装,用ftp协议就写ftp,用http协议就写http
/usr/share/elasticsearch/bin/plugin install ftp://网络IP地址/head.zip
# 使用本地的zip包进行安装
/usr/share/elasticsearch/bin/plugin install file:///本地目录/kopf.zip

   查看已经安装的插件信息

/usr/share/elasticsearch/bin/plugin list

    前往浏览器使用查看信息    http://安装插件的主机域名:9200/_plugin/插件名/

    运维常用的是head插件


调用 RESTful API

   Elasticsearch提供了一系列RESTful的API用于
       1. 检查集群、节点、索引的健康度、状态和统计
       2. 管理集群、节点、索引的数据及元数据
       3. 对索引进行CRUD操作及查询操作
       4. 执行其他高级操作如分页、排序、过滤等

    其中POST或PUT数据使用json的数据格式

RESTful API 实例: 
   1. 可以使用_cat查询集群状态

# 查看cat中有哪些模块可以使用,可以复制到URL后面进行查看
curl http://安装插件的主机域名:9200/_cat/

# 如果进入一个模块后,想查看详细信息
curl http://安装插件的主机域名:9200/_cat/模块名?v
# 查看检索的详细信息
curl http://192.168.1.18:9200/_cat/shards?v

# 如果进入一个模块后想查看帮助信息
curl http://安装插件的主机域名:9200/_cat/模块名?help
# 查看所有节点模块的帮助信息
http://192.168.1.18:9200/_cat/nodes/?help

   2. 创建一个索引,并设置分片数量与副本数量(可以使用PUT请求也可以是POST请求)

# 使用curl软件进行下列操作
curl -XPUT 'http://安装插件的主机域名:9200/索引名/' -d '{
  "settings":{
     "index":{
     "number_of_shards": 分片个数,
     "number_of_replicas": 副本个数(备份几个)
    }
  }
}'

   3. 增

curl -XPUT 'http://安装插件的主机域名:9200/索引名/类型(自定义一个名字)/ID号(第几个数据)' -d '{
   JSON文件
    "列名1" : "值1",
    "列名2" : "值2",
    "列名n" : "值n"
}'

   4. 改

curl -XPUT 'http://安装插件的主机域名:9200/索引名/类型(自定义一个名字)/ID号(第几个数据)/_update' -d '{
   "doc":{
      "要修改列名" : "改后值"
   }
}'

   5. 查

curl -XGET 'http://安装插件的主机域名:9200/索引名/类型/ID号'

   6. 删

# 删除某列
curl -XDELETE 'http://安装插件的主机域名:9200/索引名/类型/ID号'

# 删除某个索引
curl -XDELETE 'http://安装插件的主机域名:9200/索引名'

HTTP协议简介

   http请求由三部分组成,分别是:请求行、消息报头、请求正文。

    请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议版本,格式:Method Request-URI HTTP-Version CRLF

   http请求方法:
      常用方法 GET,POST,HEAD
      其他方法 OPTIONS,PUT,DELETE,TRACE,CONNECT
      其中 ES 常用的是: PUT--- 增       DELETE --- 删    POST --- 改     GET --- 查

curl命令

     在linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具。
     它支持多种请求模式,自定义请求头等强大功能,是一款综合工具

    curl 常用参数
      -A   修改请求 agent
      -X   设置请求方法
      -i   显示返回头信息

你可能感兴趣的:(Linux,大型架构)