2014年12月19日 星期五

JVM Monitoring using SNMP in Cacti

Cacti 是個監控工具,可以透過 SNMP 監控主機的運行狀態,預設可以監控 OS 的 CPU、Memory、Disk、Network usage,這裡我們說明透過 JVM-MANAGEMENT-MIB 讓 JVM 也能被 Cacti 監控。

步驟:
  1. 在被監控端安裝 snmpd,參考:Monitoring Performance with Net-SNMP
  2. 在監控端安裝 Cacti,CentOS / Fedora 用戶直接執行 yum install cacti。
  3. 啟動 JVM SNMP 功能,在執行 java command 加上:
    1. -Dcom.sun.management.snmp.port=1610
    2. -Dcom.sun.management.snmp.acl.file=snmp.acl
  4. snmp.acl 從 $JAVA_HOME/jre/lib/management/snmp.acl.template 複製,將最後的 acl、trap 區塊 uncomment。
  5. 修改 snmpd.conf,加上 proxy -v 2c -c public localhost:1610 .1.3.6.1.4.1.42。
  6. 複製 jvm_mem_pool.xmljvm_gc.xml 到 Cacti 的 snmp_queries 目錄下。
  7. 到 Cacti 的管理介面匯入 cacti_host_template_jvm_snmp_host.xml
  8. 成功匯入後會看到 Host Templates 多了一個名為 JVM SNMP Host 的 template,其下有:
    1. Associated Graph Templates
      1. JVM - Classes Count
      2. JVM - Heap Usage
      3. JVM - NonHeap Usage
      4. JVM - Thread Usage
    2. Associated Data Queries
      1. JVM - Garbage Collection Query
      2. JVM - Memory Pool Query
      3. SNMP - Get Mounted Partitions
      4. SNMP - Get Processor Information
      5. SNMP - Interface Statistics
  9. 在 Cacti 新增 Device 時,Host Template 選取 JVM SNMP Host。
  10. 相關檔案可在 https://github.com/linuschien/Cacti 取得。
  11. 範例 JVM Heap Memory Usage 圖:

2014年11月27日 星期四

自訂 Docker image 範例

這個範例從CentOS 6 image上安裝sshd、supervisord、JDK 1.7、Tomcat 7、MySQL,並且預設啟動supervisord,再由supervisord自動帶起sshd、MySQL。
Dockerfile
FROM centos:centos6

MAINTAINER Linus Chien <linus_chien@mail.gss.com.tw>

RUN yum install -y openssh-server java-1.7.0-openjdk wget tar python-setuptools mysql-server

# setup root's password
RUN echo 'root:12345678' | chpasswd

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

# init SSH keys
RUN /sbin/service sshd start && /sbin/service sshd stop

# init MySQL database
RUN /sbin/service mysqld start && /sbin/service mysqld stop

ENV TOMCAT_SITE https://archive.apache.org/dist/tomcat
ENV TOMCAT_MAJOR_VERSION 7
ENV TOMCAT_MINOR_VERSION 7.0.57

RUN wget -q ${TOMCAT_SITE}/tomcat-${TOMCAT_MAJOR_VERSION}/v${TOMCAT_MINOR_VERSION}/bin/apache-tomcat-${TOMCAT_MINOR_VERSION}.tar.gz && \
    wget -qO- ${TOMCAT_SITE}/tomcat-${TOMCAT_MAJOR_VERSION}/v${TOMCAT_MINOR_VERSION}/bin/apache-tomcat-${TOMCAT_MINOR_VERSION}.tar.gz.md5 | md5sum -c - && \
    tar zxf apache-tomcat-*.tar.gz && \
    rm apache-tomcat-*.tar.gz && \
    mv apache-tomcat* /opt/

RUN easy_install supervisor

ADD supervisord.conf /etc/supervisord.conf

EXPOSE 22 3306 8080

CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]
supervisord.conf
[supervisord]
logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=10MB        ; (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)

;[program:apache2]
;command = /usr/sbin/httpd -D FOREGROUND
;priority = 30

;[program:tomcat7]
;command = /opt/apache-tomcat-7.0.57/bin/catalina.sh run
;priority = 20

[program:mysql5]
command = /usr/bin/pidproxy /var/run/mysqld/mysqld.pid /usr/bin/mysqld_safe
priority = 10

[program:sshd]
command = /usr/sbin/sshd -D
priority = 40
步驟:
  1. 安裝docker,並啟動,細節請自行參閱官方文件。
  2. 準備好上述兩個檔案:Dockerfile、supervisord.conf
  3. 執行
  • docker build -t cao:tomcat7 . # use your own tag name, don't miss the dot
  • docker run -d --name="tomcat" cao:tomcat7 # assign a unique name to container for convenience
  • docker inspect tomcat # you can find container's IP address
  • ssh {IP} # default root's password setup in Dockerfile

Docker 常用指令

  1. docker search {keyword} # 搜尋雲端images
  2. docker pull {image} # 將雲端image拉回主機
  3. docker build -t {tag} {path} # 使用Dockerfile建立image
  4. docker run {options} {image} {command} # 從image執行指令(建立container)
  5. docker run -i -t {image} /bin/bash # 進入container shell,(ctrl+p) + (ctrl+q)可丟背景離開shell
  6. docker inspect --format='{{.NetworkSettings.IPAddress}}' {container} # 查看container IP
  7. docker images # 查看local所有的images
  8. docker ps -a # 查看container包含已結束的
  9. docker rm {container} # 移除已結束的container
  10. docker rm $(docker ps -a -q) # 移除所有container
  11. docker rmi {image} # 移除image
  12. docker commit {comtainer} {image} # 將container異動過的內容寫入image
  13. docker start {container} # 重新啟動已結束的container
  14. docker attach {container} # 重新接入正在執行container
  15. docker save {image} > {tarball} # 備份image
  16. docker load < {tarball} # 還原image

2014年1月22日 星期三

Install Tomcat 7 as Linux Service

基本上在Tomcat 7裡面已經自帶了安裝成service的必要source code和shell script,但安裝到Linux上,例如:Fedora、CentOS還是需要動一點手腳。

如何compile daemon出來請參考:http://tomcat.apache.org/tomcat-7.0-doc/setup.html#Unix_daemon

只要做完第一個步驟,將compile出來的jsvc執行檔複製到$CATALINA_HOME/bin底下即可,此時在bin目錄下除了jsvc之外,還有一個重要的daemon.sh。

編輯daemon.sh增加兩行comment,如下方所示紅色部分:
daemon.sh
#!/bin/sh
#
# chkconfig: 35 90 10
# description: Start/Stop the Tomcat daemon.
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
35代表level 3和5會啟動這個service,90代表啟動順序,10代表關閉順序。

接下來切換到root身分,到/etc/init.d底下執行:
  1. ln -s $CATALINA_HOME/bin/daemon.sh tomcat
  2. chkconfig -add tomcat
這樣就已經完成service安裝,可以執行以下指令試驗看看開關Tomcat:
  1. /sbin/service tomcat start
  2. /sbin/service tomcat stop
預設service會用tomcat這個user啟動,如果沒有這個user可以先建一個,或是在$CATALINA_HOME/bin/setenv.sh裡面加入TOMCAT_USER=user name就可以了。