文件描述符
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 显示返回头信息