orenoblog

エンジニアになりたいExcel方眼紙erの物語

MariaDB Galera Cluster Known Limitationsを勝手に翻訳

MariaDB Galera Cluster - Known Limitationsの日本語訳です。

ありがとう同僚のInoiうじそしてGoogle翻訳こんにゃく

MariaDB Galera Cluster既知の問題

この記事ではMariaDB Galera Clusterの既知の問題と制約に関する情報を記載しています。

codership.comからの制限

  • 現在レプリケーションInnoDBのみ動作します。 他のシステム(mysql.)テーブルなどのテーブルへの書き込みはレプリケーションされません (この制限は暗黙的にmysql.テーブルを変更するユーザの作成などのDDLステートメントを除外し、レプリケーションします) MyISAMはwsrep_replication_myisamシステム変数で実験的なサポートが行われています。

  • LOCK TABLES, FLUSH TABLES {explicit table list} WITH READ LOCK, (GET_LOCK(), RELEASE_LOCK(),…)はサポートされません、これら制限を克服するにはトランザクションを正しく使用できる必要があります。 グローバルロックの操作FLUSH TABLES WITH READ LOCKはサポートしています。

  • 全てのテーブルに主キーが必要です(複数列の主キーはサポートされます) 主キーのないテーブルへのDELETEはサポートされません。 また、主キーのないテーブル内の行は別のノードに異なる順序で表示される可能性があります。

  • もしクエリログを有効にした場合はlog_output=FILEにする必要があります
  • XAトランザクションはサポートしません
  • トランザクションのサイズ。Galeraはトランザクションのサイズを明示的に制限中に、writeset は、単一のバッファーをメモリ常駐として処理されます非常に大きなトランザクション (負荷データなど) される可能性があります結果、ノードのパフォーマンスに影響を与えます。避けるため、wsrep_max_ws_rows および wsrep_max_ws_size システム変数 128 K にトランザクション行とデフォルト トランザクション サイズを 1 Gb に制限します。必要に応じて、ユーザー可能性がありますそれらの制限値を大きくしたいです。将来のバージョンは、トランザクションの断片化のサポートを追加します。

他に観察されたこと(特に順序関係なく)

・もしあなたがstate transferとしてmysqldumpを使っていて、 どんな理由であれ(例:接続のためのデータベースアカウントを持っていなかったり、 必要な許可がなかったり) 失敗すると、サーバーエラーログには、「SQL SYNTAX error」と表示されるだろう。 自分が愚かだと思う必要はない、これはメッセージを伝えるための一風変わった方法なのだ。 (インチキのSQLの中の擬似ステートメントはこのエラーメッセージを含むだろう。)

・どんな大きなトランザクションも使ってはいけない。100K行挿入するだけで、 200~300Mbを必要とするだろう。もっと悪いシナリオだと、500K行のために1.5Gb、 1M行のために3.5Mbだ。詳しくはMDEV-466をみてほしい。 (それが閉じられているように見えるだろうが、修復されたから閉じられていない。)

DDLが関係しているとき、ロックでは弱い。たとえば、もしあなたの DMLトランザクションがテーブルを使って、平行するDDLステートメントがスタートしたとき、 通常のMySQLのセットアップでは、メタデータロックを待つことになるだろう。しかしGaleraの コンテクストでは、すぐに実行される。たとえあなたがただ1つのノードを動かしていても、それを クラスター・ノードとして構成していれば、そうなる。MDEV-468も見てほしい。この現象は様々な 副作用を引き起こすかもしれず、その結果は未だ調査されていない。これは出来るだけ避けてほしい。

・auto-incrementがシーケンシャルになることをあてにしてはいけない。 Galeraはコンフリクトしない独自のシーケンスを生み出すためのautoincrement incrementに 基づいたメカニズムをつかっているため、すべてのノードにおいてシークエンスにはギャップがある。

・時々、SHOW以外のほとんどすべてのステートメントにおいて、「Unknown command」エラーを 出し始めたり、他のサービスコマンドを出し始めたりするかもしれない。クラスタが分割されて、ノードが 小さい方のパートにあるとき、ネットワーク障害の間、ノードが一時的にお互いを見失ってるときに、 これは起こる。このエラーは恐ろしいが、サーバーがおかしくなったことを意味している訳ではない。 おかしくなるかもしれないということを意味しているに過ぎない。またこれは、ノードがstateを他のノードに 送った時にも起こった。

・一時的な分割の後、もしクラスタの"よい"方のノードがまだreachableで、 stateが修正されたら再同期が起きる。 その過程で、クラスタの"悪い"方のノードは、すべてのクライアントのコネクションを落とす。 それはかなり突然のものかもしれない。もしクライアントがアイドル状態で何かおかしなことが 起こっていることさえ知らなかった場合は特にそうだ。 隔離されたノードへの接続が回復された後、もしノード上のフローがあれば、 それが同期するのには長い時間がかる。その間は"よい"ノードは「 クラスタはすでに通常のサイズであり同期されている。」と言い、 再参加しているノードは「参加している(しかし同期はされていない)」と言う。 この接続は「unknown command」であり続ける。これも結局気にしない方がいい。

・binlog_formatがstartupにおいてチェックされ、ROW (Binary Log Formats参照)であるときに限り、ランタイムに変更 することができる。binlog_formatをランタイムに変更してはいけない。 複製が失敗するだけでなく、他のすべてのノードをクラッシュさせる可能性がある。

・もしあなたがstate transferのためにrsyncを使っていて、 state transferが終わる前にノードがクラッシュするなら、rsyncプロセス は永遠に宙ぶらりんで、ポートをふさいでノードの再起動ができないかもしれない。 この問題は「port in use」としてサーバーエラーログに現れる。 孤立したrsyncプロセスを見つけ、手動で殺すべきだ。

・パフォーマンス:クラスタのパフォーマンスは、最も遅いノードのより高く ならない。しかし、もしただ一つのノードだけでも、そのパフォーマンスは、 standalone modeで同じサーバーを動かすときに比べてかなり低い (wsrep プロバイダーが無いとき)。これは大きいトランザクションに 特に当てはまる。

Windowsはサポートされていない。

レプリケーション・フィルタ:Galera cluster内では、レプリケーション・フィルタは 注意して扱ったほうがいい。InnoDB DML updates以外の基本的なルールとしては、以下のレプリケーション・ フィルタはGalera clusterにおいて有効でない:binlog-do-db , binlog-ignore-db, replicate-wild-do-db, replicate-wild-ignore-db しかし、replicate-do-db, replicate-ignore-dbは、InnoDBMyISAMエンジンのDDLDML には有効だ。 前述のように、レプリケーション・フィルタは注意してあつかった方がいい。不一致を生み出し、 レプリケーションが中止になるかもしれないからだ。(MDEV-421, MDEV-6229を参照)

・FLUSH PRIVILEGESはレプリケートされない。

MariaDB Galera Cluster versions 5.5.40-galeraと10.0.14-galeraの前に、 クエリキャッシュは切る必要がある。

・マスターがGaleraノードにスレーブとして動くレプリケーションをする非同期の レプリケーション設定において、並列レプリケーション(slave-parallel-threads > 1) は現在サポートされていない。(MDEV-6860参照)

脳筋的QCachegrind on Mac OSXのメモ

出, 出, 出, 脳筋的関数呼出回数調査奴~~~wwww

Macに入れる方法

QT入れる

homebrewでgrapvizとqcachegrindをインストールする

$ brew install grapviz
$ brew install qcachegrind
  • 起動
$ qcachegrind
  • QCachegrindを使ったXdebug等のCachegrind形式ファイルの確認ポイント

(0) QCachegrindの動いてるマシンにprofileを転送する

(1) 出力サイズの大きいProfileファイルを開く

(2) Inclの多い順にソートする

(3) そのなかからSelfとCalledが多いものを見つける(自分自身を何回呼んだか)

(4) Call Graphから処理の割合が多いものを見つけて、コール回数の多い関数を見つける

(5) Inclの多いCall GraphとMemoryMapをExport Graph

(6) (4)を見つけたCall GraphとMemoryMapをExport Graph

(7) なおちてって言う。

とにかくSelfの負担の多いものを削ってもらう。

PHPの物理魔法Xdebugを導入する

XDEBUG使うとアレなコードをアレするときに非常に役立ちます。 以下はmod_php使ってる時の例

/usr/local/bin/php-config
./configure --enable-xdebug --with-php-config=<php-configのフルパス>


$ /etc/php.d/xdebug.ini
zend_extension=xdebug.so

xdebug.profiler_enable=1
xdebug.profiler_output_dir=/tmp/xdebug
xdebug.profiler_output_name=cachegrind.out.%R.%t
$ sudo service httpd restart

プロファイルが出力されたらKCachegrindで可視化して、負荷の高い処理を剤る.

/usr/bin/mysql_install_db実行時にFATAL ERROR: please install the following Perl modules before executing /usr/bin/mysql_install_db:

# /usr/bin/mysql_install_db
FATAL ERROR: please install the following Perl modules before executing /usr/bin/mysql_install_db:
Data::Dumper

上記が出たら

# yum install -y perl-Data-Dumper

でData-Dumperモジュールを導入してmysql_install_dbを再実行

# /usr/bin/mysql_install_db
WARNING: The host 'host' could not be looked up with /usr/bin/resolveip.
This probably means that your libc libraries are not 100 % compatible
with this binary MySQL version. The MySQL daemon, mysqld, should work
normally with the exception that host name resolving will not work.
This means that you should use IP addresses instead of hostnames
when specifying MySQL privileges !

Installing MySQL system tables...2015-02-04 13:38:26 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2015-02-04 13:38:26 2940 [Note] InnoDB: Using atomics to ref count buffer pool pages
2015-02-04 13:38:26 2940 [Note] InnoDB: The InnoDB memory heap is disabled
2015-02-04 13:38:26 2940 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2015-02-04 13:38:26 2940 [Note] InnoDB: Memory barrier is not used
2015-02-04 13:38:26 2940 [Note] InnoDB: Compressed tables use zlib 1.2.3
2015-02-04 13:38:26 2940 [Note] InnoDB: Using Linux native AIO
2015-02-04 13:38:26 2940 [Note] InnoDB: Using CPU crc32 instructions
2015-02-04 13:38:26 2940 [Note] InnoDB: Initializing buffer pool, size = 128.0M
2015-02-04 13:38:26 2940 [Note] InnoDB: Completed initialization of buffer pool
2015-02-04 13:38:26 2940 [Note] InnoDB: Highest supported file format is Barracuda.
2015-02-04 13:38:26 2940 [Note] InnoDB: Log scan progressed past the checkpoint lsn 49463
2015-02-04 13:38:26 2940 [Note] InnoDB: Database was not shutdown normally!
2015-02-04 13:38:26 2940 [Note] InnoDB: Starting crash recovery.
2015-02-04 13:38:26 2940 [Note] InnoDB: Reading tablespace information from the .ibd files...
2015-02-04 13:38:26 2940 [Note] InnoDB: Restoring possible half-written data pages
2015-02-04 13:38:26 2940 [Note] InnoDB: from the doublewrite buffer...
InnoDB: Doing recovery: scanned up to log sequence number 1600607
2015-02-04 13:38:26 2940 [Note] InnoDB: Starting an apply batch of log records to the database...
InnoDB: Progress in percent: 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
InnoDB: Apply batch completed
2015-02-04 13:38:27 2940 [Note] InnoDB: 128 rollback segment(s) are active.
2015-02-04 13:38:27 2940 [Note] InnoDB: Waiting for purge to start
2015-02-04 13:38:27 2940 [Note] InnoDB: 5.6.23 started; log sequence number 1600607
2015-02-04 13:38:27 2940 [Note] Binlog end
2015-02-04 13:38:27 2940 [Note] InnoDB: FTS optimize thread exiting.
2015-02-04 13:38:27 2940 [Note] InnoDB: Starting shutdown...
2015-02-04 13:38:29 2940 [Note] InnoDB: Shutdown completed; log sequence number 1625987
OK

Filling help tables...2015-02-04 13:38:29 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2015-02-04 13:38:29 2964 [Note] InnoDB: Using atomics to ref count buffer pool pages
2015-02-04 13:38:29 2964 [Note] InnoDB: The InnoDB memory heap is disabled
2015-02-04 13:38:29 2964 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2015-02-04 13:38:29 2964 [Note] InnoDB: Memory barrier is not used
2015-02-04 13:38:29 2964 [Note] InnoDB: Compressed tables use zlib 1.2.3
2015-02-04 13:38:29 2964 [Note] InnoDB: Using Linux native AIO
2015-02-04 13:38:29 2964 [Note] InnoDB: Using CPU crc32 instructions
2015-02-04 13:38:29 2964 [Note] InnoDB: Initializing buffer pool, size = 128.0M
2015-02-04 13:38:29 2964 [Note] InnoDB: Completed initialization of buffer pool
2015-02-04 13:38:29 2964 [Note] InnoDB: Highest supported file format is Barracuda.
2015-02-04 13:38:29 2964 [Note] InnoDB: 128 rollback segment(s) are active.
2015-02-04 13:38:29 2964 [Note] InnoDB: Waiting for purge to start
2015-02-04 13:38:29 2964 [Note] InnoDB: 5.6.23 started; log sequence number 1625987
2015-02-04 13:38:29 2964 [Note] Binlog end
2015-02-04 13:38:29 2964 [Note] InnoDB: FTS optimize thread exiting.
2015-02-04 13:38:29 2964 [Note] InnoDB: Starting shutdown...
2015-02-04 13:38:31 2964 [Note] InnoDB: Shutdown completed; log sequence number 1625997
OK

To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:

  /usr/bin/mysqladmin -u root password 'new-password'
  /usr/bin/mysqladmin -u root -h host password 'new-password'

Alternatively you can run:

  /usr/bin/mysql_secure_installation

which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.

See the manual for more instructions.

You can start the MySQL daemon with:

  cd /usr ; /usr/bin/mysqld_safe &

You can test the MySQL daemon with mysql-test-run.pl

  cd mysql-test ; perl mysql-test-run.pl

Please report any problems at http://bugs.mysql.com/

The latest information about MySQL is available on the web at

  http://www.mysql.com

Support MySQL by buying support/licenses at http://shop.mysql.com

New default config file was created as /usr/my.cnf and
will be used by default by the server when you start it.
You may edit this file to change server settings

MySQLに保存するデータ暗号化方式下載

Oracleでは表領域暗号化等、多数の暗号化機能がありましたがMySQLではどうするのかというと

Encryption関数が提供されていました。

MySQL :: MySQL 5.5 Reference Manual :: 12.13 Encryption and Compression Functions

EncryptionはAES128のようですが、MySQL 5.6.17以上では256bit長にて暗号化できる模様です

AES_ENCRYPT() and AES_DECRYPT() implement encryption and decryption of data using the official AES (Advanced Encryption Standard) algorithm, previously known as “Rijndael.” The AES standard permits various key lengths. These functions implement AES with a 128-bit key length, but you can extend them to 256 bits by modifying the source. The key length is a trade off between performance and security.

ちなRDSではAES128のみサポートされており、AES256は使えません。 RFPに暗号化要件が記載されている時は気をつけましょう。

脳筋的に実現するsensu-client bootstrapパターン

standaloneモードで稼働するsensu-clientがインストールされたEC2インスタンスをコピーすると、 sensu-clientのnameが重複して色々面倒なのですが、これでかいけつ。

Amazon Linux 2014.09で動作確認済み。IAM Roleを付与してEC2 ReadOnly以上を与えておくこと。

一部additional parameterを使っているので、それも同時に書き換えてます。

Sensuの通知をslackで受け取るインターネット入門

Sensu使ってますか?便利ですね(色々ありますが)

ほとんどの通知はメールで受け取っているのですが、最近slack pluginを導入して一部のホストcheckをslackで受け取るようにしました。

sensu-community-plugins/slack.rb at master · sensu/sensu-community-plugins · GitHub

アラートを検知するとSensu芸人のかっぱさんがslackにつぶやいてくれます。

  • critical

f:id:buta9999:20150120115003p:plain

  • ok

f:id:buta9999:20150120115028p:plain

メールだとアレな時があるのでslack notirifcationは便利です。