1.前言Elasticsearch在企业级实践中非常常见,数据量大,尤其是数据表超过千万级的时候,不管怎么优化就是,还是有点力不从心啊!在使用中,第一个问题是如何将上千万级的数据同步到Elasticsearch。我在一些开源框架里知道,还有专门做同步的!那就是Logstash。我在想同步之后怎么查看。这时候Kibana就映入眼帘了,可视化的界面让使用起来更加方便!!这就是三剑客ELK。但是,大多数时候,它是为了收集日志。编辑器没什么用,只是用来解决一个表数据量大,查询慢!后来小编在专门搭建ELK用于日志采集。二、三者介绍1、ElasticsearchElasticsearch是一个分布式的、RESTful的搜索和数据分析引擎,可以解决各种新兴的用例。作为ElasticStack的核心,Elasticsearch集中了您的数据,让您可以快速搜索、微调相关性、执行强大的分析并轻松扩展。2.KibanaKibana是一个免费且开放的用户界面,允许您可视化Elasticsearch数据并导航ElasticStack。您可以轻松地完成从跟踪查询负载到了解请求如何流经整个应用程序的所有事情。3.LogstashLogstash是一个免费且开放的服务器端数据处理管道,能够从多个来源获取数据,对其进行转换,然后将其发送到您最喜欢的“存储库”。3、版本选择现在最新版本是8.5,最新教程少,问题不明,小编选择7版本,请稳定!所以我去hub.docker上查看了一下。最终确定经常使用的版本为:7.17.7dockerHub官网地址:https://hub.docker.com/_/elasticsearch官方规定:安装ElasticStack时,必须使用相同的版本。例如,如果您使用的是Elasticsearch7.17.7,请安装Beats7.17.7、APMServer7.17.7、ElasticsearchHadoop7.17.7、Kibana7.17.7和Logstash7.17.74.构建mysql1并拉取MySQL映像sudodockerpullmysql:5.72,Docker启动MySQLsudodockerrun-p3306:3306--namemysql\-v/mydata/mysql/log:/var/log/mysql\-v/mydata/mysql/data:/var/lib/mysql\-v/mydata/mysql/conf:/etc/mysql\-eMYSQL_ROOT_PASSWORD=root\-dmysql:5.7####这里是说明,不用贴linux#############--name指定容器名称-v挂载相应文件到linux主机-e初始化密码-p将容器端口映射到主机的端口(将容器的3306映射到3306inlinux,所以windows可以访问这个数据库)-d后台运行3.Docker配置MySQLvim/mydata/mysql/conf/my.cnf#创建并进入编辑器[client]default-character-set=utf8[mysql]default-字符集=utf8[mysqld]init_cnotallow='SETcollat??ion_connection=utf8_unicode_ci'init_cnotallow='SETNAMESutf8'character-set-server=utf8collat??ion-server=utf8_unicode_ciskip-character-set-client-handshakeskip-name-resolve4、docker重启MySQL使配置生效dockerrestartmysql5、添加新数据库6,创建新的测试表DROPTABLEIFEXISTS`sys_log`;创建表`sys_log`(`id`bigint(20)NOTNULLAUTO_INCREMENTCOMMENT'logkey',`title`varchar(50)CHARACTERSETutf8COLLATEutf8_general_ciNULLDEFAULT''COMMENT'moduletitle',`business_type`int(2)NULLDEFAULT0COMMENT'业务类型(0other1new2modify3delete)',`method`varchar(100)CHARACTERSETutf8COLLATEutf8_general_ciNULLDEFAULT''COMMENT'方法名',`request_method`varchar(10)CHARACTERSETutf8COLLATEutf8_general_ciNULLDEFAULT''COMMENT'请求方法',`oper_name`varchar(50)CHARACTERSETutf8COLLATEutf8_general_ciNULLDEFAULT''COMMENT'operator',`oper_url`varchar(255)CHARACTERSETutf8COLLATEutf8_general_ciNULLDEFAULT''请求URL',`oper_ip`varchar(128)CHARACTERSETutf8COLLATEutf8_general_ciNULLDEFAULT''COMMENT'hostaddress',`oper_time`datetime(0)NULLDEFAULTNULLCOMMENT'operationtime',PRIMARYKEY(`id`)USINGBTREE)ENGINE=InnoDBAUTO_INCREMENT=1585197503834284034CHARACTERSET=utf8COLLATE=utf8_general_ciCOMMENT='OperationLogging'ROW_FORMAT=Dynamic;SETFOREIGN_KEY_CHECKS=1;五、ELK构建准备1、创建挂载文件esmount:mkdir-p/mydata/elk/elasticsearch/{config,plugins,data,logs}kibanamount:mkdir-p/Mydata/elk/kibana/configlogstashmount:mkdir-p/mydata/elk/logstash/config2,ES挂载具体配置vim/mydata/elk/elasticsearch/config/elasticsearch.yml输入如下命令:http.host:0.0.0.0xpack.security.enabled:falsehttp.host:任何地址都可以访问xpack.security.enabled:禁用密码认证3.Kibana挂载具体配置vim/mydata/elk/kibana/config/kibana.ymlcontent:server.host:0.0.0.0elasticsearch.hosts:["http://192.168.239.131:9200"]elasticsearch.hosts:指向es地址。4.Logstash挂载具体配置vim/mydata/elk/logstash/config/logstash.yml内容:http.host:0.0.0.0xpack.monitoring.elasticsearch.hosts:["http://192.168.239.131:9200"]记录storage:touchlogchmod777logvim/mydata/elk/logstash/config/logstash.confcontent:jdbc_driver_library:指定必须自己下载mysql-connector-java-8.0.28.jar,版本自己定,下载地址:https://mvnrepository.com/artifact/mysql/mysql-connector-java;statement:如果sql比较长,可以指定sql文件,直接指定文件的位置,这里的位置就是容器内部的地址;last_run_metadata_path:最后一条记录的存储文件对应上面的日志。input{stdin{}jdbc{jdbc_connection_string=>"jdbc:mysql://192.168.239.131:3306/test?useUnicode=true&characterEncoding=utf8&serverTimeznotallow=UTC"jdbc_user=>"root"jdbc_password=>"root"jdbc_driver_library=>"/usr/share/logstash/config/mysql-connector-java-8.0.28.jar"jdbc_driver_class=>"com.mysql.jdbc.Driver"jdbc_paging_enabled=>"true"jdbc_page_size=>"300000"语句=>"SELECTid,title,business_type,method,request_method,oper_name,oper_url,oper_ip,oper_timeFROMsys_log"schedule=>"*/1****"use_column_value=>falsetracking_column_type=>"timestamp"tracking_column=>"oper_time"record_last_run=>truejdbc_default_timezone=>"Asia/Shanghai"last_run_metadata_path=>"/usr/share/logstash/config/log"}}output{elasticsearch{hosts=>["192.168.239.131:9200"]index=>"sys_log"document_id=>"%{id}"}stdout{codec=>json_lines}}管道指定上面的配置文件:vim/mydata/elk/logstash/config/pipelines.yml内容:-pipeline.id:sys_logpath.config:"/usr/share/logstash/config/logstash.conf"finalfileunder/mydata/elk/logstash/config/为防止未经修改权限保存,可以给上面建好的文件夹和文件修改权限:chmod777文件名5、运行容器1、dockercompose一键构建在elk目录下创建:vimdocker-compose.yml内容如下:version:'3'services:elasticsearch:image:elasticsearch:7.17.7container_name:elasticsearchports:-"9200:9200"-"9300:9300"environment:-cluster.name=elasticsearch-discovery.type=single-node-"ES_JAVA_OPTS=-Xms512m-Xmx512m"volumes:-/mydata/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins-/mydata/elk/elasticsearch/data:/usr/share/elasticsearch/data-/mydata/elk/elasticsearch/logs:/usr/share/elasticsearch/logskibana:image:kibana:7.17.7container_name:kibanaports:-"5601:5601"depends_on:-elasticsearch环境:I18N_LOCALE:zh-CN卷:-/mydata/elk/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.ymllogstash:image:logstash:7.17.7container_name:logstashports:-“5044:5044”音量mes:-/mydata/elk/logstash/config:/usr/share/logstash/configdepends_on:-elasticsearch必须在docker-compose.yml所在目录执行命令!运行:dockercomposeup-d完成后可以跳到5查看kibana!2.运行ESdockerrun--nameelasticsearch-p9200:9200-p9300:9300-e"discovery.type=single-node"-eES_JAVA_OPTS="-Xms64m-Xmx512m"-v/mydata/elk/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml-v/mydata/elk/elasticsearch/data:/usr/share/elasticsearch/data-v/mydata/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins-delasticsearch:7.17.73,运行Kibanadockerrun--namekibana-eELASTICSEARCH_HOSTS=http://192.168.239.131:9200-p5601:5601-dkibana:7.17.74,运行Logstashdockerrun-d-p5044:5044-v/mydata/elk/logstash/config:/usr/share/logstash/config--namelogstashlogstash:7.17.75,容器端图6,访问Kibanahttp://192.168.239.131:5601/app/home#/六、新建索引PUT/sys_log{"settings":{"number_of_shards":1,"number_of_replicas":0,"iindex":{"max_result_window":100000000}},"mappings":{"dynamic":"strict","properties":{"@timestamp":{"type":"date"},"@version":{“type”:“text”,“fields”:{“keyword”:{“type”:“keyword”,“ignore_above”:256}}},“business_type”:{“type”:“integer”},“标题”:{“类型”:“文本”},“方法”:{“类型”:“文本”},“request_method”:{“类型”:“文本”},“oper_name”:{“类型”:“文本”},“oper_url”:{“类型”:“文本”},“oper_ip”:{“类型”:“文本”},“oper_time”:{“类型”:“日期”},“id":{"type":"long"}}}}第七,测试添加几条记录,然后查看Logstash日志dockerlogs-flogstash,我们去kibana看看是否已经存在:输入命令:GET/sys_log/_search{"query":{"match_all":{}}}我们看到有6条记录,和mysql一致!
