基於Docker實現Mysql主從同步

基於Docker實現Mysql主從同步

Docker搭建主從服務

  1. MySQL Docker Image 安裝

    docker pull mysql:8.0
    
  2. 運行容器

    Master 對外映射端口 3307

    docker run -p 3307:3306 --name master_mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0 
    

    Slave 對外映射端口 3308

    docker run -p 3308:3306 --name slave_mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
    
  3. 查看正在運行的容器

    docker ps
    
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
    f1dd97714edd        mysql:8.0           "docker-entrypoint.s…"   44 seconds ago      Up 43 seconds       33060/tcp, 0.0.0.0:3308->3306/tcp   slave_mysql
    c9c213ae2ba1        mysql:8.0           "docker-entrypoint.s…"   50 seconds ago      Up 49 seconds       33060/tcp, 0.0.0.0:3307->3306/tcp   master_mysql
    

配置

主節點

  1. 修改ids

    # 進入 master 容器內部
    docker exec -it master_mysql /bin/bash
    
    # 同步時間
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    echo 'Asia/Shanghai' >/etc/timezone
    
    # 更換源
    mv /etc/apt/sources.list /etc/apt/sources.list.bak
    echo "deb http://mirrors.ustc.edu.cn/debian stable main contrib non-free" >> /etc/apt/sources.list
    echo "deb http://mirrors.ustc.edu.cn/debian stable-updates main contrib non-free" >>/etc/apt/sources.list
    
    # 安裝vim
    apt-get update
    apt-get install vim -y
    
    # 修改 my.cnf
    vim /etc/mysql/my.cnf
    
  2. my.cnf 添加內容:

    [mysqld]
    # 同一局域網內唯一ID
    server-id=1
    # 開啓二進制日誌功能
    log-bin=mysql-bin
    # 開啓日誌
    # general_log = 1
    # general_log_file = /var/log/mysql/general_sql.log
    # 需要忽略的庫,忽略後不同步此庫
    binlog-ignore-db=information_schema
    binlog-ignore-db=cluster
    binlog-ignore-db=mysql
    # 需要同步的庫
    # binlog-do-db=test
    
  3. 重啓 master 容器

    docker restart master_mysql
    
  4. 驗證server id

    -- 連接mysql
    mysql -h127.0.0.1 -P3307 -uroot -p123456
    
    show variables like 'server_id';
    
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | server_id     | 1     |
    +---------------+-------+
    

    注意:如果不修改ID會報錯

    13117: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).
    
  5. 查看 master 的 binlog,此時需要保證Master庫不能做任何操作,否則將會引起狀態變化

    show master status;
    
    +------------------+----------+--------------+----------------------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                 | Executed_Gtid_Set |
    +------------------+----------+--------------+----------------------------------+-------------------+
    | mysql-bin.000003 |      156 |              | information_schema,cluster,mysql |                   |
    +------------------+----------+--------------+----------------------------------+-------------------+
    
  6. 創建數據同步用戶

    這用戶需要授予 slave REPLICATION SLAVE ,REPLICATION CLIENT 權限,用於同步數據

    CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
    GRANT REPLICATION SLAVE, REPLICATION CLIENT on *.* TO 'slave'@'%';
    

    可用show grants for slave; 來驗證是否授權成功, 使用mysql -h127.0.0.1 -P3307 -uslave -p123456 來驗證是否可以登錄

從節點

  1. 修改ids

    # 進入 slave 容器內部
    docker exec -it slave_mysql /bin/bash
    
    # 同步時間
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    echo 'Asia/Shanghai' >/etc/timezone
    
    # 更換源
    mv /etc/apt/sources.list /etc/apt/sources.list.bak
    echo "deb http://mirrors.ustc.edu.cn/debian stable main contrib non-free" >> /etc/apt/sources.list
    echo "deb http://mirrors.ustc.edu.cn/debian stable-updates main contrib non-free" >>/etc/apt/sources.list
    
    # 安裝vim
    apt-get update
    apt-get install vim -y
    
    # 修改 my.cnf
    vim /etc/mysql/my.cnf
    
  2. my.cnf 添加內容:

    [mysqld]
    # 同一局域網內唯一ID
    server-id=2
    # 開啓二進制日誌功能,以備Slave作爲其它Slave的Master時使用
    log-bin=mysql-slave-bin
    # relay_log配置中繼日誌
    relay_log=mysql-relay-bin
    # 開啓日誌
    # general_log = 1
    # general_log_file = /var/log/mysql/general_sql.log
    # 需要忽略的庫,忽略後不同步此庫
    binlog-ignore-db=information_schema
    binlog-ignore-db=cluster
    binlog-ignore-db=mysql
    replicate-ignore-db=mysql
    # 需要複製的庫
    # replicate-do-db=ufind_db
    log-slave-updates
    slave-skip-errors=all
    slave-net-timeout=60
    
  3. 重啓 slave 容器

    docker restart slave_mysql
    
  4. 驗證server id

    # 連接mysql
    mysql -h127.0.0.1 -P3308 -uroot -p123456
    
    show variables like 'server_id';
    
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | server_id     | 2     |
    +---------------+-------+
    
  5. 鏈接主節點

    查詢主節點容器的獨立IP

    -- 鏈接配置
    CHANGE MASTER TO MASTER_HOST='你的網絡IP,不能是 127.0.0.1', MASTER_PORT=3307, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=156, MASTER_CONNECT_RETRY=30, MASTER_BIND='';
    
    -- 啓動
    start slave user='slave' password='123456';
    -- 如果 slave 報錯:  [ERROR] [MY-010584] [Repl] Slave I/O for channel , 嘗試使用 root
    -- start slave user='root' password='123456';
    
    -- 查看 slave 狀態,確保: Slave_IO_Running: Connecting, Slave_SQL_Running: Yes
    show slave status\G
    

    說明:

    master_host: Master的地址
    master_port: Master的端口號
    master_user: 用於數據同步的用戶
    master_password: 用於同步的用戶的密碼
    master_log_file: 指定 Slave 從哪個日誌文件開始複製數據,即上文中提到的 File 字段的值
    master_log_pos: 從哪個 Position 開始讀,即上文中提到的 Position 字段的值
    master_connect_retry: 如果連接失敗,重試的時間間隔,單位是秒,默認是60秒
    

    注意: 可用docker logs -f slave_mysql查看連接錯誤時的日誌

測試

主節點創建數據庫,查看從節點是否有同步

主:

create database test default character set utf8;
create table test.tbl_test (`user` varchar(64) not null, age int(11) not null) default charset utf8;
insert into test.tbl_test values ('li',22);

從:

show databases;
show tables from test;
select * from test.tbl_test;
+------+-----+
| user | age |
+------+-----+
| li   |  22 |
+------+-----+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章