zoukankan      html  css  js  c++  java
  • 使用 docker 搭建 MySQL 主从同步/读写分离

    拉取 MySQL 容器镜像

    docker pull mysql:5.7
    

    这里我使用的是 5.7 版本,如果你想要拉取最新版本的镜像,可以使用:

    docker pull mysql:latest
    

    下载完成之后我们可以先查看一下镜像是拉取成功

    docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    mysql               5.7                 f6509bac4980        4 days ago          373MB
    

    创建 MySQL 容器

    创建主数据库容器

    docker run --name mysql-master -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
    

    创建从数据库容器

    docker run --name mysql-slave -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
    

    这里我们分别使用了 3307 和 3308 端口,因为我们本地宿主机器上已经跑了 MySQL 了,3306 端口被占用。

    配置主数据库

    首先,进入容器:

    docker exec -it mysql-master /bin/bash 
    root@c72a3032f986:/#
    

    连接 MySQL

    mysql -u root -p123456
    

    修改 root 可以通过任何客户端连接

    ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
    

    修改 MySQL 配置文档 /etc/mysql/mysql.conf.d/mysqld.cnf,在 [mysqld] 段添加以下配置:

    log-bin=mysql-bin    //[必须]启用二进制日志
    server-id=1          //[必须]服务器标识ID,每台服务器唯一
    

    配置从服务器

    首先,进入容器:

    docker exec -it mysql-slave /bin/bash 
    root@89bdbb5786ab:/#
    

    连接 MySQL

    mysql -u root -p123456
    

    修改 root 可以通过任何客户端连接

    ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
    

    修改 MySQL 配置文档 /etc/mysql/mysql.conf.d/mysqld.cnf,在 [mysqld] 段添加以下配置:

    log-bin=mysql-bin    //[必须]启用二进制日志
    server-id=2          //[必须]服务器标识ID,每台服务器唯一
    

    配置 MySQL 主从复制

    首先连接 master 服务器,查看数据库状态:

    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000003 |      154 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    

    记录 File 的值和 Position 的值,等会配置 slave 服务器的时候要用。

    接下来连接 slave 服务器,配置主从复制:

    mysql>change master to
    master_host='x.x.x.x',
    master_user='user',
    master_log_file='mysql-bin.000003',
    master_log_pos=154,
    master_port=3307,
    master_password='123456';
    Query OK, 0 rows affected, 2 warnings (0.03 sec)
    mysql> start slave;
    Query OK, 0 rows affected (0.01 sec)
    

    解释下配置参数

    master_host='x.x.x.x' // 这里填 master 主机 ip
    master_log_file='mysql-bin.000003', // 这里填写 File 的值
    master_log_pos=154,// 这里填写 Position 的值。
    mysql> start slave;// 启动从服务器复制功能
    

    如果不小心配置错, 输入 mysql> stop slave; 然后重新录入一遍就可以了。

    接下来我们可以检查主从连接状态:

    show slave statusG
    

    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    

    这两个必须是 Yes 为 No 或者 connect 说明没有连接上。

    重启容器,使配置生效

    分别重启 mysql-master 和 mysql-slave 容器

    docker stop mysql-master
    docker start mysql-master
    
    docker stop mysql-slave
    docker start mysql-slave
    

    测试

    在 master 容器中创建一张 user 表;

    mysql> CREATE TABLE `user` (
        ->   `user_id` bigint(20) AUTO_INCREMENT,
        ->   `username` varchar(30) NOT NULL,
        ->   `password` varchar(30) DEFAULT NULL,
        ->   PRIMARY KEY (`user_id`)
        -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    Query OK, 0 rows affected (0.47 sec)
    

    然后在 slave 容器查看:

    mysql> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | user           |
    +----------------+
    1 row in set (0.00 sec)
    

    发现已经同步过来了。

    在 master 服务器 user 表插入一条数据:

    mysql> insert into user(username, password) values ('test_user', 'test_pass');
    Query OK, 1 row affected (0.07 sec)
    

    然后看看 slave 服务器是否有同步

    mysql> select * from user;
    +---------+-----------+-----------+
    | user_id | username  | password  |
    +---------+-----------+-----------+
    |       1 | test_user | test_pass |
    +---------+-----------+-----------+
    1 row in set (0.00 sec)
    

    显然,已经完美同步了。

    如果docker容器中没有vim命令安装

    mv /etc/apt/sources.list /etc/apt/sources.list.bak

        echo "deb http://mirrors.163.com/debian/ jessie main non-free contrib" 

    >> /etc/apt/sources.list

        echo "deb http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib" 

    >>/etc/apt/sources.list

        echo "deb-src http://mirrors.163.com/debian/ jessie main non-free contrib" >>/etc/apt/sources.list

        echo "deb-src http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib"

     >>/etc/apt/sources.list

        #更新安装源

        apt-get update

    apt-get install vim命令即可

    转自:http://www.r9it.com/20190727/mysql-master-slave-in-docker.html

  • 相关阅读:
    MySql 用户 及权限操作
    MAC 重置MySQL root 密码
    在mac系统安装Apache Tomcat的详细步骤[转]
    Maven:mirror和repository 区别
    ES6 入门系列
    转场动画CALayer (Transition)
    OC 异常处理
    Foundation 框架
    Enum枚举
    Invalid App Store Icon. The App Store Icon in the asset catalog in 'xxx.app' can’t be transparent nor contain an alpha channel.
  • 原文地址:https://www.cnblogs.com/xuxiaobai13/p/12737197.html
Copyright © 2011-2022 走看看