首页 > 数据库 >读写分离---mysql的主主结构和主从架构

读写分离---mysql的主主结构和主从架构

时间:2023-08-31 15:22:27浏览次数:47  
标签:主主 text marks --- state mysql nodes type id

前言:

为什么要对mysql做优化?     因为数据都来源于数据库,如果数据库慢了,无论是多线程、各种识别模式优化还是很慢,因为查sql就很慢。     官方说法:单表2000万数据,增删改查就到达瓶颈了。所以为了保证查询效率,得让每张表的大小得到控制。  

Mysql架构:

实际生产过程中,查询业务更多,增删改中也包含查询。

双主架构:

两个主都负责增删改查。 如果有1000w个请求,就会让1000w分流,给两个主各分500w,且两主之间做数据同步。即两主数据库增删改查后数据同步,查询随便走哪个。
  • 实现方式:
    • mysql官方支持两主架构,在搭建二主架构的时候,修改mysql配置文件,数据就能自动同步
    • 双写:代码中写完主1,再写主2
  • 双主架构一般不怎么用:双主架构只是将负载进行了均分,如果更新频繁的话,这两个服务器压力都会很大。
0

主从架构

主节点负责增删改,从节点负责查。可以将大量请求的查询操作均摊到多个服务器里。
  • 实现方式
    • mysql官方支持主从架构,在主服务器配置从服务器的ip端口...,主服务器一旦有增删改操作,会自动同步到从节点。
    • 从节点只允许查,别的操作会报错。
  • 主从数据同步原理:监听binlog日志
  • 优点:
    • 一主多从:主节点负责增删改,从节点负责查。这种方式使用最多,不仅限于高并发,许多生产环境都会采用。如果在双主架构中,一个主节点宕机,另一个主节点也就宕了。但在主从架构中,有一个“选举制“,如果主节点宕机,从节点会自动晋升到主,代替原来主节点的工作(高可用),当宕机主节点重新启用时,他就变成了从。
    • ===>保证服务高可用,避免单点故障,同时提高了性能。
0 0
  • 缺点:
    • 0、在分布式系统中,要么满足CP,要么满足AP。
      • CAP理论:Consistency(一致性)、Availability(可用性)、Partition tolerance(分区容忍性); 如果要实现CP,就不能保证高可用,如果要实现AP就不能保证一致性。三者之间不能同时存在。
    • 1、不能满足强一致性,如果主节点刚新增一条数据,但还未向从库同步,他就宕机了,从节点晋升为主节点后则会丢失这条数据。
      • ==>解决:主节点入库时可以选择入库方式:a、主节点落库以后,不管从节点有没有同步,直接返回sql执行成功;b、主节点落库以后,所有从节点都完成同步才返回sql执行成功,当有一个从节点落库失败返回执行失败。(b策略可以满足一致性,但很慢)
    • 2、有可能造成同步延时问题。
      • 例如:新下单立马去查看列表,由于主从库还未同步 有可能没有订单记录。
      • 例如:退款后立马查看订单状态还是购买成功状态,由于主库还未向从库同步。
      • ==>解决:可以采用分布式全局锁的形式。 退完款在redis里边放一个锁,等到查询的时候发现退款是false,但redis内是有锁的,我们就知道用户已退款只是从库还未同步,就可以给用户返回“后台正在处理,请稍后重试!”。(redis没有事务)
  主从架构只能缓解查询压力,但解决不了表大小的问题。 于是 ----> 拆表 ----> 5000w数据 ----> 3个2000w ----> 多主多从 0 怎么实现?:程序在入库或查询之前先计算出来应该走哪个库。如果走的是主1库,那么我的增删改就在主1库查询。   如果数据量更大,例如有10亿,拆成10个库有点不现实。所以采用“冷热分离”。     虽然我有10亿数据,比如订单表、聊天记录,但两年前的订单或者两年前的聊天记录 都不会看,所以使用冷热数据分离。     如果冷数据占比较多,那么冷数据就单独存起来。热点数据还是用mysql(主从...)。冷数据查的慢点没关系。       如果订单表不存在关联表关系,只存放订单的创建时间、购买的什么商品、单价、交易时间.....,就可以无脑把数据扔到es中。     对于es来说,在海量数据下,查询性能较mysql高得多。在官方文档里描述,1PB的数据,秒级响应。1PB=1024TB=1024*1024GB。但内存占得多。       但这么说es并不能替代mysql,mysql有一个天生的优势就是事务。mysql是关系型数据库,es更像是一种单表查询。    

标签:主主,text,marks,---,state,mysql,nodes,type,id
From: https://www.cnblogs.com/nliu/p/17669653.html

相关文章

  • Kafka - 生产者 - 压缩算法
    总结1.Producer端压缩、Broker端保持、Consumer端解压缩。2.开启压缩的最佳实践:Producer端完成的压缩,那么启用压缩的一个条件就是Producer程序运行机器上的CPU资源要很充足。如果你的环境中带宽资源有限,那么我也建议你开启压缩。如果你的机器CPU资源有很多富余,强烈......
  • 无涯教程-Android - EditText函数
    EditText是TextView的覆盖层,该覆盖层将自身配置为可编辑的。它是TextView的预定义子类,其中包含丰富的编辑功能。EditText-属性以下是与EditText控件相关的重要属性。您可以查看Android官方文档以获取属性的完整列表以及可以在运行时更改这些属性的相关方法。继承自android.......
  • 更适合程序员宝宝的行测攻略(二 - 数量关系)
    数量关系等差数列求和公式:(上底+下底)×高/2=平均数×高=n×首项+(n(n-1))/2×公差通项公式:首项+(n-1)×公差某水果种植特色镇创办水果加工厂,从去年年初开始通过电商平台销售桃汁、橙汁两种产品。从去年2月开始,每个月桃汁的销量都比上个月多5000盒,橙汁的销量都比上个月......
  • Kafka-基础
    1.简介Kafka(ApacheKafka)是一种分布式流数据平台,最初由LinkedIn开发,并于后来捐赠给Apache软件基金会,成为了一个Apache顶级项目。它被设计用于处理大规模、实时的数据流,并为构建高吞吐量、容错性强的数据流应用程序提供支持。Kafka的特点使得它在日志收集、实时处理、事件驱动架......
  • C# - 多播委托 125
    C#-多播委托125首发2023-08-0705:23·源丁编程#头条创作挑战赛#C#多播委托(委托链)是一种特殊的委托类型,特殊在可以将多个相同签名的方法绑定到同一个委托实例上,调用委托实例时会一次性触发所有绑定的方法多播委托使用特殊的加法和减法运算符来进行方法绑定和解绑操作;......
  • 2023-08-31 js 判断内容有值才运行 ==》if (!!str) {//内容有值则运行}
    一般新手判断一个值是否不为null且不为undefined且不为空都会这样写str!=''&&str!=undefined&&str!=null或者str!==''&&typeof(str)!==undefined&&str!==null其实有一种简洁高效的写法就是2个!组成,即!!str。如:if(!!str){//内容......
  • ORA-01861
    一般是传参给sql时,传递的日期格式和Orcale的日期格式比较报错。比如:你想拿参数和数据表中字段(该字段属性是时间类型的)值作比较,whereA表.该字段=参数。to_date(参数,'YYYY-MM-DD')直接转是不行的,得先to_char(参数,'YYYY-MM-DD')格式化一下。所以你可以写成这样:to_date(to_cha......
  • el-input出发回车事件时会导致页面刷新
    原因分析:当表单只有一个文本框时,按下回车将会触发表单的提交事件,导致页面的刷新。1:el-input上使用回车事件<el-inputv-model="input"@keyup.enter.native="search1">解决方法一:在el-form表单加上@submit.native.prevent<el-form@submit.native.prevent><el-inputv-......
  • centos 安装 docker-compose 的快速简单办法
    直接使用yuminstalldocker-compose 会返回nothingtodo,可以使用pip3来安装安装DockerCompose(1)执行如下命令安装 pip3:yum-yinstallpython3-pippip3install--upgradepip-ihttps://pypi.tuna.tsinghua.edu.cn/simple (2)执行如下命令安装 docker-compose:......
  • mysql基础
    --创键数据库test(如果不存在)CREATEDATABASEIFNOTEXISTStest--删除数据库test(如果存在)DROPDATABASEIFEXISTStest--使用该数据库USEschool--表名或字段名是特殊字符用``包含(tab键上......