架构是数据被logstash打到kafka,然后消费端从kafka通过hangout消费。最后到es来索引。
原理网上比较多,就不细说,现在主要来讲实战。
一、ES集群部署优化之道
部署准备:
1.修改文件limit
#!/bin/bash
max=2500000
#check permission uid=$(id -u) if [[ -z $uid ]];then echo "please use root to run this" exit 201 fi if [[ $uid -ne 0 ]];then echo "please use root to run this" exit 201 fi
#check value #linux default: 1024 * 1024 = 1048576 if [[ $max -lt 1048576 ]];then echo "max value must >= 1048576" exit 202 fi
#set temporary sysctl -w fs.nr_open=$max if [[ $? -ne 0 ]];then echo "sysctl set failed" exit 1 fi
#set forever grep -P "^\s*fs.nr_open" /etc/sysctl.conf &>/dev/null if [[ $? -eq 0 ]];then #update sed -i "s/^\s*fs.nr_open.*/fs.nr_open = $max /g" /etc/sysctl.conf if [[ $? -ne 0 ]];then echo "update value failed" exit 2 fi else #add echo "fs.nr_open = $max" >> /etc/sysctl.conf if [[ $? -ne 0 ]];then echo "add value failed" exit 3 fi fi sed -i "s/.*-.*nofile.*/\* - nofile $max/g" /etc/security/limits.conf
2.修改内存lock
# allow user 'kafka' mlockall kafka soft memlock unlimited kafka hard memlock unlimited
添加到/etc/security/limits.conf
3.然后将es在其中的部署目录打包。
tar cf elast.tar /data/apps/elasticsearch-2.2.0
4.将包传到任意需要部署机器。
然后解压缩
tar xf elast.tar
5.修改配置文件
/data/apps/elasticsearch-2.2.0/config/elasticsearch.yml
path.data: 修改为本机数据目录,用逗号分隔
bootstrap.mlockall: true 优化es内存设置,起来lock住内存
discovery.zen.ping.unicast.hosts:修改为集群所有的ip列表,利于发现其他节点
以下为优化内存,防止gc和加速recovery的设置,默认加入即可。
indices.recovery.concurrent_streams: 24 indices.recovery.concurrent_small_file_streams: 12 indices.recovery.max_bytes_per_sec: 200mb
indices.fielddata.cache.size: 20% indices.breaker.fielddata.limit: 20% indices.breaker.request.limit: 20% indices.breaker.total.limit: 40%
6.启动es,采用如下方式,注意内存不要超过32G。
export JAVA_HOME=/data/apps/jdk1.8.0_65 export ES_HEAP_SIZE=28g cd /data/apps/elasticsearch-2.1.1/bin && ./elasticsearch -d --Xmx 28g --Xms 28g
二、KAFKA部署信息,与相关TOPIC创建
采用直接解压部署到
/data/app/kafka_2.10-0.9.0.1/
文件配置采用默认kafka配置。
/data/app/kafka_2.10-0.9.0.1/config/server.properties
这里需要修改下brok.id
启动方式是:
sudo -u kafka nohup bin/kafka-server-start.sh config/server.properties &
三、logstash部署方式介绍
由于每台日志机器需要采集日志到kafka队列。
所以采取每台日志机部署logstash方式。现在kss/ks3机器上都已经部署logstash.
部署logstash需要将该目录打包,然后传送到任一采集机,然后解压,修改如下启动脚本后启动即可。
bin/logstash -e 'input{file{ type=>".23.8" path=>"/data/logs/nginx/access.log"}}output{kafka{ bootstrap_servers => "xxx.68:10002" topic_id => "xxxslog" }}'
#type为标志本机ip
#path为日志路径
#output是kafka的地址列表,上表是武清机房的kafka地址
#topic_id是对应的topic
修改完毕的命令行可以直接以后台方式运行。这样就启动了日志采集进程。
四、日志消费程序部署与使用介绍
日志消费程序采用ctrip开源的hangout,具体git地址看这里。
https://github.com/childe/hangout
用ks3的具体配置为例:
inputs: #input为kafka - Kafka: codec: json #json格式 topic: kxxx3log: 2
########################################################
从Kafka读数据. 下面示例是说, 开2个线程取app这个topic的数据, 编码格式为plain纯文本. consumer_settings中的参数, 参考[kafka]官方文档](http://kafka.apache.org/documentation.html#consumerconfigs ), 所有参数都可以在这里配置. 比较重要的是group.id , zookeeper.connect这两个, 一定要有. zookeeper.connect的格式为 hostname1:port1,hostname2:port2,hostname3:port3.
######################################################## consumer_settings:group.id : hangout zookeeper.connect: 11.4.22.15:2181auto.commit.interval.ms : "5000" socket.receive.buffer.bytes: "1048576" fetch.message.max.bytes: "1048576" num.consumer.fetchers: "4" filters: - Grok: src: message match: - '^\"(?<upstream_http_x_kss_Bucketowner>.+)\" \"(?<upstream_http_x_kss_Bucketname>.+)\" \"\[(?<time_local>.+)\]\" \"(?<remote_addr>\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})\" \"(?<upstrea m_http_x_kss_Requester>.+)\" \"(?<upstream_http_x_kss_request_id>.+)\" \"(?<upstream_http_x_kss_Op>.+)\" \"(?<upstream_http_x_kss_Key>.+)\" \"(?<request>.+)\" \"(?<status>.+)\" \"(?<upstrea m_http_x_kss_ErrCode>.+)\" \"(?<content_length>.+)\" \"(?<body_bytes_sent>.+)\" \"(?<upstream_http_x_kss_ObjSize>.+)\" \"(?<request_time>.+)\" \"(?<upstream_response_time>.+)\" \"(?<http_re ferer>.+)\" \"(?<http_user_agent>.+)\" \"(?<upstream_addr>.+)\" \"(?<http_kscdn>.+)\"$' remove_fields: ['path'] - Json: field: message # required - Gsub: fields: #由于以下字段会有-,所以要替换为0,免得出错 upstream_http_x_kss_ObjSize: ['-','0'] body_bytes_sent: ['-','0'] content_length: ['-','0'] upstream_response_time: ['-','0.00'] request_time: ['-','0.00'] outputs: #向es输出 - Elasticsearch: cluster: xxx-ecs #es的集群名 hosts: #杭州es host - 10.4.69.70:9300 - 10.4.71.100:9300 - 10.4.71.103:9300 - 10.4.71.102:9300 index: 'hangout-ks3-%{+YYYYMMdd}' #日志格式 index_type: logs # default logs bulk_actions: 20000 #default 20000 bulk_size: 30 # default 15 MB flush_interval: 10 # default 10 seconds concurrent_requests: 0 # default 0, concurrent_requests设置成大于0的数, 意思着多线程处理, 以我应用的经验,还有是一定OOM风险的,强烈建议设置为0 timezone: "Asia/Shanghai" # defaut UTC 时区. 只用于生成索引名字的字符串格式化
关注微信公众号,获取更多精彩: