タグ別アーカイブ: ssh

zfsのプールを他のサーバに効率よく移設する

zfsのプールを他のサーバに効率よく移設してみた。

現在zfsで構築されているファイルサーバから、新規に作成されたzfsのファイルサーバへzpoolを転送してみた。

 

流れとしては元サーバでsnapshotを取り、その後にsshで転送して受け側で展開するというもの。

zfs snapshot tank/[email protected]`date +%Y%m%d`;

zfs send tank/[email protected]`date +%Y%m%d` | ssh -c arcfour256 [email protected]_to_transfer zfs recv tank/[email protected]`date +%Y%m%d`


気をつけるのはdateを使って転送しているのでスナップショット作成から転送開始までに日をまたぐと失敗する。(スナップショットの作成はだいたい早いので大丈夫なハズ…)

またsshは-cで軽い暗号化方式を選ぶことで転送速度が上がるらしい。

ちなみに今回のテストでは標準のもの(aes128-cbc)だと8.1MB/sでしたが、arcfour256では でした。

 

一瞬でのバックアップを実現するSolaris ZFS (3/4)

http://www.atmarkit.co.jp/ait/articles/0804/08/news138_3.html

大容量ファイルのSCP転送を高速にする方法

http://d.hatena.ne.jp/rx7/20101025/p1

 

cronやプログラムでssh越しrsyncを利用するときにカナリ便利なオプション

1. 始めに

同期が必要な場面って結構ある。ローカルのディレクトリ間の同期はもちろん、特にインターネット越しの同期が必要になることって結構ある。

そんなときには決まってrsyncの出番だ。ファイルの変更を検知し、よしなに同期してくれる。そんな頼もしいrsync。枯れたソフトウェアなのでホスティングを借りたときにftpだけじゃなくてsshとrsyncが付いてきたりもする。すでに広まっているからすごく便利。

で、さて、そんな便利なrsyncなんだけれどcronなどで定期的、自動的にrsyncを実行するときにはチョットした問題があったりする。

その問題とは二点。一つはパスワード無しで認証を通す必要があること。もう一つはフィンガープリントと呼ばれるsshのホストの正当性を確かめる確認が出ること、だ。

この問題はどちらも、プログラムやcronなどプロンプト(よろしいですか?[y/n]的なアレ)を処理できない端末でrsyncを利用する際に解決しなければいけない問題。

前者のパスワード無しで認証を通すためにはsshの公開鍵認証を利用する。コレに関しては文献がいろいろとあるので参照されたし。

rsyncとsshで別のマシンにバックアップ

rsync over ssh を使ってバックアップ

さて、今回は二つ目の問題点、フィンガープリントのプロンプトを越えるためのオプションについて考える。環境としてsshクライアントとしてOpenSSHを想定している。他だとうごかないかも。

続きを読む cronやプログラムでssh越しrsyncを利用するときにカナリ便利なオプション

wordpressでリモートにある環境にデータベースを転送したい

はめじに

wordpressでリモートにある環境にデータベースを転送したい。転送というか同期というか。

通常の環境であれば管理者メニューからエクスポート > インポートとすればすむ話なのだけれど、今回はちょっと変わった事情があった。

その条件ってのは下記の通り

  • 手元のサーバにあるワードプレスのデータベースの一部(コメントとかは上書きしないようにする)をリモートサーバに転送したい
  • リモートサーバにはsshでログイン可能
  • テータベースの一部のうち、post_metaにあるmeta_keyがviewsは上書きしたくない
  • 転送するのは一日に一回ぐらいのそこそこのペースで転送したい

リモートホストにsshでログインできるのでsshとパイプを使ったワンライナーでやってしまおう的な。

またpost_metaのテーブルはちょっとやっかい。今回利用しているプラグインでWP-PostViewsという閲覧数を保管するプラグインがある。これは閲覧数をpost_metaにmeta_key = viewsで管理している。だからそこをハズしたい。

キャプチャ4

というわけでさっくり

mysqldump –h localdbhost –u localuser –plocaldbpassword  --add-drop-table wpdbname wp_options wp_posts wp_postmeta wp_term_relationships wp_term_taxonomy wp_terms wp_users wp_usermeta | ssh [email protected] mysql -f -h remotedbhost -u remotedbuser –premotedbpassword  remotewpdb

これでひとまずpost_meta以外はいけた。

データがちょっと複雑なpost_meta

post_metaに関してはmysqldumpにwhere句が使えるらしいので使ってみる。

次にpost_metaをうまく通してやるためにオプションを調整してやる。

mysqldump –h localdbhost –u localuser –plocaldbpassword   --add-drop-table=false --extended-insert=false --where="meta_key!='views'" mysqldump –h localdbhost –u localuser –plocaldbpassword wp_postmeta  |  ssh [email protected] mysql -f -h remotedbhost -u remotedbuser –premotedbpassword remotewpdb

キャプチャ

--add-drop-table=false

これは対象テーブルのdrop table – if exists文を出力に含めないようにするためのオプション。

基本的にはテーブルがあるっていう前提なのでcreate-infoごといらないかもしれない。(create文ごとなくすには—no-create-infoを付けるといい)

今回は安全に動作(運用)するために付けておくことにする。ここで与えたオプションはlong形式の—add-drop-tableなんだけど、実は引数でtrue falseが与えられるらしい。よくありがちなのは—no-add-drop-tableみたいに対応してる気がしてたんだけどそうじゃないみたい。

公式には書いてないので気がつかなかった。っていうか引数ありって本当意外。

  • --add-drop-table

DROP TABLEステートメントをCREATE TABLEステートメントの前に追加します。
MySQL ::   MySQL 5.1 リファレンスマニュアル :: 7.12 mysqldump — データベースバックアッププログラム

--where=”meta_key!=’views'”

これはmeta_keyで上書きしたくない条件を指定。今回は手元のデータのうち閲覧数は上書きしたくなかった。sqlだったらすんなりwhere句書いちゃえば楽なのになーって思ったらmysqldumpでもwhereが書けるらしい。

  • --where='where_condition', -w 'where_condition'

あるWHERE状態に選択された行のみダンプします。ユーザのコマンドインタープリタにとって特別なキャラクタ、もしくはスペースを含んでいる場合、状態の周りをクオートで囲まなければいけません。

MySQL :: MySQL 5.1 リファレンスマニュアル :: 7.12 mysqldump — データベースバックアッププログラム

–extended-insert=false

キャプチャ2

このオプションも引数を取るらしい。このオプションは

  • --extended-insert, -e

複数のVALUESリストを含む、複数行INSERT構文を使用してください。これにより、ダンプファイルサイズを小さくし、ファイルが再ロードされる際の挿入スピードがあがります。

MySQL :: MySQL 5.1 リファレンスマニュアル :: 7.12 mysqldump — データベースバックアッププログラム

となっている。いわゆるbulk insertとかmultiple-row insertsとか言われてるあれにするようなやつですね。

insert hoge (id, hoge) values (1, hoge), (2, hoge1), (3, hoge), (4, hoge);

で、コレって結構早くする上では重要なものなのです。このオプションがonでないと、bulk insertが有効になっていないと、かなり遅くなります。なのですが後述するmysql -fと組み合わさって今回の運用上はoffにしてないとうまく目的を達成できません。

今回の運用上、というところはどういったところなのか。

さっきの例だとid, hogeという二つのカラムに対して四つの行を一つのinsert文でinsertしようとしてる。で、カラムの名前から分かるように、idというのはpkeyなのでunique制約がある。となるとき、上のinsertだとduplicateでinsertできないことがある。もともとid=1な行があるときとか。で、そういうのは無視しながら必要な行だけをinsertしたいので、これらのinsert文を分けて書く必要がある。なのでこのオプションを有効にしてやる。するとこんな感じのinsert文になる。

insert hoge (id, hoge) values (1, hoge);

insert hoge (id, hoge) values (2, hoge1);

insert hoge (id, hoge) values  (3, hoge);

insert hoge (id, hoge) values (4, hoge);

これでid=1は通らなくても他のinsert文は通ってくれるので期待通りの結果になるかな!

mysql –f

受け側のオプション。エラーがあっても処理を続行する。先のcreate文ですでにtableが存在しても続けたり、insert文でduplicateな行だったとしても続けてくれる。おかげさまでイケるようになります。

おわりに

これでcronに入れとけばテキトウに同期してくれそう。sshでパスワードのプロンプトをなくすために公開鍵をやりとりする、とかやる必要はあるけれど。

でもこれできっと便利。しらばらくは手でやってみるけど。

モバイル環境からSSHを接続するときに圧縮を行うようにしてみた

モバイル環境からSSHを接続するときに圧縮を行うようにしてみた。
サーバはFreeBSDでクライアントはOpenSSH on Mac OS X。

純粋にターミナルで接続するときに下記の通りオプションを与えた。
-Cは圧縮を有効にするオプション、-oで追加の設定として圧縮レベルを与えている。下記の例では最高圧縮率の9。たぶん昨今のマシンなら大丈夫じゃないかな。

shell> ssh -C  -o CompressionLevel=9 host.example.com

つないでみた感触はなかなか良好。いいんじゃないかな。但し今回は帯域のみを絞って(1KB/s)試験をしただけであって、実際の環境のようにロスが30%出るだとか、ラウンドロビンが1000msを越える、帯域が100B/sってなるとまた違った結果になるかも。delayed ackとかなんたらのアルゴリズムだとかそういった設定が有効なのかも。でもひとまずお手軽な圧縮オンで。

また今回の設定にあたって帯域を絞るには下記のソフトを利用した。
Mac OSで帯域コントロールなソフト。

Download Entonnoir for Mac – Limit upload and download speed on a system scale for any port.
ミニマムが1KB、遅延設定、ロス率は不可、あくまでポートごととちょっと痒いところに手が届かないけれど直感的で簡単な操作で帯域を絞り込める。コレのおかげで試験ができました。

 

 

 

 

 

CentOSでSSHのログインがとても遅かった件

1. SSHのログインが遅い・・・・!

CentOSを導入してみた。で、LDAPの設定をして、SSHで接続しようと思ったんだけど遅い、遅すぐる・・・!

どこが遅いのかというと、SSHで接続に行ってパスワードの入力を促されるまでに10秒ほど待たされる。コレは参った。

で、SSHの応答が遅い –> サーバでDNSの逆引きを疑え! という格言がある通り(わしが言った!)、まずココを疑う。

対象のホストでDNSで逆引きしてみる。ちゃんとうまくいく・・・。

ついでに色々とログインしてみたら、公開鍵での認証は早いみたい。どうやらパスワードの認証だけがやたらめったら遅いらしい。

続きを読む CentOSでSSHのログインがとても遅かった件

FreeBSDのホストにsshが繋がらない時のある対処法

あるホストでsshの調子が悪くなった。
sshのサーバ側、繋がれる待ち受け側はFreeBSD7.2-R i386

OpenSSH is a derivative of the original and free ssh 1.2.12 release by Tatu Ylonen

クライアント側、繋ぎにいく側はFreeBSD。

これだとどこからもつながらない。

sshclient.l2tp.org%ssh badssh.l2tp.org
Connection to 10.0.0.1 timed out while waiting to read

FreeBSDだと繋がらない、というのは、windowsのputtyだと時間がかかるけどつながる。なんでだろう。

FreeBSDからtelnetするとこんな感じ

sshclient.l2tp.org%telnet badssh.l2tp.org 22
Trying 121.1.227.95...
Connected to badssh.l2tp.org.
Escape character is '^]'.
SSH-2.0-OpenSSH_5.1p1 FreeBSD-20080901

とちゃんと応答がある。

予想だと名前解決あたりでこけてるんじゃないかな、と。

と思ったらマジでこけてた。resolv.confの最初がつながらないホストが指定してあった。

おそらくここのタイムアウト待ちして次のname serverに聞きに行く前に、freebsdのsshクライアントがタイムアウト処理しちゃうんだと思われる。それに対してputtyだとタイムアウト値が長い模様。