DMOZ中文网站分类目录-免费收录各类优秀网站的中文网站目录.
  • DmozDir.org
DMOZ目录快速登录入口-免费收录各类优秀网站的中文网站目录.由人工编辑,并提供网站分类目录检索及地区分类目录检索,是站长免费推广网站的有力平台!

Docker进行MySQL主从复制操作

  • Docker进行MySQL主从复制操作

  • 已被浏览: 45 次2021年01月08日    来源:  https://www.cnblogs.com/yumq/p/14253812.html
  • --name 容器的名称命名-p 暴露端口,端口的映射 上述是本机的3307端口映射到容器内的3306端口,访问本机3307就能访问容器内的数据库(3306端口)--privileged=true 赋予容器内以root用户来操作-it 交互

    Docker的相关操作 与 Docker下MySQL容器的安装
    https://www.cnblogs.com/yumq/p/14253360.html

    本次实验我是在单机状态下进行mysql的主从复制,和多机的原理一样

    准备多个mysql容器

    相关参数

    --name 容器的名称命名
    -p 暴露端口,端口的映射 上述是本机的3307端口映射到容器内的3306端口,访问本机3307就能访问容器内的数据库(3306端口)
    --privileged=true 赋予容器内以root用户来操作
    -it 交互运行 
    --hostname docker1 容器内hostname,我是为了区分docker添加的,如果用不到可以去掉
     
    -e MYSQL_ROOT_PASSWORD=123456 环境参数配置,配置mysql root角色的密码
    -e MYSQL_DATABASE=ymq 创建一个ymq的数据库,用不到的可以删除掉
    -e MYSQL_USER=user 
    -e MYSQL_PASSWORD=pass
    `-v 非常重要,相当于docker容器的宝贵文件(相关配置,相关数据,相关日志)存放到容器外(即云服务器中),这样做的目的是不把数据放在容器内,保障数据安全`
    -v /home/mysql/docker-data/3307/conf:/etc/mysql/conf.d
    -v /home/mysql/docker-data/3307/data/:/var/lib/mysql
    -v /home/mysql/docker-data/3307/logs/:/var/log/mysql -d mysql:5.7
    -d 后台运行容器,并返回容器ID;
    mysql:5.7 运行的镜像文件
    

    直接运行下面代码就能启动mysql

    mysql1

    docker run --name mysqldocker1 -p 3306:3306 --privileged=true -it -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=ymq --hostname docker1 -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -v /home/mysql/docker-data/mysql1/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/mysql1/data/:/var/lib/mysql -v /home/mysql/docker-data/mysql1/logs/:/var/log/mysql -d mysql:5.7
    

    mysql2

    docker run --name mysqldocker2 -p 3307:3306 --privileged=true -it -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=ymq --hostname docker2 -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -v /home/mysql/docker-data/mysql2/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/mysql2/data/:/var/lib/mysql -v /home/mysql/docker-data/mysql2/logs/:/var/log/mytsql -d mysql:5.7
    

    mysql3

    docker run --name mysqldocker3 -p 3308:3306 --privileged=true -it -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=ymq --hostname docker3 -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -v /home/mysql/docker-data/mysql3/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/mysql3/data/:/var/lib/mysql -v /home/mysql/docker-data/mysql3/logs/:/var/log/mytsql -d mysql:5.7
    

    配置相关容器

    查看Docker内容器状态

    docker ps
    


    现在是启动成功了,但是没有配置主从相关配置,所以我们下一步要配置MySQL。
    因为运行的时候我们将容器内的配置目录挂载到本机的/home/mysql/docker-data/

    所以我们将对应容器的配置文件复制到对应目录下的conf目录下

    my.cnf 文件内容如下

    # For advice on how to change settings please see
    # http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
    
    [mysqld]
    #
    # Remove leading # and set to the amount of RAM for the most important data
    # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
    # innodb_buffer_pool_size = 128M
    #
    # Remove leading # to turn on a very important data integrity option: logging
    # changes to the binary log between backups.
    # log_bin
    #
    # Remove leading # to set options mainly useful for reporting servers.
    # The server defaults are faster for transactions and fast SELECTs.
    # Adjust sizes as needed, experiment to find the optimal values.
    # join_buffer_size = 128M
    # sort_buffer_size = 2M
    # read_rnd_buffer_size = 2M
    #datadir=/home/mysql/docker-data/3307/data
    #socket=/home/mysql/docker-data/3307/mysql.sock
    
    character_set_server=utf8
    init_connect="SET NAMES utf8"
    
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0
    
    #log-error=/home/mysql/docker-data/3307/logs/mysqld.log
    #pid-file=/home/mysql/docker-data/3307/mysqld.pid
    lower_case_table_names=1
    server-id=4122
    log-bin=mysql-bin
    auto_increment_increment=2
    auto_increment_offset=1
    
    #rpl_semi_sync_master_enabled=1
    #rpl_semi_sync_master_timeout=10000
    
    

    配置说明
    三个容器的my.conf 中不能相同server-id
    如上图我的第一个mysql的server-id为4122,那个我第二个server-id我就设置为4123
    log-bin=mysql-bin 是开启bin-log
    auto_increment_offset 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
    auto_increment_increment 表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535
    为了避免两台服务器同时做更新时自增长字段的值之间发生冲突,一般在主主同步配置时,
    需要将两台服务器的auto_increment_increment增长量都配置为2,
    而要把auto_increment_offset分别配置为1和2。
    当然如果三台就需要auto_increment_increment增长量都配置为3
    auto_increment_offset分别设置为1和2和3

    重启所有mysql容器

    #先查看所有容器 
    docker ps
    #然后一个个重启相应的容器
    docker restart 容器id
    
    #因为我容器只有这三个mysql 所以我以这样方式重启全部容器
    docker restart $(docker ps -aq)
    

    配置master

    我是以docker1下的mysql作为master主机

    进入docker1

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

    看到root@docker1时表示在docker1容器内
    如果操作完毕就exit退出容器

    进入mysql


    根据容器的配置 我设置的密码为123456

    在master mysql添加权限

    GRANT REPLICATION SLAVE,FILE,REPLICATION CLIENT ON *.* TO "repluser"@"%" IDENTIFIED BY "123456";
    FLUSH PRIVILEGES;
    

    查看master的二进制文件

    show master status;
    

    这样master配置就成功了

    配置slave

    分别进入docker2 和 docker3

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

    注意当看到光标前显示 root@docker2 和 root@docker3 时才表明进入成功
    如果需要退出用exit进行退出。

    在slave中设置master信息

    change master to master_host="172.24.7.187",master_port=3306,master_user="repluser",master_password="123456",master_log_file="mysql-bin.000001",master_log_pos=154;
    

    master_host="172.24.7.187" 主机我是用的云服务器内网地址 master_port=3306 是master主机的端口,master_user="repluser" master主机上的角色
    master_log_file="mysql-bin.000001",master_log_pos=154; 必须与主机的二进制一样

    开启slave,启动SQL和IO线程

    start slave;
    

    如果需要关闭就 stop slave;

    查看slave的状态

    show slave status\G;
    

    如果都为YES 就表明配置成功,主从复制搭建完成!!

    如果 Slave_IO_Running: NO 但 Slave_SQL_Running: Yes
    可能是在slave中设置master信息的sql中master_host地址填的127.0.0.1 或者 localhost。
    因为这两个地址会先去访问容器内的本机,而不是容器外的mysql,所以需要换成云服务器的公网或内网ip

    如果 Slave_IO_Running: Yes 但 Slave_SQL_Running: NO
    可能是主从同步的时候相关数据同步上的错误,在slave端 删除冲突的数据就行,具体的错误信息会在
    show slave status\G下面的信息中指出NO的原因

    测试结果


    以上信息来源于网络,如有侵权,请联系站长删除。

    TAG:主从 操作 docker Mysql

  • 上一篇:JAVA_基础反射机制
  • 与“Docker进行MySQL主从复制操作”相关的资讯
  • Redis 主从复制(Replication)
  • docker的网络-单主机(三种原生网络)none、host、bridge
  • docker和vm虚拟机的区别是什么
  • 【Java】位操作符
  • CentOS6下mysql的安装与配置