たまごかける日報

ここにAA貼りたい

MySQL Casual Talks vol.7で「Continuous Restoreへの道」を発表奴

タイトルの通りだけど

MySQL Casual Talks vol.7でお話してきた。

MySQLのbackupはみんな取ってると思うけどそのBackupって本当にRestore出来るのかなーという不安からRestoreを検証してくれる仕組みを作ってみたというお話  

発表資料はこれ

実は発表の二日前にようやくちゃんと全部のjobが綺麗に動いたんだけど、
何故かその段階で、もう大丈夫っしょ!(・。・)となってしまい、
実際に全部のjobを連結させて一連の流れが見えるようになったのは、
なんと発表当日会場入りの30分前という体たらくっぷり。

なので、資料の途中に書いてある実際の運用ではとかのくだりは、あくまでもそういう予定である。
みたいなかんじになってしまった。なんか今思うと詐欺みたいだなw

発表にあたって

実は人前で何かを発表するみたいな経験に乏しく、
発表当日は緊張しすぎて雨に濡れた子犬みたいになってた。
発表までにカジュアルウォーター3本ぐらい空けてしまったし

あと緊張のあまり大阪弁で発表してしまい、
「バァーンってBackup取ってー」
「バァーンってinstance作ってー」
「バァーンってRestoreしてー」
「バァーンってRestoreのcheckしますー」
みたいな感じで擬音語を多発したことにより、
バァーンの人みたいな認知のされ方をしたのは今となってはいい思い出です。

謝辞的な

この場を借りて的なお話を。

まず@namikawaさん
引きこもりがちな僕に発表の機会を与えていただきありがとうございます。
とってもいい経験になったし、もっと外に出てアウトプットしていかなきゃなと思える一日でした。
あと、発表の後の開放感からお酒を飲み歩いてベロンベロンになってしまった僕の代わりに夜間の障害対応をしていただき本当にありがとうございました・・・:(;゙゚'ω゚'):

そして、発表練習&内容の相談に付き合ってくださった@kuwa_twさん、@dblmktさん、@kakky_hさん、@nekoruriさん本当にありがとうございます、資料当てをしてなかったら多分会場で死体が出来上がってました。
特に@kuwa_twさんは資料にも出演していただき本当にありがとうございます^^

あと、発表の時に@oranieさんを壮絶にdisってしまいましたが
いつもお世話になっております、本当にありがとうございます^^;

おわり

最近の私のchef周りの事情

どうやら台風が来るらしい。
台風にえしゃこらされて頑張ってる雨の音を肴にビール飲みながらブログ書いてる。
台湾ビール旨い、そしてフラフラする


んでまぁ、
事務職をドロップアウトしてインフラ周りのお仕事に戻って二ヶ月ぐらい。
サーバ管理ツールとしてchefをまた使い始めた。
chef周りのテストとかの運用ってどうするべきなのかなーと悩んだりしているのだが、現状のところを纏めてみる。
どうしたもんかなー

使用しているツール

  • chef-solo
  • Berkshelf
  • Vagrant
    • sahara plugin
  • serverspec

こんな感じ。

今まではchef-serverを主に使っていたのだが、
chef-serverじゃないといけない理由もないし、
触ってみたこと無いやっていうモチベーションでchef-soloを使い始めた。

Berkshelfも依存関係管理すんのメンドイな、とか使ったことねーなーというモチベーションで始めた。
てか、意外とcommunityのcookbook使ってるのよね、最近。
まぁ、使ってみたら意外と便利。

Vagrantは完全にテスト用。
後述するが別にvirtualboxでもワンチャン実現可能じゃね?って言われそうな用途で使用しているが、
sahara-pluginが便利でVagrantに落ち着いている。

serverspecは最近使い始めた。
chef適用後の構成管理もちゃんとしたいなと思い使い始めてみた。あと、chefで管理してない部分とかね。
LDAPやら、NICやら、

なんだけど、今のモダンなchef周りの運用ってどんな感じなのかしら。
ダレか教えてよ(適当

おまけ2

vagrantのメモ

chefのテストはvagrantを使用している。
社内用に少し改良したvagrantboxを使用しているがそれ以外は特別なことはしていない。
vagrant upする時にchef_soloを走らせてもいいのだが、chefのレシピのテストでいちいちup&destroyを繰り返してたら時間がいくらあっても足りない、のでsahara_pluginを使って以下のように実行している。

# cd Vagrant用のディレクトリ
# vagrant ssh-config >> ~/.ssh/config
# sed -i 's/Host default/Host kakeru_vagrant/' ~/.ssh/config
# cd hogehoge/chef-repo   #chefのRepositoryに移動してね
# knife solo prepare kakeru_vagrant
# knife solo cook kakeru_vagrant
# vagrant sandbox on
# vagrant sandbox commit

# テストしたいレシピを実行

vagrant sandbox rollback #初期状態へ

ssh kakeru_vagrantでノンパスログイン出来るように、ssh_configを書き換えておく。
その後に、どのサーバにも適用するようなbaseのレシピを適用した後にcommit。
そしたら、作成中のレシピを当てて、ミスったらrollback、修正して適用、rollbackみたいな感じ。

おまけ3

chef-soloがんばるぞ~って矢先にchef-soloやめっからって公式が言い出したみたい。
Chef-Soloはオワコンになりlocal modeが今後の主流になるとのこと - DQNEO起業日記
あらまぁ。

hoge

なんか日記みたいなブログやな・・・

出、出〜、homebrew-cask便利奴〜wwwww

なんというか、会社で所属チームが変わった。
そして、変わった瞬間に夏休み突入した。
今治なう。orionビール片手に記事を書いてる。


なんでまぁ、良い機会だからアウトプット増やす的な意味でちゃんとブログ再開する。
リハビリで手順書記事。

経緯

先日新卒の頃に自作したWindowsPCを墓地に伏せ、会社支給のMBPを召喚した。
障害対応用に前から持ってたMBAもそろそろクリーンインストールしたいなーとか考えてたから、
この際Macの初期のセットアップをちゃんと手順化したいなーとか思ってた。
そしたら、homebrew-caskなるものが便利という噂を聞いた。なんで使ってみた( `o´ )
https://github.com/caskroom/homebrew-cask

homebrew-caskってなんなん

homebrewみたいな感じでdmg形式のアプリも管理出来るらしい。
マジか!

導入

# homebrew入れてね
$ ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"

# cask導入しよか。
$ brew tap caskroom/cask
$ brew install brew-cask

cask使ってみる

Mou - Markdown editor for web developers, on Mac OS X 入れてみよか

# 入れたいアプリあるかなー
$ brew cask search mou
==> Exact match
mou ...
# あった入れてみる
$ brew cask install mou

これで入る、うげー便利。ゲロ吐いた

もっと管理する

brewfileで管理するとモットいいと思う

brewfileやで
こういうのを用意しといて

$ brew bundle Brewfile

すれば、上記のアプリが勝手に入る
うげー便利。鼻血吹いた

出、出〜、ELBSSL証明書奴〜wwwww

早くこの形式のタイトルから脱したい
【たまごELBSSLかける】
【ELBにSSL証明書かける】
とか。なんでもいいけど。

で、
ELBにオレオレ証明書を突っ込んだ時の手順書が掘り出されたのでブログにも書き残すことにした
今年はいっぱいブログ書くねん....('A`)

証明書的な云々

証明書ってなんなんとか、オレオレ証明書ってどうやってツクんの?とかは人様のブログを参考に・・・
オレオレ証明書をopensslで作る(詳細版) - ろば電子が詰まっている

CSRを作るまで

秘密鍵作るで〜

作る
$ openssl genrsa -aes128 2048 > server.key
Generating RSA private key, 2048 bit long modulus
...................+++
...................................+++
e is 65537 (0x10001)
Enter pass phrase:
Verifying - Enter pass phrase:

確認
$ openssl rsa -text < server.key

ELBは秘密鍵パスフレーズがついていたらエラるので、パスを削除してあげる

$ openssl rsa -in server.key -out server.key
Enter pass phrase for server.key:
writing RSA key

CSR作成
今回はオレオレ証明書でやってみるので、対話形式で色々聞かれるけど今回は全部空Enterでかまわないす。
もし、ちゃんと認証局に依頼をするならここでちゃんと記入してね

作る
$ openssl req -new -key server.key > server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
以下略

確認
$ openssl req -text < server.csr

で、本来なら出来たcsr認証局に投げて、証明書をもらう。
でも、今回はオレオレなので、それも自分でやる

証明書

自分で署名して証明書つくんで〜

作る
$ openssl x509 -req -signkey server.key < server.csr > server.crt
Signature ok
subject=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd
Getting Private key

確認
$ openssl x509 -text < server.crt
設定すんで〜

AWSのマネジメントコンソールから
create Load Balancerをぽちっと押して、

f:id:kakerukaeru:20140124212604p:plain

こうやって

f:id:kakerukaeru:20140124212614p:plain

こう!

Private Keyが
$ cat server.key 

Public Key Certificateが
$ cat server.crt

やで〜。

ほなな〜ノシ

出、出〜、mongos接続突然切奴〜wwwww

なんというか、ただの恥さらしブログになんだけど自戒のために残しておく。

なんかおかしい

ある日、本番稼働してない控えのmongosさんで変なエラーが出てアプリでもいっぱいエラーが出てきた。
なんかオカシイ。
エラー的には下記

Tue Nov 26 18:20:47.294 [conn88] Socket say send() errno:32 Broken pipe 10.10.10.10:27018
Tue Nov 26 18:20:47.294 [conn88] warning: problem while initially checking shard versions on RS01 :: caused by :: socket exception [SEND_ERROR] for 10.10.10.10:27018
Tue Nov 26 18:20:47.294 [conn88] DBException in process: socket exception [SEND_ERROR] for 10.10.10.10:27018

Broken pipe....?
mongos->mongodの接続が切れてる... ? _ ?

調べる

最初は単純にBroken pipeだからネットワーク的な問題かなと思い、
トラフィックが急にオチてたりethとかで変なエラーが出てないかを見たがそれっぽいものは特に何もナシ。


connectionsが頭打ちになってね?となり
そこ周りで調べてみることにした


f:id:kakerukaeru:20131201182710p:plain
mongodのプライマリシャードのconnectionsを確認してみる。
900ちょっとで停滞・・・?

実際にログインしてプロセス数を確認してみる

ec2-user@prd-mongod001(ip-10-10-10-10) ~
$ ps auxxx -L | grep mong | wc -l 
931

設定値は?

$ ulimit -u
1024

デフォルト・・・(´ェ`* ;;;)

すごくそれっぽい


作業

mongoさん優しい。ulimitの推奨値書いてた
http://docs.mongodb.org/manual/reference/ulimit/
ulimitの説明とかも書いてくれてるしなんて親切なの・・・

実際に、作業にはいる

vim /etc/security/limits.d/90-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
#*          soft    nproc     1024

こっちをコメントアウトして、

vim /etc/security/limits.conf 
追記
root    soft    nofile  64000
root    hard    nofile  64000
root    soft    stack   unlimited
root    hard    stack   unlimited
root    soft    nproc   32000
root    hard    nproc   32000
*       soft    nofile  64000
*       hard    nofile  64000
*       soft    stack   unlimited
*       soft    nproc   32000
*       hard    nproc   32000

プロセス再起動

$ cat /proc/`pgrep mongo | head -1`/limits
Limit                     Soft Limit           Hard Limit           Units     
Max cpu time              unlimited            unlimited            seconds   
Max file size             unlimited            unlimited            bytes     
Max data size             unlimited            unlimited            bytes     
Max stack size            unlimited            unlimited            bytes     
Max core file size        0                    unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             32000                32000                processes 
Max open files            64000                64000                files     
Max locked memory         65536                65536                bytes     
Max address space         unlimited            unlimited            bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       13087                13087                signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us        

反映された
エラーも消えた。

実際の作業はchef流して、各mongo鯖のプロセスを再起動。
一応全てのmongoを1台ずつ再起動していったから、メンテに入れること無く作業は終わりました。
こんな所まで管理できるのもちょっと怖いね

感想

今回のサービスがAWS上で0から環境を作るというものだったのだが、
今まで社内の環境でKickstartとかでデフォルトで入ってた用意されたインフラ的なものにいかに助けられてたかという事を痛感した。
もっかいちゃんと読んでみよう。


おまけ1

f:id:kakerukaeru:20131201172112p:plain
mongod側のconnectionsをちょっと広い期間で見てみる。
(間にconnectionsが0にまで下がってるのは、僕がmongoのメモリリークのバグを踏んでサービスメンテ状態を2回引き起こしたからです、ごめんなさい死にます)

本当に今になって思えばなんだけど、
このグラフの期間で増設をしてmongosの台数が約2.5倍になったのに
mongodのconnectionが500 -> 900しかいかないなんて単純に考えてオカシイ

ちなみに、その後ulimitの変更を全ての鯖に適応したら
f:id:kakerukaeru:20131201201750p:plain
1200近くまで上がりました(′ʘ⌄ʘ‵)

おまけ2

ulimit適用してもOS再起動時に反映されてないんじゃないの?
【参考】http://blog.father.gedow.net/2012/08/08/ulimit-configuration/
といろいろ不安になったが、そもそも起動スクリプトにulimit書くとか以前に、起動ユーザーのulimitの値を引き継いでプロセスが上がってくるから、そんな心配はいらなかった
実際、試してみたら実行ユーザのulimitで上がってきました。

おまけ???

max processes1024
やんけ!と発見した後に、ulimitが原因だったと他に示す証拠が出てこなかったので、ステージング環境でmax processesを125とかにして再現するか試してみたらmongod自体が死んでテストにならなかった。うふふ
結局500ぐらいに変えて再発した。ので本番にも適用することにした。
状況証拠を集めみたいになってしまったが、今思えばmongodとかもログレベル上げてみれば良かったんや。

isucon2013で生き恥をさらした話

結果

予選敗退^p^

多分技術的には読んでても面白く無いとおもう

なんせ何をチューニングしたのと言われても、
途中から何をどうしたか分からん状態に陥ってたから。

  • そもそも当日の朝に全員集合して言語何にする?とか選ぶ体たらくっぷり。
  • 僕遅刻しましたし
  • とりあえず、PHPでベンチ動いたからPHPにすっか(死ね)
  • とりあえず、ベンチ動かしてmysqlがボトルネックっぽ(適当)
  • とりあえず、インデックス貼ってみるか(適当)
  • innodb_Memcachedってなんぞ(適当)
  • とりあえず、countとか別にもたせたらいいんじゃね(適当)
  • 全件取りに行く奴、キャッシュさせろ(適当)
  • apacheでもキャッシュさせるか(適当)

とか、もうこんな感じですよ。
分担とかは特にせず、これボトルネックっぽくね、どうやったら解決できる?って全員が口出して解決しようとしてたのは逆に良かったのかな・・・?

悪かったこと

何よりも事前準備が足りなかった。
そして、ただただ自分の知識の無さを痛感した。
これ何?何に使っててどうやって動いてんの?みたいな。

良かったこと

自分がウンコカスだと改めて自覚した。
そして、モチベーションが何故か上がったこと。
自分と予選突破一位の人たちと、8倍強の差が開いてたけど、自分もあんな人達にみたいになりたいと純粋に思えた。
また再挑戦したい。

余談

予選敗退の日のお酒は本当に美味しかったです(悲しい)

出、出〜、Vagrant用Box作奴〜wwwww

経緯

色々細かいことは置いておいて、
Vagrantでさくっとchefのテストをしたかったんだけど、社内のリポジトリを見てるBase Boxが見当たらなかったので作ることにした。

設定色々

順番としては
VirtualBoxにお好みのOS入れる
Vagrant連携用の設定を入れる
お好みの設定を入れる(今回の場合僕は社内のリポジトリを見るようにしました)
BaseBoxに仕立て上げる

意外とさっくり作れるからさくっとやってみよう

OS Install

Cent6.4のminimalをここから取ってきてVirtualBoxでインストールしてね

Network設定

そのまんまインストールしてるとeth1がONBOOT="no"になってるからyesにしてね。

# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
NM_CONTROLLED="no"
ONBOOT="yes"
BOOTPROTO="dhcp"

# /etc/init.d/network restart

ビルド用のパッケージとか、アップデートとか

# yum install ruby ruby-devel gcc gcc-c++ automake autoconf make rubygems kernel-devel
# yum update
# reboot

Virtual Box Guest Additions

ファイル共有とかポートフォワーディングとか使うためにVirtual Box Guest Additionsを入れてくよ
VirtualBox
Devices>Install Guest Additionsを選択


f:id:kakerukaeru:20130728033034p:plain


# mkdir /media/cdrom
# mount /dev/cdrom /media/cdrom
# sh /mnt/VBoxLinuxAdditions.run 
Installing the Window System drivers                       [失敗]
(Could not find the X.Org or XFree86 Window System.)

X環境が入ってないよって言われて怒られるけど、まぁ入れてないしね。
入ってなくてもいいしそのまま続行

本当に出来てるか確認してみよう

# VBoxControl --version
# VBoxService --version

Vagrant用の設定

vagrant用ユーザーとsudo権限を付けるよ

# useradd -m vagrant
# usermod -aG wheel vagrant
# echo vagrant | passwd vagrant --stdin
# echo "vagrant ALL=(ALL) ALL" >> /etc/sudoers
# echo "%wheel ALL=NOPASSWD: ALL" >> /etc/sudoers
# echo "Defaults env_keep=\"SSH_AUTH_SOCK\"" >> /etc/sudoers

ssh経由のsudoを許可するためにrequirettyフラグを折ってあげよう

Default !requiretty

vagrantのpublickeyを登録

# mkdir -m 0700 /home/vagrant/.ssh
# curl -s https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub > \
> /home/vagrant/.ssh/authorized_keys
# chown -R vagrant:vagrant /home/vagrant/.ssh
# chmod -R 0600 /home/vagrant/.ssh/*

Chef入れる

$ sudo su -
# curl -L http://www.opscode.com/chef/install.sh | bash

お好みの設定を入れる

今回は社内のリポジトリを見るようの設定を入れたかったので、

# vi /etc/yum.repos.d/CentOS-Base.repo
お好みの設定を入れてね
# yum clean all

base box化

vagrant package --base TestBox(今回VirtualBoxで作ったインスタンスの名前)
[TestBox] Clearing any previously set forwarded ports...
[TestBox] Creating temporary directory for export...
[TestBox] Exporting VM..

そうすると、package.boxがカレントディレクトリにできるので、それをbox addしてあげる
ちなみに、対象イメージが起動中だとboxを作れないから先にshutdownしてあげよう

# vagrant box add TestBox package.box
vagrant] Downloading with Vagrant::Downloaders::File...
[vagrant] Copying box to temporary location...
[vagrant] Extracting box...


あとは、お好みに使ってね
以上で、終了

ちなみに

使うまでも一応書いておくね

# vagrant init TestBox
# vim Vagrantfile
僕が使ってたのはこんな感じ↓
Vagrant::Config.run do |config|
      config.vm.box = "TestBox"
#     config.vm.box = "CentOS-6.2-x86_64"
      config.vm.forward_port 80, 8080
      config.vm.customize do |vm|
            vm.memory_size = 1024
      end
      config.vm.provision :chef_solo do |chef|
            chef.cookbooks_path = "~/chef_2/public/cookbooks"
            chef.add_recipe "test::test"
      end
end
 

あとは起動して入るだけ

# vagrant up
# vagrant ssh


(∩´∀`)∩ワーイ

ね、眠たい・・・・
失敗談とか後で追記していく・・・( ˘ω˘ )ゴーツーオフトゥン