ご無沙汰しております。増田でございます。
先日2日にはゼノブレイドが発売され、今月23日にはブレイブリーセカンドが発売されます。
そんな忙しい中、みなさんいかがお過ごしですか。
KyotoTycoonからElastiCacheへの移行
今まで弊社のソーシャルPLUSでは、RailsのセッションストアとキャッシュサーバにKyotoTycoonを使っていました。
しかし、KyotoTycoonはRails4でmemcachedを使うために必要なdalliから使えません。バイナリプロトコルをフルサポートしていないためだと思います。
そのため今週月曜日にAWS ElastiCacheに移行しました。
KyotoTycoonは他にも以下のようなツラミがありました。
- 開発が止まっている
- KyotoTycoonが稼働するEC2インスタンスを自前で用意し、運用する必要がある
- レプリカと合わせて2台構成
- サーバのCIも行っている都合上、rpmを作る必要がある
ElastiCacheの構成
- EngineはRedis-2.8
- Node Typeはcache.m3.medium
- primaryとread replicaの2台構成でAvailability Zoneは別
- それぞれのNodeは1台ずつ
EngineをMemcachedではなくRedisにしたのは、read replicaを使いたかったからです。
データの永続化
デフォルトパラメータではファイルに書き出さないため再起動したらデータは消えます。
AOF(Append-Only File)を有効にして(appendonly=yes)トランザクションログを記録すれば回避できますが、ソーシャルPLUSではそこまで繊細なデータは扱っていません。
そのため、再起動が必要な時はread replicaをPromoteすることにしました。
ElastiCacheの監視
本番環境で動かすためには監視はかかせません。
ソーシャルPLUSでは当初からZabbixを使っており、KyotoTycoonの時は監視用のスクリプトを用意してZabbixに登録していました。
ElastiCacheではCloudWatchが使えるので、fluentd経由でZabbixに送信することでシンプルかつ既存の監視と馴染ませることが出来ました。
ちなみにEC2インスタンス上でfluent-plugin-zabbixを使うためには、一工夫必要でした。付録の「fluent-plugin-zabbix使用時のworkaround」に記載しました。
fluentd自体の監視
fluentdが落ちると困るので監視を追加しました。
fluentd付属のMonitoring Agentを有効にし、Zabbixがポーリングしています。
まとめ
- ElastiCacheを監視するために、CloudWatchからメトリクスを取得し、fluentd経由でZabbixに転送した
- fluent-plugin-zabbixをEC2上で使う時は、workaroundが必要
- fluentd付属のMonitoring Agentを有効にし、Zabbixでfluentdを監視した
付録
fluentdの設定ファイル
今回の設定内容です。
#
# ElastiCacheの監視設定
#
<source>
type cloudwatch
aws_key_id <AWS_ACCESS_KEY_ID>
aws_sec_key <AWS_SECRET_ACCESS_KEY>
cw_endpoint monitoring.ap-northeast-1.amazonaws.com
tag cloudwatch.elasticache
namespace AWS/ElastiCache
statistics Maximum
metric_name CPUUtilization,SwapUsage,FreeableMemory,NetworkBytesIn,NetworkBytesOut,BytesUsedForCache,CacheHits,CacheMisses,CurrConnections,CurrItems,Evictions,GetTypeCmds,KeyBasedCmds,NewConnections,Reclaimed,ReplicationLag,SetTypeCmds,StringBasedCmds
dimensions_name CacheClusterId
dimensions_value production-001
period 60
interval 60
</source>
<match cloudwatch.elasticache>
type zabbix
zabbix_server 10.0.40.10
host ElastiCache
name_keys CPUUtilization,SwapUsage,FreeableMemory,NetworkBytesIn,NetworkBytesOut,BytesUsedForCache,CacheHits,CacheMisses,CurrConnections,CurrItems,Evictions,GetTypeCmds,KeyBasedCmds,NewConnections,Reclaimed,ReplicationLag,SetTypeCmds,StringBasedCmds
add_key_prefix aws.elasticache
</match>
#
# fluentd自体の監視設定
#
<source>
type monitor_agent
bind 0.0.0.0
port 24220
</source>
fluent-plugin-zabbix使用時のworkaround
今回のfluentdはEC2上で動いていますが、fluent-plugin-zabbixが依存するzabbix gemがうまく動作しませんでした。
PullRequestを送りましたが、すでにメンテされていないようでマージされるか分かりません。
そのため修正したzabbix gemを使うChefのレシピにしました。
これがtd-agentとpluginをインストールするためのレシピです。CentOS6で動作確認しています。CentOS7でも動くと思います。
include_recipe 'td-agent'
conf_file = node['sp-td-agent']['conf_file']
return unless conf_file
directory '/etc/td-agent/conf.d'
execute 'Add @include directive' do
command 'printf "\n@include conf.d/*.conf\n" >> /etc/td-agent/td-agent.conf'
not_if 'fgrep "@include conf.d/*.conf" /etc/td-agent/td-agent.conf'
notifies :reload, 'service[td-agent]'
end
cookbook_file "/etc/td-agent/conf.d/#{conf_file}" do
notifies :reload, 'service[td-agent]'
end
include_recipe 'sp-td-agent::workaround_zabbix_gem'
%w(fluent-plugin-cloudwatch fluent-plugin-zabbix).each do |gem|
gem_package gem do
gem_binary '/opt/td-agent/embedded/bin/fluent-gem'
notifies :reload, 'service[td-agent]'
end
end
include_recipe 'td-agent'
ではこちらのレシピが実行されます。
execute 'Install td-agent' do
# See http://docs.fluentd.org/articles/install-by-rpm
command 'curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh'
not_if 'rpm -q td-agent'
end
service 'td-agent' do
action [:enable, :start]
supports restart: true, reload: true, status: true
end
include_recipe 'sp-td-agent::workaround_zabbix_gem'
がzabbix gemのworkaroundです。
version = '0.4.1'
gem_file = "zabbix-#{version}.gem"
gem_fullpath = "/var/tmp/#{gem_file}"
remote_file gem_fullpath do
source "https://github.com/masutaka/zabbix-rb/releases/download/v#{version}/#{gem_file}"
checksum '9d6f8c5bc1f8019dca351c056110b5be16a82bd3f5c84347b0d7a2075e93a5ed'
end
gem_package 'zabbix' do
gem_binary '/opt/td-agent/embedded/bin/fluent-gem'
source gem_fullpath
notifies :restart, 'service[td-agent]'
end