書籍概要

MySQL Cluster構築・運用バイブル
~仕組みからわかる基礎と実践のノウハウ

著者
発売日
更新日

概要

MySQLのストレージエンジンとして動作し,スケールアウトや高可用性のニーズに応えてくれるのがMySQL Cluster。RDBMSとNoSQL両方のインターフェイスを持つ「NewSQL」の先駆けといえる同ソフトの日本ではじめての解説書です。やや難解な部分も,現場で数々のサポート経験を持つ奥野幹也氏の濃くわかりやすい解説で対応。特有の落とし穴にはまらないためのポイントを,コンパクトでどこでも参照できるサイズに詰め込みました。memcached APIをサポートしたバージョン7.2に対応。

こんな方におすすめ

  • システムの可用性を高めたい方
  • 複数のサーバで同時に更新と参照を行えるようにしたい方
  • 既存のアプリとSQLの互換性を保ちたい方

著者から一言

昨今,サーバーサイドアプリケーションの重要性は高まるばかりです。当初は単一のコンピュータで運用していたRDBMSでも,求められるサービスレベルが高くなれば様々なニーズが生じてきます。

  • 「高可用性構成にしたい」
  • 「複数のサーバーで同時に更新と参照を行えるようにしたい」
  • 「既存のアプリと SQL の互換性を保ちたい」

そのような悩みを一手に解決する手段の1つがMySQL Clusterです。

MySQL ClusterにはRDBMS機能だけでなく,スケールアウトや高可用性を実現する機能が搭載されています。他に追加でソフトウェアを導入する必要はなく,MySQL Clusterを使えば,大規模な並列分散型のシステムであってもアプリの開発やデータベースの管理がとてもシンプルになります。

さらに最近「NoSQL」というキーワードが流行していますが,MySQL ClusterにもNoSQLインターフェイスが備わっています。RDBMSとNoSQL,両方のインターフェイスを持つソフトウェアを「NewSQL」などと呼ぶようになっていますが,MySQL Cluster はまさにその先駆けです。登場した当時からNDB APIという独自のNoSQLインターフェイスを持っていました。

それだけでなく,バージョンが上がるごとに様々な新しいNoSQLインターフェイスが追加されてきました。最新のバージョン7.2では,Web開発で人気の高いmemcached APIをサポートするようになっています。APIこそmemcachedですが,データはMySQL Clusterに蓄積されるため,データは永続性を持ちます。しかも同じデータにSQLでもNoSQLでもアクセスできるのです!

そのような素晴らしい技術ながら,「複数のコンピュータを使って構成する」という複雑さのため,そして日本語の解説書がないため,MySQL Clusterに手を出しにくい方は多いのではないでしょうか。そこで,筆者は筆をとりました。

本書はかなり幅広いトピックをカバーしています。MySQL Clusterは複数のコンピュータで運用するため単体のコンピュータで動くRDBMSよりも管理が難しい側面もありますが,本書を手にしたならば恐れることはありません!

MySQL Clusterという尖った技術を,みなさんが役立てられることを願っています。

目次

第1章 MySQL Clusterのコンセプト

1-1 MySQL Clusterの特徴

  • MySQL Clusterのユースケース
  • MySQL Clusterの13の特徴
  • シェアードナッシングアーキテクチャの強み
  • コラム NDBCLUSTERストレージエンジン

1-2 アーキテクチャ概要

  • 3種類のノード
  • ノード間でデータの連係をとる仕組み
  • 複製されたデータが同じであることを保証する2フェーズコミット
  • データを永続化するための2つのチェックポイント処理
  • 全体の性能低下を防ぐための仕組み
  • データノードの内部構造をのぞく(NDBカーネルブロック)

第2章 インストールと設定

2-1 システム計画のポイント

  • 3つ以上のレプリカ数を選択する際は慎重に
  • ネットワークの分断でシステムを停止させない仕組み
  • トポロジーの4つの方針
  • コラム マルチサイトクラスター

2-2 システム要件のポイント

  • サーバマシンを選定するうえで確認すべきこと
  • 各ノードごとのハードウェア選定基準
  • ネットワーク設計の2つのポイント
  • コラム MySQL Clusterにとってのサーキット
  • ディスクオブジェクトを利用する
  • コラム ディスク型テーブルのクラッシュリカバリ

2-3 パッケージをインストールする

  • RPMパッケージのインストール
  • 全部入りパッケージのインストール
  • コラム 権限テーブルを同期させる

2-4 設定ファイルを変更する

  • config.iniの書式
  • 管理ノードのオプション
  • コラム 運用中にオプションを変更したいときに知っておきたい4つの再起動
  • データノードのオプション
  • メモリ割り当て
  • トランザクション
  • チェックポイント
  • コラム REDOログのサイズはLCPとGCPのデータサイズに依存する
  • バックアップ
  • その他のオプション
  • SQLノードのオプション
  • トランスポーター(TCP)のオプション
  • config.iniの設定例
  • コラム 直結する場合もBondingドライバなどで経路を冗長化しておく
  • コラム InfiniBandは利用できるか?
  • コラム 仮想環境における設定値

第3章 基本操作を身につける

3-1 本章で利用する設定

3-2 MySQL Clusterを起動/停止する

  • 下準備
  • 起動手順
  • 停止手順

3-3 コマンドオプションを把握する

  • 共通の起動オプション
  • 管理ノードの起動オプション
  • データノードの起動オプション
  • SQLノードの起動オプション

3-4 状態を確認する

  • 管理ノード上でステータスを確認する
  • SQLノード上でステータスを確認する

第4章 アプリケーションを開発するために知っておくべきこと

4-1 スキーマ設計のポイント

  • テーブルを作成する
  • 3種類のインデックスを把握する
  • 主キーとユニークインデックスの2重構造の理由
  • 5通りのインデックス構成を使い分ける
  • コラム T-TREEインデックス=
  • テーブルサイズを見積もる
  • コラム 最新版に対応したサイジングツール「sizer」
  • テーブルの定義を調べる
  • ディスクオブジェクトを利用する
  • コラム ディスク型テーブルを使う上での7つの注意点
  • テーブルスペースを作成する

4-2 テーブルのデータを操作する

  • テーブルへアクセスする2つの方法
  • アプリケーションとSQLノードを同居させる
  • SQLに関する制限事項

第5章 NoSQLとしてのMySQL Cluster

5-1 SQLより高い性能を発揮するNDB APIとは

  • NDB APIを利用するのに必要なもの
  • NDB APIを用いてアプリケーションをビルドする
  • コラム GNU Autotoolsを利用して移植性を高める

5-2 プログラミングのポイント

  • プログラミングの流れ
  • 例1:レコードの参照
  • 例2:レコードの挿入/更新/削除

5-3 スキャンの概要

  • 例3:スキャン

5-4 リトライ処理を実装してエラーハンドリングする

  • 例4:エラーハンドリング

5-5 ClusterJを利用する

  • ClusterJの使い方
  • 例5:ClusterJのサンプル
  • コラム:さらにもっと詳しく知りたい方は

5-5 memcached APIを利用する

  • memcachedの利点
  • NDB-memcachedをセットアップする
  • プレフィクスを設定する

第6章 最大限の性能を引き出すパフォーマンスチューニングの原則

6-1 基本的な設定を見直す

  • 省電力機能を停止する
  • NUMAの利点を生かす
  • スレッド数を調整する
  • Hyper-Threadingをオフにする
  • コネクションプールを利用する

6-2 リアルタイム処理を効率化する

  • 特定のCPUにスレッドの処理を割り当てる
  • リアルタイムスケジューラーを利用する

6-3 SQLを工夫する

  • JOINを高速化する
  • ユーザー定義パーティショニングを利用する
  • エンジンコンディションプッシュダウンを利用する
  • コミットのサイズを調整する

6-4 その他の対策

  • SSDを利用する
  • ノード追加の効果を最大化する
  • 高速なインターコネクトを利用する
  • NoSQLを利用する

第7章 レプリケーション

7-1 レプリケーションの基礎

  • Clusterレプリケーションのメリット
  • レプリケーションの仕組み

7-2 Clusterレプリケーションをセットアップする

  • 新規にセットアップする
  • 既存のClusterにスレーブを追加する
  • デュアルチャネルでフェイルオーバーを実装する

7-3 マルチマスターレプリケーションと衝突検出

  • 衝突検出の5つの方式
  • 衝突検出を設定する4つのステップ
  • アプリケーションを実装する際の注意点
  • ステータスを監視する

7-4 InnoDBへのレプリケーション

  • 前提条件
  • レプリケーションの設定手順
  • マスター側のSQLノードを多重化しておく
  • InnoDBをスレーブにする場合の注意点

7-5 レプリケーション利用時に注意すべきこと

  • バイナリログを記録するSQLノード数を調整する
  • 同じぐらいのスペックのサーバーを利用する
  • スレーブの更新性能を高める
  • Clusterレプリケーションを監視する
  • コラム レプリケーション関連のオプション

第8章 監視のポイント

8-1 プロセスを監視する

8-2 ステータス表示コマンドを利用する

  • 管理ノード上からステータス情報を得る
  • コラム MasterとPresident
  • データのステータスを表示する
  • SQLノード上のコマンドでステータスを確認する
  • コラム MySQL Cluster NDB 7.0でNDB$INFOを有効にする

8-3 ログ

  • クラスターログ
  • ノードログ
  • データノードのエラーログとトレースログ
  • コラム データノードのコアファイルの注意点
  • SQLノードのログ
  • コラム クラスターログに記録されるイベント

第9章 メンテナンスのコツ

9-1 バックアップとリストア

  • バックアップとリストアの基本
  • バックアップの準備をする
  • バックアップを実行する
  • バックアップの進捗状況を監視する
  • バックアップを中止する
  • リストアを実行する
  • 特定のテーブルだけをリストアする
  • バックアップファイルをCSVファイルに変換する
  • ログファイルを適用する
  • コラム ログファイルの中身
  • Epochをリストアする
  • リストアを高速化する
  • シングルユーザーモードを利用する
  • ロールフォワードリカバリを使う
  • コラム バイナリログの意味を考えてみよう

9-2 テーブルをメンテナンスする

  • テーブル定義を変更する
  • インデックス統計情報を更新する
  • テーブルを最適化する
  • コラム フラグメンテーションが起きていることを検知するには?

9-3 ローリングリスタート

  • 管理ノード
  • データノード
  • SQLノード

9-4 データノードを追加する

  • 1. マシンの準備
  • 2. config.iniを編集
  • 3. ローリングリスタート
  • 4. 追加したデータノードを起動
  • 5. ノードグループを構成
  • 6. データを再分散
  • 7. 空いた領域を回収
  • コラム SQLノードを追加する場合のポイント

9-5 アップグレード

  • アップグレードのリスクと向き合う
  • ローリングアップグレード
  • オフラインアップグレード
  • レプリケーション構成のアップグレード
  • リハーサルのポイント

第10章 典型的なトラブルと対処法

  • 10-1 GCP Stopが起きたら
  • 10-2 スプリットブレインが起きたら
  • 10-3 エラー処理に対応するには
  • 10-4 Watchdog Timeoutに対処するには
  • 10-5 Swap Insanityに対処するには
  • 10-6 起動時の問題に対処するには
  • コラム もしもバグだと思ったら

Appendix

  • A-1 データノードのオプション
  • A-2 ステータス変数

サポート

正誤表

本書の以下の部分に誤りがありました。ここに訂正するとともに,ご迷惑をおかけしたことを深くお詫び申し上げます。

(2012年4月13日更新)

P.137 最終行

デフォルトは1です
デフォルトは3です

P.254 

"role=ndb-only"
"role=db-only"

商品一覧