主从复制和读写分离

MySQL 主从复制和读写分离:

主从复制:主MySQL上的数据,新增,修改库,表,表里的数据,都会同步到从MySQL上。

MySQL的主从复制的模式:(面试题)

1,异步复制:(MySQL的默认复制就是异步复制,最常用。只要执行完之后,客户端提交事务,主MySQL会立即把结果返回给从服务器,主服务器并不关心从服务器是否已经接受,并且处理。)

问题:主一旦崩溃,主MySQL的事务可能没有传到从MySQL,这个时候强行的把从提升为主,可能到新的主服务器数据不完整。(很少见。)

2,全同步复制,主库执行完成一个事务,所有的从库都执行了该事务之后才会返回客户端。

因为需要等待所有从库全部执行完成,性能必然下降。(对数据一致性,和数据完整性要求很好的场景。)

3,半同步复制:介于异步和全同步复制之间。主库执行完一个客户端提交的事务之后,至少等待一个从库接受并处理完成之后才会返回给客户端。半同步在一定程度上提高了数据的安全性。也会有一定延迟。

这个延迟一般是一个tcp/ip的时间:从发送到接受的时间,单位是毫秒ms

时间<1ms: round-trip time RTT

架构:主从复制和读写分离:

mysql1 主

mysql2 从

mysql3 从

test1 读写分离的服务器

test2 客户端

实验:

主从复制

主从服务器之间的时间也要同步:

安装 ntp工具

yum -y install ntp

改ntp配置文件:

数字越小,时间的精确度越高,设置fudge 8 时间层级是8 最高到15。

从本地获取时间源,不从网络获取

从服务器执行同步命令

生成中会加一个定时任务

每30分钟同步一次

查看时间:

改主配置文件:

log-bin=master-bin #添加,主服务器开启二进制日志

binlog_format = MIXED

log-slave-updates=true

#添加,允许slave从master复制数据时可以写入到自己的二进制日志

进入服务器,新建一个用户,并授权:

GRANT REPLICATION SLAVE ON . TO 'myslave'@'192.168.176.%' IDENTIFIED BY '123456';

FLUSH PRIVILEGES;

show master status;

靠位置点进行同步:

修改从数据库配置文件

每个id不能一样:

server-id = 2

relay-log=relay-log-bin

relay-log-index=slave-relay-bin.index

relay_log_recovery = 1

relay_log_recovery=1

默认是0,1开启中继日志的复制。从服务器出现异常或者崩溃时,从服务器会从主服务器的二进制

server-id = 3

relay-log=relay-log-bin

relay-log-index=slave-relay-bin.index

relay_log_recovery = 1

重启数据库

从服务器分别进入数据库:

mysql -u root -p123456;

和主进行同步:

CHANGE master to master_host='192.168.176.30',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=604;

启动同步:

start slave;

查看:

show slave status\G;

Slave_IO_Running: Yes #负责与主机的io通信

Slave_SQL_Running: Yes #负责自己的slave mysql进程

在主数据库创建库,表

从库也会跟着改变

面试题:如果slave io running no

1,网络问题

2,my.cnf 配置文件写错了

3,

4,防火墙和安全机制。

主从复制是单向的,只能从主复制到从服务器。

面试题:主从复制的延迟问题:

1,网络延迟

2,主从硬件设备(CPU主频,内存IO,硬件IO)。

3,同步复制而不是异步复制。

解决方案:

1,硬件方面,主库一般来说不需要动的太多,从库硬件配置要更好。提升随机写的性能。硬盘可以换成固态的,升级cpu的核数,扩容内存。尽量使用物理机(不要用云服务器。)4核8G,硬盘。

2,网络层面,主从服务器配置在一个局域网内,尽量避免跨网段和跨机房。

3,架构方面:读写分离,把写入控制在主库,从库负责读,降低从库的压力

4,配置方面 mysql配置。从配置文件的角度实现性能最大化

追求安全性的配置:

innodb_flush_log_at_trx_commit=1

每次事务提交时都会刷新事务日志。已确保持久性,最高级别的数据安全性,但是会响应性能,默认就是1

0就是事务提交时不会立刻刷新,而是每秒刷新一次。可以提高性能,但是发生故障会导致数据丢失。

2 事务提交时,事务日志不会写入硬盘而是保持在系统缓存,不会进行刷新。一定的安全性和性能。内存要求比较高。

sync_binlog=1

1,也是默认值,每次提交事务之后,直接把二进制日志刷新,以确保日志的持久性。占用比较高的性能。但是安全性高。

0,二进制日志写入到缓存,也不会刷新日志。故障发生也会丢失数据,内存的要求也提高了

3,每3个事务执行一次刷新磁盘。提高性能,但是一旦崩溃,数据会大量丢失。

追求性能化:

sync_binlog=0

innodb_flush_log_at_trx_commit=2

logs-slave-updates=0

从库的更新不会写入二进制日志(不建议)

innodb_buffer_pool_size 300M 500G

innodb存储引擎的缓冲池大小,设置的s值越高,可以提高innodb的性能。

更多的数据和索引都可以缓存在内存中。减少磁盘的访问次数。对系统内存要求比较高。

主从复制的一个工作过程:

1,主节点是数据记录发生变化都会记录在二进制日志。

2,slave节点会一定时间内对主库的二进制文件进行探测,看其是否发生变化,如果有变化,从库会开启一个I/O线程,请求主库的二进制事件。

3,主库会给每一个I/O的线程启动一个dump。用于发送二进制事件给从库,从库通过I/O线程获取更新,slave_sql负责将更新写入到从库本地。实现主从一致。

主从复制的问题:

1,只能在主库上发生变化,任何同步到从。

2,复制过程是串行化过程,在从库上复制是串行的,主库的并行更新不能在库上并行操作。

3,主从复制的设计目的就是为在主库上写,在从库上查看。读写分离,实现高可用

mysql主从复制

若主从版本不一致,从的版本一定要高于主,保证可以向下兼容

因为若主的版本更新,低版本的从无法兼容的

读写分离:

要实现读写分离,必须要实现主从复制。

读写分离:所有的写入操作在主库,从库只负责读。(select)。如果有更新,是从主库复制到从库。

为什么要有读写分离:

1,数据库在写入数据时,比较耗时(mysql写一万条数据 3分钟)

2,数据库在读的时候,速度很快(读一万,5秒)

读写一旦分离,数据库的写入和读取是分开的,哪怕写入的数据量比较大,但是不影响查询的效率。

在什么场景下需要读写分离:

只有在某些程序在使用数据库过程中,更新少,但是查询比较多,这种情况可用考虑读写分离。

读和查的需求差不多,也可以考虑读写分离。

生产库一般都会做读写分离

测试库一般不管。

在工作中,数据库的读写不会在同一个库中完成。即不安全,也不能满足高可用,也不能实现高并发。工作中读会做读写分离。

mysql读写分离的原理:

1,根据脚本实现。在代码中实现路由分类。select insert 进行路由分类。这种方式是最多的。

性能好,在代码中可用实现,不需要额外的硬件设备

缺点:开发实现的,跟我们无关。如果大型的复制的应用,设计改动的代码非常多。

2,基于中间代理层实现:

mysql-proxy自带的开源项目,基于自带的lua脚本。这些lua脚本不是现成的,,要自己写,不熟悉他的内置变量写不出来的 atlas 360内部做自己代理工具。每天的读写请求承载量可用到几十亿条。支持事务,支持存储过程。

3,Amoeba 陈思儒,之前在阿里就职。是由java开发的一个开源团建。不支持事务,也不支持存储过程。但是Amoeba还是用的最多的功能比较强大的软件。

实验:

mysql1 主

mysql2 从

mysql3 从

test1 读写分离的服务器 Amooeba

test2 客户端

修改java环境

查看java环境:java -version

基于 jdk1.5开发的,官方推荐的

更换java环境

cd /opt/

cp jdk-6u14-linux-x64.bin /usr/local/

cd /usr/local/

chmod +x jdk-6u14-linux-x64.bin

./jdk-6u14-linux-x64.bin

//按yes,按enter

mv jdk1.6.0_14/ /usr/local/jdk1.6

vim /etc/profile

在最后一行添加

export JAVA_HOME=/usr/local/jdk1.6

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin

export AMOEBA_HOME=/usr/local/amoeba

export PATH=$PATH:$AMOEBA_HOME/bin

使文件立即生效:source /etc/profile

java -version

安装amoeba

在opt目录下创建amoeba目录

mkdir /usr/local/amoeba

解压

tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/

赋权

chmod -R 755 /usr/local/amoeba/

执行:

/usr/local/amoeba/bin/amoeba

显示 amoeba start|stop说明安装成功

在三台数据库给用户amoeba赋权

grant all on *.* to amoeba@'192.168.176.%' identified by '123456';

flush privileges;

在amoeba服务器修改配置文件:

cd /usr/local/amoeba/conf/

配置用户信息:

配置数据库信息:

备份

cp amoeba.xml amoeba.xml.bak

改配用户信息:

vim amoeba.xml

--30行--

amoeba

--32行--

123456

--115行--

master

--117-去掉注释-

master

slaves

修改数据库信息:

cp dbServers.xml dbServers.xml.bak

vim dbServers.xml

--23行--注释掉 作用:默认进入test库 以防mysql中没有test库时,会报错

--26--修改

amoeba

--28-30--去掉注释

123456

--45--修改,设置主服务器的名Master

--48--修改,设置主服务器的地址

192.168.233.21

--52--修改,设置从服务器的名slave1

--55--修改,设置从服务器1的地址

192.168.233.22

--58--复制上面6行粘贴,设置从服务器2的名slave2和地址

192.168.233.23

--65行--修改

--71行--修改

slave1,slave2

启动Amoeba软件:

/usr/local/amoeba/bin/amoeba start &

查看8066端口是否开启

netstat -anpt | grep java

测试读写分离:

客户端安装 mariadb

yum install -y mariadb-server mariadb

systemctl start mariadb.service

修改三台mysql生成日志文件

最后一行添加:

general_log=ON

general_log_file=/usr/local/mysql/data/mysql_general.log

三台库打开日志

tail -f /usr/local/mysql/data/mysql_general.log

在客户端对表进行写入时三个日志都会有显示

查看表只有一台从库有记录,而且会轮询记录:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

金镂智能——蔡银云 移动建筑的未来

蔡银云&#xff0c;一个有着军旅经历的创业者。在他的创业道路上&#xff0c;曾经历种种困难与挑战&#xff0c;却始终坚守着初心&#xff0c;并愈发深刻地理解到自己应当为社会奉献力量。从最初的追求利润&#xff0c;到后来的承担社会责任&#xff0c;蔡银云的故事中满篇充溢…

后端接口性能优化分析-1

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&…

3DMAX建模基础教程:常用工具补充

在本篇3DMAX建模基础教程中&#xff0c;我们将为您介绍一些常用的工具及其功能。熟练掌握这些工具将大大提高您的建模效率。 1️⃣ 选择与变换工具 选择工具&#xff1a;帮助您选择对象&#xff0c;可以通过单击对象或按组选择。 变换工具&#xff1a;对选定的对象进行移动、…

XMind 2023 mac/win:引领思维导图革命,让思维更直观、更高效!

XMind是一款引领思维导图的革命性软件&#xff0c;以其强大的功能和高效的操作体验&#xff0c;赢得了全球用户的广泛喜爱。作为一款思维导图软件&#xff0c;XMind将复杂的思维过程和想法以直观、清晰的方式呈现出来&#xff0c;让用户能够更好地理解、组织和表达自己的思想。…

如何禁止谷歌浏览器Google Chrome自动更新?

Windows系统&#xff1a; 按下Win R键&#xff0c;打开“运行”对话框&#xff1b;在对话框输入“services.msc”&#xff0c;并按下Enter键或者“确定”按钮。 在服务列表中找到“Google 更新服务”。 右键单击该服务&#xff0c;选择“属性”&#xff0c;将“启动类型”更改…

SpringBoot从零到一项目实战落地博客系统(附源码!!!)

1.项目内容 1.1.页面展示 1.2.博客分类 1.3.面试辅导 1.4.私教带徒 1.5.文章编辑 1.6.后台管理 2.项目架构及技术描述 2.1.本项目用到的技术和框架 项目构建&#xff1a;Mavenweb框架&#xff1a;Springboot数据库ORM&#xff1a;Mybatis数据库连接池&#xff1a; HikariCP分…

软件测试行业趋势分析

1 绪论 本文先对互联网对时代和社会变革进行了论述&#xff0c;然后再由互联网时代对软件工业模式变革进行了介绍&#xff0c;最后引出附属于软件工业的测试行业在新形势下的需求变化&#xff0c;并对趋势进行了分析&#xff0c;并最终给出了相关的从业人员的职业发展建议。 …

【极客时间-系列教程】Vim 实用技巧必知必会-更多常用命令:应对稍复杂的编辑任务

文章目录 更多常用命令&#xff1a;应对稍复杂的编辑任务光标移动文本修改文本对象选择 更多常用命令&#xff1a;应对稍复杂的编辑任务 几个基本的命令已经了解了&#xff0c;可以操作简单的任务&#xff0c;但一些很复杂的命令&#xff0c;并没有了解到&#xff0c;只知道几…

Freeswitch实现坐席状态

1.呼叫中心的坐席状态 官网地址&#xff1a;mod_callcenter | FreeSWITCH Documentation 2.对应关系 登儒&#xff1a;login 》 Login&#xff08;暂时没有这个明确&#xff0c;调用下面方法不过没有事件返回&#xff0c;可以用Onbreak代替&#xff09; EslMessage eslMessag…

SNMP监控解决方案

简单网络管理协议&#xff08;SNMP&#xff09;是一种网络协议&#xff0c;可帮助在设备之间传输数据&#xff0c;从而管理和监控互联网协议网络中存在的设备。网络连接着一系列设备&#xff0c;随着技术趋势的发展&#xff0c;新设备被引入其中。 网络上的大多数设备都支持网…

AI创作系统ChatGPT源码+AI绘画系统+支持OpenAI DALL-E3文生图,可直接对话文生图

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。新增支…

java中常见的设计模式

最早概念是在建筑领域产生的&#xff0c;后来被引入到软件开发领域。 模式是解决一类问题的固定写法&#xff0c;一个模式用来解决一种问题&#xff0c;经过反复优化&#xff0c;最终得出来的。之前的程序员们&#xff0c;在工作中对某一类问题解决方式进行总结归纳&#xff0…

【java学习—十四】Class类(2)

文章目录 1. Class类2. Class类的常用方法3. 实例化Class类对象&#xff08;四种方法&#xff09; 1. Class类 在 Object 类中定义了以下的方法&#xff0c;此方法将被所有子类继承&#xff1a; public final Class getClass() 以上的方法返回值的类型是一个 Class 类&#xf…

负载均衡原理

负载均衡原理是什么&#xff1f; 负载均衡Load Balance&#xff09;是高可用网络基础架构的关键组件&#xff0c;通常用于将工作负载分布到多个服务器来提高网站、应用、数据库或其他服务的性能和可靠性。负载均衡&#xff0c;其核心就是网络流量分发&#xff0c;分很多维度。 …

修炼k8s+flink+hdfs+dlink(七:flinkcdc)

一 &#xff1a;flinkcdc官网链接。 https://ververica.github.io/flink-cdc-connectors/release-2.1/content/about.html 二&#xff1a;在flink中添加jar包。 在flink lib目录下增加你所需要的包。 https://kdocs.cn/join/gv467qi?f101 邀请你加入共享群「工作使用重要工具…

RobotFramework常见问题如何解决 ?

附加-问题解决 1. 执行robot用例的时候提示WebDriverException: Message: invalid argument: cant kill an exited process 查看驱动的log是否是提示 如果是的话&#xff0c;参照第七步安装图形界面 2. jenkins启动后发现打不开jenkins页面的问题解决 打开jenkins页面提…

CNN进展:AlexNet、VGGNet、ResNet 和 Inception

一、说明 对于初学者来说&#xff0c;神经网络进展的历程有无概念&#xff1f;该文综合叙述了深度神经网络的革命性突破&#xff0c;从AlexNet开始&#xff0c;然后深度VGG的改进&#xff0c;然后是残差网络ResNet和 Inception&#xff0c;如果能讲出各种特色改进点的和改进理由…

Springboot监控

1. 监控的理解 什么是监控&#xff1f;就是通过软件的方式展示另一个软件的运行情况&#xff0c;运行的情况则通过各种各样的指标数据反馈给监控人员。例如网络是否顺畅、服务器是否在运行、程序的功能是否能够整百分百运行成功&#xff0c;内存是否够用&#xff0c;等等等等。…

Jordan 引理

See https://wuli.wiki/online/JdLem.html#ex_JdLem_1

嵌入式工作岗位未来会不会越来越少?

今日话题&#xff0c;嵌入式工作岗位未来会不会越来越少&#xff1f;未来的嵌入式岗位机会将会逐渐增多&#xff0c;因为嵌入式技术是万物互联的基础&#xff0c;从智能手表到智能汽车&#xff0c;嵌入式都扮演着关键角色。虽然相比计算机科学CS&#xff0c;嵌入式领域的天花板…