系统版本:CentOS Linux release 7.7.1908 (Core)
elastic系列为6.8.0版本,使用rpm包安装,简单,方便管理。
elastic系列软件下载地址:https://www.elastic.co/cn/downloads/past-releases 这个地址可以下载各个版本的elastic系列软件包。
点击下载 elasticsearch下载 kibana下载 logstash下载 filebeat下载
将上面的rpm包下载好,上传到指定主机,用yum命令安装即可。
es简单配置如下
cluster.name: my-application # 集群名称,3个节点的都要一样 node.name: node-104 # 节点名 path.data: /var/lib/elasticsearch # 数据存储路径 path.logs: /var/log/elasticsearch # 日志输出路径 network.host: 192.168.100.104 # 主机IP http.port: 9200 # 开放的端口 # 3节点 discovery.zen.ping.unicast.hosts: ["192.168.100.104:9300", "192.168.100.105:9300","192.168.100.106:9300"]9200端口是http协议端口,主要用于外部通信 9300端口是tcp协议端口,主要用于集群间传递信息 在每台主机上修改好配置。启动es
systemctl start elasticsearch systemctl status elasticsearch启动成功后,可以通过api接口命令查看集群状态
curl http://192.168.100.104:9200 curl http://192.168.100.104:9200/_cat/nodes curl http://192.168.100.104:9200/_cat/master可以看到3节点都已经加到了集群中,且104被选为master。
需要配置nodejs环境。nodejs可以用yum安装,或者用源码安装。
yum install epel-release git -y yum install nodejs npm -y下载源码
cd /usr/local git clone https://github.com/mobz/elasticsearch-head.git cd elasticsearch-head npm install npm install grunt --save安装
npm install -g grunt-cli #安装grunt命令行工具grunt-cli npm install grunt --save-dev #安装grunt及其插件 grunt -version #查看安装版本情况修改elasticsearch配置文件,增加如下字段
http.cors.enabled: true http.cors.allow-origin: "*"修改es配置可以只在es-head需要连接的那台主机上进行。 修改elasticsearch-head目录下的Gruntfile.js文件
#其中增加一段配置 hostname: '0.0.0.0' 或者是 hostname: '*'如果有端口冲突的情况,也可以修改下面的监听端口。 启动es-head
cd /usr/local/elasticsearch-head/ # 注意,一定要进入代码目录下启动,否则启动不了 nohup grunt server > ./grunt.log 2>&1 & netstat -tnulp|grep 9100 # 如果没有端口冲突的情况,启动不会有什么异常如果是长期使用es-head,可以考虑把它配置为系统服务。 可以参考https://blog.csdn.net/wind_2307154495/article/details/79402911 启动成功后就可以连接使用了。
配置文件:/etc/kibana/kibana.yml
server.port: 5601 server.host: "192.168.100.106" server.name: "elk-106" elasticsearch.hosts: ["http://192.168.100.106:9200"] # es地址 kibana.index: ".kibana" logging.dest: /var/log/kibana.log # 日志输出路径 i18n.locale: "zh-CN" # 中文配置注意:
kibana如果不配置日志输出,一般日志会输出到/var/log/message里面,导致系统日志文件越来越大,且信息太多,难以区分,所以最好配置单独的日志输出路径。如果要配置日志输出路径,特别要注意权限文件,执行以下命令 touch /var/log/kibana.log chown kibana.kibana /var/log/kibana.log # 或者直接改权限 chmod 666 /var/log/kibana.log登录:http://192.168.100.106:5601 可以添加样例数据。打开之后如下显示: es索引管理
生产中,需要对es进行管理,首先要有权限管理配置,否则任何人,只要能访问到es主机,知道端口,都可以对他进行管理操作,这是非常危险的。 如果是生产中,需要添加es认证,需要停服务,这个操作,需要提前跟开发沟通好,最好选择业务低峰期。这样对用户的影响就非常小。
生成秘钥,在主节点执行以下操作 /usr/share/elasticsearch/bin/elasticsearch-certutil ca /usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 mkdir /etc/elasticsearch/cert/ mv elastic-* /etc/elasticsearch/cert/ chmod 600 /etc/elasticsearch/cert/* chown -R elasticsearch.elasticsearch /etc/elasticsearch/cert/elastic-* # 更改权限生成的配置文件elastic-certificates.p12需要copy到所有节点上/etc/elasticsearch/cert/目录下,注意保存秘钥密码 2. 秘钥密码认证,在所有节点执行 这一步一定不能少,否则es会启动报错,启动失败
/usr/share/elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password /usr/share/elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password 所有节点增加如下配置vim /etc/elasticsearch/elasticsearch.yml
# ---------------------------------- X-pack ------------------------------------ xpack.license.self_generated.type: basic # xpack.security.enabled: true xpack.security.transport.ssl.enabled: true xpack.security.transport.ssl.verification_mode: certificate xpack.security.transport.ssl.keystore.path: cert/elastic-certificates.p12 xpack.security.transport.ssl.truststore.path: cert/elastic-certificates.p12 # #-------ellasticsearch-head------------- http.cors.enabled: true http.cors.allow-origin: "*" http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type 重启服务 sudo systemctl start elasticsearch.service sudo systemctl status elasticsearch.service要确保各节点服务启动正常,上面的命令执行缺一不可,如果启动异常可以通过日志检查错误。 5. 重启之后,生成账号密码(在其中一台上执行)
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto执行后会生成一些默认账号的密码: 6. 配置kibana,配置账号密码 增加如下配置段 配置完成后,重启,重新刷新kibana页面
sudo systemctl restart kibana.service输入你的账号密码既可以了。 常用的账号已经配置到了es中 账号配置流程:新建角色–>配置角色权限(集群权限,索引权限,可以使用正则匹配)–>配置用户(绑定角色) 配置角色权限也可以直接用已经配置好的角色,以权限角色运行。 角色权限参考:https://www.elastic.co/guide/en/elasticsearch/reference/6.8/security-privileges.html#privileges-list-cluster
为了方便开发人员查看日志,我们新建一个只读账号 索引权限,可以使用正则匹配。只给只读权限。 如果是项目使用,在配置单独索引的读写权限。 单个用户,是可以选择多个角色的。 使用新建用户的账号密码登录。可以看到,用户看不到es的index界面,也不能修改kibana已经创建的索引。
下面是日志传送流程:
/etc/filebeat/filebeat.yml
filebeat.inputs: # 这一段是默认配置 - type: log enabled: false # 是否启用,默认不启用 paths: - /var/log/*.log # 下面是我们自定义的配置 - type: log enable: true # 启用配置,收集日志 paths: - /tmp/002.txt # 日志路径,可以定义多个,可以使用正则 tail_files: true # Filebeat从文件尾开始监控文件新增内容,非从头开始 document_type: "test-redis" #设定Elasticsearch输出时的document的type字段 可以用来给日志进行分类。Default: log fields_under_root: true fields: # 下面是自定义字段,可以用来区分日志类型,日志信息 log_type: "test-redis" service: "test-redis" - type: log enable: true paths: - /tmp/003.txt # 这个是测试路径,方便我们调试 tail_files: true document_type: "testlog" exclude_files: ['.gz$'] tags: "testlog" fields_under_root: true fields: log_type: "testlog" service: "testlog" # java日志收集 - type: log enable: true paths: - /tmp/logs/catalina* exclude_files: ['.gz$'] exclude_lines: ['^$'] tags: "java" # 定义多行的情况 multiline: # 这个匹配,根据日志情况自定义 pattern: '^\s*(\d{4}|\d{2})\-(\d{2}|[a-zA-Z]{3})\-(\d{2}|\d{4})' negate: true match: after max_lines: 1000 timeout: 60 fields_under_root: true fields: log_type: "java" service: "cms" # 下面是输出配置 # 具体配置参考官网:https://www.elastic.co/guide/en/beats/filebeat/current/redis-output.html # 输出中间,如果数据量不大的情况下,redis是很好的选择,数据量很大,建议使用kafka集群 output.redis: hosts: ["192.168.100.104:6379"] password: "changeme" # redis一定要加上认证 key: "filebeat" # 日志发布到的Redis列表或渠道的名称 db: 0 timeout: 5 #连接超时时间如何对filebeat搜集的日志进行区分,然后保存到不同的index里面呢? 通过自定义字段
redis简单配置 主要是下面两个配置。
bind 192.168.100.104 requirepass changme配置完成后,可以启动服务了。
systemctl restart filebeat systemctl restart redis注意观察日志啊。
日志通过filebeat到了redis,然后logstash从redis中取数据,输出到es中,在这一部,我们要通过自定义的字段,把日志输出到不同的index中。 配置如下: vim /etc/logstash/conf.d/redis.conf
注意:logstash配置文件路径是/etc/logstash/conf.d/
# 从redis中拿数据 input { redis { data_type => "list" key => "filebeat" host => "192.168.100.104" port => "6379" password => "changme" } } # 输出到es中 output { # 通过自定义字段fields.service判断日志是属于哪个服务的,相同的服务输出到一个index中 if [service] { elasticsearch { hosts => ["192.168.100.104:9200","192.168.100.105:9200","192.168.100.106:9200"] user => "elastic" password => "changme" index => "logstash-%{service}-%{+YYYY.MM.dd}" http_compression => true } } # 如果没有source字段匹配,就输出到另一个公共的index中 else { elasticsearch { hosts => ["192.168.100.104:9200","192.168.100.105:9200","192.168.100.106:9200"] user => "elastic" password => "changme" index => "logstash-other-%{+YYYY.MM.dd}" http_compression => true } } }配置之后,可以先对配置文件进行测试,确认配置没有问题
/usr/share/logstash/bin/logstash -t /etc/logstash/conf.d/redis.conf --debug配置文件检查没有问题,重启logstash服务
sudo systemctl restart logstash现在所有服务都已经配置完了。我们开始测试。 刚才在filebeat中定义了3个日志输入路径:
/tmp/002.txt 对应service:test-redis /tmp/003.txt 对应service:testlog /tmp/logs/catalina* 对应service:cms 写入日志到这些测试文件中。可以看到已经有index了 然后创建kibana的索引,方便进行查看 创建完索引之后,就可以在Discover里面看到了 其它几个kibana索引的创建方式。参考上面的即可。
至此,所有流程就全部打通了。 后面需要做的工作:
nginx接入进来,展示nginx信息,站点访问情况,状态码等等es的index要按照日期,定时删除可以参考如下脚本:
# 保留15天内日志索引 date=$(date -d "-15 days" "+%Y.%m.%d") # 获取要删除的索引 delete_index=$(curl -s -u elastic:l7oTPEalirnWNBZHnuWt http://192.168.100.104:9200/_cat/indices|grep test|grep ${date} |awk '{print $3}') # for index in ${delete_index} do #echo $index curl -XDELETE -u elastic:changme http://192.168.100.104:9200/$index done使用es的定期删除策略
配置生命周期管理:3天后删除配置索引模板,引用策略 在kibana的开发工具中操作 PUT _template/logs_template { "index_patterns": ["logs-*"], # 匹配所有以logs开头的索引 "settings": { "number_of_shards": 1, "number_of_replicas": 1, "index.lifecycle.name": "delete-3day", "index.lifecycle.rollover_alias": "logs" } }参考: https://www.elastic.co/guide/en/elasticsearch/reference/6.8/_applying_a_policy_to_our_index.html 注意:只有新索引会自动绑定策略,原来的不会变化,还是需要手动绑定
