MySQL 5.6 on Ubuntu 14.04で少しはまったこと

3号です。

オンプレ+CentOS6系なインフラをちょめちょめしてたのが一年くらい前でそっから会社辞めて、今の会社で久々にMySQL構築おじさんをしたらちょっとはまりました。私にUbuntuの知見がほとんど無かったというのも原因ですね。そのメモになります。

インストール時にMySQLのユーザパスワードを聞かれないようにする

通常ubuntuにaptでMySQLをインストールするとrootのパスワードどうする?とかインタラクティブなやりとりが行われます。しかしシェルスクリプトやchefなどからインストールする場合、これをスキップしたいです。そこで下記のようにDEBIAN_FRONTEND=noninteractiveをコマンドに渡すとスキップすることができます。

sudo DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-server-5.6 mysql-client-5.6 libmysqlclient-dev

をバーンでいけます。Ubuntu力が低くてはまった事柄です。

mysqldが落ちない

上記インストール直後、ps -ef | grep mysqlってやるとmysqldが存在しています。で、このプロセスなのですが、/etc/init.d/mysql stopってやっても落ちてくれません。killしてもダメです。

service mysql stop

ってやる必要があります。普段serviceコマンドほとんど使わないので解決するまで結構時間を食ってしまった...。serviceコマンドで落としたあとは/etc/init.d/mysql stop/etc/init.d/mysql startが効くようになります。

File 'mysql-bin.index' not found (Errcode: 13 - Permission denied)とか言われる

データディレクトリの場所を変えたんですが、そしたらこれに当たりました。データディレクトリ変える場合は注意ですね。原因は/etc/apparmor.d/usr.sbin.mysqldというファイルがあってですね(知らなかった)、このファイルに下記を追記します。以下の例はデータディレクトリを/db/mysqlにする場合になります。

   /db/mysql/ r,
   /db/mysql/** rwk,

そしてsudo service apparmor reloadで解消します。

[ERROR] Function 'innodb' already existsがログに記録される

http://www.faqssys.info/error-function-innodb-already-exists/

これですね。たぶんバグだと思います。mysql.pluginテーブルに入っているinnodbプラグインがないよ、って意味です。他にもFEDERATEDがないよとかいろいろログに出ます...。 これについてはそもそもinnodbはビルトインされたものを使ってますので、mysql.pluginテーブルで不要なものを消しました。このエラーログが出ていても動作に影響は無いようなのですが、ERRORって文字が気持ち悪いので。

[ERROR] InnoDB: Tablespace open failed for '"mysql"."innodb_index_stats"', ignored.がログに記録される

http://bugs.mysql.com/bug.php?id=67179

これですね。該当のバージョンではないのですが...これが発生しました。

http://bugs.mysql.com/file.php?id=19725&bug_id=67179&text=1

こちらの要領に従って従ってテーブルを再作成してMySQLを再起動して完了です。

以上です。

ncコマンドでTCP/UDPポートの疎通確認をする

3号です。

このシノギをしていると謎の力によって通信が遮断されてとても困ることがあります。 私の現場ではfluentdを運用しているのですが、つい先ほど転送元ホストから転送先ホストにログが転送できなくなってしまいました。

fluentdはログの受け口として24224番ポートをTCP、UDP双方でリスンするのでこのポートを調査します。

まずTCP24224ポートの調査です。telnetを用いるのが定番ですが掲題のncコマンドでもできるので今回はncコマンドでやってみます。

次のようにして転送先ホストで24224番をTCPでリスンします。

nc -l -p 24224

そして転送元から次のようにhello tcpというメッセージを送ります。

echo "hello tcp" | nc TARGET_HOST 24224

疎通ができれば転送先にhello tcpというメッセージが表示されます。

続いてUDP24224番を調査します。ncコマンドに-uをつけることでUDPでリスンすることができます。

nc -l -u -p 24224

転送元ホストから同じく-uオプションをつけてUDPでメッセージ(hello udp)を送信。

echo "hello udp" | nc -u TARGET_HOST 24224

UDP24224番の疎通ができるのであればメッセージが表示されます。

私の環境ではダメでした。どうやらUDP24224番に謎の力が働いたようです。突然です。iptablesも動いてないし。

困ったなあ、と思いながらこのブログを書きました。

追記

今、fluentdはheatbeat_type tcpを設定すればudp空いてなくてもいいんだよ、と教えてもらえました。なぜ突然udpがダメになったか不思議なんですが、困らなくて済みそうです。

Linuxのビープ音を鳴らさないようにする

3号です。今年も残すところあと356日くらいです。がんばっていきましょう。

  • OS
vim /etc/inputrc

#set bell-style none
のコメントアウトをはずして一度ログアウトする
  • vim
~/.vimrc

set visualbell

っていう。

2014年のまとめ

『飲んだ勢いで俺たちのブログを開設しました』
と、このブログが始まってから1ヶ月がたちました。

今回は今年最後の記事ということで、今年の総まとめ的なやつです。

※ちなみに7人で、週一当番制で書いてました。



記事数、はてブ数、アクセス数!

1ヶ月でどういう記事がどのぐらいのユーザに届いたのかについてです。

それではまず、






総記事数 28!



総はてブ数 671!!

f:id:oretachino:20141226180155p:plain



そして



総アクセス数 12000!!!

f:id:oretachino:20141226180212p:plain

広告収入 無し!!!

おおー、けっこういきましたね。
1ヶ月にしてはまぁまぁじゃないでしょうか。



続いてもうちょっと細かく見てみます。

はてブ数のTOP10はこうなりました。

  1. 俺とおまえとawk - 俺たちのブログ
  2. scpとrsyncでパスのケツスラッシュのありなしの挙動を毎回迷うのでメモ - 俺たちのブログ
  3. CloudFront+S3の画像配信にリサイズ機能を追加する - 俺たちのブログ
  4. Ruby の Object Data Dumper - 俺たちのブログ
  5. (tmux) ペインを独立したウィンドウに変える - 俺たちのブログ
  6. test-unitさえあればご飯大盛り三杯はイケる - 俺たちのブログ
  7. ELBのIPアドレス個数でサービス規模は推定できるのか - 俺たちのブログ
  8. 例えばディレクトリの作成にinstallコマンドを使う - 俺たちのブログ
  9. mysqldumpで欲しいレコードだけ抽出する - 俺たちのブログ
  10. Sinatraライクなgin-gonicで手軽にGolangを試す。 - 俺たちのブログ

上から7号、6号、1号!!!
記事ごとのアクセス数分布もだいたい同じです。

awkとケツスラの記事が特に人気でした。
書いてる人がおっさんばっかだから、やたら古めかしいツールの運用系TIPSが多いですねぇ。
みんなもっとDockerとかHubot+Slackとかみたいなオシャレ記事書けや。

各隊員ごとのはてブ数はこうなりました。

  • 1号 : 77
  • 2号 : 24
  • 3号 : 34
  • 4号 : 81
  • 5号 : 24
  • 6号 : 189
  • 7号 : 242

次の飲み会は2号と5号のオゴリですね。

まとめ

というわけで、この1年のブログまとめでした。

まぁなんといっても、開始から28日欠かさずに書いたのがすごいですね。

やっぱ匿名が良かったのかな。
最初は名前を出さずに書くってなんか不毛だなと思いましたが、
そのぶん、時間無かったり、いいネタ思いつかなったりしても、
『もうなんでもいいから書いちまえ!』
という割り切りがしやすかった気がします。
やっぱブログで一番大事なのはとにかく書くことですよね。

アクセス数、はてブ数もけっこういい数字になって良かったです。


という感じでした!!!

それではみなさん、今年はお疲れ様でした。
今後どういう形で続けてくのかは謎ですが、来年もよろしくお願いします!

DHCP だけど DNS サーバを手動で指定したい [Linux]

さっき調べてたことのメモ。

Vagrant で Linux マシンを起動したときに、ネットワーク設定を NAT (+ DHCP) にした状態で、DNS サーバは社内のやつを使いたかった。 普通に /etc/resolv.conf を編集して

+ nameserver x.x.x.x

とかしても、/etc/init.d/network restart とかしてネットワークを再起動すると DHCP (正確には dhclient-script) によって、/etc/resolv.conf が書き換えられてしまう。

$ cat /etc/resolv.conf
; generated by /sbin/dhclient-script
nameserver 10.0.2.3

VirtualBox の 10.0.2.3 が指定される。これをなんとかしたいという話。

方法1:PEERDNS=no を使う

/etc/sysconfig/network-scripts/ifcfg-eth0 に PEERDNS=no を追加すると、DHCP で /etc/resolv.conf を更新されないようにできる。

$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=dhcp
PEERDNS=no

なので、あとは /etc/resolv.conf を手動でいじって良い

$ cat /etc/resolv.conf
nameserver x.x.x.x
nameserver y.y.y.y

方法2:DNS1/DNS2 を使う

DNS1/DNS2 を書いて置くと network を再起動した時に、/etc/resolv.conf に追記してくれる。

$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=dhcp
DNS1=x.x.x.x
DNS2=y.y.y.y
$ sudo /etc/init.d/network restart
$ cat /etc/resolv.conf
; generated by /sbin/dhclient-script
nameserver x.x.x.x
nameserver y.y.y.y

ifcfg-eth1 もある場合どうなるんや!と思って試した所、どうやら後勝ちするようだ。

おわりに

PEERDNS=no がよさそう。なんかもっとうまい方法あればおしえてちょ。

Golang + mgoを使う時にクエリはbson型にするんだよ、というお話

メリークリスマス。5号です。こんな時間にブログ書いている時点でお察し下さい。

そろそろネタが無くなって来たので、本当に小ネタで。

Golang + mongodbを利用する時にmgo

mgo - Rich MongoDB driver for Go

というドライバを使っているんですが、クエリを投げる時にベタにstringで

        var result ResultEntity
        query := "\"delete_flg\": 0"
        err := session.Find(query).All(&result)

みたいに書いてもクエリが動いてくれません。(かなり色々端折っています・・・。)

どうするかと言うと一度bson型に入れる必要があり、さらに中でネストされているような場合もそれをbsonにする必要があります。

        var result ResultEntity
    query := bson.M{"test": testid,
        "hoge_flg":      1,
        "fuga_flg":         0,
        "time_start_at": bson.M{"$lte": now},
    }

    err := session.Find(query).All(&result)

みたいに書くと動きます、というお話です。まあ、普通にちゃんとドキュメント読んだ人なら迷いません。ちなみに僕は初めの頃に今回の例で言うクエリ内の「{"$lte": now}」をbsonにしなくてドハマりした記憶があります。

以上、メリクリでした!

ちょっとしたファイルの転送に便利な SimpleHTTPServer

サーバ間でちょっとしたファイルの受け渡しをしたいことはよくあると思う。
そういうときには scp とか rsync とかを使ったりすると思う。
だけど ssh がそのサーバ間で許可されてなかったり、ケツスラッシュとかを気にしたりしなくてはならなかったりして意外とダルい。
あとは netcat とかあるけど日常的に使わないから毎回使い方調べたりしなくてはならなくて*1ダルい。

そこで SimpleHTTPServer ですよ

たぶんみんな知ってて普通に使ってるんじゃないかなと思ったけど、たまたま同僚のおじさんが 3 人連続で知らなくて俺が教えてあげるみたいな機会があったからこのブログにも書いておこうと思う。

SimpleHTTPServer とは

python の簡易WEBサーバ。
コマンドラインから起動すると、カレントディレクトリ以下が DocumentRoot になる。

起動方法

いずれの場合も第一引数で任意のポート番号を指定できる。デフォルトは 8000

  • python 2 系
$ python -m SimpleHTTPServer
  • python 3 系
$ python -m http.server

送りたいファイルのあるディレクトリに cd して SimpleHTTPServer を起動すれば、受け取らせたいサーバ側から wget などでカンタンにファイルを取得出来る。超便利。
ssh できるかとかケツスラッシュとかを気にしたりしなくていいし、どっか適当に空いてて疎通が取れるポートがあればいいだけ〜。最高。

*1:わたしだけですかね。そうですね。