目の前に僕らの道がある

勉強会とか、技術的にはまったことのメモ

MySQLのレプリケーションをしてみる

マスタースレーブ構成を作ってみたのでメモ書き

前提

OSはDebian lenny

  • マスター
    • 192.168.65.31
  • スレーブ
    • 192.168.65.32

mysqlのインストール

sudo aptitude install mysql-server-5.0

初期設定のパスワードは空にします。

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

マスター側でレプリケーション用ユーザ作成します

GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.65.0/255.255.255.0' IDENTIFIED BY 'replication';

マスターの設定

元の設定ファイルを保存

cd /etc/mysql/
sudo cp my.cnf my.cnf.orig

下記の設定を/etc/mysql/my.cnfのそれぞれの場所に追記。必要なのはlog-binとserver-id

[client]
default-character-set = utf8

[mysqld] 
#ホストごとの設定
server-id = 31 # IPアドレスの4オクテット目の数字を入れるのが定説らしい

#共通設定
default-character-set = utf8 
log-bin=mysql01-bin  #バイナリログを記録する

#bind-address = 127.0.0.1  #ローカルホストからしか接続できないので変えること
bind-address = 0.0.0.0

[mysql]
default-character-set = utf8
prompt='[\u@\h] \d> ' 

[mysqldump] 
default-character-set = utf8

スレーブの設定

元の設定ファイルを保存

cd /etc/mysql/
sudo cp my.cnf my.cnf.orig

下記の設定を/etc/mysql/my.cnfのそれぞれの場所に追記。必要なのはlog-binとserver-idとスレーブの設定の箇所。

[client]
default-character-set = utf8

[mysqld] 
#ホストごとの設定
server-id = 32 # IPアドレスの4オクテット目の数字を入れるのが定説らしい

#スレーブの設定
master-host = 192.168.65.31
master-user = replication
master-password = replication
master-port = 3306

#共通設定
default-character-set = utf8 
log-bin=mysql02-bin  #バイナリログを記録する

#bind-address = 127.0.0.1  #ローカルホストからしか接続できないので変えること
bind-address = 0.0.0.0

[mysql]
default-character-set = utf8
prompt='[\u@\h] \d> ' 

[mysqldump] 
default-character-set = utf8

マスターのデータをスレーブにコピー

まずマスタースレーブ両方でmyusqlを止める。

/etc/init.d/mysql stop

マスター側のデータディレクトリを固めてスレーブに送る

cd /var/lib
sudo tar czvf mysql.tar.gz mysql
sudo scp mysql.tar.gz root@192.168.65.32:/var/lib

スレーブ側で元のmysqlデータをバックアップしとく

cd /var/lib/
sudo mv mysql mysql.orig
sudo tar xzvf mysql.tar.gz

メンテナンスユーザのパスワード変更

ユーザ情報をマスターのデータで上書きしてしまったので、このままではスレーブのmysqlが立ち上がらないのでマスターの/etc/mysql/debian.cnfを持ってくる必要がある。

スレーブ側で元ファイルをバックアップする。

cu /etc/mysql
sudo mv debian.cnf debian.cnf.orig

scpで持ってくるdebian.cnfを持ってくる。

sudo scp root@192.168.65.31:/etc/mysql/debian.cnf /etc/mysql/debian.cnf

もしマスタのバイナリログやエラーログが残っていたら削除する

mysqlの起動

マスタースレーブそれぞれでmysqlを立ち上げる

sudo /etc/init.d/mysql start

マスター側でマスターステータスを確認する。

[root@localhost] mysql> show master status; 
+--------------------+----------+--------------+------------------+ 
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB | 
+--------------------+----------+--------------+------------------+ 
| mysql01-bin.000001 |      262 |              |                  | 
+--------------------+----------+--------------+------------------+ 
1 row in set (0.00 sec)

スレーブ側でレプリケーションを開始する。マスター側で確認したバイナリログの名前とログポジションを指定します。

SLAVE STOP;

CHANGE MASTER TO
MASTER_USER = 'replication',
MASTER_PASSWORD = 'replication',
MASTER_LOG_FILE = 'mysql01-bin.000001',
MASTER_LOG_POS = 262;

SLAVE STAER;

スレーブ側でshow slave statusを打ってSlave_IO_Runnin、Slave_SQL_RunningがYesになっていればとりあえずOK。

[root@localhost] mysql> show slave status\G 
*************************** 1. row *************************** 
            Slave_IO_State: Waiting for master to send event 
               Master_Host: 192.168.65.31 
               Master_User: replication 
               Master_Port: 3306 
             Connect_Retry: 60 
           Master_Log_File: mysql01-bin.000003 
       Read_Master_Log_Pos: 359 
            Relay_Log_File: mysqld-relay-bin.000005 
             Relay_Log_Pos: 498 
     Relay_Master_Log_File: mysql01-bin.000003 
          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: 359 
           Relay_Log_Space: 498 
           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)

マスター側で適当にデータベースを作成して、スレーブに反映されていることを確認する。