arinux

Linux サーバー設定備忘録
<< Moodle (10) - Tips | main | MySQL (2) - passwd 管理 >>
MySQL (1) - レプリケーション


MySQL のマスター/スレーブ型のレプリケーションの設定方法について記述します。ここでは、スレーブ側は read-only として設定します。


メモ サーバー構築環境


機種NEC Express5800, IBM x336(OS 変更)
OSVine 4.2CentOS 5.2
kernel2.6.16-76.39vl42.6.18-92.1.18.el5
glibcglibc-2.3.4-2vl3.3glibc-2.5-24
mysqlmysql-5.0.67-linux-i686-glibc23.tar.gzmysql-5.0.67-linux-i686.tar.gz


メモ MySQL インストール


※マスター及びスレーブの両方で以下を実施します。


  1. http://download.softagency.net/MySQL/Downloads/MySQL-5.0/ から、
    「mysql-5.0.67-linux-i686.tar.gz」 をダウンロードして、「/usr/local/src」 に置きます。


  2. /usr/local に解凍します。
    [root]# tar zxvf mysql-5.0.67-linux-i686.tar.gz -C /usr/local
    


  3. シンボリックリンクを張ります。
    [root]# cd /usr/local
    [root]# ln -s mysql-5.0.67-linux-i686 mysql
    [root]# ls -l
    (一部省略)
    lrwxrwxrwx  1 root root    31 Oct 20 17:01 mysql -> mysql-5.0.67-linux-i686/
    drwxr-xr-x 14  503  503  4096 Aug  5 00:20 mysql-5.0.67-linux-i686/
    


  4. mysql グループと mysql ユーザーを作成します。
    [root]# groupadd -g 401 mysql
    [root]# useradd -g mysql -u 401 mysql -d /nonexistent -s /sbin/nologin
    


  5. インストールスクリプトを実行します。
    [root]# cd /usr/local/mysql
    [root]# ./scripts/mysql_install_db --user=mysql
    Installing MySQL system tables...
    081121 17:12:53 [Warning] option 'thread_stack': unsigned value 126976 adjusted to 131072
    OK
    Filling help tables...
    081121 17:12:54 [Warning] option 'thread_stack': unsigned value 126976 adjusted to 131072
    OK
    (以下、省略)
    


  6. オーナーとグループを変更します。
    [root]# cd /usr/local
    [root]# chown -R root:mysql mysql-5.0.67-linux-i686
    [root]# cd /usr/local/mysql
    [root]# chown -R mysql data
    


  7. 「~/.bash_profile」 に PATH 変数の設定を追加します。
    [root]# vi /root/.bash_profile
    # .bash_profile
    
    # Get the aliases and functions
    if [ -f ~/.bashrc ]; then
            . ~/.bashrc
    fi
    
    # User specific environment and startup programs
    
    ENV=$HOME/.bashrc
    USERNAME="root"
    
    #export USERNAME ENV PATH                   #この行はコメントアウト
    export USERNAME ENV                         #この行を追加
    export PATH=$PATH:/usr/local/mysql-5.0.67-linux-i686/bin     #この行を追加
    
    mesg n
    


  8. 「~/.bash_profile」 を実行します。
    [root]# . ~/.bash_profile
    


  9. mysqld を起動します。
    [root]# cd /usr/local/mysql/bin
    [root]# ./mysqld_safe --user=mysql &
    [1] 3841
    Starting mysqld daemon with databases from /usr/local/mysql/data
    


  10. root ユーザーを作成してテストします。
    [root]# ./mysqladmin -u root password 'bxmbUW0|d8'
    [root]# ./mysqlshow -u root -p
    Enter password: bxmbUW0|d8
    +--------------------+
    |     Databases      |
    +--------------------+
    | information_schema |
    | mysql              |
    | test               |
    +--------------------+
    


  11. mysqld を停止します。
    [root]# ./mysqladmin shutdown -u root -p
    Enter password: bxmbUW0|d8
    STOPPING server from pid file /usr/local/mysql/data/dbmst.arinux.me.pid
    081021 18:00:33  mysqld ended
    
    [1] + Done                 ./mysqld_safe --user=mysql
    



メモ レプリケーション設定


  1. my.cnf の元になるファイルを選択してコピーします。
    ●マスター
    [master]# cp /usr/local/mysql/support-files/my-huge.cnf /etc/my.cnf
    


    虫眼鏡 各 .cnf ファイルの説明


    ファイル名説明
    my-small.cnfメモリーが64MB以下で、MySQLが時々使用されるだけの場合
    my-medium.cnfメモリーが32MB〜64MBでMySQL専用の場合、もしくは 128MBメモリーで webサーバーも同時に稼働する場合
    my-large.cnfメモリーが512MBで、主にMySQLが稼働する場合
    my-huge.cnfメモリーが1GB〜2GBで、主にMySQLが稼働する場合
    my-innodb-heavy-4G.cnfメモリーが4GBで、InnoDB のみのテーブルとわずかな接続で複雑なクエリーを実行する場合


  2. my.cnf を編集します。
    ●マスター
    [master]# vi /etc/my.cnf
    
    [mysqld]
    (省略)
    # Replication Master Server (default)
    # binary logging is required for replication
    log-error=/var/log/mysql.log    # 起動、停止、実行時のログを記録
    log-warnings=1                  # 警告メッセージを記録
    log-bin=mysql-bin               # この行はもともとあります
    
    server-id       = 1             # この行はもともとあります
    


  3. スタートアップ・スクリプトをコピーします。
    ●マスター
    [master]# cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysql
    


  4. mysqld を起動します。
    ●マスター
    [master]# /etc/rc.d/init.d/mysql start
    Starting MySQL. SUCCESS!
    


  5. MySQL にログインします。
    ●マスター
    [master]# mysql -u root -p
    Enter password:
    
    mysql>
    


  6. server_id を確認します。
    ●マスター
    master> SHOW VARIABLES LIKE 'server¥_id';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | server_id     | 1     |
    +---------------+-------+
    1 row in set (0.00 sec)
    


  7. スレーブからマスターへ接続するためのユーザーを作成します。このユーザーには 「REPLICATION SLAVE」 を与えます。例として、slave01.arinux.me から接続を許可する repls01 ユーザーを作成します。
    ●マスター
    master> GRANT REPLICATION SLAVE ON *.* TO repls01@'slave01.arinux.me' IDENTIFIED BY 'n8uP9(udIx';
    Query OK, 0 rows affected (0.00 sec)
    


  8. ユーザ情報を反映します。
    ●マスター
    master> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.00 sec)
    


  9. マスターのデータベースをスレーブにコピーします。この時、DB が更新されないように書き込みをロックします。
    ●マスター
    master> FLUSH TABLES WITH READ LOCK;
    Query OK, 0 rows affected (0.00 sec)
    


  10. 現在のバイナリログの状態を確認します。
    ●マスター
    master> SHOW MASTER STATUS;
    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000001 |      594 |              |                  |
    +------------------+----------+--------------+------------------+
    1 row in set (0.00 sec)
    
    ※ ここに表示された 「File」 と 「Position」 の値を、後ほど使用します。


  11. MySQL にログインしたままの状態で、別のターミナルで操作します。


  12. マスターから 「usr/local/mysql/data」 以下をスレーブにコピーします。
    ●マスター
    [master]# cd /usr/local/mysql/data
    [master]# tar zcvf ../master594.tar.gz .
    [master]# cd ..
    [master]# scp ./master594.tar.gz ari@'slave01.arinux.me':/home/ari
    ari@'slave01.arinux.me''s password:
    master594.tar.gz                              100%  178KB 178.5KB/s   00:00
    


  13. スレーブ側の /usr/local/mysql/data と入れ替えます。
    ●スレーブ
    [slave]# cd /usr/local/mysql
    [slave]# mv data data.save01
    [slave]# mkdir data
    [slave]# chown mysql:mysql data
    [slave]# chmod 750 data
    [slave]# cd data
    [slave]# tar zxvf /home/ari/master594.tar.gz
    


  14. マスターのログは必要ないので削除します。
    ●スレーブ
    [slave]# rm -i ./master.arinux.me.*
    [slave]# rm -i ./mysql-bin.*
    [slave]# rm -i ./ib_logfile*
    [slave]# rm -i ./ibdata*
    


  15. スレーブの my.cnf を編集します。
    ●スレーブ
    [slave]# cp /usr/local/mysql/support-files/my-huge.cnf /etc/my.cnf
    [slave]# vi /etc/my.cnf
    
    [mysqld]
    (省略)
    # Replication Master Server (default)
    # binary logging is required for replication
    log-error=/var/log/mysql.log    # 起動、停止、実行時のログを記録
    log-warnings=1                  # 警告メッセージを記録
    #log-bin=mysql-bin              # コメントアウトします
    
    server-id       = 2             # 2に変更します。
    read_only                       # スレーブは read only にします
    


  16. スタートアップ・スクリプトをコピーします。
    ●スレーブ
    [slave]# cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysql
    


  17. mysqld を起動します。
    ●スレーブ
    [slave]# /etc/rc.d/init.d/mysql start
    Starting MySQL. SUCCESS!
    


  18. マスターのロックを外します。
    ●マスター
    master> UNLOCK TABLES;
    Query OK, 0 rows affected (0.00 sec)
    


  19. スレーブ側で、マスターの情報を指定します。
    ●スレーブ
    [slave]# mysql -u root -p
    Enter password: 
    
    slave> change master to
        -> master_host='master.arinux.me',
        -> master_user='repls01',
        -> master_password='eDniXxgo35r]',
        -> master_log_file='mysql-bin.000001',
        -> master_log_pos=594;
    Query OK, 0 rows affected (0.13 sec)
    


  20. スレーブを開始します。
    ●スレーブ
    slave> START SLAVE;
    Query OK, 0 rows affected (0.00 sec)
    


  21. スレーブのステータスを確認します。
    ●スレーブ
    slave> SHOW SLAVE STATUS¥G
    *************************** 1. row ***************************
                 Slave_IO_State: Waiting for master to send event
                    Master_Host: master.arinux.me
                    Master_User: repls01
                    Master_Port: 3306
                  Connect_Retry: 60
                Master_Log_File: mysql-bin.000001
            Read_Master_Log_Pos: 594
                 Relay_Log_File: slave01-relay-bin.000002
                  Relay_Log_Pos: 235
          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: 594
                Relay_Log_Space: 235
                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
    1 row in set (0.00 sec)
    


  22. 実際にマスター側で DB を作成して、スレーブに更新されるかを確認します。
    ●マスター
    master> CREATE DATABASE repldb;
    Query OK, 1 row affected (0.01 sec)
    
    master> USE repldb;
    Database changed
    
    master> CREATE TABLE sample (
        -> id INT,
        -> data VARCHAR(100)
        -> );
    Query OK, 0 rows affected (0.01 sec)
    
    master> INSERT INTO sample VALUES(1,'arinux');
    Query OK, 1 row affected (0.00 sec)
    
    master> SELECT * FROM sample;
    +------+--------+
    | id   | data   |
    +------+--------+
    |    1 | arinux |
    +------+--------+
    1 row in set (0.00 sec)
    


  23. スレーブ側で確認します。
    ●スレーブ
    slave> SHOW DATABASES;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | repldb             |
    | test               |
    +--------------------+
    4 rows in set (0.00 sec)
    
    slave> USE repldb;
    Database changed
    
    slave> SHOW TABLES;
    +------------------+
    | Tables_in_repldb |
    +------------------+
    | sample           |
    +------------------+
    1 row in set (0.00 sec)
    
    slave> SELECT * FROM sample;
    +------+--------+
    | id   | data   |
    +------+--------+
    |    1 | arinux |
    +------+--------+
    1 row in set (0.00 sec)
    



メモ スレーブ停止テスト


スレーブが停止している間の DB 更新が、再開後に反映されるかをテストします。


  1. スレーブの mysqld を停止します。
    ●スレーブ
    [slave]# /etc/rc.d/init.d/mysql stop
    Shutting down MySQL. SUCCESS!
    


  2. マスターでテーブルの内容を更新します。
    ●マスター
    master> INSERT INTO sample VALUES(2,'cweb');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> UPDATE sample SET id='11' where data='arinux';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> SELECT * FROM sample;
    +------+--------+
    | id   | data   |
    +------+--------+
    |   11 | arinux |
    |    2 | cweb   |
    +------+--------+
    2 rows in set (0.00 sec)
    


  3. スレーブの mysqld を起動します。
    ●スレーブ
    [slave]# /etc/rc.d/init.d/mysql start
    Starting MySQL. SUCCESS!
    


  4. スレーブ側でテーブルが更新されているかを確認します。
    ●スレーブ
    [slave]# mysql -u root -p
    Enter password:
    
    slave> USE repldb;
    Database changed
    
    slave> SELECT * FROM sample;
    +------+--------+
    | id   | data   |
    +------+--------+
    |   11 | arinux |
    |    2 | cweb   |
    +------+--------+
    2 rows in set (0.00 sec)
    



ここまで

| arinux | MySQL | 16:51 | comments(2) | trackbacks(0) | pookmark |
管理者の承認待ちコメントです。
| - | 2018/05/19 8:51 PM |
管理者の承認待ちコメントです。
| - | 2018/05/23 12:06 AM |









http://www.arinux.net/trackback/87
  12345
6789101112
13141516171819
20212223242526
2728293031  
<< May 2018 >>
+ SELECTED ENTRIES
+ RECENT COMMENTS
+ RECENT TRACKBACK
+ CATEGORIES
+ ARCHIVES
+ 掲載予定のタイトル
  • Wordpress
  • Pukiwiki
  • SMTPs/POPs/IMAPs
  • fml
  • Tips
+ CSS Nite
+ MOBILE
qrcode
+ LINKS
+ RECOMMEND
+ PROFILE