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は、InnoDBとMyISAMエンジンのDDLとDML には有効だ。 前述のように、レプリケーション・フィルタは注意してあつかった方がいい。不一致を生み出し、 レプリケーションが中止になるかもしれないからだ。(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の通知をslackで受け取るインターネット入門
Sensu使ってますか?便利ですね(色々ありますが)
ほとんどの通知はメールで受け取っているのですが、最近slack pluginを導入して一部のホストcheckをslackで受け取るようにしました。
sensu-community-plugins/slack.rb at master · sensu/sensu-community-plugins · GitHub
アラートを検知するとSensu芸人のかっぱさんがslackにつぶやいてくれます。
- critical
- ok
メールだとアレな時があるのでslack notirifcationは便利です。