MySQL Cluster DataMemory, IndexMemory の増やし方

MySQL Cluster 7.1.3 でこんなエラーが発生 🙁

#1114 - The table '○○○' is full

色々調べたところ DataMemory 使用率が 96% に達している事が判明しました。

$ ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> all report memoryusage
Connected to Management Server at: localhost:1186
Node 11: Data usage is 96%(12800 32K pages of total 12288)
Node 11: Index usage is 60%(6826 8K pages of total 4096)
Node 12: Data usage is 96%(12800 32K pages of total 12288)
Node 12: Index usage is 60%(6826 8K pages of total 4096)
(※実際の数値とは違います)

DataMemory は config.ini で指定しますので、config.ini を変更して

DataMemory, IndexMemory を増やしました。

root# vi /var/lib/mysql-cluster/config.ini
[NDBD DEFAULT]
NoOfReplicas=2
DataDir=/var/lib/mysql-cluster
# ServerPort = 63132
# MaxNoOfConcurrentOperations=10000
DataMemory=1024M
IndexMemory=128M
# TimeBetweenWatchDogCheck=30000
# MaxNoOfOrderedIndexes=512

この変更を反映させます。

  1. ndb_mgmd を再起動をします。
  2. この時、起動オプションに –reload を追加します。
    (この –reload が分かるまで何度も試行錯誤してしまいました 🙂 )

    root# kill {ndb_mgmd の PID}
    root# kill {ndb_mgmd の PID}(もういっちょ!)
    -bash: kill: ({ndb_mgmd の PID}) - No such process(停止したね!!)
    root# /usr/sbin/ndb_mgmd --config-dir=/var/lib/mysql-cluster --config-file=/var/lib/mysql-cluster/config.ini --reload
  3. データノードを順番に再起動
  4. (Node 11 を再起動します。)
    ndb_mgm> 11 restart(しばらく待ちます)
    Node 11: Node shutdown initiated
    Node 11: Node shutdown completed, restarting, no start.
    Node 11 is being restarted
     
    Node 11: Start initiated (version 7.1.3)
    ndb_mgm> Node 11: Started (version 7.1.3)(再起動完了)
     
    (Node 12 を再起動します。)
    ndb_mgm> 12 restart(しばらく待ちます)
    Node 12: Node shutdown initiated
    Node 12: Node shutdown completed, restarting, no start.
    Node 12 is being restarted
     
    Node 12: Start initiated (version 7.1.3)
    ndb_mgm> Node 12: Started (version 7.1.3)(再起動完了)
  5. メモリ使用率を確認
  6. ndb_mgm> ALL REPORT MemoryUsage
    Connected to Management Server at: localhost:1186
    Node 11: Data usage is 35%(11636 32K pages of total 32768)
    Node 11: Index usage is 10%(1652 8K pages of total 16416)
    Node 12: Data usage is 35%(11636 32K pages of total 32768)
    Node 12: Index usage is 10%(1651 8K pages of total 16416)

    DataMemory, IndexMemory が増えて使用率が減りました 🙂

    今後も使用量は増え続けるのでこの作業は繰り返し行う必要がありそうです :mrgreen:

OpenPNE3.4.8

ざっくりとセットアップの内容をメモします。

3.4.8 というバージョンをダウンロードしました。

ファイル名はopenpne-OpenPNE3-OpenPNE-3.4.8-0-gb9d705e.zip

  1. zip ファイルを解凍して DOCUMENT_ROOT 以外の任意の場所に保存します。
  2. /usr/local/apache2/OpenPNE3 に解凍しました。

  3. OpenPNE.yml 作成
  4. $ cd /usr/local/apache2/OpenPNE3
    $ cp config/OpenPNE.yml.sample config/OpenPNE.yml
    $ vi config/OpenPNE.yml

    base_url と mail_envelope_from を環境に合わせたモノに変更しました。

  5. ProjectConfiguration.class.php 作成
  6. 特に変更せずデフォルトのままです。

    $ cp config/ProjectConfiguration.class.php.sample config/ProjectConfiguration.class.php
  7. DB 作成
  8. openpne3db という名前で作成しました。

    mysql> CREATE DATABASE open3db DEFAULT CHARACTER SET utf8;

    そして、openpne ユーザがパスワード openpne で接続できるようにユーザを作成しました。

    mysql> GRANT ALL ON *.openpne3db TO 'openpne'@'localhost' IDENTIFIED BY 'openpne';
  9. インストール
  10. 対話的形式でデータベースへの接続情報を設定をした後、色々と表示されますが、
    意味が分かりませんでした。

    $ ./symfony openpne:install
  11. web ディレクトリを公開ディレクトリから参照できるようにシンボリックリンクを作成
  12. 公開ディレクトリを /usr/local/apache2/htdocs として説明します。
    /sns というサブディレクトリに公開します。
    サーバ名を www.example.com とすると、URL は http://www.example.com/sns/ になります。

    $ cd /usr/local/apache2/htdocs
    $ ln -s ../OpenPNE3/web sns
  13. .htaccess 変更
  14. RewriteBase 変更

    $ vi web/.htaccess

    RewriteBase を /sns/ に変更しました。

  15. ブラウザからアクセス
  16. http://www.example.com/sns/

    ページは表示されますが、CSS が適用されていない状態です 😥
    apache の error_log を見たら DOCUMENT_ROOT 直下の opSkinBasicPlugin を
    参照している事が分かったので、DOCUMENT_ROOT に opSkinBasicPlugin/web へ
    のシンボリックリンクを作成しました。

    # cd /usr/local/apache2/htdocs
    # ln -s ../OpenPNE3/plugins/opSkinBasicPlugin/web opSkinBasicPlugin

    簡単に参照先を変更できるかと思ったのですが、調べても分からなかったのでシンボリックリンクで対応してしまいました。

  17. 再度ブラウザでアクセス
  18. CSS が適用されたデザインされたページになりました 🙂

    プリセットされているユーザでログインします。

    メールアドレス: sns@example.com
    パスワード: password

    すると今度は以下のエラー 😥

    現在、サーバが混み合っているか、メンテナンス中です。
    ご迷惑をおかけいたしますが、しばらく時間を空けて再度アクセスしてください。
     
    Currently, our service is too busy or is under maintenance.
    We're sorry and please retry accessing later.

    またまた apache の error_log を見ると以下が記録されていました。

    SQLSTATE[HY000]: General
     error: 2014 Cannot execute queries while other unbuffered queries are active.
    Consider using PDOStatement::fetchAll().  Alternatively, if your code is only ev
    er going to run against mysql, you may enable query buffering by setting the PDO
    ::MYSQL_ATTR_USE_BUFFERED_QUERY attribute., referer: http://www.example.com/sns/
    pc_backend.php/

    エラーメッセージのとおり、PDO::MYSQL_ATTR_USE_BUFFERED_QUERY を true
    にする必要があるようです。

    色々と調べたところ以下のファイルを変更したところ解決しました。
    (これで正しいのかわかりませんが 😎 )

    lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection/Mysql.php

    以下のように PDO::MYSQL_ATTR_USE_BUFFERED_QUERY を追加。

    public function connect()
         {
             $connected = parent::connect();
             $this->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
             $this->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
     
             return $connected;
         }

    これでとりあえず動くようになりました 🙂

    ※この対応方法は DB が MySQL の場合にのみ有効です