zoukankan      html  css  js  c++  java
  • 使用docker构建双主mysql

      我们有的时候需要双主mysql, 这样无论哪个数据库出现了问题的话都可以继续使用数据库。把两个数据库挂到一个代理上面,这样哪个服务出问题了,另外一个就可以继续服务了。当然本文不是主要谈代理的,所以这个不做细说。

      因为我们的电脑资源有限,所有我们继续采用docker的形式进行处理。

      首先我的电脑是mac且安装了docker的,如果有同学没有安装的话需要提前安装上。加上国内加速镜像站,这样拉取镜像服务的时候我们就会很快完成,否则镜像需要从国外拉取很慢。这个我之前遇到的问题,后来就把docker放置了很久,现在配置了国内加速镜像站,拉取镜像很快了。

      docker的基础知识之前在我的博文中已经说了,不太清除的可以用“飞机票”过去。

      好了,咱们进入正题,大家的docker环境已经准备好了。我们拉取镜像 mysql 5.7版本,拉取完成后可以看一下自己有哪些镜像。

    docker pull mysql:5.7
    docker images

      接下来我们需要创建一个网络环境,让主从机器在相同的环境中。可以通过命令:docker network ls 查看自己创建了哪些网络。咱们下面创建了以mysql为名网络。

    docker network create --driver=bridge mysql

      咱们把主从的机器开始启动。

    docker run -p 3366:3306 --network=mysql -h "mysql_master"  --name mysql_master -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
    docker run -p 3367:3306 --network=mysql -h "mysql_slave"  --name mysql_slave -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

      上边的参数大概解释一下 -p 是将机器内部的端口暴露出来,这个就可以从外边连接mysql机器了。 -h 是主机名, --name 用于指定启动的容器的名字,这个就可以在后续中用于重启镜像了,比如:docker restart mysql_master。-e 用于创建的时候指定环境变量,因为mysql容器必须指定root的密码,所以通过-e进行设置,把密码设置为root。 -d 这个是deamon的意思,就是守护进程,也就是在后台运行。最后指定mysql及版本号用于启动。

      接下来咱们需要进入到mysql_master机器中。docker exec是用于进入正在运行的机器中,-it是交互的方式,最后指定脚本类型bash。

    docker exec -it mysql_master /bin/bash

      进入到机器以后,因为mysql的进行很干净,里边没有我们需要的工具。这个镜像的内核是debian,我们需要安装vim及ping工具。我们需要首先把apt的源更改,首先把源文件备份,然后设置了163的源作为我们的apt源。当然大家可以搜索其他云apt的源都是可以的。

    cp /etc/apt/sources.list /etc/apt/sources_init.list
    
    echo "deb http://mirrors.163.com/debian/ buster main non-free contrib
    deb http://mirrors.163.com/debian/ buster-updates main non-free contrib
    deb http://mirrors.163.com/debian/ buster-backports main non-free contrib
    deb http://mirrors.163.com/debian-security/ buster/updates main non-free contrib
    
    deb-src http://mirrors.163.com/debian/ buster main non-free contrib
    deb-src http://mirrors.163.com/debian/ buster-updates main non-free contrib
    deb-src http://mirrors.163.com/debian/ buster-backports main non-free contrib
    deb-src http://mirrors.163.com/debian-security/ buster/updates main non-free contrib" > /etc/apt/sources.list

      我们更新一下apt-get,然后安装vim及ping,执行完了工具也就安装好了。

    apt-get update
    apt-get install vim
    apt-get install iputils-ping

      这些更新apt即安装工具的方法也需要再slave中执行一遍,我就不单独发步骤了。我们可以测试一下ping命令,我们执行  “ping mysql_slave” 有返回值,说明网络是通着的。我们继续编辑mysql的配置文件。

    vim /etc/mysql/mysql.conf.d/mysqld.cnf

      我们配置上server-id和log-bin,mysql是通过bin log进行同步的,这个也就是开启log-bin。每个机器的server-id是不一样的,用于标志不同的机器。

    server-id=1
    log-bin=mysql-bin

      保存后我们退出镜像,然后重启镜像使其配置生效。

    docker restart mysql_master

      我们也需要把slave的机器文件也改一下。这里进入机器的命令为: docker exec -it mysql_slave /bin/bash 。执行一下上边的更新和安装配置,配置好了之后记得重启一下slave : docker restart mysql_slave 。

    server-id=2
    log-bin=mysql-bin
    binlog_format=mixed

      我们在master的机器里边进入mysql, 执行的命令如下。输入密码root即可进入。

    mysql -uroot -p

      我们需要授权root用户的replication及slave权限。如果不授权的话,从库是不能连接主库的。

    GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'root'@'%';

      看一下master的日志文件即位置。我们看到了master机器的文件名及其位置。

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

      我们也需要开启一个slave的机器,并且进入到mysql里边。因为可能需要来回切换。我们在从库里边执行如下命令。里边配置设置了master的主机名,主机端口号,主机用户名,密码,主机器的文件名字以及位置。

    change master to master_host='mysql_master',master_port=3306, master_user='root',master_password='root',master_log_file='mysql-bin.000001',master_log_pos=154;

      接下来我们来启动slave,并且查看slave的线程命令。

    start slave;
    show slave status G;

      

        里边的yes说明已经开启成功并且连通,如果没有连通的话就是NO,这个时候需要检查上边配置的主机的host 用户名和密码,这些都需要检查一遍。

      我们在master的机器上建一个数据库test - create database test; 然后我们在从库里边查看,已经有了。说明从库已经创建好了。

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | slavetest          |
    | sys                |
    | test               |
    +--------------------+
    6 rows in set (0.00 sec)

      接下来我们我们在mysql_slave机器的库把用户root进行授权。

    GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'root'@'%';

      然后看一下mysql_slave机器的日志文件名及位置。

    show master status G;

      我们找到对应的文件名及位置,看一下下面的命令着两个值是否正确,不正确的话替换即可,正确的话进入mysql_master机器上执行。

    change master to master_host='mysql_slave',master_port=3306, master_user='root',master_password='root',master_log_file='mysql-bin.000001',master_log_pos=154;

      执行完了之后在mysql_master上执行。

    start slave;

      然后看一下slave的状态。如果刚才像上图那样的都是Yes的话说明成功。

    show slave status G;

      接下来咱们在mysql_slave的机器上创建一张表。create database slavetest; 这个时候我们进入mysql_master机器上查看一下。

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | slavetest          |
    | sys                |
    | test               |
    +--------------------+

      这个时候也有了,说明双主mysql搭建完成。

      

      

      

  • 相关阅读:
    第12组 Beta冲刺 (3/5)
    第12组 Beta冲刺 (2/5)
    第12组 Beta冲刺 (1/5)
    每周小结(1/3)
    第03组 Beta冲刺 (4/5)
    第03组 Beta冲刺 (3/5)
    第03组 Beta冲刺 (1/5)
    第03组 Alpha冲刺 总结
    第03组 Alpha冲刺 (6/6)
    第03组 Alpha冲刺 (4/6)
  • 原文地址:https://www.cnblogs.com/huangqingshi/p/12593395.html
Copyright © 2011-2022 走看看