【开心一刻】
当前企业中间件应用运行在Docker容器中能够感受到容器快速创建快速销毁确实带来了很大的便利性、灵活性。但由于Docker应用容器销毁不管人为操作,还是容器挂掉甚至容器应用导致其崩溃,它运行的数据都会随着它的生命周期结束而结束,这种情况是非常适合部署无状态服务。却不适合有状态的应用部署。但问题来了,假如运维同事需要对容器应用发生的故障进行下一步分析,而在容器中这分部有状态的应用日志也会随着容器销毁而销毁。日志都丢了还谈分析故障。然而在大的容器集群环境下如果直接将容器应用日志持久化存储目录里面那样日志会出现目录结构临乱和日志文件覆盖问题。因此接下来要跟大家介绍我们如何对容器中的应用日志进行自动统一采集到日志服务器。
1)将容器中的单个或多个业务应用日志文件按照一定目录结构统一采集到远程日志服务器进行集中管理。
2)存储日志的目录结构形式需要以下方式存储:
/logs/app_id/service_id/host_name/app_name/xxx.log
Filebeat是一个日志文件托运工具,在你的服务器上安装客户端后,filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件(追踪文件的变化,不停的读),并且转发这些信息到logstarsh中存放
Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的、多样化的日志搜集起来,并进行自定义的处理,然后传输到指定的位置。
申请一台独立的服务器部署logstash日志服务端,此服务器的要求是要有充足的存储来存放容器应用日志。
指标名称 | 值 |
系统 | Centos7.0 X86_64 以上 |
CPU | 4核 |
内存 | 16G |
存储 | 外部存储500G以上 |
Logstash软件对JDK也是有要求的,建议在JDK1.8.0以上版本来运行logstash软件。
4.1 JDK软件安装
直接去oracle官方下载JDK版本1.8软件来安装
tar xvf jdk1.8.0_131.tar.gz–C /usr
然后配置JDK环境变量vi /etc/profile
JAVA_HOME=/usr/jdk1.8.0_131
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOMECLASSPATH PATH
用命令source/etc/profile生效环境变量
4.2 JDK软件安装
软件下载
https://artifacts.elastic.co/downloads/logstash/logstash-6.0.0.tar.gz
软件安装
执行命令tar-xvf /opt/ logstash-6.0.0.tar.gz 解压logstash
启动logstash
/opt/logstash/bin/logstash -f /opt/logstash/logstash.conf
在日志服务器上新建一个/logs目录用于存储大量应用容器日志
直接将filebeat软件和nginx,php-fpm软件联合一起封装成一个新的基础镜像,事先我们需要知道哪此应用日志文件需要提取出来。注意以下是需要提取容器中的应用日志:
Nginx日志容器路径
/var/log/nginx
Php-fpm日志窗口路径:
/var/opt/remi/php70/log/php-fpm
下载filebeat软件
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.0.0-linux-x86_64.tar.gz
5.1 采用dockerfile脚本安装nginx,php-fpm, Filebeat软件
以上红色字体部署就是规范nginx与php-fpm应用日志,并将日志文件映射到/logs目录下。同时安装filebeat软件。
FROM centos MAINTAINER jaymarco@shsnc.com #Install system library RUN rpm -ivh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm && rpm -ivh http://rpms.remirepo.net/enterprise/remi-release-7.rpm && \ yum install -y php70-php-gd.x86_64 php70-php-mcrypt.x86_64 php70-php-fpm.x86_64 php70-php-pecl-redis.x86_64 python-setuptools \ php70-php-mbstring.x86_64 php70-php-snmp.x86_64 php70-php-pecl-zip.x86_64 php70-php-xml.x86_64 \ php70-php-mysqlnd.x86_64 php70-php-pecl-mysql.x86_64 gcc gcc-c++ automake libtool make cmake openssl openssl-devel pcre-devel && \ yum clean all #Make install nginx RUN rpm -ivh http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.10.3-1.el7.ngx.x86_64.rpm COPY nginx.conf /etc/nginx/nginx.conf #set php www.conf config RUN sed -e 's/127.0.0.1:9000/9000/' \ -e '/allowed_clients/d' \ -e '/catch_workers_output/s/^;//' \ -e '/error_log/d' \ -e 's/;listen.backlog = 511/listen.backlog = 1024/' \ -e 's/pm.max_children = 50/pm.max_children = 300/' \ -e 's/pm.start_servers = 5/pm.start_servers = 30/' \ -e 's/pm.min_spare_servers = 5/pm.min_spare_servers = 30/' \ -e 's/pm.max_spare_servers = 35/pm.max_spare_servers = 60/' \ -e 's/;pm.max_requests = 500/pm.max_requests = 10240/' \ -e 's/;request_slowlog_timeout = 0/request_slowlog_timeout = 2/' \ -e 's/;request_terminate_timeout = 0/request_terminate_timeout = 20/' \ -e 's/;rlimit_files = 1024/rlimit_files = 65535/' \ -i /etc/opt/remi/php70/php-fpm.d/www.conf && \ sed -e 's/max_execution_time = 30/max_execution_time = 150/' \ -e 's/max_input_time = 60/max_input_time = 300/' \ -i /etc/opt/remi/php70/php.ini && \ sed -e 's/daemonize = yes/daemonize = no/' \ -e 's/;rlimit_files = 1024/rlimit_files = 65535/' -i /etc/opt/remi/php70/php-fpm.conf && \ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\ echo 'Asia/Shanghai' >/etc/timezone RUN easy_install supervisor && \ mkdir -p /var/log/supervisor && \ mkdir -p /var/run/sshd && \ mkdir -p /var/run/supervisord #Add supervisord conf ADD supervisord.conf /etc/supervisord.conf #copy start script ADD startserv.sh /startserv.sh RUN chmod +x /startserv.sh #Set port EXPOSE 9000 # For collecting logs, install filebeat plugin RUN mkdir /logs RUN ln -s /var/log/nginx /logs/ RUN ln -s /var/opt/remi/php70/log/php-fpm /logs ADD filebeat-6.0.0-linux-x86_64.tar.gz /var/log/ RUN chmod +x /var/log/filebeat/filebeat
#Start web server #ENTRYPOINT ["/var/log/filebeat/init.sh"] CMD ["/startserv.sh"] |
5.2 supervisord.conf配置参数
容器中只能运行一个进程,运行多进程如果需要运行多个进程我们使用了supervisord后台管理进程工具,方便多进程启动监控。以上红色字体加入了filebeat启动命令。
[unix_http_server] file=/tmp/supervisor.sock ; (the path to the socket file) [supervisord] logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log) logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB) logfile_backups=10 ; (num of main logfile rotation backups;default 10) loglevel=info ; (log level;default info; others: debug,warn,trace) pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid) nodaemon=true ; (start in foreground if true;default false) minfds=1024 ; (min. avail startup file descriptors;default 1024) minprocs=200 ; (min. avail process descriptors;default 200) user=root ; ; the below section must remain in the config file for RPC ; (supervisorctl/web interface) to work, additional interfaces may be ; added by defining them in separate rpcinterface: sections [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket [program:php-fpm] command=/opt/remi/php70/root/usr/sbin/php-fpm -F [program:nginx] command=/usr/sbin/nginx -c /etc/nginx/nginx.conf [program:filebeat] command=/var/log/filebeat/filebeat -c /var/log/filebeat/filebeat.yml |
5.3 服务启动脚本startserv.sh
以上红色字体部分的内容主要是为了生成一个filebeat.yml文件,让filebeat程序加载对应的app_id,service_id,host_name,logstash等参数值,并将服务接起来。
生成filebeat.yml文件例子:
5.4 启动应用容器
docker run -itd -p 80:80 -e APP_ID=6db116df -e SERVICE_ID=_6db116df_64a00233 -e LOGSTASH_HOST=<日志服务器IP> XX.XX.XX.XX/zjhtproj/acitivty_front:6.0-201711221420
容器应用启动后,容器中的应用日志就会通过filebeat自动每隔30秒同步到logstash日志服务器上面。接下来看一下这两个插件的日志。
其中一个容器中的filebeat日志信息
日志服务器日志目录解析:
日志服务器logstash接收日志:
近期热文: