推荐阅读:

成功斩获头条offer,Java程序员心得分享给你春招助力

摘要

本文将从MySql主从复制的原理出发,详细介绍MySql在Docker环境下的主从复制搭建,以一个主实例和一个从实例实现主从复制为例。

什么是主从复制?

主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从数据库上,然后在从数据库上对这些日志进行重新执行,从而使从数据库和主数据库的数据保持一致。

主从复制的原理

  • MySql主库在事务提交时会把数据变更作为事件记录在二进制日志Binlog中;
  • 主库推送二进制日志文件Binlog中的事件到从库的中继日志Relay Log中,之后从库根据中继日志重做数据变更操作,通过逻辑复制来达到主库和从库的数据一致性;
  • MySql通过三个线程来完成主从库间的数据复制,其中Binlog Dump线程跑在主库上,I/O线程和SQL线程跑着从库上;
  • 当在从库上启动复制时,首先创建I/O线程连接主库,主库随后创建Binlog Dump线程读取数据库事件并发送给I/O线程,I/O线程获取到事件数据后更新到从库的中继日志Relay Log中去,之后从库上的SQL线程读取中继日志Relay Log中更新的数据库事件并应用,如下图所示。

主实例搭建

  • 运行mysql主实例:
docker run -p 3307:3306 --name mysql-master -v /mydata/mysql-master/log:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root  -d mysql:5.7
  • 在mysql的配置文件夹/mydata/mysql-master/conf中创建一个配置文件my.cnf:
touch my.cnf
  • 修改配置文件my.cnf,配置信息如下:
[mysqld]## 设置server_id,同一局域网中需要唯一server_id=101 ## 指定不需要同步的数据库名称binlog-ignore-db=mysql  ## 开启二进制日志功能log-bin=mall-mysql-bin  ## 设置二进制日志使用内存大小(事务)binlog_cache_size=1M  ## 设置使用的二进制日志格式(mixed,statement,row)binlog_format=mixed  ## 二进制日志过期清理时间。默认值为0,表示不自动清理。expire_logs_days=7  ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致slave_skip_errors=1062  
  • 修改完配置后重启实例:
docker restart mysql-master
  • 进入mysql-master容器中:
docker exec -it mysql-master /bin/bash
  • 在容器中使用mysql的登录命令连接到客户端:
mysql -uroot -proot
  • 创建数据同步用户:
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';复制代码

从实例搭建

  • 运行mysql从实例:
docker run -p 3308:3306 --name mysql-slave -v /mydata/mysql-slave/log:/var/log/mysql -v /mydata/mysql-slave/data:/var/lib/mysql -v /mydata/mysql-slave/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root  -d mysql:5.7
  • 在mysql的配置文件夹/mydata/mysql-slave/conf中创建一个配置文件my.cnf:
touch my.cnf
  • 修改配置文件my.cnf:
[mysqld]## 设置server_id,同一局域网中需要唯一server_id=102## 指定不需要同步的数据库名称binlog-ignore-db=mysql  ## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用log-bin=mall-mysql-slave1-bin  ## 设置二进制日志使用内存大小(事务)binlog_cache_size=1M  ## 设置使用的二进制日志格式(mixed,statement,row)binlog_format=mixed  ## 二进制日志过期清理时间。默认值为0,表示不自动清理。expire_logs_days=7  ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致slave_skip_errors=1062  ## relay_log配置中继日志relay_log=mall-mysql-relay-bin  ## log_slave_updates表示slave将复制事件写进自己的二进制日志log_slave_updates=1  ## slave设置为只读(具有super权限的用户除外)read_only=1  
  • 修改完配置后重启实例:
docker restart mysql-slave

将主从数据库进行连接

  • 连接到主数据库的mysql客户端,查看主数据库状态:
show master status;
  • 主数据库状态显示如下:
  • 进入mysql-slave容器中:
docker exec -it mysql-slave /bin/bash
  • 在容器中使用mysql的登录命令连接到客户端:
mysql -uroot -proot
  • 在从数据库中配置主从复制:
change master to master_host='192.168.6.132', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;  
  • 主从复制命令参数说明: master_host:主数据库的IP地址; master_port:主数据库的运行端口; master_user:在主数据库创建的用于同步数据的用户账号; master_password:在主数据库创建的用于同步数据的用户密码; master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数; master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数; master_connect_retry:连接失败重试的时间间隔,单位为秒。
  • 查看主从同步状态:
show slave status G;
  • 从数据库状态显示如下:
  • 开启主从同步:
start slave;
  • 查看从数据库状态发现已经同步:

主从复制测试

主从复制的测试方法有很多,可以在主实例中创建一个数据库,看看从实例中是否有该数据库,如果有,表示主从复制已经搭建成功。

  • 在主实例中创建一个数据库mall;
  • 在从实例中查看数据库,发现也有一个mall数据库,可以判断主从复制已经搭建成功。

作者:MacroZheng
链接:https://juejin.im/post/5e1daba46fb9a02fb75d5e92

java读取mysql配置文件_MySql主从复制,从原理到实践相关推荐

  1. java读取mysql配置文件_一文读懂 MySQL 主从复制读写分离

    文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary 前言 在很多项目,特别是互联网项目,在使用MySQL时都会采用主从复 ...

  2. java读取mysql配置文件_Linux运维:MySQL读写分离解决方案

    一次性付费进群,长期免费索取教程,没有付费教程. 进微信群回复公众号:微信群:QQ群:460500587  教程列表 见微信公众号底部菜单 |  本文底部有推荐书籍  微信公众号:计算机与网络安全 I ...

  3. java读取mysql数据库配置文件_java读取properties文件的方法

    Java 读写Properties配置文件 Java 读写Properties配置文件 1.Properties类与Properties配置文件 Properties类继承自Hashtable类并且实 ...

  4. java解析yml文件_如何基于JAVA读取yml配置文件指定key内容

    这篇文章主要介绍了如何基于JAVA读取yml配置文件指定key内容,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 先引入需要的依赖 org.yaml ...

  5. java 读取 application配置文件信息

    java 读取 application配置文件 application.yml hedd:#单字younger-brother: 小弟little-brother: 小兄弟#类数据all:bigSis ...

  6. java 读取 xml 配置文件内容

    java  读取 xml 配置文件内容 public static void main(String[] args) throws Exception {//创建读取的核心类SAXReader sax ...

  7. Atitit.java jna  调用c  c++ dll的原理与实践  总结  v2  q27

    Atitit.java jna  调用c  c++ dll的原理与实践  总结  v2  q27 1. Jna简单介绍1 2. Jna范例halo owrld1 3. Jna概念2 3.1. (1)需 ...

  8. 高可用Mysql架构_Mysql主从复制、Mysql双主热备、Mysql双主双从、Mysql读写分离(Mycat中间件)、Mysql分库分表架构(Mycat中间件)的演变...

    [Mysql主从复制] 解决的问题 数据分布:比如一共150台机器,分别往电信.网通.移动各放50台,这样无论在哪个网络访问都很快.其次按照地域,比如国内国外,北方南方,这样地域性访问解决了. 负载均 ...

  9. mysql driver 读写分离_Mysql主从复制和读写分离实践

    1.主从复制 原理 MySQL之间数据复制的基础是二进制日志文件(binary log file).一台MySQL数据库一旦启用二 进制日志后,其作为master,它的数据库中所有操作都会以" ...

最新文章

  1. Python 的种类以及特点
  2. 学会这八个技术,你离 BAT 大厂不远了
  3. SP 2010: Getting started with Business Connectivity Services (BCS) in SharePoint 2010
  4. redis 五大数据结构__常用命令
  5. MYSQL多表查询与事务
  6. day18--django3之Ajax
  7. 保护 WordPress 安全的10个方法
  8. 原码和补码在计算机中的应用,原码,补码和反码在计算机中的作用
  9. java zookeeper 主从热备_zookeeper 核心原理
  10. s-palindrome
  11. ZooKeeper CentOS7上安装
  12. MySql之sql语句(自用)
  13. Linux系统基础原理
  14. 计算机电源烧保险,ATX电脑电源保险换了就烧怎么维修?
  15. 基于图像的火焰识别调研总结
  16. Go sync.Pool 浅析
  17. JRuby——Java和Ruby的强强联合
  18. 两个常用算法day1
  19. CSAPP第八、九章家庭作业(原书第二版)
  20. ubuntu 板载r8125有限网卡连接

热门文章

  1. 物联卡与sim卡有什么差别性的不同
  2. CentOS查看硬件情况
  3. 如何在云服务器使用docker快速部署jupyter web服务器(Nginx+docker+jupyter+tensorflow)
  4. 为什么线程池里的方法会执行两次_别以为线程池很简单,来回答下这些问题!...
  5. 至商3000服务器信息,至商3000企业管理系统
  6. linux 提取重复数据处理,Linux提取命令cut
  7. python︱ collections模块(namedtuple/defaultdict/OrderedDict等)
  8. txt文件参数化200用户,返回在表格中查看只能看到100行数据
  9. 由canvas实现btn效果有感
  10. 2018-2019-1 20165302 《信息安全系统设计基础》第三周学习总结