読者です 読者をやめる 読者になる 読者になる

by shigemk2

当面は技術的なことしか書かない

mysqlnd_ms について @my_pp

MySQL勉強会in大阪(第2回) (2012年3月6日)

アジェンダ
mysqlnd と mysqlnd_msとは何か
CentOSでの導入方法

@my_pp とは
株式会社あすか取締役副社長
'97からオープンソースに関わり、MySQLPostgreSQLAsteriskなどの
オープンソースに関わる

mysqlndとは
mysql native driver for PHPの略で、mysql専用
PDO_MYSQLより動作は速い
ライセンスはGlvpではなくPHPライセンス

PHP以下でおくられてきたクエリーを、更新か検索かを
判断して自動的にマスタorスレーブに振り分ける
(プログラマはマスタやスレーブについて意識しなくてもよい)

スレーブについては、ランダムロビンで適当に負荷分散できるが、
現状ではフェイルオーバに対応していない

mysqlnd_ms CentOS6.2で検索(Google)
Free Dynamic DNS(DDNS) by POP3,IMAP4,FTP,HTTP-BASIC for Home Server, VPS | MyDNS.JP

インストールしたら、mysqlnd_ms.iniを確認する
/etc/php.d/mysqlnd_ms.ini を以下のようになっているか確認、なっていなけ
れば編集して以下の内容にする。

extension=mysqlnd.so
mysqlnd_ms.enable = 1
mysqlnd_ms.ini_file = "/etc/mysqlnd_ms.json"

当然マスタとスレーブの定義が必要となるので、
mysqlnd_ms.jsonに、マスタとスレーブのサーバを定義する(jsonで)

サンプル実行

<?php
// MySQLに接続(zzzはデータベース名)
$mysqli = new mysqli("myapp", "user1", "pass1", "zzz");

// 接続できなければエラーメッセージを出力して停止
if (mysqli_connect_errno())
  die(sprintf("[%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()));

// マスター側にtestテーブルを作成
if (!$mysqli->query("DROP TABLE IF EXISTS test")) {
  printf("[%d] %s\n", $mysqli->errno, $mysqli->error);
}
if (!$mysqli->query("CREATE TABLE test(id INT)")) {
  printf("[%d] %s\n", $mysqli->errno, $mysqli->error);
}
if (!$mysqli->query("INSERT INTO test(id) VALUES (1)")) {
  printf("[%d] %s\n", $mysqli->errno, $mysqli->error);
}

// ちなみにクエリーログを確認するとCREATE/UPDATEは、マスターで実行されています

// SELECT文を発行。これはスレーブ側に振られているはず
if (!($res = $mysqli->query("SELECT id FROM test"))) {
  printf("[%d] %s\n", $mysqli->errno, $mysqli->error);
} else {
  $row = $res->fetch_assoc();
  $res->close();
  printf("Slave returns id = '%s'\n", $row['id']);
}

// MySQLとの接続を切る
$mysqli->close();

// ちなみにクエリーログを確認するとSELECT文は、スレーブで実行されています
?>

etcの設定ファイルに、以下を設定してログを確認できるようにする

log = /var/log/mysql/mysql.log

今後の課題

  1. cakephpやsynfonyなどのフレームワーク上で利用できることを確認する
  2. 仮想IPアドレスの問題