IT井戸端会議

IT井戸端会議

インフラ、ネットワーク、アプリケーション開発、IT界隈の話等々を東京都千代田区界隈から発信します。

MySQL 5.5 で mysqld_multi とMaster-Slave 構成を試す

環境

CentOS 6.5 (x86_64)

実行手順

MySQL インストール

rpmリポジトリyumに追加。

$ sudo yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm

yum リポジトリの定義ファイルを開き、5.5をインストールするように以下の通り編集。

$ sudo vi /etc/yum.repos.d/mysql-community.repo

@@ -16,7 +16,7 @@
 [mysql55-community]
 name=MySQL 5.5 Community Server
 baseurl=http://repo.mysql.com/yum/mysql-5.5-community/el/6/$basearch/
-enabled=0
+enabled=1
 gpgcheck=1
 gpgkey=file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
 
@@ -24,7 +24,7 @@
 [mysql56-community]
 name=MySQL 5.6 Community Server
 baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/6/$basearch/
-enabled=1
+enabled=0
 gpgcheck=1
 gpgkey=file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

yummysql をインストール。

$ sudo yum -y install mysql mysql-devel mysql-server mysql-utilities

mysql 5.5 がインストールされたことを確認。

$ mysql --version
mysql  Ver 14.14 Distrib 5.5.45, for Linux (x86_64) using readline 5.1

mysqld_multi を適用

ユーザ作成

$ sudo adduser user1

それぞれのディレクトリに対して初期化処理を行います。

$ sudo mysql_install_db --datadir=/data/user1m
$ sudo mysql_install_db --datadir=/data/user1s
$ sudo vi /etc/my.cnf
@@ -25,7 +25,32 @@
 
 # Recommended in standard MySQL setup
 #sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 
+user = mysql    ### `datadir`で設定したユーザを指定します。
 
 [mysqld_safe]
 log-error=/var/log/mysqld.log
 pid-file=/var/run/mysqld/mysqld.pid
+
+[mysqld_multi]
+mysqld     = /usr/bin/mysqld_safe
+mysqladmin = /usr/bin/mysqladmin
+user       = admin
+password   = hoge
+
+[mysqld1]
+port       = 50001
+datadir    = /data/user1
+pid-file   = /data/user1m/mysql.pid
+socket     = /data/user1m/mysql.sock
+user       = user1
+general_log = ON
+general-log-file = /var/log/mysqld/user1.log
+
+[mysqld2]
+port       = 50002
+datadir    = /data/user1s
+pid-file   = /data/user1s/mysql.pid
+socket     = /data/user1s/mysql.sock
+user       = user1
+general_log = ON
+general-log-file = /var/log/mysqld/user2.log

ディレクトリ作成

$ sudo mkdir -p /data/user1m
$ sudo chown -R mysql:mysql /data/user1m

$ sudo mkdir -p /data/user1s
$ sudo chown -R mysql:mysql /data/user1s

一台ずつ起動

$ sudo mysqld_multi start 1
$ sudo mysqld_multi start 2

ちなみにmysql_multi startと後述のmysql_multi stopの引数は、 以下の通り指定することもできます。 <なし>: 全台 1,3: 1と3 1-3: 1〜3

起動を確認します。

$ sudo mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysqld1 is running
MySQL server from group: mysqld2 is running

停止してみます。

$ sudo mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysqld1 is running
MySQL server from group: mysqld2 is running

停止できていないことが確認できるかと思います。

$ sudo mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysqld1 is running
MySQL server from group: mysqld2 is running

ログを確認してみるとわかりますが、 my.cnfファイルのmysqld_multiセクションで設定したユーザに対して権限が与えられていないことによるものです。

$ sudo tail /var/lib/mysql/mysqld_multi.log
...
/usr/bin/mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'admin'@'localhost' (using password: YES)'
/usr/bin/mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'admin'@'localhost' (using password: YES)'

mysql を停止できるように権限を付与しましょう。

$ sudo mysql --socket=/data/user1m/mysql.sock -u root
mysql> SELECT user,host FROM mysql.user;
+------+-----------------+
| user | host            |
+------+-----------------+
| root | 127.0.0.1       |
| root | ::1             |
|      | ip-172-31-1-225 |
| root | ip-172-31-1-225 |
|      | localhost       |
| root | localhost       |
+------+-----------------+
6 rows in set (0.00 sec)
 
mysql> TRUNCATE TABLE mysql.user;
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL ON *.* TO 'admin'@'127.0.0.1' IDENTIFIED BY 'hoge' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL ON *.* TO 'admin'@'localhost' IDENTIFIED BY 'hoge' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL ON *.* TO 'admin'@'localhost.localdomain' IDENTIFIED BY 'hoge' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;

mysql> SELECT user,host FROM mysql.user;
+-------+-----------------------+
| user  | host                  |
+-------+-----------------------+
| admin | 127.0.0.1             |
| admin | localhost             |
| admin | localhost.localdomain |
+-------+-----------------------+
3 rows in set (0.00 sec)

同様に2のほうでも作業を行います。

これで mysql を停止できるようになりました。

$ sudo mysqld_multi stop
$ sudo mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysqld1 is not running
MySQL server from group: mysqld2 is not running

レプリケーション用のユーザ作成

# mysql -uadmin -phoge --socket=/data/user1/mysql.sock -e "GRANT REPLICATION SLAVE ON *.* TO 'repusr'@'%';"

mysqldumpによるデータコピー

READ LOCK

mysql> FLUSH TABLES WITH READ LOCK;

MASTER POSITION の確認

# mysql -uadmin -phoge --socket=/data/user1m/mysql.sock -e "SHOW MASTER STATUSG"
*************************** 1. row ***************************
            File: mysql-bin.000002
        Position: 749
    Binlog_Do_DB: 
Binlog_Ignore_DB: 

ダンプ作成

# mysqldump -uadmin -phoge --socket=/data/user1m/mysql.sock --all-databases > dump1.sql
-- Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.

LOCK を解除

# mysql -uadmin -phoge --socket=/data/user1m/mysql.sock -e "UNLOCK TABLE ;"

ダンプをインポート

# mysql -uadmin -phoge --socket=/data/user1s/mysql.sock < dump1.sql

Slave側でマスタの設定

# mysql -uadmin -phoge --socket=/data/user1s/mysql.sock << EOF
CHANGE MASTER TO
MASTER_HOST = '127.0.0.1',
MASTER_USER = 'repusr',
MASTER_PORT = 50001,
MASTER_LOG_FILE = 'mysql-bin.000002',
MASTER_LOG_POS = 749;
EOF
# mysql -uadmin -phoge --socket=/data/user1s/mysql.sock -e "START SLAVE;"
# mysql -uadmin -phoge --socket=/data/user1s/mysql.sock -e "SHOW SLAVE STATUSG"
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 127.0.0.1
                  Master_User: repusr
                  Master_Port: 50001
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 107
               Relay_Log_File: mysql-relay.000002
                Relay_Log_Pos: 253
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 107
              Relay_Log_Space: 405
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1

マスター側のデータを確認します。

# mysql -uadmin -phoge --socket=/data/user1m/mysql.sock test -e "SELECT * from table1;"
+------+-------+
| col1 | col2  |
+------+-------+
|    1 | one   |
|    2 | two   |
|    3 | three |
+------+-------+

スレーブ側に反映しているか確認します。

# mysql -uadmin -phoge --socket=/data/user1s/mysql.sock test -e "SELECT * from table1;"
+------+-------+
| col1 | col2  |
+------+-------+
|    1 | one   |
|    2 | two   |
|    3 | three |
+------+-------+