2014年12月26日金曜日

MySQL HandlerSocketのコネクションを記録するmuninプラグイン

http://www.flickr.com/photos/hejog/1402968379


MySQL HandlerSocketのコネクションを記録するmuninプラグインです。
SHOW PROCESSLISTから、HandlerSocketの読み込み/書き込み数を取得して、以下の様なグラフを生成します。



以下、セットアップ方法です。

プラグインをダウンロードして設置。
# curl -o /usr/share/munin/plugins/hs_read https://raw.githubusercontent.com/takeshiyako2/contrib/master/plugins/mysql/hs_read
# curl -o /usr/share/munin/plugins/hs_write https://raw.githubusercontent.com/takeshiyako2/contrib/master/plugins/mysql/hs_write
# chmod +x /usr/share/munin/plugins/hs_read
# chmod +x /usr/share/munin/plugins/hs_write
# ln -s /usr/share/munin/plugins/hs_read /etc/munin/plugins/hs_read
# ln -s /usr/share/munin/plugins/hs_write /etc/munin/plugins/hs_write

MySQLホストの接続情報を設定ファイルに記述。
# vim /etc/munin/plugin-conf.d/munin-node
[hs_*]
env.mysql_host localhost
env.mysql_port  3306
env.mysql_user root
env.mysql_password password

動作テスト。
# cd /etc/munin/plugins/
# munin-run hs_read
# munin-run hs_write

munin-nodeをリスタート。
# service munin-node restart

Enjoy!

Redisのレイテンシを記録するmuninプラグイン


https://github.com/takeshiyako2/contrib/blob/master/plugins/redis/redis-speed
Redisのレイテンシを記録するmuninプラグインです。
PING time, SET time, GET timeを取得して、以下の様なグラフを生成します。
※ SETを発行しているので、Slaveではこのままでは使えません。コードを修正して使ってください。



以下、セットアップ方法です。難しいことはないです。

プラグインをダウンロードして設置。
# curl -o /usr/share/munin/plugins/redis-speed https://raw.githubusercontent.com/takeshiyako2/contrib/master/plugins/redis/redis-speed
# chmod +x /usr/share/munin/plugins/redis-speed
# ln -s /usr/share/munin/plugins/redis-speed /etc/munin/plugins/redis-speed

RedisホストのIPアドレスを設定ファイルに記述。
# echo "\n[redis-speed*]\nenv.host IPアドレス" >> /etc/munin/plugin-conf.d/munin-node

動作テスト。
# cd /etc/munin/plugins/
# munin-run redis-speed

munin-nodeをリスタート。
# service munin-node restart
グラフが出ているか、確認しましょう。

Enjoy!


2014年12月19日金曜日

EC2 HVMにRedisを載せたときの性能差は2倍以上

http://www.flickr.com/photos/othree/10945272436

EC2をHVMに移行するモチベーション – AWS Advent Calendar 2014:9日目 | Developers.IO http://dev.classmethod.jp/cloud/ec2-migration-to-hvm/

Developers.IOさん曰く、HVMインスタンスを使うとパフォーマンスがかなり良くなるという話だったので、Redisの場合はどうかなと思い、ベンチマークを走らせてみました。
結果、PVに比べてHVMは、ほぼ全てのパラメータで2倍以上の差がでました。

Redisのバージョンは2.8.19です。設定ファイルはデフォルトです。

EC2の環境
HVM AMI: CentOS 6 (x86_64) - with Updates HVM
PV AMI: CentOS 6 (x86_64) - with Updates
Instance Type: c3.xlarge + EBS-optimized instance
EBS: 100GB Provisioned IOPS (SSD) IOPS 3000

Linuxカーネルチューニング
# cat /etc/sysctl.conf
vm.swappiness = 0
net.core.somaxconn = 2048
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.ip_local_port_range = 1024 65000
vm.overcommit_memory = 1

ベンチマークコマンド
# time /usr/local/bin/redis-benchmark -c 1000 -r 100000 -n 10000 -q --csv

以下、結果のグラフです。
HVM/ PVそれぞれ5回試行しています。左の5本がHVM、右の5本がPVです。

Gitに脆弱性、Mac OS X YosemiteでGitをバージョンアップ

http://www.flickr.com/photos/nicmcphee/536062392

Gitに脆弱性が見つかったそうなので、Mac OS X Yosemiteでgitをバージョンアップしてみます。



報告の内容はこんな感じです。
http://article.gmane.org/gmane.linux.kernel/1853266
From: Junio C Hamano pobox.com>
Subject: [ANNOUNCE] Git v2.2.1 (and updates to older maintenance tracks)
Newsgroups: gmane.linux.kernel, gmane.comp.version-control.git
Date: 2014-12-18 21:11:19 GMT (3 hours and 58 minutes ago)
The latest maintenance release Git v2.2.1 is now available at
the usual places.

This is a security-fix for CVE-2014-9390, which affects users on
Windows and Mac OS X but not typical UNIX users. A set of new
releases for older maintenance tracks (v1.8.5.6, v1.9.5, v2.0.5, and
v2.1.4) are published at the same time and they contain the same fix.


以下、Gitのバージョンアップ方法です。
あらかじめ、brew(http://brew.sh/)が使えるように準備しておいてください。

brewを使ってGitをインストール
$ brew install git
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/git-2.2.1.yosemite.bottle.tar.gz
######################################################################## 100.0%
==> Pouring git-2.2.1.yosemite.bottle.tar.gz
==> Caveats
The OS X keychain credential helper has been installed to:
  /usr/local/bin/git-credential-osxkeychain

The "contrib" directory has been installed to:
  /usr/local/share/git-core/contrib

Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completion has been installed to:
  /usr/local/share/zsh/site-functions
==> Summary
🍺  /usr/local/Cellar/git/2.2.1: 1356 files, 31M

インストールされたGitのバージョンを確認
$ /usr/local/bin/git --version
git version 2.2.1

コマンドPATH設定を確認
$ cat /etc/paths
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin

.bashrcを再読み込み
$ source ~/.bashrc

Gitのバージョンを確認
$ git --version
git version 2.2.1


最新バージョンが使えるようになりました。


参考)
brew upgrade gitしたのにバージョンあがらない問題 - DRYな備忘録
http://otiai10.hatenablog.com/entry/2014/12/19/101654

2014年12月18日木曜日

EC2のCentOS6 HVMでresize2fs "Nothing to do!"と言われたとき

http://www.flickr.com/photos/micahdowty/2932264540

EC2のCentOS6 HVMインスタンスを立ち上げたときは、そのままでは、resize2fsが動かずディスクサイズの増加ができません。
※ CentOS 6 (x86_64) - with Updates HVMのみ、CentOS 7版はOKです。
# resize2fs /dev/xvda1
resize2fs 1.41.12 (17-May-2010)
The filesystem is already 2096896 blocks long.  Nothing to do!
fdiskでパーティーションを作りなおしたりすれば良いのですが、若干面倒です。
cloud-initとcloud-utils-growpartを使った簡単な方法でディスクサイズを増加させます。

cloud-initをインストール
# yum -y install http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# yum -y install cloud-init.noarch cloud-utils-growpart

下記の記述があることを確認
# cat /etc/cloud/cloud.cfg
 - growpart
 - resizefs

リブート
# reboot

もう一回、ログインしてリブート
※ ログインユーザがcentosになっているので注意。
$ ssh -i your.pem centos@xxxxxx.ap-southeast-1.compute.amazonaws.com
$ sudo su
# reboot

ディスクサイズが増えていることを確認
$ ssh -i your.pem centos@xxxxxx.ap-southeast-1.compute.amazonaws.com
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       99G  898M   93G   1% /
tmpfs            30G     0   30G   0% /dev/shm




参考)
AWS Marketplace版CentOSとの格闘記録 | tech
http://www.infilic.co.jp/tech/?p=221

1001714 – Add cloud-init to our base AMIs
https://bugzilla.mozilla.org/show_bug.cgi?id=1001714

Amazon EC2 CentOS 6 (x86_64) - with Updates HVM のディスク容量を増やす
http://takeshiyako.blogspot.jp/2015/02/amazon-ec2-centos-6-with-updates-hvm.html

2014年12月15日月曜日

BasecampのアップデートをSlackに投稿する

http://www.flickr.com/photos/qrush/14683721804

https://github.com/takeshiyako2/basecamp_to_slack
BasecampのアップデートをSlackに投稿するスクリプトを書きました。
以下のように通知してくれます。


もともと、Zapier(https://zapier.com/)というサービスで、BasecampとSlackを接続していたのですが、すぐにAccount Usageがフルになり使えなくなってしまいました。
調べたところ、BasecampにはAPIが提供されていたので、それを使ってみました。
https://github.com/birarda/logan
こちらのGemライブラリを利用しています。

Enjoy!



2014年12月12日金曜日

NagiosでAmazon Redshiftのディスク使用量をチェックする

http://www.flickr.com/photos/chewie/163892769

https://github.com/takeshiyako2/nagios-check_redshift_free_storage_space
Amazon Redshiftのディスク使用量をチェックするNagiosプラグインを書きました。


Amazon Redshiftは、ディスク使用率が50%を超えると性能が劣化してきます。
無理のないように早めにスケールさせて上がるとよいでしょう。

以下、セットアップ方法です。先に、rubyを使えるようにしておいてください。

1) CentOSの場合postgresql-develをインストール。
# yum -y install postgresql-devel

2) Gemライブラリをインストール.
# bundle

3) スクリプトを実行.
# ruby check_redshift_free_storage_space.rb -H xxxxx.ap-northeast-1.redshift.amazonaws.com -P 5439 -d my_database -u my_user -p my_password -w 50% -c 80%
OK - total: 7168GB, used: 2048GB (28%), free: 5120GB (72%)|used=2048

4) nrpe.cfgに設定を書き込み。nrpeをリスタート。


Enjoy!

2014年12月10日水曜日

EC2, EBS, ELB, RDS and ElastiCache to New Relic

http://www.flickr.com/photos/lizasperling/9110748397/in/photostream/

https://github.com/newrelic-platform/newrelic_aws_cloudwatch_plugin

"New Relic Amazon CloudWatch Plugin"を使って、AWSのサービスの監視データをNew Relicで確認できるようにします。以下の様なイメージです。


このプラグインは、CloudWatchから任意のデータを取得してNew Relicに入れるようになっています。データはCloudWatchでも確認可能な情報ですが、視認性の良いグラフで表示してくれます。

対応サービス:
EC2, EBS, ELB, RDS, SQS, SNS and ElastiCache(Memcached and Redis)

必要なスペック:
A single t1.micro EC2 instance (in any region)
Ruby (>= 1.9.2)
Rubygems (>= 1.3.7)
Bundler gem install bundler
Git

インストール方法:
※ 今回はCentOS6.6でインスールしました。

nokogiri に必要なyumライブラリをインストール。
# yum -y install libxml2-devel libxslt-devel

ソースを git clone。
# git clone https://github.com/newrelic-platform/newrelic_aws_cloudwatch_plugin.git

Gemライブラリをインストール。
# cd newrelic_aws_cloudwatch_plugin
# bundle install

設定ファイルを編集。
# cp config/template_newrelic_plugin.yml config/newrelic_plugin.yml
# emacs config/newrelic_plugin.yml

変更箇所は以下のようになります。

New Relicのライセンスキーを設定。
newrelic:
  #
  # Update with your New Relic account license key:
  #
  license_key: 'New Relicのライセンスキー'

AWSのアクセスキーと、シークレットキーを設定。
#
# AWS configuration.
#
aws:
  # Update with you AWS account keys:
  access_key: 'AWSアクセスキー'
  secret_key: 'AWSシークレットキー'

AWSのリュージョンを設定。Tokyoの場合は、ap-northeast-1 とします。
  # Specify AWS regions to query for metrics
  regions:
    -
      ap-northeast-1

どの項目をチェックするか設定します。
RDSの場合は、インスタンスID(DB Instance Identifier)を設定します。
#
# Agent configuration.
#
agents:
  #
  # Enable/disable agents with the enabled attribute or by commenting out each agent.
  ec2:
    enabled: true
  ebs:
    enabled: true
  elb:
    enabled: true
  rds:
    enabled: true
    instance_identifiers:
      - インスタンスID

エージェントをスタート。
# bundle exec bin/newrelic_aws 2>> /var/log/newrelic/newrelic_aws.log&
うまくいかなかったら、verboseオプションを有効にしてみてください。詳細をログに記録してくれます。
bin/daemonも用意されていますが、ログを落としてくれないので、上記のような起動にしています。スタートスクリプトは自作するのが良いかもしれません。
また、以下の様な警告がログに記録される場合があります。いつの間にかログが肥大したりすることもあるので注意しましょう。
Digest::Digest is deprecated; use Digest

Enjoy!

2014年12月2日火曜日

MySQLとAmazon RDSのレプリケーションをする方法

https://www.flickr.com/photos/atomictaco/5095355117

オンプレミスやEC2その他のサーバで動かしているMySQLとAmazon RDSをレプリケーションさせる方法です。
昨年、以下の資料が発表されています。

オンプレミスのMySQLデータをAmazon RDSに移動する
https://aws.amazon.com/blogs/aws/migrate-mysql-data-to-amazon-rds-and-back/

ダウンタイム無しでAmazon RDS MySQLデータベースにデータをインポート
http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MySQL.Procedural.Importing.NonRDSRepl.html


ひじょうに簡単になっていたので纏めてみました。

MySQLマスターサーバは既に立ち上がっているとします。
IPアドレス: 100.100.100.100

コンソールからRDSを作成します。
ホスト名: rds.xxx.ap-northeast-1.rds.amazonaws.com
ユーザ: userrds
パスワード: passwordrds


MySQLマスターにスレーブ用のユーザを作成。
$ mysql -uroot -pxxxxxxxx
mysql> GRANT REPLICATION SLAVE ON *.* TO userrds@"%"IDENTIFIED BY "passwordrds";
mysql> FLUSH PRIVILEGES;

mysqldumpを使ってMySQLマスターのデータベースをバックアップ。
$ /usr/bin/ionice -c2 -n7 /bin/nice -n19 /usr/bin/mysqldump -uroot -pxxxxxxxx --master-data=2 --single-transaction --routines --triggers --databases  databasename > databasename.sql

binlog名とポジションを調べて、控えておく。
$ head -100 databasename.sql | grep CHANGE
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000855', MASTER_LOG_POS=846543983;

RDSにデータベースを作っておく。
$ mysql -uuserrds -ppasswordrds -hrds.xxx.ap-northeast-1.rds.amazonaws.com
mysql> CREATE DATABASE  databasename;

RDSにバックアップファイルをインポートする。
$ mysql -uuserrds -ppasswordrds -hrds.xxx.ap-northeast-1.rds.amazonaws.com databasename < databasename.sql

RDSにMySQLマスターの情報を登録する。
$ mysql -uuserrds -ppasswordrds -hrds.xxx.ap-northeast-1.rds.amazonaws.com
mysql> CALL mysql.rds_set_external_master('100.100.100.100',3306,'userrds','passwordrds','mysql-bin.000855',846543983,0);

レプリケーションをスタート。
mysql> CALL mysql.rds_start_replication;

レプリケーションの状態を確認。
mysql> SHOW SLAVE STATUS\G

※ read_onlyがOFFになっているので、書き込み可能な状態になっています。お好みによって、read_onlyをONにしてください。
mysql> SHOW GLOBAL VARIABLES like 'read_only';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only     | OFF   |
+---------------+-------+
1 row in set (0.00 sec)

以下、その他のコマンドです。

レプリケーションをストップする。
mysql> CALL mysql.rds_stop_replication;

レプリケーションを解除する。
mysql> CALL mysql.rds_reset_external_master;

レプリケーションの状態を確認する。
mysql> SELECT * FROM mysql.rds_replication_status;

レプリケーション設定のログを表示する。
mysql> SELECT * FROM mysql.rds_history;


参考資料)

Importing Data to an Amazon RDS MySQL DB Instance with Reduced Downtime - Amazon Relational Database Service
http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MySQL.Procedural.Importing.NonRDSRepl.html

付録: MySQL Amazon RDS SQL リファレンス - Amazon Relational Database Service
http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Appendix.MySQL.SQLRef.html

既存のMySQLサーバからRDSインスタンスへの移行をテストする « サーバーワークス エンジニアブログ
http://blog.serverworks.co.jp/tech/2011/10/17/mysql-to-rds-test/

EC2・オンプレ環境のMySQLからRDSのマイグレーションがやりやすくなった - まめ畑
http://d.conma.me/entry/2013/09/06/133656