# tar zxf jdk-8u101-linux-x64.tar.gz -C /opt/ # vim /etc/profile.d/java.sh export JAVA_HOME=/opt/jdk1.8.0_101 export JAVA_BIN=/opt/jdk1.8.0_101/binls export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME JAVA_BIN PATH CLASSPATH # source /etc/profile.d/java.sh # java -version
# useradd heboan # passwd heboan
# tar zxf elasticsearch-5.2.0.tar.gz -C /opt/ # cd /opt/ # ln -s elasticsearch-5.2.0/ elasticsearch # chown -R heboan elasticsearch-5.2.0 elasticsearch # su heboan $ tree -L 1 . ├── bin //运行Elasticsearch实例和管理插件的一些脚本 ├── config //配置文件路径,包含Elastichsearch.yml基本配置文件 ├── lib //Elasticsearch使用的库 ├── LICENSE.txt ├── modules ├── logs //日志目录 ├── NOTICE.txt ├── plugins //插件安装目录 └── README.textile
四、改下配置文件/opt/elasticsearch/config/elasticsearch.ymljava
cluster.name: my-application //集群名字 node.name: node-88.1 //节点名字 path.data: /data/es-data //数据存放路径,确保建立此目录 # mkdir -p /data/es-data # chown -R heboan /data/es-data network.host: 192.168.88.1 http.port: 9200 ----官方建议进行的配置说明------------ 虽然Elasticsearch仅须要不多的配置,但有一些设置须要手动配置,而且在进入生产以前进行配置 ☻ path.data 和 path.logs #若是使用.zip或.tar.gz安装文件,则data和logs目录是在目录$ES_HOME中。若是这些重要的文件夹保留在默认位置,则在将Elasticsearch升级到新版本时存在将其删除的高风险 ☻ cluster.name #节点只能cluster.name在与集群中全部其余节点共享集群时才加入集群。咱们应该将其更改成描述集群用途的适当名称 ☻ node.name #默认状况下,Elasticsearch将使用随机生成的UUID的第一个字符做为节点ID,节点ID是持久的,重启不会更改,咱们应该配置一个更有意义的名称 ☻ bootstrap.memory_lock #对节点的健康相当重要,没有一个JVM被交换到磁盘,一种实现方法是将bootstrap.memory_lock设置设置为true ☻ network.host #默认状况下,Elasticsearch仅绑定到环回地址,为了与其余服务器带上的节点进行通讯和造成集群,咱们须要将节点绑定到非环回地址 ☻ discovery.zen.ping.unicast.hosts #当与其余服务器的节点造成集群时,咱们必须提供集群中多是活动和可联系的其余节点列表 ☻ discovery.zen.minimum_master_nodes #为了防止数据丢失,此配置相当重要,为了不脑裂,此设置应该设置为主合格节点的法定 数量(master_eligible_nodes / 2)+1, 换句话说,若是有三个主合格节点,则最小主节点应设置为(3 / 2 ) + 1或2: discovery.zen.minimum_master_nodes:2
$ /opt/elasticsearch/bin/elasticsearch -d //-d 表示在后台运行 >>启动报错,日志以下 bound or publishing to a non-loopback or non-link-local address, enforcing bootstrap checks ERROR: bootstrap checks failed max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536] max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] >>解决办法 切换到root用户修改配置sysctl.conf # vi /etc/sysctl.conf vm.max_map_count=655360 # sysctl -p # echo "* soft nofile 65536" >>/etc/security/limits.conf # echo "* hard nofile 65536" >>/etc/security/limits.conf 修改后从新登陆heboan用户,使用以下命令查看是否修改为功 $ ulimit -Hn 65536
$ netstat -lntp Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN - tcp6 0 0 192.168.88.1:9200 :::* LISTEN 2428/java tcp6 0 0 192.168.88.1:9300 :::* LISTEN 2428/java tcp6 0 0 :::22 :::* LISTEN - tcp6 0 0 ::1:25 :::* LISTEN -
$ curl 192.168.88.1:9200 { "name" : "node-88.1", "cluster_name" : "my-application", "cluster_uuid" : "5j87qZ4dS9uBIoZc0CEseg", "version" : { "number" : "5.2.0", "build_hash" : "24e05b9", "build_date" : "2017-01-24T19:52:35.800Z", "build_snapshot" : false, "lucene_version" : "6.4.0" }, "tagline" : "You Know, for Search" }
/opt/elasticsearch/config/elasticsearch.yml更改以下: cluster.name: my-application //集群名字 node.name: node-88.2 //节点名字 path.data: /data/es-data //数据存放路径,确保建立此目录 # mkdir -p /data/es-data # chown -R heboan /data/es-data network.host: 192.168.88.2 http.port: 9200 discovery.zen.ping.unicast.hosts: ["192.168.88.1", "192.168.88.2"] 在192.168.88.1也修改此配置,内容同样 部署过程当中遇到问题请参考192.168.88.1解决方案
九、查看集群状态node
$ curl -XGET 'http://192.168.88.1:9200/_cluster/health?pretty' { "cluster_name" : "my-application", "status" : "green", "timed_out" : false, "number_of_nodes" : 2, "number_of_data_nodes" : 2, "active_primary_shards" : 0, "active_shards" : 0, "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 }
# tar zxf jdk-8u101-linux-x64.tar.gz -C /opt/ # vim /etc/profile.d/java.sh export JAVA_HOME=/opt/jdk1.8.0_101 export JAVA_BIN=/opt/jdk1.8.0_101/binls export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME JAVA_BIN PATH CLASSPATH # source /etc/profile.d/java.sh # java -version
YUM安装下载并安装公共签名密钥 # rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch 例如/etc/yum.repos.d/,在具备.repo后缀的文件中的目录中添加如下内容logstash.repo [logstash-5.x] name=Elastic repository for 5.x packages baseurl=https://artifacts.elastic.co/packages/5.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md 能够安装 $sudo yum install logstash 由于使用YUN安装网络慢的缘由,这里我使用二进制包安装 ☻下载并解压logstash # tar zxf logstash-5.2.0.tar.gz -C /opt/ # cd /opt/ # ln -s logstash-5.2.0 logstash # chown -R heboan logstash* # su heboan ☻准备logstash.conf配置文件 ☻运行 bin/logstash -f logstash.conf
$ /opt/logstash/bin/logstash -e 'input {stdin {}} output {stdout {}}'
hello heboan 2017-02-15T10:21:08.599Z host-2.heboan.com hello heboan my name is heboan 2017-02-15T10:21:22.909Z host-2.heboan.com my name is heboan
$ /opt/logstash/bin/logstash -e 'input {stdin {}} output {stdout {codec => rubydebug}}' hello heboan { "@timestamp" => 2017-02-15T10:31:46.127Z, "@version" => "1", "host" => "0.0.0.0", "message" => "hello heboan" }
$ /opt/logstash/bin/logstash -e 'input {stdin {}} output {elasticsearch {hosts => ["192.168.88.1:9200"]}}' hello heboan 如今咱们来查看192.168.88.1上面Elasticsearch的索引全部列表 $ curl '192.168.88.1:9200/_cat/indices?v' health status index uuid pri rep docs.count docs.deleted store.size pri.store.size yellow open logstash-2017.02.15 wLuFEV4rRsS87DruuoX6fQ 5 1 1 0 4.6kb 4.6kb 咱们发现有一个索引logstash-2017.02.15 删除索引 $ curl -XDELETE '192.168.88.1:9200/logstash-2017.02.15'
# tar zxf kibana-5.2.0-linux-x86_64.tar.gz -C /opt/ # cd /opt/ # ln -s kibana-5.2.0-linux-x86_64 kibana # chown -R heboan kibana*
# cd kibana # tree -L 1 . ├── bin //二进制脚本包括kibana启动Kibana 服务器和kibana-plugin安装插件 ├── config //配置文件 ├── data //Kibana及其插件写入磁盘的数据文件的位置 ├── LICENSE.txt ├── node ├── node_modules ├── optimize //Transpiled源代码。某些管理操做(例如插件安装)致使源代码被即时从新转换 ├── package.json ├── plugins //插件文件位置。每一个插件都将包含在一个子目录中 ├── README.txt ├── src ├── ui_framework └── webpackShims
server.port: | 默认值:5601 Kibana由后端服务器提供服务。此设置指定要使用的端口 |
server.host: | 默认值:“localhost”此设置指定后端服务器的主机 //这里我把kibana安装在88.1上面,因此我指定了IP:192.168.88.1 |
server.basePath: | 使您可以指定一个路径来挂载Kibana在若是你在代理后面运行。这只影响Kibana生成的URL, 您的代理应该在将请求转发到Kibana以前删除basePath值。此设置不能以斜杠(/)结尾 |
server.maxPayloadBytes: | 默认值:1048576传入服务器请求的最大有效负载大小(以字节为单位) |
server.name: | 默认值:“your-hostname”用于标识此Kibana实例的可读的显示名称 |
server.defaultRoute: | 默认值:“/ app / kibana”此设置指定打开Kibana时的默认路由, 您可使用此设置在打开Kibana时修改着陆页 |
elasticsearch.url: | 默认值:“http:// localhost:9200”要用于全部查询的Elasticsearch实例的URL //这里我改成http://192.168.88.1:9200 |
elasticsearch.preserveHost: | 默认值:true当此设置的值为true时Kibana使用server.host设置中指定的主机名, 当此设置的值为时false,Kibana使用链接到此Kibana实例的主机的主机名 |
kibana.index: | 默认值:“.kibana”Kibana使用 Elasticsearch中的索引来存储保存的搜索, 可视化和仪表板。若是索引不存在,Kibana将建立一个新索引 |
kibana.defaultAppId: | 默认值:“discover”要加载的默认应用程序 |
tilemap.url: | Kibana用于在tilemap可视化中显示地图图块的图块服务的URL。 默认状况下,Kibana从外部元数据服务读取此URL,但用户仍能够覆盖此参数以使用本身的Tile Map Service。 例如:"https://tiles.elastic.co/v2/default/{z}/{x}/{y}.png?elastic_tile_service_tos=agree&my_app_name=kibana" |
tilemap.options.minZoom: | 默认值:1最小缩放级别 |
tilemap.options.maxZoom: | 默认值:10最大缩放级别 |
tilemap.options.attribution: | 默认:"© [Elastic Tile Service](https://www.elastic.co/elastic-tile-service)"地图属性字符串 |
tilemap.options.subdomains: | tile服务使用的子域的数组。指定带有令牌的URL的子域的位置{s} |
elasticsearch.username: 和 elasticsearch.password: |
若是您的Elasticsearch受基本认证保护,这些设置提供Kibana服务器用于在启动时对Kibana索引执行维护的用户名和密码, 您的Kibana用户仍须要使用经过Kibana服务器代理的Elasticsearch进行身份验证 |
server.ssl.cert: 和 server.ssl.key: |
分别指向PEM格式SSL证书和SSL密钥文件的路径。这些文件为从Kibana服务器到浏览器的传出请求启用SSL |
elasticsearch.ssl.cert: 和 elasticsearch.ssl.key: |
提供PEM格式SSL证书和密钥文件路径的可选设置。这些文件验证您的Elasticsearch后端使用相同的密钥文件 |
elasticsearch.ssl.ca: | 可选设置,使您可以为Elasticsearch实例指定证书颁发机构的PEM文件的路径 |
elasticsearch.pingTimeout: | 默认值:值elasticsearch.requestTimeout设置以毫秒为单位的时间等待Elasticsearch对PING做出响应 |
elasticsearch.requestTimeout: | 默认值:30000等待来自后端或Elasticsearch的响应的时间(以毫秒为单位)。此值必须为正整数 |
elasticsearch.requestHeadersWhitelist: | 默认值:[ 'authorization' ]要发送到Elasticsearch的Kibana客户端头标列表。要发送任何客户端头,请将此值设置为[](一个空列表) |
elasticsearch.customHeaders: | 默认值:{}要发送到Elasticsearch的标题名称和值。不管配置如何, 任何自定义标头都不能被客户端头elasticsearch.requestHeadersWhitelist覆盖 |
elasticsearch.shardTimeout: | 默认值:0 Elasticsearch等待来自分片的响应的时间(毫秒)。设置为0可禁用 |
elasticsearch.startupTimeout: | 默认值:5000重试前等待Kibana启动时Elasticsearch的时间(以毫秒为单位 |
pid.file: | 指定Kibana建立进程标识文件的路径 |
logging.dest: | 默认值:stdout容许您指定Kibana存储日志输出的文件 |
logging.silent: | 默认值:false将此设置的值设置true为禁止全部日志记录输出 |
logging.quiet: | 默认值:false将此设置的值设置true为禁止除错误消息以外的全部日志记录输出 |
logging.verbose | 默认值:false将此设置的值设置为true记录全部事件,包括系统使用信息和全部请求 |
ops.interval | 默认值:5000设置示例系统和过程性能指标的间隔(以毫秒为单位)。最小值为100 |
status.allowAnonymous | 默认值:false若是启用了验证,则将此设置为true容许未经身份验证的用户访问Kibana服务器状态API和状态页 |
console.enabled | 默认值:true设置为false可禁用控制台。切换这将致使服务器在下次启动时从新生成资产,这可能会致使在开始投放网页以前出现延迟 |
console.proxyFilter | 默认值:.*用于验证来自控制台的任何传出请求的正则表达式列表。若是没有匹配,请求将被拒绝 |
console.proxyConfig | 基于代理目标的配置选项列表。使用此选项能够为特定主机设置自定义超时或SSL设置。 这是经过match使用通配符/ globs 定义一组标准来完成的,这将根据每一个请求进行检查。而后将全部匹配规则中的配置合并在一块儿,以配置用于该请求的代理 |
有效匹配关键字match.protocol, match.host,match.port, 和match.path |
全部这些键默认为*,这意味着它们将匹配任何值。有关示例,请参阅配置控制台 |
elasticsearch.tribe.url: | 用于全部查询的Elasticsearch部落实例的可选URL |
elasticsearch.tribe.username: 和 elasticsearch.tribe.password: |
若是您的Elasticsearch受基本认证保护,这些设置提供Kibana服务器用于在启动时对Kibana索引执行维护的用户名和密码。 您的Kibana用户仍须要使用经过Kibana服务器代理的Elasticsearch进行身份验证 |
elasticsearch.tribe.ssl.cert: 和 elasticsearch.tribe.ssl.key: |
提供PEM格式SSL证书和密钥文件路径的可选设置。这些文件验证您的Elasticsearch后端使用相同的密钥文件 |
elasticsearch.tribe.ssl.ca: | 可选设置,使您可以为Elasticsearch实例指定证书颁发机构的PEM文件的路径 |
elasticsearch.tribe.ssl.verify: | 默认值:true要忽略SSL证书的有效性,请将此设置的值更改成false |
elasticsearch.tribe.pingTimeout: | 默认值:值elasticsearch.tribe.requestTimeout设置以毫秒为单位的时间等待Elasticsearch对PING做出响应 |
elasticsearch.requestTimeout: | 默认值:30000等待来自后端或Elasticsearch的响应的时间(以毫秒为单位)。此值必须为正整数 |
elasticsearch.tribe.requestHeadersWhitelist: |
默认值:[ 'authorization' ]要发送到Elasticsearch的Kibana客户端头标列表。要发送任何客户端头,请将此值设置为[](一个空列表) |
elasticsearch.tribe.customHeaders: | 默认值:{}要发送到Elasticsearch的标题名称和值。不管配置如何, 任何自定义标头都不能被客户端头elasticsearch.tribe.requestHeadersWhitelist覆盖 |
# su heboan $ cd /opt/kibana/bin/ $ ./bin/kibana 默认状况下,Kibana在前台运行,将其日志打印到标准输出(stdout),并能够经过按中止Ctrl-C
$ tree /home/heboan/logs /home/heboan/logs ├── log-error.2017-02-10.log ├── log-error.2017-02-15.log └── log-info.2017-02-10.log
2017-02-10 14:23:24.636 [http-nio-8082-exec-7] ERROR com.bagtree.api.app.AppDeviceController 145 - [userFollow:device = 1788223859148804 no bind to children] 2017-02-10 14:23:24.637 [http-nio-8082-exec-7] ERROR com.bagtree.common.extend.CommExceptionHandler 28 - 设备未关联到宝贝 com.bagtree.common.extend.CommException: 设备未关联到宝贝 at com.bagtree.api.app.AppDeviceController.userFollow(AppDeviceController.java:146) ~[classes/:na] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_101] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_101] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_101] 2017-02-10 14:23:27.319 [http-nio-8082-exec-9] ERROR com.bagtree.api.app.AppDeviceController 145 - [userFollow:device = 1788223859148804 no bind to children] 2017-02-10 14:23:27.320 [http-nio-8082-exec-9] ERROR com.bagtree.common.extend.CommExceptionHandler 28 - 设备未关联到宝贝 com.bagtree.common.extend.CommException: 设备未关联到宝贝 at com.bagtree.api.app.AppDeviceController.userFollow(AppDeviceController.java:146) ~[classes/:na] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_101] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_101] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_101] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_101] 分析: 从上面的日志咱们能够看出,多行事件,就是一个日志事件由多行组成,java的异常日志基本上是这样的
input { stdin { codec => multiline { charset =>... # 字符编码 ,可选 max_bytes => # bytes类型,设置最大的字节数,可选 max_lines => #number类型,设置最大的行数,默认是500行,可选 multiline_tag => #string类型,设置一个事件标签,默认是"multiline" ,可选 pattern =>... # string 类型,设置匹配的正则表达式 ,必选 patterns_dir =>... #array类型,能够设置多个正则表达式,可选 negate =>... # boolean类型,设置正向匹配仍是反向匹配,默认是false,可选 what =>... # 设置未匹配的内容是向前合并仍是向后合并,previous, next 两个值选择,必选 } } }
2017-02-10 23:59:41.156 [Thread-4] INFO com.bagtree.push.OemPushClient 113 - package read length:23 2017-02-10 23:59:41.156 [Thread-4] INFO com.bagtree.push.impl.response.LTHBCmdResponseHandlerImpl 33 - hb response:11722 2017-02-10 23:59:51.128 [Timer-0] INFO com.bagtree.push.impl.response.LTLoginCmdResponseHandlerImpl 70 - hb send:117204298 2017-02-10 23:59:51.158 [Thread-4] INFO com.bagtree.push.OemPushClient 113 - package read length:23 2017-02-10 23:59:51.158 [Thread-4] INFO com.bagtree.push.impl.response.LTHBCmdResponseHandlerImpl 33 - hb response:11723 分析:这个info日志是一行一个事件
$ vim /opt/logstash/conf/logstash.conf input { file { path => "/home/heboan/logs/log-error.*.log" type => "log_error" start_position => "beginning" codec => multiline { pattern => "^\d" negate => true what => "previous" } } file { path => "/home/heboan/logs/log-info.*.log" type => "log_info" start_position => "beginning" } } output { if [type] == "log_error" { elasticsearch { hosts => ["192.168.88.1:9200"] index => "log_error_%{+YYYY-MM-dd}" } } if [type] == "log_info" { elasticsearch { hosts => ["192.168.88.1:9200]" index => "log_info_%{+YYYY-MM-dd}" } } }
$ /opt/logstash/bin/logstash -f /opt/logstash/conf/logstash.conf 运行成功以后,咱们能够看下索引: $ curl '192.168.88.1:9200/_cat/indices?v' health status index uuid pri rep docs.count docs.deleted store.size pri.store.size yellow open log_info_2017-02-16 iq0HUZKMQtqLgPCQpamXTw 5 1 11633 0 4.7mb 4.7mb yellow open .kibana HesedL8WSiuprZzNObB-3w 1 1 1 0 3.1kb 3.1kb yellow open log_error_2017-02-16 lwG1iEsYSNmC5tgFIlUFMA 5 1 9 0 57.5kb 57.5kb