mysql df_MySQL主从复制实战

64a29464f7ac0cb984c18dbf8cd13e29.png

什么是主从复制

使用两个或两个以上的数据库,一部分数据库当做主数据库,而另一部分数据库当做从数据库。系统在主数据库中进行写操作,从数据库记录在主库上所有的写操作,使得主从数据库的数据保持一致。

一旦主数据库出现问题时,使用从数据库代替主数据库,可以避免服务中断。

什么是读写分离

读写分离是基于主从复制的。系统操作数据库中的数据时,将对数据的增删改也就是写操作,发送到主数据库,将查询的任务交给从数据库。

写操作一般相比读操作更耗时,而系统在大多数情况下都是读多写少。进行读写分离,减少读写操作相互影响,既能提高查询效率,也能减轻主数据库的压力,提高系统性能。

主从复制原理

下图为网上找的一张介绍主从复制的原理图。

6a67e2660214b716898c8e59252349a0.png

简单来讲,有以下四个关键点:

1、主数据库开启bin-log,将所有写操作的sql语句记录到日志文件中。

2、每当有从库连接到主库的时候,主库都会创建一个线程(master bin-log输出线程),用于发送bin-log内容到从库。

3、从数据库开启中继日志relay-log,用于同步回来的主数据库bin-log。

4、从数据库中运行2个线程,一个线程(slave

I/O线程)连接到主库,获取主数据库bin-log日志文件里的SQL,记录到本机的中继日志relay-log文件里,另一个线程(slave

SQL线程)执行本机relay-log文件里的SQL语句,在从数据库重新执行一遍数据操作,保持主从数据库的数据一致。

复制模式介绍

异步复制

说明:MySQL默认的复制模式。主库在执行完客户端提交的事务后,立即将结果返回给客户端,而不等待从库接收处理。

问题:一旦主数据库宕机,已经提交的事务可能并没有传到从数据库上,此时如果进行主备切换,会导致新主库上的数据不完整,牺牲了数据的一致性。

全同步复制

说明:当主库和从库执行完客户端提交的事务后,才返回结果给客户端。

问题:虽然保证了在任何情况下的数据一致性,当由于需要等待所有数据库执行完该事务才能返回结果,操作耗时长,牺牲了性能。

半同步复制

说明:主库在执行完客户端提交的事务后,等待至少一个从库接收到并写到中继日志后,才返回结果给客户端。

相对于异步复制和半同步复制,是保证数据一致性和性能的折中方案。需要注意的是,半同步需要等待从库响应,因此对于网络要求高,仅适用于低延时的网络。

主从复制方案

下图为常见的主从复制的方案。

762f3fa37e7da8823f78647e42e55f24.png

一主一从:从机可以作为数据的热备,当主节点宕机,备节点顶替。但需要注意的是,并不能代替数据备份,因为错误的操作,也会同步到备节点,数据仍会丢失。

一主多从:适用于读多写少的系统,但从库不可过多,过多会导致响应速度变慢。可以指定一个从库作为备用库,当主节点宕机,备节点顶替。也可以指定一个从库,将报表统计之类的慢查询语句都发到该从库,不至于影响其他查询操作。也可以指定一个从库,供开发人员排障使用,即使不小心删除数据,也不至于影响整体系统业务数据准确性,达到隔离效果。

双主:当大部分业务都为写,而写入性能还不够理想,可以采取双主模式。同时在两个主库写数据,并互相同步。业务上可以通过id取模、哈希计算等方法,奇数往主库1插数据,偶数往主库2插数据,保证主键不重复。

级联同步:为了减低主库的压力,主库只向一个从库同步数据,其他从库同步这个从库的数据。如果主库宕机,同步主库的从库可以直接作为主库使用。但如果这个从库挂了,问题会比较严重,会导致其他从库变为孤儿节点。

环形多主:性能强,但一旦挂了一个,会导致整个系统不可用。

使用Docker 搭建MySQL主从复制

以下演示使用Docker,搭建一主一从的数据库系统。

1、运行docker pull mysql:5.7下载mysql镜像。

2、在/opt目录下创建三个文件夹,分别为/opt/mysql_cluster、/opt/mysql_cluster/master和/opt/mysql_cluster/slave1。其中master和slave1文件夹用于保存需要持久化到宿主机上mysql容器的数据文件、日志文件等。

3、在/opt/mysql_cluster/master编写my.cnf文件,内容如下。需要注意的是,开启bin-log日志后默认记录所有库所有表的操作,可以通过配置来指定需要记录操作的数据库或者表,或指定不记录操作的数据库或者表。[mysqld]

#实例ID,不能和集群中的其他实例相同

server-id=1

#bin log 文件前缀

log-bin=mysql-prefix

# 需要同步的数据库

binlog-do-db=tuling

#不需要同步的数据库

binlog-ignore-db=information_schema

binlog-ignore-db=mysql

binlog-ignore-db=performance_schema

binlog-ignore-db=test

4、在/opt/mysql_cluster/slave1编写my.cnf文件,内容如下:[mysqld]

#实例ID,不能和集群中的其他实例相同

server-id=2

skip-slave-start=true

#限定用户进行数据修改的操作

read_only=ON

#中继日志前缀

relay-log=relay-bin

5、运行以下命令,启动主数据库。向外暴露的端口号为3307,默认的密码为123456,并且挂载宿主机目录到容器中,用于将数据保存到宿主机,保证数据不丢失。docker run -p 3307:3306 --name mysql_master \-v /opt/mysql_cluster/master/conf:/etc/mysql \-v /opt/mysql_cluster/master/logs:/var/log/mysql \-v /opt/mysql_cluster/master/data:/var/lib/mysql \ -v /opt/mysql_cluster/master/my.cnf:/etc/my.cnf \-e MYSQL_ROOT_PASSWORD=123456 \-d mysql:5.7

6、运行docker exec -it mysql_master /bin/bash,进入主数据库容器。

7、运行mysql -uroot -p,输入密码,登录数据库。

8、运行以下命令,添加访问权限,刷新授权表信息,方便后续在其他机器操作该数据库。grant all privileges on *.* to root@'%' identified by "123456";flush privileges;

9、运行以下命令,添加主库复制账号,刷新授权表信息。用户名和密码都是slave。后续从库使用该账号,获取相关bin-log。CREATE USER 'slave'@'%' IDENTIFIED BY 'slave';GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';flush privileges;

10、运行命令show master status;,获取主库当前bin-log文件名(File)和位置(Position)。

ccb6e7aac2d1c0f2e3bfff0b374aae17.png

11、运行以下命令,启动从数据库。向外暴露的端口号为3308,默认的密码为123456,并且挂载宿主机目录到容器中,用于将数据保存到宿主机,保证数据不丢失。docker run -p 3308:3306 -m 300M --memory-reservation 200M --name mysql_slave \-v /opt/mysql_cluster/slave1/conf:/etc/mysql \-v /opt/mysql_cluster/slave1/logs:/var/log/mysql \-v /opt/mysql_cluster/slave1/data:/var/lib/mysql \ -v /opt/mysql_cluster/slave1/my.cnf:/etc/my.cnf \-e MYSQL_ROOT_PASSWORD=123456 \-d mysql:5.7

12、运行docker exec -it mysql_slave /bin/bash,进入从数据库容器。

13、运行mysql -uroot -p,输入密码,登录数据库。

14、运行以下命令,添加访问权限,刷新授权表信息。方便后续在其他机器操作该数据库。grant all privileges on *.* to root@'%' identified by "123456";flush privileges;

15、运行以下命令,配置从库复制信息。其中,master_host为docker宿主机的ip,master_user和master_slave为主库复制账号,master_log_file是主库运行命令show master status获取的File字段值,master_log_pos为Position字段值。master_port为主数据库向外暴露的端口号。change master to master_host='192.168.255.167',master_user='slave',master_password='slave',master_log_file='mysql-prefix.000004',master_log_pos=1824,master_port=3307;

16、运行start slave;,启动slave服务。

17、运行show slave status\G;,查看slave状态。当参数"Slave_IO_Running"和"Slave_SQL_Running"值都是Yes,主从配置完成。

a7889996c6ccd1b5af1c37ea69799d3f.png

18、可以通过在主库创建表、插入修改数据后,查看从库是否同步成功,验证是否搭建成功。

19、当需要重新配置主从时,可以在从库上运行以下两条命令,取消当前的主备复制。stop slave;reset master;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409658.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python logistic回归_logistic回归介绍与源码分析

1. 介绍(由线性模型引出logistic回归)首先介绍一下什么是线性模型呢?线性模型的定义如下:给定 个属性描述的样本 , 代表样本在第 个属性上的取值。线性模型的目的是学习一个函数,它可以通过属性的线性组合来…

[html] 列举几种多列等高布局的方法

[html] 列举几种多列等高布局的方法 1, 使用table布局 .row { display: table; }.row > * { display: table-cell; }2, 使用flex布局.row { display: flex; flex-wrap: wrap; } .row > * { display: flex; flex-direction: column; }个人简介 我是歌谣,欢迎…

当前标签: Entity Framework

当前标签: Entity Framework在Entity Framework中使用泛型 qouoww 2012-04-29 22:39 阅读:1937 评论:4 一步一步学Entity Framework 4.x (3) qouoww 2012-04-27 17:20 阅读:2569 评论:8 一步一步学Entity Framework 4(2) qouoww 2012-04-27 09:10 阅读:2972 评论:7 一步一步…

case mybatis 不同表_解决mybatis case when 报错的问题

在mybatis中使用case when进行条件筛选判断时遇到Failed to process, please exclude the tableName or statementId.这样的报错信息,报错的信息是语法错误但是我在mysql的命令行中运行sql语句是没问题的//我的case when语句WHERE dept.type 1AND(CASE agent.dept_…

python c cmd_在Python cmd模块中处理CTRL-C

我发现了一些使用Ctrl-C实现所需行为的hacky方法.设置use_rawinput False并替换stdin这个(或多或少……)粘在cmd.Cmd的公共接口上.不幸的是,它禁用了readline支持.您可以将use_rawinput设置为false并传递一个不同的类文件对象来替换Cmd .__ init __()中的stdin.实际上,只在此对…

[html] 列举几种瀑布流布局的方法

[html] 列举几种瀑布流布局的方法 flex方法: .waterfall{ //从上到下 display: flex; flex-direction: row; } .column { //从左到右 display: flex; flex-direction: column; width: calc(100%/3); }个人简介 我是歌谣,欢迎和大家一起交流前后端知识。…

Activity、BroadcastReceiver、Service共同工作的简单例子

? Activity 好像是應用程式的眼睛,提供與User 互動之窗。 ? BroadcastReceiver 好像是耳朵,接收來自各方的Intent。 ? Service 好像是手,提供符合Intent 意圖之服務。 10.2.1 操作情境: 1. 此程式一開始,畫面出現兩…

linuxpython拍照_linux下python抓屏实现方法 -电脑资料

作者:zevolo 字体:[增加 减小] 类型:转载这篇文章主要介绍了linux下python抓屏实现方法,涉及Python操作屏幕截取的相关技巧,需要的朋友可以参考下本文实例讲述了linux下python抓屏实现方法,#!/usr/bin/python‘‘‘by zevolo, 201…

[html] 什么是表单域?它有哪些运用场景?

[html] 什么是表单域&#xff1f;它有哪些运用场景&#xff1f; <form></form>标签中间的部分 当点击这个表单域中的submit按钮&#xff0c;就会把表单中的数据提交到你action的属性指定的网页里面个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放…

线程执行一半断了_有的线程它死了,于是它变成一道面试题

----本文首发于公众号&#xff0c;关注文末公众号阅读体验更佳有些线程它活着&#xff0c;但它躺在池中碌碌无为&#xff1b;有的线程它死了&#xff0c;于是它变成一道面试题。这次的文章&#xff0c;要从一次阿里的面试说起。我记得那天是周一&#xff0c;刚刚经历过周末过的…

C#中的扩展方法,Linq,IO和多线程的定义和实例

前段时间学C#的上转型&#xff0c;泛型&#xff0c;lambda表达式这些应用的理解很费劲。学过之后我多多的练习了几天&#xff0c;接下来继续复习C#的其他一些概念&#xff0c;说实在的这些知识点学过之后很容易忘&#xff0c;但是都是很重要的&#xff0c;所以发表在博客上没事…

准确率 召回率_吴恩达深度学习笔记(61)-训练调参中的准确率和召回率

单一数字评估指标(Single number evaluation metric)无论你是调整超参数&#xff0c;或者是尝试不同的学习算法&#xff0c;或者在搭建机器学习系统时尝试不同手段&#xff0c;你会发现&#xff0c;如果你有一个单实数评估指标&#xff0c;你的进展会快得多&#xff0c;它可以快…

CDU集训代码:基础算法和数据结构2

做题地址&#xff1a; http://acm.hdu.edu.cn/diy/contest_login.php?cid16636 Problem A: HDU1040 排序题&#xff0c;可以直接使用c提供的排序&#xff0c;如果是JAVA&#xff0c;也可以使用自带的排序方法。C语言需要自己写排序算法。 #include<cstdio> #include<…

[html] 如何禁止input输入的历史记录

[html] 如何禁止input输入的历史记录 给form加上 autocompleteoff 可以禁止整个表单的历史记录给单个input加上 autocompleteoff 可禁止这个input的历史记录个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起…

python迷宫最短路径_python实现最短路径的实例方法

解决最短路径问题&#xff1a;(如下三种算法)(1)迪杰斯特拉算法(Dijkstra算法)(2)弗洛伊德算法(Floyd算法)(3)SPFA算法第一种算法&#xff1a;Dijkstra算法广度优先搜索解决赋权有向图或者无向图的单源最短路径问题.是一种贪心的策略算法的思路声明一个数组dis来保存源点到各个…

[html] html如何创建图片热区(img usemap)?

[html] html如何创建图片热区&#xff08;img usemap&#xff09;&#xff1f; <img src"china.gif" usemap"#mymap"><map name"mymap"><area shape"rect" href"a.html" coords"0,0,50,50"><…

探讨LoadRunner的并发用户和集合点

探讨LoadRunner的并发用户和集合点 近来跟踪一个项目&#xff0c;发现同事们在执行性能测试时&#xff0c;比较热衷于使用集合点&#xff0c;从概念上认为要得到并发用户就必须设置集合点&#xff0c;认为在执行一个压力测试脚本时&#xff0c;设置了集合点才算是有效的并发用…

python在职场的用处大吗_Python未来发展怎么样,未来办公是否都需要精通Python?...

首先&#xff0c;要先了解Python是什么&#xff1f;Python是一种计算机程序设计语言&#xff0c;又被称为胶水语言&#xff0c;可以用混合编译的方式使用c/c/java等语言的库。你可能已经听说过很多种流行的编程语言&#xff0c;比如在大学里感觉非常难学的C语言&#xff0c;进入…

spring gateway 鉴权_通过spring实现service变成controller,代码得到了简化

在网上发现了一个牛X的思路&#xff0c;在做restful的时候&#xff0c;如果业务改变&#xff0c;需要每次都修改controller&#xff0c;后来方便了&#xff0c;直接透传的方式&#xff0c;其实也比较麻烦&#xff0c;每次都要写controller。需求变了接口也发生了改变&#xff0…

java中return返回值_Java中return的用法

展开全部一、return语句总是用在方法中&#xff0c;有两个作用。一个是返回方法指定类型的值(这个值总62616964757a686964616fe59b9ee7ad9431333366306434是确定的)。一个是结束方法的执行(仅仅一个return语句)。二、实例1 。返回一个String。private String gets(){String s …