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搭建完成。

      

      

      

  • 相关阅读:
    AX ERROR: Could not find my mock parent, most likely I am stale 不及格的程序员
    利用Segue在视图控制器间传值的问题 不及格的程序员
    Creating a Singleton Instance 不及格的程序员
    iPad 通知 UIKeyboardWillShowNotification 不会在keyBoard处在Undock状态下接到通知 不及格的程序员
    Why RootViewController's view is rotated Automatically by System when the app first loaded? 不及格的程序员
    如何弹出UIDatePicker最好 不及格的程序员
    jQuery开始做恶了 不及格的程序员
    what is the SEL,id and IMP,Class ,Method? 不及格的程序员
    Objectivec 字符串比较的陷井 不及格的程序员
    Unable to create any keyboard shortcuts after the iOS 6.1.3 update on iPad. 不及格的程序员
  • 原文地址:https://www.cnblogs.com/huangqingshi/p/12593395.html
Copyright © 2011-2022 走看看