Docker-MySQLマスターコピーの実装


Dockerのインストール
チュートリアルのドアの取り付け
ミラーをダウンロードしてコンテナを起動
  • ダウンロードミラー
  • root@ubuntu:~# docker pull mysql:5.7
    
  • 起動master容器とslave容器
  • root@ubuntu:~# docker run --name master -p 3339:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
    root@ubuntu:~# docker run --name slave -p 3340:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
    
  • コンテナの表示
  • root@ubuntu:~# docker container ls
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
    88fab660ae5f        mysql:5.7           "docker-entrypoint.s…"   32 seconds ago      Up 16 seconds       33060/tcp, 0.0.0.0:3340->3306/tcp   slave
    c62e1b47c365        mysql:5.7           "docker-entrypoint.s…"   29 minutes ago      Up 13 minutes       33060/tcp, 0.0.0.0:3339->3306/tcp   master
    

    マスターの設定
  • masterコンテナに入り、/etc/mysql/my.cnfを編集
  • root@ubuntu:~# docker exec -it master bash
    root@c62e1b47c365:/# vi /etc/mysql/my.cnf
    

    意外なことに、次のようなエラーが発生します.
    bash: vi: command not found
    
    vimをインストールします.
    root@c62e1b47c365:/# apt-get install vim
    

    意外なことに、次のようなエラーが発生します.
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    E: Unable to locate package vim
    

    この場合、apt-getを更新してインストールすることができます.
    root@c62e1b47c365:/# apt-get update
    root@c62e1b47c365:/# apt-get install vim
    

    また問題が発生した場合は、下記の !!!次に、/etc/mysql/my.cnfに次の内容を追加します.
    [mysqld]
    server-id=100
    #          
    log-bin=mysql-bin
    

    ファイルを保存し、mysqlを再起動し、コンテナを再起動します.
    root@c62e1b47c365:/# service mysql restart
    [info] Stopping MySQL Community Server 5.7.30.
    ..root@ubuntu:~# docker container restart master
    
  • mysql
  • # 123456        MYSQL_ROOT_PASSWORD       root  
    root@c62e1b47c365:/# mysql uroot -p123456
    mysql> 
    
  • 作成slaveユーザー、replication slaveアクセス権およびreplication clientアクセス権を付与し、プライマリ・スレーブ・ライブラリ間のデータの同期
  • mysql> use mysql;
    mysql> create user 'slave'@'%' identified by '123456';
    mysql> grant replication slave, replication client on *.* to 'slave'@'%';
    mysql> flush privileges;
    

    slaveの設定
    構成masterと同様に、/etc/mysql/my.cnfに次の構成を追加する必要があります.
    [mysqld]
    server-id=101
    #          ,
    log-bin=mysql-slave-bin
    # relay_log      
    relay_log=edu-mysql-relay-bin
    

    設定が完了したら、MySQLとコンテナを再起動します.
    root@c62e1b47c365:/# service mysql restart
    [info] Stopping MySQL Community Server 5.7.30.
    ..root@ubuntu:~# docker container restart slave
    

    リンクmasterとslavemasterでMySQLに入り、show master statusステータスを表示します.
    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000001 |     1418 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    

    次の操作が完了するまで、masterのMySQLに対して何も操作しないでください.そうしないと、状態の変化を引き起こします.slaveのMySQLで次のコマンドを実行します.リンクmasterは、次のようになります.
    mysql> change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=1418, master_connect_retry=30;
    

    コマンドの説明:
  • master_host:masterのアドレスは、コンテナの独立IPを指す.docker inspect --format '{{.NetworkSettings.IPAddress}}' masterで表示できます
  • master_port:masterのポート番号は、コンテナのポート番号
  • を指します.
  • master_user:データ同期用ユーザ
  • master_password:同期用ユーザのパスワード
  • master_log_file:slaveがどのログファイルからデータのコピーを開始するかを指定します.すなわち、前述したFileフィールドの値
  • master_log_pos:上記のPositionフィールドの値
  • をどのpositionから読み始めるか
  • master_connect_retry:接続に失敗した場合、再試行の間隔は秒
  • この時点で、slaveのMySQLでプライマリ・スレーブの同期ステータスを確認します.
    mysql> show slave status\G
    *************************** 1. row ***************************
                   Slave_IO_State: 
                      Master_Host: 172.17.0.2
                      Master_User: slave
                      Master_Port: 3306
                    Connect_Retry: 30
                  Master_Log_File: mysql-bin.000001
              Read_Master_Log_Pos: 1418
                   Relay_Log_File: edu-mysql-relay-bin.000001
                    Relay_Log_Pos: 4
            Relay_Master_Log_File: mysql-bin.000001
                 Slave_IO_Running: No
                Slave_SQL_Running: No
                  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: 1418
                  Relay_Log_Space: 154
                  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: NULL
    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: 0
                      Master_UUID: 
                 Master_Info_File: /var/lib/mysql/master.info
                        SQL_Delay: 0
              SQL_Remaining_Delay: NULL
          Slave_SQL_Running_State: 
               Master_Retry_Count: 86400
                      Master_Bind: 
          Last_IO_Error_Timestamp: 
         Last_SQL_Error_Timestamp: 
                   Master_SSL_Crl: 
               Master_SSL_Crlpath: 
               Retrieved_Gtid_Set: 
                Executed_Gtid_Set: 
                    Auto_Position: 0
             Replicate_Rewrite_DB: 
                     Channel_Name: 
               Master_TLS_Version: 
    1 row in set (0.00 sec)
    

    通常、この場合のSlave_IO_RunningSlave_SQL_RunningはいずれもNOであり、主従レプリケーションプロセスがまだ開始されていないためです.この場合、start slaveを実行し、再度ステータスを確認します.
    mysql> start slave;
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> show slave status\G
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 172.17.0.2
                      Master_User: slave
                      Master_Port: 3306
                    Connect_Retry: 30
                  Master_Log_File: mysql-bin.000001
              Read_Master_Log_Pos: 1418
                   Relay_Log_File: edu-mysql-relay-bin.000002
                    Relay_Log_Pos: 320
            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: 1418
                  Relay_Log_Space: 531
                  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: 100
                      Master_UUID: e101f6c0-ba7b-11ea-8e31-0242ac110002
                 Master_Info_File: /var/lib/mysql/master.info
                        SQL_Delay: 0
              SQL_Remaining_Delay: NULL
          Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
               Master_Retry_Count: 86400
                      Master_Bind: 
          Last_IO_Error_Timestamp: 
         Last_SQL_Error_Timestamp: 
                   Master_SSL_Crl: 
               Master_SSL_Crlpath: 
               Retrieved_Gtid_Set: 
                Executed_Gtid_Set: 
                    Auto_Position: 0
             Replicate_Rewrite_DB: 
                     Channel_Name: 
               Master_TLS_Version: 
    1 row in set (0.00 sec)
    

    このとき,Slave_IO_RunningSlave_SQL_RunningはいずれもYESであり,マスタがレプリケーションから開始し,データの同期に成功したか否かのテストを開始できることを示している.
    主従レプリケーションのテストmasterコンテナのMySQLでデータベースを作成します.
    mysql> create database web;
    Query OK, 1 row affected (0.01 sec)
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    | web               |
    +--------------------+
    5 rows in set (0.00 sec)
    

    このとき、コンテナのMySQLでこのデータベースがあるかどうかを確認します.
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    | web               |
    +--------------------+
    5 rows in set (0.00 sec)
    

    もしあるならば、主従の複製が成功したことを表明します!!!
    よくある質問
  • Temporary failure resolving 'security.ubuntu.com’

  • 解決策:slaveファイルに次の内容を追加します(ファイルが存在しない場合は新規作成してください):
    {
        "dns": [
            "114.114.114.114",
            "8.8.8.8"
        ]
    }
    

    その後dockerを再起動します
  • Could not connect to deb.debian.org:80 (151.101.230.133), connection timed out

  • 実行コマンド/etc/docker/daemon.jsondockerの再起動
  • No query specified

  • 問題が発生した原因は、SQL文の末尾にservice docker restartを付けて、削除すればいいです.