• 在Centos 7中使用 Docker搭建MySQL异地双向复制环境


    (0)一些准备操作:

    Centos安装好之后(这里使用的是vm虚拟机)

    将当前用户添加到sudoers中:
    su root
    vim /etc/sudoers
    找到
    root ALL=(ALL) ALL
    在之后添加一行
    ${user} ALL=(ALL) ALL
    保存切换用户即可

    本地ssh免密码登陆Centos虚拟机
    本地系统为Mac,使用自带的终端工具ssh连接虚拟机
    ssh ${user}@${ip}
    会要求输入密码

    使用scp复制本地的rsa公钥到虚拟机中
    scp ~/.ssh/id_rsa.pub ${user}@${ip}:/home/${user}/.ssh
    进入虚拟机中的.ssh目录
    cat id_rsa.pub >> authorized_keys
    修改authorized_keys文件的权限
    chmod 600 authorized_keys
    没有修改权限的话可能没办法成功

    之后即可直接使用ssh ${user}@${ip}登陆虚拟机
    方便起见,可以将该命令写入/etc/profile中
    alias centos=’ssh ${user}@${ip}’

    之后直接执行centos就可以连接到虚拟机

    (1)Docker安装:

    sudo yum -y install docker

    启动Docker服务:
    sudo systemctl start docker

    设置开机启动Docker:
    sudo systemctl enable docker

    设置免sudo执行Docker命令:
    sudo groupadd docker
    sudo gpasswd -a ${user} docker
    sudo systemctl restart docker
    newgrp - docker

    期间若是出现无法上网的情况请参考:

    Centos7 虚拟机无法上网解决方法:
    (1)
    cd /etc/sysconfig/network-scripts/
    修改该目录下的ifcfg-eno******
    vi ifcfg-eno32
    ONBOOT=”yes” 开启自动启用网络连接
    重启

    (2)
    关闭虚拟机,打开虚拟机存储的目录,用记事本打开三台电脑图标的vmx
    配置文件,加一条进去
    ethernet0.virtualDev = “e1000”
    再次开机

    由于直接使用官方的MySQL镜像无法满足此次需求,所以从

    (2)从一个基本的Ubuntu镜像开始重新配置MySQL:

    docker pull ubuntu

    从该镜像启动容器
    docker run –name mysql -itd ubuntu
    进入容器内部bash环境(此时可以像日常操作Linux一样进行操作)
    docker exec -it mysql bash

    (3)Ubuntu安装MySQL:

    更新apt-get
    apt-get update

    安装MySQL
    apt-get -y install mysql-server

    容器中的vi编辑器不好用,可以顺便下个vim
    apt-get -y install vim

    root密码修改为自己的,如果在容器中不知道密码可以使用一下命令修改
    passwd root

    这里可以先将这个容器保存为镜像,免得之后出错了要重新安装这些东西
    docker commit mysql
    docker tag ${id} chubby/mysql:0.1

    (4)在Ubuntu容器中配置MySQL多实例启动

    目标:在一个Ubuntu容器中可以启动两个MySQL服务
    作用:每个容器模拟一个数据库服务器,两个MySQL服务分别准备做异地容灾的主从

    修改mysql配置文件:
    vim /etc/mysql/my.cnf
    在[mysqld]的内容中加入:
    log_slow_queries=/var/log/mysql/mysql-slow.log
    log-bin
    server-id=1

    注释一行:
    bind-address = 127.0.0.1
    没有注释的话从节点无法连接到master

    另外加入两个内容:
    [mysqld_multi]
    mysqld = /usr/bin/mysqld_safe
    mysqladmin = /usr/bin/mysqladmin
    user = root
    password = root

    [mysqld1]
    socket = /var/run/mysqld/mysqld1.sock
    port = 3307
    pid-file = /var/run/mysqld/mysqld1.pid
    log-slow-queries = /var/log/mysql1/mysql-slow.log ## mysql slow log
    relay-log = /var/spool/mysqld1/mysqld-relay-bin ## relay for replication
    datadir = /var/lib/mysql1 ## mysql data file folder
    user = mysql
    log-bin
    server-id=2

    以上的配置具体看情况设置

    启动MySQL:
    service mysql start
    修改root密码:
    mysqladmin -u root -p password “root”

    初始化第二个MySQL实例:
    mysql_install_db –user=mysql –datadir=/var/lib/mysql1

    启动该MySQL实例:
    mysqld_multi start 1

    使用命令查看3306、3307端口是否开启
    netstat -tunlp
    如果有则启动成功

    登陆该实例时需要制定sock文件
    修改该实例的root密码:
    mysqladmin -S /var/run/mysqld/mysqld1.sock -u root -p password “root”

    登陆该实例:
    mysql -S /var/run/mysqld/mysqld1.sock -uroot -proot

    进去之后可以使用
    show variables like ‘%datadir%’;
    查看datadir是否是配置文件中的路径

    (5)配置主从双向复制

    将这个容器提交成镜像
    docker commit mysql
    docker tag ${id} chubby/mysql:1.0

    使用这个镜像启动两个容器
    docker run –name mysql1 -itd chubby/mysql:1.0
    docker run –name mysql2 -itd chubby/mysql:1.0

    进入bash环境
    docker exec -it mysql1 bash
    docker exec -it mysql2 bash

    分别启动两个容器中的两个mysql实例

    进入主数据库(默认的3306端口,两个容器相同的操作)
    mysql -uroot -proot

    查看用户登陆信息
    select user,host from mysql.user;

    设置root用户可以从任何地方登陆访问任何表
    grant all on *.* to root@’%’ identified by ‘root’ with grant option;

    新建一个用户backup用来
    给从数据库登陆,获取主数据库信息,密码也是backup(这里设置的登陆地址为localhost,如果从数据库在别的机器上需要修改为对应的IP)
    GRANT REPLICATION SLAVE ON *.* to ‘backup’@’%’ identified by ‘backup’;
    刷新
    flush privileges;

    查看用户登陆信息
    select user,host from mysql.user;
    可以看到相关用户的登录权限已经设置好了

    使用
    show variables like “%log_%”;
    查看二进制日志是否开启(配置文件中的log-bin),要使用主从复制一定要开启这个

    使用
    show master status;
    查看主数据库信息
    File和Position
    这两个信息会在配置从数据库的时候用到

    进入从库,执行下列命令进行主库信息配置

    change master to master_host=’localhost’,master_user=’backup’,master_password=’backup’,master_log_file=’mysqld-bin.000003’,master_log_pos=107;

    master_host:主库地址(如果不是默认的3306可以使用master_port指定端口信息)
    master_user:上面配置的从库登陆主库的用户
    master_log_file:即主库show master status;中File的值
    master_log_pos:即主库show master status;中Position的值

    开启从库
    start slave;

    查看状态信息
    show slave statusG

    其中的
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    两个必须都为Yes才是成功

    此时为Slave单向复制Master,若要变为双向复制则将Master和Slave节点的角色互换然后分别做各自角色的配置即可

    若是Slave同步的时候出现问题:
    Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: ‘Could not find first log file name in binary log index file’

    在对应的Master中
    flush logs;
    show master status;

    记下File, Position

    重新执行
    change master to master_host=’localhost’,master_user=’backup’,master_password=’backup’,master_log_file=’mysqld-bin.000003’,master_log_pos=107;
    即可

    一些其他的资料:

    (1)使用Docker官方的MySQL镜像

    docker pull busybox
    docker pull docker.io/mysql

    使用busybox启动镜像作为挂载数据的容器
    docker run –name mysql_data -v /var/lib/mysql -d busybox echo “MySQL data”
    使用MySQL镜像连接到数据容器的volume中
    docker run –name=mysql_server –volumes-from mysql_data -e MYSQL_ROOT_PASSWORD=root -d docker.io/mysql

    Docker容器挂载磁盘路径无法访问的问题解决方法,添加selinux规则,将要挂载的目录添加到白名单:
    chcon -Rt svirt_sandbox_file_t /home/docs

    (2)Centos 7缺乏yum源安装mysql:
    wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
    sudo rpm -ivh mysql-community-release-el7-5.noarch.rpml
    安装这个包后,会获得两个mysql的yum repo源:
    /etc/yum.repos.d/mysql-community.repo
    /etc/yum.repos.d/mysql-community-source.repo。

    安装mysql:
    sudo yum install mysql-server

  • 相关阅读:
    2019 牛客多校第五场 B generator 1
    POJ 1797 Heavy Transportation
    POJ 3352 Road Construction
    POJ 2553 The Bottom of a Graph
    POJ 1236 Network of Schools
    POJ 1144 Network
    POJ 3761 Bubble Sort
    2019 牛客多校第三场 B Crazy Binary String
    2019 牛客多校第三场 H Magic Line
    Codeforces Round #592 (Div. 2)
  • 原文地址:https://www.cnblogs.com/jchubby/p/5449374.html
Copyright © 2020-2023  润新知