zoukankan      html  css  js  c++  java
  • Docker构建mysql主从

    一、为什么要搭建主从架构呢

    1.数据安全,可以进行数据的备份。

    2.读写分离,大部分的业务系统来说都是读数据多,写数据少,当访问压力过大时,可以把读请求给到从服务器。从而缓解数据库访问的压力

    3.故障转移(高可用),当主节点宕机之后,将从服务切换为主节点继续提供服务。当然要实现主从切换还需要其他中间件来实现。

    二、主从数据同步原理

    mysql的主从架构一般都是通过binlog日志实现,binlog日志会记录主库的每一次操作。从库和主库建立连接TCP后,请求主库将binlog传输过来,这是主库有一个dump线程把binlog传输给从库。

    从库将读取到的binlog日志写入自己的relaylog,另外一个线程读取relaylog里面的内容进行重放。有那么一点点像redis的AOF持久方式,也是重放操作记录。

    三、docker搭建mysql主从

    感觉用docker会方便很多,自己写点demo之类需要构建集群的时候确实方便很多。

    1.拉镜像,再启动两个mysql容器

    我的docker是装的windows版本的。

     -d 后台启动  最后的mysql:5.7 是我自己的镜像版本,分别映射到宿主机的3306和3307端口 方便等下使用工具连接

    docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
    
    docker run -p 3307:3306 --name mysqlslave -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

    确保两个mysql容器都正常启动了,可以使用工具连接3306和3307端口看看是否能够连接上mysql。

    2.修改配置,这个时候我们需要进入到docker容器内部去修改/etc/mysql目录下的mysql的my.cnf文件

    docker exec -it 容器ID/容器名字 /bin/bash

     docker容器是轻量级的嘛,所以有些操作是不支持的,我们想要修改文件一般都会使用vim命令嘛,所以我们还需要安装一下:

    先执行

    apt-get update

    在执行

    apt-get install vim

    master的my.cnf文件:

    [mysqld]
    #保证唯一性
    server-id=1 
    #开启binlog日志并设置文件名字
    log_bin=master-bin

    slave的my.cnf文件:

    [mysqld]
    #保证唯一性
    server-id=2 
    #开启relay日志并设置文件名字
    relay_log=slave-relay
    

      

    配置完之后重启两个容器的mysql服务 service mysql restart  或者重启容器,因为重启mysql服务容器也会停止。

    windows桌面版的docker可以直接在这儿重启容器

    3.查看master状态配置并进行连接

    show master status;

    可以看到binlog文件,还有文件中的索引位置。Binlog_Do_DB和Binlog_Ignore_DB这两个字段是表示需要记录binlog文件的库或者不需要记录binlog文件的库。暂时没有配置,就表示是针对全库记录日志。

    在从节点上面执行sql语句:

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

      

    master_host :Master的地址,这儿需要的是容器在的独立IP 可以进入容器查看,也可执行docker指令查看:

    docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称/容器id

    master_user master_password:用于同步的用户的密码,实际中肯定不能使用root用户

    master_log_file:指定 Slave 从哪个日志文件开始复制数据

    master_log_pos:从哪个 Position 开始读,都是对应master中的值

    执行成功之后在启动slave就可以了

    start slave;
    show slave status

    查看从节点信息了:

    现在去主库建库表,写数据,从库都会吧数据同步过去了

    四、其他

    这个主从架构师可能失败的,如果查看slave状态发现Slave_SQL_Running=no 就表示主从同步失败了,可能是在从库进行了些,导致从主库同步过来主键冲突。也可能是从库服务重启之后有事务回滚了。如果是从库事务回滚可以:

    stop slave ;
    set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; 
    start slave ;

    还可以重新设置主节点的binlog信息 重新指定position,可能需要处理一下从节点上面的数据

    其他参数:

    #master:
    #需要同步的二进制数据库名 
    binlog-do-db=masterdemo 
    #只保留7天的二进制日志,以防磁盘被日志占满(可选) 
    expire-logs-days = 7 
    #不备份的数据库 
    binlog-ignore-db=xxx1
    binlog-ignore-db=xxx2
    
    #从库:
    #如果master库名[mastdemo]与salve库名[mastdemo01]不同,使用以下配置[需要做映射] 
    replicate-rewrite-db = xxx -> aaa
    #如果不是要全部同步[默认全部同步],则指定需要同步的表 
    replicate-wild-do-table=xxx1
    replicate-wild-do-table=xxx2
  • 相关阅读:
    WebDriver Api
    Web系统基础
    python自动化测试相关资料
    持续集成Jenkins
    Git和Github库详细使用教程
    TCP/UDP协议
    CentOS连接网络设置
    Web测试基本思路:UI测试、功能测试和兼容性测试
    初识Jenkins
    selenium +python 对table的操作
  • 原文地址:https://www.cnblogs.com/nijunyang/p/14990169.html
Copyright © 2011-2022 走看看