zabbix 初期環境構築

はじめに

centos5.6環境に、統合監視パッケージzabbixを利用した監視環境を構築する。
zabbixのバージョンは 1.8系ではなく、1.6系 を利用することにした。
まずは、サーバ&エージェント環境を1台のサーバのみで行う。
ここでは、初期環境の構築メモを残す。

環境構築

パッケージ準備

リポジトリパッケージ インストール
  • ダウンロード

zabbix-jpが提供しているリポジトリパッケージをダウンロード。

 # wget http://www.zabbix.jp/binaries/relatedpkgs/rhel5/i386/zabbix-jp-release-5-3.noarch.rpm
 # rpm -ivh zabbix-jp-release-5-3.noarch.rpm
zabbixパッケージ インストール

公式サイトに記述されている通り、下記のパッケージをインストールする。

# yum install zabbix zabbix-agent zabbix-server zabbix-server-mysql zabbix-web zabbix-web-mysql
〜
=====================================================================================
 Package                 Arch     Version           Repository              Size
=====================================================================================
Installing:
 zabbix                  x86_64   1.6.9-3.el5.JP     zabbix-jp                11 k
 zabbix-agent            x86_64   1.6.9-3.el5.JP     zabbix-jp               245 k
 zabbix-server           x86_64   1.6.9-3.el5.JP     zabbix-jp               5.6 M
 zabbix-server-mysql     x86_64   1.6.9-3.el5.JP     zabbix-jp               243 k
 zabbix-web              x86_64   1.6.9-3.el5.JP     zabbix-jp               1.2 M
 zabbix-web-mysql        x86_64   1.6.9-3.el5.JP     zabbix-jp               9.4 k
Installing for dependencies:
 OpenIPMI-libs           x86_64   2.0.16-11.el5_7.2  updates                 571 k
 fping                   x86_64   2.4b2-16.el5.JP    zabbix-jp-relatedpkgs    34 k
 iksemel                 x86_64   1.4-2.el5          epel                     48 k
 mysql                   x86_64   5.5.16-1.el5.remi  remi                    7.4 M
 mysql-libs              x86_64   5.5.16-1.el5.remi  remi                    1.1 M
 mysqlclient15           x86_64   5.0.67-1.el5.remi  remi                    1.3 M
 php-bcmath              x86_64   5.3.8-1.el5.remi   remi                     40 k
 php-gd                  x86_64   5.3.8-1.el5.remi   remi                    209 k
 php-mbstring            x86_64   5.3.8-1.el5.remi   remi                    2.3 M
 php-mysql               x86_64   5.3.8-1.el5.remi   remi                    160 k
 php-pdo                 x86_64   5.3.8-1.el5.remi   remi                    118 k
 t1lib                   x86_64   5.1.2-1.el5.rf     rpmforge                388 k
 unixODBC                x86_64   2.2.11-7.1         base                    835 k

MySQL環境構築

mysql-serverパッケージをインストールした上で、MySQL環境を構築。

mysql-server インストール

yumでインストールし、my.cnf設定をしておく。

 # yum install mysql-server
 # cp -p /etc/my.cnf /etc/my.cnf.org
 # vim /etc/my.cnf

  [client]
  port = 3306
  
  [mysqld]
  # zabbix 向けに下記2つのパラメータ設定は必須。
  # mysql5.5の場合は、default-character-set ではなく、character_set_server で指定すること。
  character_set_server                = utf8
  #default-character-set              = utf8
  skip-character-set-client-handshake
  
  max_connections                     = 150
  thread_cache_size                   = 8
  sort_buffer_size                    = 4M
  table_open_cache                    = 4096
  max_allowed_packet                  = 16M
  default_storage_engine              = InnoDB
  
  server-id                           = 1
  port                                = 3306
  
  log-bin                             = mysql-bin
  expire_logs_days                    = 5
  
  innodb_file_format                  = Barracuda
  innodb_file_per_table               = 1
  innodb_flush_log_at_trx_commit      = 1
  innodb_flush_method                 = O_DIRECT
  innodb_buffer_pool_size             = 64M
  innodb_log_buffer_size              = 8M
  innodb_log_file_size                = 128M
  key_buffer_size                     = 1M
  query_cache_type                    = 1
  query_cache_size                    = 16M
  
  slow_query_log                      = 1
  long_query_time                     = 1.0
 
 # mysql_install_db
 # chown -R mysql:mysql /var/lib/mysql/
 # /etc/init.d/mysqld start
 
zabbixDB向けデータ投入

パッケージに付属しているSQLファイルを利用し、テーブル/データ投入を行う。

  • テーブル作成

zabbix DB内にテーブル作成するためのSQLを修正。
※mysql5.5では、テーブル作成時のエンジン指定に、TYPE は利用できなくなっており、
 ENGINE を指定する必要があるため。

 # mv /usr/share/doc/zabbix-server-1.6.9/schema/mysql.sql /usr/share/doc/zabbix-server-1.6.9/schema/mysql.sql.org 
 # cat /usr/share/doc/zabbix-server-1.6.9/schema/mysql.sql.org | sed -e 's/type\=InnoDB/ENGINE\=InnoDB/g' > /var/tmp/mi.txt
  • data SQL投入
 # mysql -u root -D zabbix -p < /usr/share/doc/zabbix-server-1.6.9/data/data.sql

apache環境設定

初期設定を行うので、zabbix.conf.php ファイルを退避しておく。
退避が完了したら、apache再起動しておく。

 # mv /etc/zabbix/zabbix.conf.php /etc/zabbix/zabbix.conf.php.org
 #

zabbix初期設定

管理画面(http://[対象サーバ]/zabbix/)にアクセスし、tutorialに従い設定を進める。
Webインターフェース設定の際にエラーとなるが、下記のようにパーミッション変更する事で対処可能。

 # chmod 777 /etc/zabbix/

管理画面へのアクセス

Tutorial通りの設定が完了したら、管理画面へのログインを行う。

  • 初期ID:admin
  • 初期PW:zabbix
管理画面TOPページでのエラーメッセージ対策

初回ログイン時に、画面上に以下のメッセージが表示される。
将来的に利用できなくなる ereg関数などの警告メッセージだが、影響はないため、
対処として、zabbixのエラーハンドラをコメントアウトする。

 # vim /usr/share/zabbix/include/config.inc.php
 
  - set_error_handler('zbx_err_handler')
  + //set_error_handler('zbx_err_handler')

zabbix-server用config設定

パラメータ修正を行い、サービスを起動する。

 # cp -p /etc/zabbix/zabbix_server.conf /etc/zabbix/zabbix_server.conf.org
 # vim /etc/zabbix/zabbix_server.conf
  
  - DBPassword=zabbix
  + #DBPassword=<password>
  
  # Connect to MySQL using Unix socket?
  
  - DBSocket=/var/lib/mysql/mysql.sock
  + #DBSocket=/var/lib/mysql/mysql.sock
 
 # /etc/init.d/zabbix-server start

zabbix-agent用config設定

パラメータ設定を行い、サービスを起動する。
サーバ環境では特に修正の必要がなかったので、そのままサービス起動する。

 # /etc/init.d/zabbix-agent start

ipvsadm、RPMパッケージ作成

pukiwikiに慣れ過ぎて、はてな記法に慣れないな...。

はじめに

centos5.6で、LVS環境を構築するにあたり、ipvsadmのRPMパッケージを作成する。
Baseリポジトリ提供のipvsadm RPMでは、IPVS v1.2.0対応となっているための処置。

現状確認

今回、LVS環境を構築するサーバ環境は以下の通り。

    • OS  :centOS5.6
    • kernel:2.6.18-274.3.1.el5
  • ipvsadm RPMパッケージインストール

まず、Baseリポジトリで提供されているRPMをインストールし、バージョン確認。


# yum install ipvsadm

# rpm -qa | grep ipvsadm
ipvsadm-1.24-13.el5
#

# ipvsadm -v
ipvsadm v1.24 2003/06/07 (compiled with popt and IPVS v1.2.0)
#

IPVS1.2.0をサポートしている。

  • kernel内のip_vsバージョン確認

LVS環境と同じkernelソースを用意し、ip_vsのバージョンを確認。
※ここでは、build環境で kernel-develを入れて確認した。


# yum install kernel-devel

# grep VERSION_CODE /usr/src/kernels/2.6.18-274.3.1.el5-x86_64/include/net/ip_vs.h
 #define IP_VS_VERSION_CODE 0x010201
#

kernel-2.6.18-274.3.1.el5では、ip_vsのバージョンが1.2.1となっている事が確認できたため、
ip_vsの1.2.1に対応したipvsadm RPMパッケージを作成することにする。

  • 参考

勉強不足のため根本理由が把握できていないが、下記klabさんの記事によると、
「ipvsadmをコンパイルしたときのIPVSのバージョンと、
 kernelのIPVSのバージョンが異なっていると期待した動作をしないことがある」
とのことで、ip_vsの1.2.1に対応したipvsadm RPMパッケージを作成することにした。
DSAS開発者の部屋 -こんなに簡単! Linuxでロードバランサ (1)-

RPM作成

  • ソースファイルのダウンロード

RPMの作成はbuild環境で行う。
こちらのサイトから、LVS環境のkernelに適応したバージョンのsrcRPMを取得する。

ソースファイル(〜.tar.gz)とspecファイルが配置されるので、buildに進む。

rpmbuildで、RPMパッケージを作成する。


$ cd /usr/src/redhat/SPECS/
$ rpmbuild -ba ./SPECS/keepalived.spec
エラー: 旧来の構文はサポートされません: copyright
エラー: 7 行目: 不明なタグ: Copyright: GNU General Public Licence
$

ほう、rpm4.1以降では、ライセンスの定義を行うタグが「Copyright」から「License」に変更されたために発生する模様。
specファイルで以下の修正をする。


$ vim ./SPECS/keepalived.spec
- Copyright: GNU General Public Licence
+ License: GNU General Public Licence
$

改めて、rpmbuild。


$ rpmbuild -ba ./SPECS/keepalived.spec

libipvs.c:23 から include されたファイル中:
libipvs.h:14:23: error: net/ip_vs.h: そのようなファイルやディレクトリはありません
In file included from libipvs.c:23:

RPM ビルドエラー:
/var/tmp/rpm-tmp.73389 の不正な終了ステータス (%build)
$
buildエラー。
調査したところ、こちらの掲示板で make時にkernelソースを見に行くとの情報があったので、
kernelソースのシンボリックリンクを作成して、再度rpmbuildしてみる。

# ln -s /usr/src/kernels/2.6.18-274.3.1.el5-x86_64 /usr/src/linux
$ rpmbuild -ba ./SPECS/keepalived.spec
ようやくRPMパッケージが作成できた。

ipvsadmのサポートするip_vsバージョン確認

LVS環境にインストールする前に、build環境で作成したRPMパッケージをインストールし、
サポートするip_vsのバージョンを確認する。


# rpm -ivh /usr/src/redhat/RPMS/x86_64/ipvsadm-1.24-6.x86_64.rpm
# ipvsadm -v
ipvsadm v1.24 2005/12/10 (compiled with popt and IPVS v1.2.1)
#
ip_vs1.2.1がサポートされていることが確認できた。

次は、これまでに作成した ipvsadm と keepalivedパッケージを利用して、
LVS環境を構築する。

LVS環境構築

はじめに

centos5.6で、LVS環境を構築する。
環境構成は、以下の通り。LVSはNATではなく、DSRで稼働させる。

                         -------------
      -------------------|client(AWS)|
      |                  -------------
  Global IP1               Global IP2
  ~~~~~~~~~~
   Internet
  ~~~~~~~~~~
      |
  --------
  |router|
  --------
      |
      -------------------------------------------------------------
      |                   |             |            |            |
      ---VIP:192.168.1.30--             |            |            |
      |                   |             |            |            |
192.168.1.22        192.168.1.23  192.168.1.20  192.168.1.21  192.168.1.18
  --------            --------      --------     --------      --------
  | LVS1 | -- VRRP -- | LVS2 |      | web1 |     | web2 |      | sorry |
  --------            --------      --------     --------      --------

web/sorryサーバには、それぞれ以下の文字列を表示するページを用意しておく。
web1 : test1
web2 : test2
sorry: sorry
また、web1,2のヘルスチェック用に /health.cgi ページを用意しておく(status code 200を返すだけ)。

LVS1,2 環境構築

パッケージインストール

LVS1,2サーバに、それぞれパッケージをインストール


# rpm -ivh /usr/local/src/ipvsadm-1.24-6.x86_64.rpm
# rpm -ivh /usr/local/src/keepalived-1.2.1-5.x86_64.rpm

ip_foward設定

LVSからwebサーバへのIPv4転送を有効にするため、net.ipv4.ip_forward パラメータを変更(0 -> 1)し、設定反映する。


# vim /etc/sysctl.conf
 - net.ipv4.ip_forward = 0
 + net.ipv4.ip_forward = 1

# sysctl -p

rp_filter設定

今回構築している環境では、Interfaceが1つのみなので、rp_filterは有効(1)にしたままにしている。

もし、Interfaceが追加されて、外(eth1)/内(eth0)の2枚環境になるようであれば、
以下の設定をすれば良いと思う。


# vim /etc/sysctl.conf
 + net.ipv4.conf.eth0.rp_filter = 0

# sysctl -p

keepalived.conf設定

LVSの冗長性を確保するためのkeepalivedを利用する。
keepalivedのパラメータ設定として、keepalived.confを設定する。
ここでは、メール通知設定などは省略する。
※本番運用であれば欠かせないと思いますが。
各パラメータの意味は、下記サイトや「24時間365日 サーバ/インフラを支える技術」などを参考に。
LVSを使ったブローカーの構築:「keepalived.conf」についての説明
本家サイトのUserGuide

virtual_server_group HTTP100 {
  192.168.1.30 80
}

virtual_server group HTTP100 {
  delay_loop   3
  lvs_sched    lc
  lvs_method   DR
  protocol     TCP

  virtualhost  www.example.org

  sorry_server 192.168.1.18  80

  # web1
  real_server  192.168.1.20 80 {
    weight 1
    inhibit_on_failure

    # health check
    HTTP_GET {
      url {
        path /health.cgi
        status_code 200
      }
      connect_timeout 3
    }
  }
  # web2
  real_server 192.168.1.21 80 {
    weight 1
    inhibit_on_failure

    # health check
    HTTP_GET {
      url {
        path /health.cgi
        status_code 200
      }
      connect_timeout 3
    }
  }

}

# VRRP
vrrp_instance VI {
  state BACKUP
  interface eth0
  garp_master_delay 5
  virtual_router_id 1
  priority 101
  nopreempt
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass himitsu
  }
  virtual_ipaddress {
    192.168.1.30/24  dev eth0
  }
}
virtual_server_group HTTP100 {
  192.168.1.30  80
}

virtual_server group HTTP100 {
  delay_loop   3
  lvs_sched    lc
  lvs_method   DR
  protocol     TCP

  virtualhost  www.example.org

  sorry_server 192.168.1.18  80

  # web1
  real_server  192.168.1.20 80 {
    weight 1
    inhibit_on_failure

    # health check
    HTTP_GET {
      url {
        path /health.cgi
        status_code 200
      }
      connect_timeout 3
    }
  }
  # web2
  real_server  192.168.1.21 80 {
    weight 1
    inhibit_on_failure
    HTTP_GET {
      url {
        path /health.cgi
        status_code 200
      }
      connect_timeout    3
    }
  }

}

# VRRP
vrrp_instance VI {
  state BACKUP
  interface eth0
  garp_master_delay 5
  virtual_router_id 1
  priority 100
  nopreempt
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass himitsu
  }
  virtual_ipaddress {
    192.168.1.30/24  dev eth0
  }
}

web1,2、sorry 環境構築

iptables設定

webサーバ側では、VRRPで指定した仮想IP(192.168.1.30)は直接持たず、
iptablesによるアドレス変換(DNAT)で処理させる。


# iptables -t nat -L
 Chain PREROUTING (policy ACCEPT)
 target prot opt source destination
 
 Chain POSTROUTING (policy ACCEPT)
 target prot opt source destination
 
 Chain OUTPUT (policy ACCEPT)
 target prot opt source destination
#

# iptables -t nat -A PREROUTING -d 192.168.1.30 -j REDIRECT
# /etc/init.d/iptables save

# iptables -t nat -L
 Chain PREROUTING (policy ACCEPT)
 target prot opt source destination
 REDIRECT all -- anywhere 192.168.1.30
 
 Chain POSTROUTING (policy ACCEPT)
 target prot opt source destination
 
 Chain OUTPUT (policy ACCEPT)
 target prot opt source destination
#

# /etc/init.d/iptables restart

LVS環境起動

LVS1,2でkeepalivedを起動し、動作確認を行う。
まずは、LVS1をmaster、LVS2をbackup環境として稼働させる。

keepalived起動
  • LVS1 作業

masterとなる LVS1 からkeepalivedを起動する。


# /etc/init.d/keepalived start
# tail /var/log/messages
 〜
 Keepalived_vrrp: VRRP_Instance(VI) Transition to MASTER STATE
 Keepalived_vrrp: VRRP_Instance(VI) Entering MASTER STATE
 Keepalived_vrrp: VRRP_Instance(VI) setting protocol VIPs.
 Keepalived_vrrp: VRRP_Instance(VI) Sending gratuitous ARPs on eth0 for 192.168.1.30
 Keepalived_vrrp: Netlink reflector reports IP 192.168.1.22 added
 Keepalived_healthcheckers: Netlink reflector reports IP 192.168.1.22 added
 avahi-daemon[3291]: Registering new address record for 192.168.1.30 on eth0.
 Keepalived_vrrp: VRRP_Instance(VI) Sending gratuitous ARPs on eth0 for 192.168.1.30
#
MASTERとして起動し、仮想IPが設定されたことが分かる。
実際にipコマンドで仮想IPが設定されているか確認する。


# ip addr show dev eth0
 2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
  link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
  inet 192.168.1.22/24 brd 192.168.1.255 scope global eth0
  inet 192.168.1.30/24 scope global secondary eth0
#
仮想IP(192.168.1.30)が設定されている事が分かる。

  • LVS2 作業

次にbackupとなる LVS2 のkeepalivedを起動する。


# /etc/init.d/keepalived start
# tail /var/log/messages
 〜
 Keepalived_vrrp: VRRP_Instance(VI) Entering BACKUP STATE
 Keepalived_vrrp: VRRP sockpool: [ifindex(2), proto(112), fd(11,12)]
#
backupとして起動し、仮想IPが設定されたことが分かる。
ipコマンドで仮想IPが設定されて"いない"事を確認する。


# ip addr show dev eth0
 2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
  link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
  inet 192.168.1.23/24 brd 192.168.1.255 scope global eth0
#
仮想IP(192.168.1.30)が設定されて"いない"事が確認できた。

動作確認

ここまでで、LVS環境の構築ができたので、クライアント環境からHTTPリクエストを投げて
LVS環境を通し、分散/冗長されているか動作確認する。

パターン1:正常系

master経由で、web1,2にリクエストが振られ、クライアント環境へ意図した応答が変えるか確認。

 LVS1:master
 LVS2:backup
 web1:正常稼働
 web2:正常稼働
  • クライアントからのリクエス


# while(true); do curl -H 'Host: www.example.org' http://[Global IP1]; sleep 1; done
 test1
 test2
 test1
 test2
 〜
#
web1,2からそれぞれレスポンスが返る事が確認できた。

パターン2:異常系

lvs1で障害が発生し、LVS2がmasterとなった状態で、
web1,2にリクエストが振られ、クライアント環境へ意図した応答が変えるか確認。

 LVS1:障害!
 LVS2:master
 web1:正常稼働
 web2:正常稼働
  • クライアントからのリクエス


# while(true); do curl -H 'Host: www.example.org' http://[Global IP1]; sleep 1; done
 test1
 test2
 test1
 test2
 〜
#
web1,2からそれぞれレスポンスが返る事が確認できた。
ただし、LVS1のkeepalivedをダウンさせた際、クライアントからのリクエストが1度コネクションエラーとなった。

パターン3:異常系

web1で障害(apacheダウン)が発生した状態で、master経由で web2にリクエストが振られ、クライアント環境へ意図した応答が変えるか確認。

 LVS1:master
 LVS2:backup
 web1:障害!
 web2:正常稼働
  • クライアントからのリクエス


# while(true); do curl -H 'Host: www.example.org' http://[Global IP1]; sleep 1; done
 test2
 test2
 test2
 test2
 〜
#
web2からレスポンスが返る事が確認できた。

パターン4:異常系

web2で障害(apacheダウン)が発生した状態で、master経由で web2にリクエストが振られ、クライアント環境へ意図した応答が変えるか確認。

 LVS1:master
 LVS2:backup
 web1:正常稼働
 web2:障害!
  • クライアントからのリクエス


# while(true); do curl -H 'Host: www.example.org' http://[Global IP1]; sleep 1; done
 test1
 test1
 test1
 test1
 〜
#
web1からレスポンスが返る事が確認できた。

パターン5:異常系

web1,2で障害(apacheダウン)が発生した状態で、master経由で sorryにリクエストが振られ、クライアント環境へ意図した応答が変えるか確認。

 LVS1:master
 LVS2:backup
 web1:障害!
 web2:障害!
 sorry:正常稼働
  • クライアントからのリクエス


# while(true); do curl -H 'Host: www.example.org' http://[Global IP1]; sleep 1; done
 sorry
 sorry
 sorry
 sorry
 〜
#
sorry
からレスポンスが返る事が確認できた。

まとめ

LVS(DSR&VRRP)を利用することで、分散/冗長環境を構築することが確認できた。
非常に高価なハードウェアLBを用意せずとも、分散/冗長環境環境を用意できるメリットは大きい。

本番環境で稼働させる際は、細かいパラメータ設定、運用/障害対応手順の確立、
監視環境の用意などが必要となってくると思うので、また時間があればまとめていきたい。

keepalived、RPMパッケージ作成

cntos5.6で、LVS環境を構築するにあたり、RPMパッケージとして提供されていない
keepalivedRPMパッケージを作成する。
管理面からソースからのインストールではなく、RPMパッケージを作成するようにしている。


build環境の準備

先にopenssl-develを入れておく。
$ yum install openssl-devel

ソースダウンロード&RPM作成

  • ソースダウンロード&configure


$ cd /usr/src/redhat/SOURCES/
$ wget http://www.keepalived.org/software/keepalived-1.2.2.tar.gz
$ tar zxvf keepalived-1.2.2.tar.gz
$./configure

Keepalived configuration

                                              • -

Keepalived version : 1.2.2
Compiler : gcc
Compiler flags : -g -O2 -DETHERTYPE_IPV6=0x86dd
Extra Lib : -lpopt -lssl -lcrypto
Use IPVS Framework : No
IPVS sync daemon support : No
Use VRRP Framework : Yes
Use Debug flags : No
$

IPVSがサポートされていない。
どうやらkernelディレクトリを指定する必要がある模様。
kernel-develをインストールし、--with-kernel-dirオプションでディレクトリ指定する。


# yum install kernel-devel
$./configure --with-kernel-dir=/usr/src/kernels/2.6.18-274.3.1.el5-x86_64/

Keepalived configuration

                                              • -

Keepalived version : 1.2.2
Compiler : gcc
Compiler flags : -g -O2 -DETHERTYPE_IPV6=0x86dd
Extra Lib : -lpopt -lssl -lcrypto
Use IPVS Framework : Yes
IPVS sync daemon support : Yes
IPVS use libnl : No
Use VRRP Framework : Yes
Use Debug flags : No
$

今度は、IPVS use libnl が認識されていない。
なので、libnl-develをインストール。


# yum install libnl-devel
$./configure --with-kernel-dir=/usr/src/kernels/2.6.18-274.3.1.el5-x86_64/

Keepalived configuration

                                              • -

Keepalived version : 1.2.2
Compiler : gcc
Compiler flags : -g -O2 -DETHERTYPE_IPV6=0x86dd
Extra Lib : -lpopt -lssl -lcrypto -lnl
Use IPVS Framework : Yes
IPVS sync daemon support : Yes
IPVS use libnl : Yes
Use VRRP Framework : Yes
Use Debug flags : No
$

ようやく認識された。

specファイルをSPECSディレクトリにコピーし、rpmbuild。


$ cp -p keepalived.spec ../../SPECS/
$ rpmbuild -ba ../../SPECS/keepalived.spec

                        • -
  1. cd keepalived-1.2.2
  2. grep -q 'IPVS_SUPPORT='\''_WITH_LVS_'\''' config.log
  3. echo 'ERROR: We do not want keeepalived lacking LVS support.'

ERROR: We do not want keeepalived lacking LVS support.

  1. exit 1

エラー: /var/tmp/rpm-tmp.80338 の不正な終了ステータス (%check)
RPM ビルドエラー:
/var/tmp/rpm-tmp.80338 の不正な終了ステータス (%check)

                        • -

buildエラー...。
kernelとkernel-develのバージョンに差異があるので、kernelのアップデートを行う。

  • アップデート前

kernel : 2.6.18-238
kernel-devel: 2.6.18-274.3.1

  • kernelアップデート&OS再起動


# yum update kernel
# shutdown -r now

OS再起動しアップデートしたkernelを認識したところで、改めてrpmbuild。
が、だめ。


$ rpmbuild -ba ../../SPECS/keepalived.spec

                        • -

make: *** [all] エラー 2
エラー: /var/tmp/rpm-tmp.24180 の不正な終了ステータス (%build)
RPM ビルドエラー:
/var/tmp/rpm-tmp.24180 の不正な終了ステータス (%build)

                        • -

自分ではちゃんと調べてないが、この辺の記事内容が原因なのかな?
http://moriya.xrea.jp/tdiary/20110131.html

rpmbuild時のmakeログを見ると

    • -

ip_vs.h:19:31: error: netlink/genl/genl.h: そのようなファイルやディレクトリはありません
ip_vs.h:20:31: error: netlink/genl/ctrl.h: そのようなファイルやディレクトリはありません

    • -

とあるから、恐らくそうなのだろう。
build環境のバージョンは、下記になっていた。


$ rpm -qa | grep libnl
 libnl-1.0-0.10.pre5.5
 libnl-devel-1.0-0.10.pre5.5

なので、keepalived-1.2.1を利用することに。
すんなり作成できた。


$ wget http://www.keepalived.org/software/keepalived-1.2.1.tar.gz
$ tar zxvf keepalived-1.2.1.tar.gz
$ cd keepalived-1.2.1/
$ ./configure --with-kernel-dir=/usr/src/kernels/2.6.18-274.3.1.el5-x86_64/
$ cp -p keepalived.spec ../../SPECS/
$ rpmbuild -ba ../../SPECS/keepalived.spec

centos6.0 + MySQL-5.5.15

はじめに

自分向けのメモ。
master1台、slave1台でmysqlレプリケーションを行う。

環境

  • OS
    • CentOS6.0(on ESXi5)
      • master 1台
      • slave 1台

MySQL設定

事故防止のため、slave側でMySQL再起動などを実施した際は、
明示的にslave startさせるようにしておく。
パラメータ最適化は....後回しの方向で。

  • master向けmy.cnf


[client]
port = 3306

[mysqld]
character_set_server = utf8

max_connections = 150
thread_cache_size = 8

sort_buffer_size = 4M

table_open_cache = 4096

max_allowed_packet = 16M

default_storage_engine = InnoDB

server-id = 1
port = 3306
log-bin = mysql-bin
expire_logs_days = 5
innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT
innodb_buffer_pool_size = 64M
innodb_log_buffer_size = 8M
innodb_log_file_size = 128M

key_buffer_size = 1M

query_cache_type = 1
query_cache_size = 16M

slow_query_log = 1
long_query_time = 1.0

  • slave向けmy.cnf


[client]
port = 3306

[mysqld]
character_set_server = utf8


max_connections = 150
thread_cache_size = 8

sort_buffer_size = 4M

table_open_cache = 4096

max_allowed_packet = 16M

default_storage_engine = InnoDB

server-id = 2
port = 3306
relay-log = mysqld-relay-bin
relay-log-index = mysqld-relay-bin
skip-slave-start

innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT
innodb_buffer_pool_size = 64M
innodb_log_buffer_size = 8M
innodb_log_file_size = 128M

key_buffer_size = 1M

query_cache_type = 1
query_cache_size = 16M

slow_query_log = 1
long_query_time = 1.0

apache-killer対応

はじめに

Apache脆弱性(CVE-2011-3192)に関する対応メモ。
(apache-killer対応)

既にapache-killer対応済のRPMパッケージが提供されているので、
未対応パッケージ&パラメータ定義ではなく、対応済パッケージの適用で対策する。

環境(適用前)

OS:CentOS5.6
apachehttpd-2.2.3-45.el5.centos.x86_64

パッケージ取得

CentOS5.7がリリースされるまでの対応として、CR(Continuous Release)リポジトリから、
apache-killer対応済みのパッケージを取得する。

パッケージダウンロード&インストール

情報ソース
http://lists.centos.org/pipermail/centos-announce/2011-August/017689.html

    • パッケージ取得&インストール

念のため、現バージョンと新バージョンのRPMパッケージを取得しておく。
その前に yumdownloader を入れておこう。


# yum install yum-utils
# yumdownloader httpd-2.2.3-45.el5.centos
# yumdownloader httpd

  • apacheパッケージアップデート

設定ファイルは事前に退避しておきましょう。


# yum update ./httpd-2.2.3-53.el5.centos.1.x86_64.rpm

  • パッケージ更新履歴確認

CVE-2011-3192対応されたものか更新履歴で確認しておく。


# rpm -q --changelog httpd-2.2.3-53.el5.centos.1 |head
木 9月 01 2011 Karanbir Singh - 2.2.3-53.el5.centos.1

水 8月 31 2011 Joe Orton - 2.2.3-53.1

  • add security fix for CVE-2011-3192 (#733059)

動作チェック

yamagataさんが公開されている、以下のサイトを利用させて頂く(感謝)
http://yamagata.int21h.jp/tool/apache-killer-checker/

memcached-1.4.5 + repcached のRPM作成

はじめに

rpmbuildする際、CPUコアがシングルコアだと処理が途中で止まってしまう。
2コア以上の環境でbuildすること。

RPM作成まで


# yum install libevent libevent-devel gcc

  • rpmパッケージ作成のため、rpm-buildパッケージをインストール


# yum install rpm-build
build用のディレクトリも独自に用意する。


# cd /usr/src/
# cp -rp redhat redhat.org
# mkdir -p /home/daggun/rpm/{BUILD,SRPMS,SPECS,SOURCES,RPMS}
# chown -R daggun:daggun /home/daggun/rpm
# ln -s /home/daggun/rpm redhat

ここから一般ユーザーでの作業。~

  • rpmパッケージの定義ファイルを用意しておく(かなり雑)


$ vim /home/daggun/.rpmmacros
----

%_topdir /home/daggun/rpm

%packager daggun

----

  • memcachedのソースと、repcachedを適用するためのパッチを取得

※パッチ提供者のHPはこちら。1.4.7向けのパッチも公開されている。
http://mdounin.ru/

  • パッチ適用


$ tar zxvf memcached-1.4.5.tar.gz
$ gunzip repcached-2.3-1.4.5.patch.gz
$ patch -p0 -i repcached-2.3-1.4.5.patch

  • configure処理


$ cd /home/daggun/rpm/SOURCES/memcached-1.4.5
$ ./configure --enable-64bit --build=x86_64-unknown-linux --enable-replication
$ cp -p memcached.spec ../../SPECS/

  • specfile修正(replication対応)


$ vim ../../SPECS/memcached.spec
 - %configure
 + %configure \
 + --enable-replication

  • tarball準備


$ cd ../
$ mv memcached-1.4.5.tar.gz memcached-1.4.5.tar.gz.org
$ tar zcvf memcached-1.4.5.tar.gz memcached-1.4.5


$ rpmbuild -ba ../SPECS/memcached.spec


ls -lR ../ | grep rpm

RPMインストール

インストールと設定はrootアカウントでOK。

  • rpmインストール


# rpm -ivh memcached-1.4.5-1.x86_64.rpm /usr/src/redhat/RPMS/x86_64/

memcached設定

以下のサーバ構成で動作確認する。

  • サーバ1
    • OS:centos5.6
    • サーバ名:mem_master
    • IPアドレス:192.168.1.20/24
  • サーバ2
    • OS:centos5.6
    • サーバ名:mem_slave
    • IPアドレス:192.168.1.21/24
memcached定義ファイル

memcached起動時のパラメータ定義ファイルを作成。
レプリケーションポートはデフォルトの11212とする。
レプリケーション方向は mem_master -> mem_slave を想定する。

  • mem_masterパラメータ設定
    • vim /etc/sysconfig/memcached
      • PORT="11211"
      • USER="nobody"
      • MAXCONN="1024"
      • CACHESIZE="64"
      • OPTIONS=""

  • mem_slaveパラメータ設定
    • vim /etc/sysconfig/memcached
      • PORT="11211"
      • USER="nobody"
      • MAXCONN="1024"
      • CACHESIZE="64"
      • OPTIONS="-x mem_slave"
memcached 起動

mem_master、mem_slaveでそれぞれmemcachedサービスを起動する。


# /etc/init.d/memcached start

レプリケーション確認

下記のようにsetした値がレプリケーションされている事を確認する。

  • mem_master
    • 1. setコマンドで値を投入
    • 2. getコマンドで値を取得
  • mem_slave
    • 3. getコマンドでmaster側で投入したキー値を取得

では確認してみる。

  • 1. setコマンドで値を投入

# telnet localhost 11211

Trying 127.0.0.1...

Connected to localhost.localdomain (127.0.0.1).

Escape character is '^]'.

set daggun 0 0 5

world

STORED

    • 2. getコマンドで値を取得

get daggun

VALUE daggun 0 5

world

END

quit

    • 3. getコマンドでmaster側で投入したキー値を取得
# telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
get daggun
VALUE daggun 0 5
world
END
quit

終わりに

双方向でのレプリケーション(マルチマスタ)とする場合は、mem_master側の定義ファイルで、 mem_slave側へのレプリケーション設定を追加すればよい。