久しぶりですが MySQL 系のイベントやります。軽いトークが流行っていたようなので、深いトークもやりたいなと思い開催することにしました。
豪華講師陣は以下の皆様です:
- 木下さん
- 平塚さん
- 瀬島さん
んで、あともうちょい時間ありそうなんで、LT とかがっつり喋りたい人募集中です!
夜中に眠いのに master のディスク容量がいっぱいで、でも binlog 用のスペースがない slave たちはまだ明日起きてから対応するんでも間に合うとき。よくありますよね。
そんなとき、いままで mysqlbinlog と格闘しながら pos のコピペに注意しつつやってたんですが、 show binlog events という便利コマンドがあることを今更知ったメモです。
master から絶対に読み込みがないデータを消して、延命することにします。しかし innodb だったりするので単に delete しても容量は減りません。
そこで、えいやとアプリを止めて (or table lock して) 以下のようにすることにします。
CREATE TABLE hoge_history_new LIKE hoge_history; INSERT INTO hoge_history_new SELECT * FROM hoge_history WHERE date >= '2012-01-01'; RENAME TABLE hoge_history TO hoge_history_bak, hoge_history_new TO hoge_history; DROP TABLE hoge_histroy_bak;
ほんとに無停止でやりたいなら trigger で hoge_history_new に double write するとか。しかし trigger 仕込むのでミスするくらいなら、停止した上で停止時間短い方針考えるほうがいい時もあるかかも。
これでなんとか master は 10 分停止くらいで drop したぶんの容量が稼げた。しかし slave はまだ容量に多少余裕あるので、できたらこんな drop して欲しくない。と言うよりデータ消しちゃだめじゃん!!
なので、データ消さない slave を 1 つ狙いを定め、上の sql を流す直前に master で show master status を実行し確認した pos まで replication を進めて止めておきます。
slave> STOP SLAVE; slave> START SLAVE UNTIL master_log_file='hoge-bin.000123', master_log_pos=456789;
さて、次は drop table の直前まで replication を進めた上で stop slave し、 sql_slave_skip_counter=1 して drop だけ飛ばしてやりたい。
こんなとき、 pos をどこまで進めればいいかを今までは mysqlbinlog コマンドで調べていました。しかし以下の理由で、絶対もっといい方法あんだろ、と思っていた。
なんでドキュメントぷらぷら眺めてたら show binlog events という最強に見やすいコマンドがあったんですね!
まずは slave が何処まで replication しているか調べます。この例では pos=456789 の位置まで実行済み、ということになります。
slave> SHOW SLAVE STATUS\G ... Master_Log_File: hoge-bin.000123 ... Exec_Master_Log_Pos: 456789
次に pos=456789 からのイベント内容を master で調べます。
master> SHOW BINLOG EVENTS IN 'hoge-bin.000123' FROM 456789 LIMIT 2; +-----------------+--------+------------+-----------+-------------+----------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +-----------------+--------+------------+-----------+-------------+----------------------------------------+ | hoge-bin.000123 | 456789 | Query | 100 | 456901 | use `aho`; drop table hoge_history_bak | | hoge-bin.000123 | 456901 | Intvar | 100 | 457005 | INSERT_ID=91187051 | +-----------------+--------+------------+-----------+-------------+----------------------------------------+ 2 rows in set (0.00 sec)
お、なんとも運がいいことにちょうど次のイベントが drop になってるじゃないですか! ということで slave で 1 イベントをスキップすれば ok。
slave> SET GLOBAL sql_slave_skip_counter=1 slave> START SLAVE;
これで、めでたく master だけデータが欠損した状態に出来ました。後はちゃんと寝てからこの slave に孫を作ってそのまま master に昇格させればよい。
改めて考えてみれば、 pos は境界の場所であって、そこに対応する event があるわけじゃないんだよね。
1234567890123456789012345678901234567890 | event1 | event2 | event3 | ^pos=1 ^pos=10 ^pos=25 ^pos=40
たとえば pos=10 のときに 10 に対応する event はなく、前に event1 があって後ろに event2 がある、と。
https://twitter.com/#!/nslope/status/164802160524136448
なんかひっそりと Solaris11 のソースが公開されてるのかな?? あんまり「キタ━(゚∀゚)━!」と盛り上がってないけど...。
とりあえず du.c 探したけど見つかんない。 2 つめの zip に coreutils や ./osnet/usr/src/lib/libcmd/common/find.c とかは見つかったが。
Solaris 11 11/11 (5.11 11.0) での話。
中身は MySQL の MYD と MYI と frm です。やっぱ InnoDB とか忘れて、基本は bs=128k で生きてたほうが良いような気がする。
send/receive と rsync を状況に合わせて使い分ける場合、 recordsize を設定してたのを忘れてメンテナンス後に変わっちゃう危険があるので、ちまちま分けたくはない。なので公約数的な値を取りたいわけですが、 16k にするかどうかくらいは意識して分けておいたほうがいいかな。
% for i in 2 3 4; do time rsync -av --progress test1/* test$i >/dev/null; done rsync -av --progress test1/* test$i 83.51s user 57.11s system 103% cpu 2:16.36 total rsync -av --progress test1/* test$i 87.93s user 58.11s system 100% cpu 2:25.67 total rsync -av --progress test1/* test$i 79.15s user 49.77s system 99% cpu 2:09.13 total
% zfs list -o space,recordsize,compression,compressratio -r tank NAME AVAIL USED USEDSNAP USEDDS USEDREFRESERV USEDCHILD RECSIZE COMPRESS RATIO tank 20.8T 26.5G 0 123K 0 26.5G 128K off 1.28x tank/test1 20.8T 8.09G 0 8.09G 0 0 128K off 1.00x tank/test2 20.8T 4.45G 0 4.45G 0 0 128K on 1.82x tank/test3 20.8T 8.77G 0 8.77G 0 0 16K off 1.00x tank/test4 20.8T 5.15G 0 5.15G 0 0 16K on 1.76x tank/test5 20.8T 8.05G 0 8.05G 0 0 1M off 1.00x [追記] tank/test6 20.8T 4.37G 0 4.37G 0 0 1M on 1.84x [追記]
cf. http://www.c0t0d0s0.org/archives/5865-SSD,-ZFS,-L2ARC-and-mysql.html
余談ですが、 /usr/bin/du のオプション無しって何を表示してるんだろ?
それ以外については、ファイルサイズの合計ではなく、そのディレクトリ以下に含まれるファイルたちの disk usage を出してくれてるみたい。
% /usr/bin/du test* 16957022 test1 9331071 test2 18395314 test3 10803173 test4
% /usr/bin/du -h test* 8.1G test1 4.4G test2 8.8G test3 5.2G test4
% /usr/gnu/bin/du test* 8478511 test1 4665536 test2 9197657 test3 5401587 test4
% /usr/gnu/bin/du -h test* 8.1G test1 4.5G test2 8.8G test3 5.2G test4
だいぶ間があいちゃいましたが、とうとう Solaris11 がリリースされました。
私が Solaris の世界に足を踏み入れたきっかけは、ふだん扱うデータが多くて困ってたときに「いいファイルシステムないかなー」と 2ch を漁っていたところ、http://logsoku.com/thread/pc8.2ch.net/unix/1146631270/ というスレに出会ったことでした。
しかし ZFS はじめすごい便利な機能が盛りだくさんな OS なのに、 ksh とかキモくていやでたまりませんでした。しばらくして OpenSolaris に /usr/gnu/bin なディレクトリができたあたりから「やべえこれしかなくね」なんて思ってましたけど、業務で使うにはサポート契約などの関係でなかなか難しかった。
そんなガマン大会ももう終わりです。存分に新しい ZFS と暮らしやすいユーザランドで暮らすことができるようになりました。が、残念なこともあります。タダで業務に使える便利な OS ではなくなってしまったかもしれません。
Debian も Sarge が出るときに大変だったような気がしますが、次期バージョンのリリースまで時間がかかると、改善と共に変更も多く、移行も大変です。 ``the First Cloud OS'' なんて言ってるくらいで、ほんとに変わりました。
営業的な目玉や細かいところは Oracle の方がちゃんと営業活動をしてくださるので、 Transitioning From Oracle Solaris 10 to Oracle Solaris 11 から気になるところをピックアップしつつ、とりあえず触ってみたいけど live CD だと裏でいろいろやってくれすぎてよくわからん、という人向けに「私はこうやってインストールした」のメモを書いておきます。
Debian や Solaris10 ならなんとなくインストールできる人が、デスクトップなどではなくサーバ向けのセットアップをしたいときの例です。
まずは http://oracle.com/solaris11 からインストーラをダウンロードします。いくつか種類がありますが text install のイメージを使います。
インストーラで設定することはそんなに多くないですが、ポイントとしては以下。
インストール時に作ったアカウントでログインし、 su または sudo で作業をします。
/etc にあるたくさんのファイルは、かなりのものが自動生成で SMF 管理に移行しました。
root@oscar:~# svccfg -s svc:/system/identity:node describe config config application Properties that control the configuration of the node config/nodename astring oscar Network name of the computer config/loopback astring oscar Hostname mapped to loopback root@oscar:~# svccfg -s svc:/system/identity:node listcust config/loopback astring admin oscar general/enabled boolean admin true
root@oscar:~# svccfg -s svc:/system/identity:node editprop
root@oscar:~# svccfg -s svc:/system/identity:node validate root@oscar:~# svccfg -s svc:/system/identity:node refresh root@oscar:~# svcadm refresh svc:/system/identity:node root@oscar:~# svcadm restart svc:/system/identity:node
root@oscar:~# dladm show-phys LINK MEDIA STATE SPEED DUPLEX DEVICE net0 Ethernet up 1000 full e1000g0 root@oscar:~# dladm show-ether LINK PTYPE STATE AUTO SPEED-DUPLEX PAUSE net0 current up yes 1G-f bi root@oscar:~# dladm show-link LINK CLASS MTU STATE OVER net0 phys 1500 up --
root@oscar:~# ipadm show-if IFNAME CLASS STATE ACTIVE OVER lo0 loopback ok yes -- root@oscar:~# ipadm create-ip net0 root@oscar:~# ipadm show-if IFNAME CLASS STATE ACTIVE OVER lo0 loopback ok yes -- net0 ip down yes --
root@oscar:~# ipadm show-addr ADDROBJ TYPE STATE ADDR lo0/v4 static ok 127.0.0.1/8 lo0/v6 static ok ::1/128 root@oscar:~# ipadm create-addr -T static -a 192.168.1.100/24 net0/v4 root@oscar:~# ipadm show-addr ADDROBJ TYPE STATE ADDR lo0/v4 static ok 127.0.0.1/8 net0/v4 static ok 192.168.1.100/24 lo0/v6 static ok ::1/128
root@oscar:~# route -p add default 192.168.1.1
root@oscar:~# svccfg -s svc:/network/dns/client svc:/network/dns/client> setprop config/nameserver = net_address: 127.0.0.1 svc:/network/dns/client> select dns/client:default svc:/network/dns/client:default> refresh svc:/network/dns/client:default> validate svc:/network/dns/client:default> quit
root@oscar:~# svccfg -s svc:/system/name-service/switch svc:/system/name-service/switch> setprop config/host = astring: "files dns mdns" svc:/system/name-service/switch> select system/name-service/switch:default svc:/system/name-service/switch:default> refresh svc:/system/name-service/switch:default> validate svc:/system/name-service/switch:default> quit
root@oscar:~# svcadm enable svc:/network/dns/multicast
root@oscar:~# format -L vtoc c4t1d0 Searching for disks...done selecting c4t1d0 [disk formatted] c4t1d0 is labeled with VTOC successfully. root@oscar:~# prtvtoc /dev/rdsk/c4t0d0s2 | fmthard -s - /dev/rdsk/c4t1d0s2 fmthard: Partition 2 specifies the full disk and is not equal full size of disk. The full disk capacity is 33511590 sectors. fmthard: Partition 2 specified as 33511590 sectors starting at 0 does not fit. The full disk contains 33511590 sectors. fmthard: New volume table of contents now in place. root@oscar:~# zpool attach -f rpool c4t0d0s0 c4t1d0s0 Make sure to wait until resilver is done before rebooting.
kernel$ /platform/i86pc/kernel/amd64/unix -B $ZFS-BOOTFS,console=force-text
で、 shutdown なのか init なのか halt なのか。みたかんじ poweroff と reboot でよさそうですね。
Solaris10 時代からそうですが FMA (Fault Manager?) という仕組みがあって、たいていの OS 的エラーはこれで検知できます。
root@oscar:~# svccfg setnotify problem-diagnosed mailto:active
Date: Sat, 10 Dec 2011 18:47:50 +0900 (JST) From: No Access User <noaccess@localhost.localdomain> X-FMEV-HOSTNAME: oscar X-FMEV-CLASS: list.suspect X-FMEV-UUID: a7085088-582a-4aef-bf74-9d0d5cf3818d X-FMEV-CODE: SUNOS-8000-KL X-FMEV-SEVERITY: Major Subject: Fault Management Event: oscar:SUNOS-8000-KL To: root@localhost.localdomain SUNW-MSG-ID: SUNOS-8000-KL, TYPE: Defect, VER: 1, SEVERITY: Major EVENT-TIME: Sat Dec 10 18:47:50 JST 2011 PLATFORM: i86pc, CSN: -, HOSTNAME: oscar SOURCE: software-diagnosis, REV: 0.1 EVENT-ID: a7085088-582a-4aef-bf74-9d0d5cf3818d DESC: The system has rebooted after a kernel panic. AUTO-RESPONSE: The failed system image was dumped to the dump device. If savecore is enabled (see dumpadm(1M)) a copy of the dump will be written to the savecore directory /var/crash. IMPACT: There may be some performance impact while the panic is copied to the savecore directory. Disk space usage by panics can be substantial. REC-ACTION: Use 'fmadm faulty' to provide a more detailed view of this event. If savecore is not enabled then please take steps to preserve the crash image. Use 'fmdump -Vp -u a7085088-582a-4aef-bf74-9d0d5cf3818d' to view more panic detail. Please refer to the associated reference document at http://sun.com/msg/SUNOS-8000-KL for the latest service procedures and policies regarding this diagnosis.
ichii386@oscar% fmdump -Vp -u a7085088-582a-4aef-bf74-9d0d5cf3818d TIME UUID SUNW-MSG-ID Dec 10 2011 18:47:50.083117000 a7085088-582a-4aef-bf74-9d0d5cf3818d SUNOS-8000-KL TIME CLASS ENA Dec 10 18:47:46.4495 ireport.os.sunos.panic.dump_available 0x0000000000000000 Dec 10 18:47:37.7837 ireport.os.sunos.panic.dump_pending_on_device 0x0000000000000000 nvlist version: 0 version = 0x0 class = list.suspect uuid = a7085088-582a-4aef-bf74-9d0d5cf3818d code = SUNOS-8000-KL ... panicstr = BAD TRAP: type=e (#pf Page fault) rp=ffffff001ef229c0 addr=5a occurred in module "si3124" due to a NULL pointer dereference ...
root@oscar:~# pkg search 'pkg.fmri:*/mysql*' | grep 175 pkg.fmri set solaris/database/mysql-51 pkg:/database/mysql-51@5.1.37-0.175.0.0.0.2.537 pkg.fmri set solaris/database/mysql-51/library pkg:/database/mysql-51/library@5.1.37-0.175.0.0.0.2.537 pkg.fmri set solaris/database/mysql-51/tests pkg:/database/mysql-51/tests@5.1.37-0.175.0.0.0.2.537 pkg.fmri set solaris/database/mysql-common pkg:/database/mysql-common@0.5.11-0.175.0.0.0.2.537 pkg.fmri set solaris/database/mysql-51 pkg:/database/mysql-51@5.1.37-0.175.0.0.0.2.537 pkg.fmri set solaris/database/mysql-51/library pkg:/database/mysql-51/library@5.1.37-0.175.0.0.0.2.537 pkg.fmri set solaris/database/mysql-51/tests pkg:/database/mysql-51/tests@5.1.37-0.175.0.0.0.2.537 pkg.fmri set solaris/database/mysql-common pkg:/database/mysql-common@0.5.11-0.175.0.0.0.2.537 root@oscar:~# pkg install mysql-51 ...
献本で頂いたわけでもないんですが、かなりヒットな本。
仕事でしかたなく git をちょいちょい使い出したんですけど、 id:sotarok が git-daily 使えば全く理解しなくてもうまくいくように整備してくれてて、なかなか理解が進まなくいくつか本を眺めたりしてました。
この本は最初の例が dotfiles の git 管理とか、もうど真ん中じゃないですか。ちゃんと「こういうときに失敗して、なぜ失敗して、どう頭を切り替えなきゃいけないのか」が説明されているのもありがたいです。思えば git の由来からして、 Debian の人たちが書く本がわかりやすいのは必然なのかもしれません。
ということで、よく使う数パターンが問題なく回るぶんには使えるけど、細かいとこはよくわかってないんだよな、というひとにオススメです。
10月に Percona Live 2011 でロンドンに行ったときに、運良く現地のアップルストアで SIM unlocked な iPhone 4S を買うことが出来ました。もともと SoftBank の iPhone 3GS を持っていて 4S は買う気でいたので、まだ日本では予約しても手に入らなかった当時、「いいオモチャ」が手に入ったわけです。
正直なところ、 SIM フリーなんて一部の携帯マニアのもので、壊れても無保証な Jail Break とかして遊んでるんでしょ、くらいなイメージを持っていましたが、これがまた超絶便利すぎる。当初ドコモショップに行って mini UIM (MicroSIM) だけを追加で買い飽きたら解約する気でいましたが、たんにオモチャからメインの携帯に昇格することになりました。
いろいろ整理した結果、
と、手数料もりだくさんだけどすっきりさせました。
without contract もしくは unlocked, いわゆる SIM フリーな iPhone をわざわざ日本で使うメリットは何か。私には以下がありました。
国内旅行が好きな人にはとても大事です。以前種子島に遊びに行ったとき、現地レンタカーには当然カーナビなんぞ付いていないので、 iPhone で google map がすべての情報源でした。しかし SoftBank はほんと繋がらない。というより一部に入る集落がある、くらいでした。
なお、回線速度については、 ssh で軽く作業するぶんには全然問題ない速度が出ています。しかし EMOBILE の 42Mbps がちゃんと繋がる時と比べれば、やっぱり遅いです。
これにより iPad2 3G の回線契約を解約できました。もともと USB タイプの e-mobile も持っていて PocketWiFi にする案もあったんですけれど、すくなくとも WiFi が必要ならば Tethering で十分。ガッツリ作業するなら電源の意味で USB タイプは外せないので、 e-mobile が圏外のときの救済用と考えています。
ちなみに iPhone 4S での Tethering は以下の 3 通りがあります。
まだ試してないのでウソかもしれませんけど、ドコモショップの方によると「ここで保証はできないが、海外パケホーダイも含めたぶん使えるはず」だそうです。 b-mobile だと海外ローミングできないそうだし、 KDDI の回線もよくわからんので、これはかなりのポイント。
もっとも、せっかくの SIM unlocked なので、ある程度の期間滞在するならちゃんと現地でプリペイド SIM 買ったほうがいいですね :p
これはデメリットです。 SMS が他キャリアに送れるようになったので、プライベートのレベルではそんなに困らなそうな予感。しかしアラート受信先でもあったので、ちょっと困っています。
そもそもドコモの MMS は転送設定ができず、また @ezweb.ne.jp のように IMAP を開放しているわけでもありません。まして @i.softbank.jp のように push 手段があるアドレスを用意してくれるわけでもない。 (まあ当然ですけどね...)
DoCoMo の Android 端末では i-mode に変わって sp-mode というのができ、APN spmode.net だか IMEI だかによるチェックが通れば、専用アプリで i-mode のメールが見れるようになっているようです。インターネットからは月々 210 円の imode.net を契約すると、 IE じゃないとうまく動かない web アプリから見えるようになります。
imode.net は、クライアント側はかなりクソですがサーバ側の CGI は比較的素直な作りのようで、 imoten のように頑張って必要な FORM を POST するプログラムなり iOS/Android アプリの実装がありました。詳しくは 仙石さんの記事 が参考になると思います。
アラートは別のところに送って見ることにして、いったんは遅延ありで imoten で吸出し、どっかに転送しようと思っています。
ディズニーモバイルのスマートフォン 2 世代目です。ソフトバンクで言うところの 101SH になります。
DoCoMo iPhone をメインにすることを決心し、もう1回線どうしようかなと悩み、
という理由により、これを買うことにしました。
ふつうのスマフォではあるんですが、一見するとガラケーで、スライドするとハードウェアキーが付いています。正直あまり使いやすくなくて微妙ですが...。