from:https://www.infoq.cn/article/orvjbfycnrito5qiyfhf
前言


学习一个知识之前,我觉得比较好的方式是先理解它的来龙去脉:即这个知识产生的过程,它解决了什么问题,它是怎么样解决的,还有它引入了哪些新的问题(没有银弹),这样我们才能比较好的抓到它的脉络和关键点,不会一开始就迷失在细节中。


所以,在学习分布式系统之前,我们需要解决的第一个问题是:分布式系统解决了什么问题?


分布式系统解决了什么问题?


第一个是单机性能瓶颈导致的成本问题,由于摩尔定律失效,廉价 pc 机性能的瓶颈无法继续突破,小型机和大型机能提高更高的单机性能,但是成本太大高,一般的公司很难承受;


第二个是用户量和数据量爆炸性的增大导致的成本问题,进入互联网时代,用户量爆炸性的增大,用户产生的数据量也在爆炸性的增大,但是单个用户或者单条数据的价值其实比软件时代(比如银行用户)的价值是只低不高,所以必须寻找更经济的方案;


第三个是业务高可用的要求,对于互联网的产品来说,都要求 7 * 24 小时提供服务,无法容忍停止服务等故障,而要提供高可用的服务,唯一的方式就是增加冗余来完成,这样就算单机系统可以支撑的服务,因为高可用的要求,也会变成一个分布式系统。


基于上面的三个原因可以看出,在互联网时代,单机系统是无法解决成本和高可用问题的,但是这两个问题对几乎对所有的公司来说都是非常关键的问题,所以,从单机系统到分布式系统是无法避免的技术大潮流。


分布式系统是怎么来解决问题的?


那么,分布式系统是怎么来解决单机系统面临的成本和高可用问题呢?


其实思路很简单,就是将一些廉价的 pc 机通过网络连接起来,共同完成工作,并且在系统中提供冗余来解决高可用的问题。


分布式系统引入了哪些新的问题?


我们来看分布式系统的定义:分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。在定义中,我们可用看出,分布式系统它通过多工作节点来解决单机系统面临的成本和可用性问题,但是它引入了对分布式系统内部工作节点的协调问题。


我们经常说掌握一个知识需要理解它的前因后果,对于分布式系统来说,前因是「分布式系统解决了什么问题」,后果是「它是怎么做内部工作节点的协调」,所以我们要解决的第二个问题是:分布式系统是怎么做内部工作节点协调的?


分布式计算引入了哪些新的问题?


先从简单的情况入手,对于分布式计算(无状态)的情况,系统内部的协调需要做哪些工作:


1.怎么样找到服务?


在分布式系统内部,会有不同的服务(角色),服务 a 怎么找到服务 b 是需要解决的问题,一般来说服务注册与发现机制是常用的思路,所以可以了解一下服务注册发现机制实现原理,并且可以思考服务注册发现是选择做成 ap 还是 cp 系统更合理(严格按 cap 理论说,我们目前使用的大部分系统很难满足 c 或者 a 的,所以这里只是通常意义上的 ap 或者 cp);


2.怎么样找到实例?


找到服务后,当前的请求应该选择发往服务的哪一个实例呢?一般来说,如果同一个服务的实例都是完全对等的(无状态),那么按负载均衡策略来处理就足够(轮询、权重、hash、一致性 hash,fair 等各种策略的适用场景);如果同一个服务的实例不是对等的(有状态),那么需要通过路由服务(元数据服务等)先确定当前要访问的请求数据做哪一个实例上,然后再进行访问。


3.怎么样避免雪崩?


系统雪崩是指故障的由于正反馈循序导致不断扩大规则的故障。一次雪崩通常是由于整个系统中一个很小的部分出现故障于引发,进而导致系统其它部分也出现故障。比如系统中某一个服务的一个实例出现故障,导致负载均衡将该实例摘除而引起其它实例负载升高,最终导致该服务的所有实例像多米诺骨牌一样一个一个全部出现故障。


避免雪崩总体的策略比较简单,只要是两个思路,一个是快速失败和降级机制(熔断、降级、限流等),通过快速减少系统负载来避免雪崩的发生;另一个为弹性扩容机制,通过快速增加系统的服务能力来避免雪崩的发生。这个根据不同的场景可以做不同的选择,或者两个策略都使用。


一般来说,快速失败会导致部分的请求失败,如果分布式系统内部对一致性要求很高的话,快速失败会带来系统数据不一致的问题,弹性扩容会是一个比较好的选择,但是弹性扩容的实现成本和响应时间比快速失败要大得多。


4.怎么样监控告警?


对于一个分布式系统,如果我们不能很清楚地了解内部的状态,那么高可用是没有办法完全保障的,所以对分布式系统的监控(比如接口的时延和可用性等信息),分布式追踪 trace,模拟故障的混沌工程,以及相关的告警等机制是一定要完善的;


分布式存储引入了哪些新的问题?


接下来我们再来看分布式存储(有状态)的内部的协调是怎么做的,同时,前面介绍的分布式计算的协调方式在分布式存储中同样适用,就不再重复了:


1.分布式系统的理论与衡权


acid、base 和 cap 理论,了解这三个主题,推荐这一篇文章以及文章后面相关的参考文献:


英文版本:


中文版本:


2.怎么样做数据分片?


单机的存储能力是不可能存储所有的数据的,所以需要解决怎么将数据按一定的规则分别存储到不同的机器上,目前使用比较多的方案为:hash、consistent hash 和 range based 分片策略,可以了解一下它们的优缺点和各自的应用场景;


3.怎么样做数据复制?


为什么满足系统的高可用要求,需要对数据做冗余处理,目前的方案主要为:中心化方案(主从复制、一致性协议比如 raft 和 paxos 等)和 去中心化的方案(quorum 和 vector clock)了解一下它们的优缺点和各自的应用场景,以及对系统外部表现出来的数据一致性级别(线性一致性、顺序一致性、最终一致性等);


4.怎么样做分布式事务?


对于分布式系统来说,要实现事务,首先需要有对并发事务进行排序的能力,这样在事务冲突的时候,确认哪个事务提供成功,哪个事务提交失败。对于单机系统来说这个完全不是问题,简单通过时间戳加序号的方式就可以实现,但是对于分布式系统来说,系统中机器的时间不能完全同步,并且单台机器序号也没用全局意义,按上面的方式说行不通的。不过整个系统选一台机器按单机的模式生产事务 id 是可以的,同城多中心和短距离的异地多中心都没有问题,不过想做成全球分布式系统的话,那么每一次事务都要去一个节点去获取事务 id 的成本太高(比如中国杭州到美国东部的 rtt 为 200 ms ),google 的 spanner 是通过 gps 和原子钟实现 truetime api 来解决这个问题从而实现全球分布式数据库的。


有了事务 id 后,通过 2pc 或者 3pc 协议来实现分布式事务的原子性,其他部分和单机事务差别不大,就不再细说来。


进阶学习阶段


到这里,对分布式系统脉络上有了基本的概念,接下来开始进入细节学习阶段,这也是非常幸苦的阶段,对于分布式系统的理解深入与否,对细节的深入度是很重要的评价指标,毕竟魔鬼在细节。这里可以往两个方面进行系统的学习:


1.从实践出发


研究目前比较常用的分布式系统的设计,hdfs 或者 gfs(分布式文件系统)、kafka 和 pulsar(分布式消息队列),redis cluster 和 codis(分布式缓存),mysql 的分库分表(传统关系型数据库的分布式方案),mongodb 的 replica set 和 sharing 机制集以及去中心化的 cassandra(nosql 数据库),中心化的 tidb 和去中心化的 cockroachdb(newsql),以及一些微服务框架等;


2.从理论出发


从理论出发,研究分布式相关的论文,这里推荐一本书「designing data-intensive applications」(中文版本:数据密集型应用系统设计),先整体看书,对比较感兴趣的章节,再读一读该章节中涉及到的相关参考文献。


总结


本文从分布式系统解决的问题开始,再讨论它是怎么样来解决问题的,最后讨论了它引入了哪些新的问题,并且讨论这些新问题的解决办法,这个就是分布式系统大概的知识脉络。掌握这个知识脉络后,那么就可以从实践和理论两个角度结合起来深入细节研究分布式系统了。


参考






posted @ 2020-11-26 16:20 小马歌 阅读(165) | 评论 (0)编辑 收藏
     摘要: from:https://www.huxiu.com/article/351920.html本文来自微信公众号: 鲜枣课堂(id:xzclasscom),作者:小枣君,题图来自:视觉中国大家好,我是小枣君。今天我们来聊聊基带和射频。说起基带和射频,相信大家都不陌生。它们是通信行业里的两个常见概念,经常出现在我们面前。不过,越是常见的概念,网上的资料就越混乱,错误也就越多。这些错误给很多初...  阅读全文
posted @ 2020-11-24 10:41 小马歌 阅读(363) | 评论 (0)编辑 收藏
from:https://mp.weixin.qq.com/s/s-auc_ids5geamrwx286mq


随着紫光展锐、asr 等芯片厂商发布性价比更高的 cat.1 芯片之后,cat.1 模组厂商扎堆发布了自家的模组,
使得市场上的 cat.1 模组价格已经迅速降至 45-60 元,玩家众多,竞争惨烈,基本重走 nb-iot 的老路 —— 量未起,价已跌。

cat.1 芯片原厂:

  • 高通 mdm9207-1(2016 年发布)

  • 紫光展锐春藤 8910dm(28nm工艺,集成蓝牙和wifi 室内定位)

  • 翱捷 asr3601

cat.1 模组厂商(不完全统计):

  • 中移物联网

  • 移远通信

  • 合宙电子

  • 移柯通信

  • 域格信息

  • 广和通

  • 芯讯通

  • 高新兴物联

  • 美格智能

  • 有方科技

  • 有人信息

  • 信位通讯

  • 锐骐(厦门)电子

  • 深圳信可通讯

cat.1 优势

  • 相对 nb-iot,其通信速率优势明显

  • 相对 emtc,其网络成本低

  • 相对 cat.4,其具有一定的成本优势

cat.1 劣势:

  • 现阶段芯片厂家少

    国外以高通为主,辅以 sequans、altair。

    国内主要是展锐和翱捷。

  • 现阶段价格偏高

    nb-iot、cat.1、cat.4 模组价格:


cat1 的主要市场和应用场景:

cat.1 仍处于商用初期,落地的应用场景和案例还较少,一些明确的场景包括了共享、金融支付、工业控制、车载支付、公网对讲、pos 等等。

总结

工信部办公厅发布了《关于深入推进移动物联网全面发展的通知》(以下简称《通知》)同时为 nb-iot 和 cat.1 站台,未来 nb-iot 依旧很香,cat.1 则前途大好。

随着新基建的启动,5g 打头,未来将是 nb-iot、4g(包括 cat.1)、5g 共同承载蜂窝物联网的连接,以应对不同层次的物联网业务需求。

posted @ 2020-11-06 14:36 小马歌 阅读(193) | 评论 (0)编辑 收藏
from:https://www.cnblogs.com/schips/p/12262587.html


背景

qos 等级 与 通信的流程有关,直接影响了整个通信。而且篇幅比较长,所以我觉得应该单独拎出来讲一下。

概念

qos 代表了 服务质量等级。 设置上,由2 位 的二进制控制,且值不允许为 3(0x11)。

qos值bit 2bit 1描述
000最多分发一次
101至少分发一次
210只分发一次
-11保留位

要注意的是,qos 是 sender 和 receiver 之间达成的协议,不是 publisher 和 subscriber 之间达成的协议。

也就是说 publisher 发布一条 qos1 的消息,只能保证 broker 能至少收到一次这个消息;至于对应的 subscriber 能否至少收到一次这个消息,还要取决于 subscriber 在 subscribe 的时候和 broker 协商的 qos 等级。

这里又牵扯出一个概念:"qos 降级":在 mqtt 协议中,从 broker 到 subscriber 这段消息传递的实际 qos 等于 "publisher 发布消息时指定的 qos 等级和 subscriber 在订阅时与 broker 协商的 qos 等级,这两个 qos 等级中的最小那一个。"

qos 0 的通信时序图

此时,整个过程中的 sender 不关心 receiver 是否收到消息,它"尽力"发完消息,至于是否有人收到,它不在乎。

发布者服务器订阅者publish (qos0,msg-a)publish(qos0,msg-a)delete msg-a发布者服务器订阅者qos 0:at most one(fire and forget)

qos1 的通信时序图

此时,sender 发送的一条消息,receiver 至少能收到一次,也就是说 sender 向 receiver 发送消息,如果发送失败,会继续重试,直到 receiver 收到消息为止,但是因为重传的原因,receiver 有可能会收到重复的消息;

发布者服务器订阅者store (msg-a)publish (qos1,msg-a)store (msg-a)publish (qos1,msg-a)puback (qos1)delete (msg-a)puback (qos1,msg-a)delete (msg-a)发布者服务器订阅者qos 1:at least one

1)sender 向 receiver 发送一个带有消息数据的 publish 包, 并在本地保存这个 publish 包。

2)receiver 收到 publish 包以后,向 sender 发送一个 puback 数据包,puback 数据包没有消息体(payload),在可变头中(variable header)中有一个包标识(packet identifier),和它收到的 publish 包中的 packet identifier 一致。

3)sender 收到 puback 之后,根据 puback 包中的 packet identifier 找到本地保存的 publish 包,然后丢弃掉,一次消息的发送完成。

4)如果 sender 在一段时间内没有收到 publish 包对应的 puback,它将该 publish 包的 dup 标识设为 1(代表是重新发送的 publish 包),然后重新发送该 publish 包。重复这个流程,直到收到 puback,然后执行第 3 步。

qos 2 的通信时序图

qos2 不仅要确保 receiver 能收到 sender 发送的消息,还要保证消息不重复。它的重传和应答机制就要复杂一些,同时开销也是最大的。

sender 发送的一条消息,receiver 确保能收到而且只收到一次,也就是说 sender 尽力向 receiver 发送消息,如果发送失败,会继续重试,直到 receiver 收到消息为止,同时保证 receiver 不会因为消息重传而收到重复的消息。

发布者服务器订阅者store (msg-a)publish (qos2,msg-a,dup=0)store (msg-a)pubrec (qos2,msg-a)pubrel (qos2,msg-a)publish (qos2,msg-a,dup=0)pubcomp (qos2,msg-a)delete (msg-a)store (msg-a)pubrec (qos2,msg-a)pubrel (qos2,msg-a)notify (msg-a)pubcomp (qos2,msg-a)delete (msg-a)delete (msg-a)发布者服务器订阅者qos 2:exactly one

qos 使用 2 套请求/应答流程(一个 4 段的握手)来确保 receiver 收到来自 sender 的消息,且不重复:

1)sender 发送 qos 为 2 的 publish 数据包,数据包 packet identifier 为 p,并在本地保存该 publish 包;

2)receiver 收到 publish 数据包以后,在本地保存 publish 包的 packet identifier p,并回复 sender 一个 pubrec 数据包,pubrec 数据包可变头中的 packet identifier 为 p,没有消息体(payload);

3)当 sender 收到 pubrec,它就可以安全地丢弃掉初始的 packet identifier 为 p 的 publish 数据包,同时保存该 pubrec 数据包,同时回复 receiver 一个 pubrel 数据包,pubrel 数据包可变头中的 packet identifier 为 p,没有消息体;如果 sender 在一定时间内没有收到 pubrec,它会把 publish 包的 dup 标识设为 1,重新发送该 publish 数据包(payload);

4)当 receiver 收到 pubrel 数据包,它可以丢弃掉保存的 publish 包的 packet identifier p,并回复 sender 一个 pubcomp 数据包,pubcomp 数据包可变头中的 packet identifier 为 p,没有消息体(payload);

5)当 sender 收到 pubcomp 包,那么它认为数据包传输已完成,它会丢弃掉对应的 pubrec 包。如果 sender 在一定时间内没有收到 pubcomp 包,它会重新发送 pubrel 数据包。

我们可以看到在 qos2 中,完成一次消息的传递,sender 和 reciever 之间至少要发送四个数据包,qos2 是最安全也是最慢的一种 qos 等级了。

qos 和会话(session)

客户端的会话状态包括:

  • 已经发送给服务端,但是还没有完成确认的qos 1和qos 2级别的消息
  • 已从服务端接收,但是还没有完成确认的qos 2级别的消息。

服务端的会话状态包括:

  • 会话是否存在,即使会话状态的其它部分都是空。
  • 客户端的订阅信息。
  • 已经发送给客户端,但是还没有完成确认的qos 1和qos 2级别的消息。
  • 即将传输给客户端的qos 1和qos 2级别的消息。
  • 已从客户端接收,但是还没有完成确认的qos 2级别的消息。
  • 可选,准备发送给客户端的qos 0级别的消息。

保留消息不是服务端会话状态的一部分,会话终止时不能删除保留消息。

如果 client 想接收离线消息,必须使用持久化的会话(connect报文中可变头(byte8[1])clean session = 0)连接到 broker,这样 broker 才会存储 client 在离线期间没有确认接收的 qos 大于 1 的消息。

qos 等级的选择

在以下情况下你可以选择 qos0

  • client 和 broker 之间的网络连接非常稳定,例如一个通过有线网络连接到 broker 的测试用 client;
  • 可以接受丢失部分消息,比如你有一个传感器以非常短的间隔发布状态数据,所以丢一些也可以接受;
  • 你不需要离线消息。

在以下情况下你应该选择 qos1:

  • 你需要接收所有的消息,而且你的应用可以接受并处理重复的消息;
  • 你无法接受 qos2 带来的额外开销,qos1 发送消息的速度比 qos2 快很多。

在以下情况下你应该选择 qos2:

  • 你的应用必须接收到所有的消息,而且你的应用在重复的消息下无法正常工作,同时你也能接受 qos2 带来的额外开销。

实际上,qos1 是应用最广泛的 qos 等级,qos1 发送消息的速度很快,而且能够保证消息的可靠性。虽然使用 qos1 可能会收到重复的消息,但是在应用程序里面处理重复消息,通常并不是件难事。

posted @ 2020-10-12 14:19 小马歌 阅读(208) | 评论 (0)编辑 收藏
from:
posted @ 2019-03-30 11:44 小马歌 阅读(2353) | 评论 (0)编辑 收藏
     摘要: from:https://www.ibm.com/developerworks/cn/linux/thread/posix_thread1/index.htmlhttps://www.ibm.com/developerworks/cn/linux/thread/posix_thread2/index.htmlhttps://www.ibm.com/developerworks/cn/linux/t...  阅读全文
posted @ 2019-02-16 11:37 小马歌 阅读(198) | 评论 (0)编辑 收藏
     摘要: from:http://www.fanyilun.me/2017/04/20/mysql加锁分析/mysql加锁分析目录前言mysql的锁如何查看事务的加锁情况不同语句的加锁情况1. 查询命中聚簇索引(主键索引)2. 查询命中唯一索引3. 查询命中二级索引(非唯一索引)4. 查询没有命中索引5. 对索引键值有修改6. 插入数据隐式锁一...  阅读全文
posted @ 2019-02-13 17:07 小马歌 阅读(634) | 评论 (0)编辑 收藏

摘要: mysql replace into 错误案例 背景 * mysql5.7 * row模式 * 表结构 create table `test` ( `id` int(10) unsigned not null auto_increment, `col_1` varc

背景

* mysql5.7  * row模式   * 表结构 create table `test` (   `id` int(10) unsigned not null auto_increment,   `col_1` varchar(100) default null,   `col_2` varchar(100) default null,   `col_3` varchar(100) default null,   primary key (`id`),   unique key `col_1` (`col_1`) ) engine=innodb  default charset=utf8 

错误场景一

其他字段value莫名其妙的没了

  • step1 初始化记录
mater:lc> replace into test (col_1,col_2,col_3) values('a','a','a'); query ok, 1 row affected (0.00 sec) --注意,这里是影响了1条记录  master:lc> replace into test (col_1,col_2,col_3) values('b','b','b'); query ok, 1 row affected (0.00 sec) --注意,这里是影响了1条记录  master:lc> replace into test (col_1,col_2,col_3) values('c','c','c'); query ok, 1 row affected (0.00 sec) --注意,这里是影响了1条记录   master > show create table test  | test  | create table `test` (   `id` int(10) unsigned not null auto_increment,   `col_1` varchar(100) default null,   `col_2` varchar(100) default null,   `col_3` varchar(100) default null,   primary key (`id`),   unique key `col_1` (`col_1`) ) engine=innodb auto_increment=4 default charset=utf8 |   mater > select * from test;  ---- ------- ------- -------  | id | col_1 | col_2 | col_3 |  ---- ------- ------- -------  |  1 | a     | a     | a     | |  2 | b     | b     | b     | |  3 | c     | c     | c     |  ---- ------- ------- -------  3 rows in set (0.00 sec)  
  • step2 构造错误场景
master:lc> replace into test(col_1,col_2) values('c','cc'); query ok, 2 rows affected (0.00 sec)  dba:lc> select * from test;  ---- ------- ------- -------  | id | col_1 | col_2 | col_3 |  ---- ------- ------- -------  |  1 | a     | a     | a     | |  2 | b     | b     | b     | |  4 | c     | cc    | null  |  ---- ------- ------- -------  3 rows in set (0.00 sec)  
  • 总结
  1. col_3 的值,从原来的c,变成了null,天呐,数据不见了。 id 也变了。
  2. 用户原本的需求,应该是如果col_1='c' 存在,那么就改变col_2='cc',其余的记录保持不变,结果id,col_3都变化了
  3. 凯发天生赢家一触即发官网的解决方案就是:将replace into 改成 insert into … on duplicate key update

但是你以为这样就完美的解决了吗? 马上就会带来另外一场灾难,请看下面的错误场景

错误场景二

error 1062 (23000): duplicate entry 'x' for key 'primary'

  • step1 初始化记录
 mater:lc> replace into test (col_1,col_2) values('a','a'); query ok, 1 row affected (0.00 sec) --注意,这里是影响了1条记录  master:lc> replace into test (col_1,col_2) values('b','b'); query ok, 1 row affected (0.00 sec) --注意,这里是影响了1条记录  master:lc> replace into test (col_1,col_2) values('c','c'); query ok, 1 row affected (0.00 sec) --注意,这里是影响了1条记录   master > show create table test  | test  | create table `test` (   `id` int(10) unsigned not null auto_increment,   `col_1` varchar(100) default null,   `col_2` varchar(100) default null,   primary key (`id`),   unique key `col_1` (`col_1`) ) engine=innodb auto_increment=4 default charset=utf8 |   slave > show create table test  | test  | create table `test` (   `id` int(10) unsigned not null auto_increment,   `col_1` varchar(100) default null,   `col_2` varchar(100) default null,   primary key (`id`),   unique key `col_1` (`col_1`) ) engine=innodb auto_increment=4 default charset=utf8 |
  • step2 构造错误场景
* master  mater:lc> replace into test (col_1,col_2) values('c','cc'); query ok, 2 rows affected (0.00 sec)  --注意,这里是影响了两条记录  mater:lc> show create table test  | test  | create table `test` (   `id` int(10) unsigned not null auto_increment,   `col_1` varchar(100) default null,   `col_2` varchar(100) default null,   primary key (`id`),   unique key `col_1` (`col_1`) ) engine=innodb auto_increment=5 default charset=utf8 |  master:lc> select * from test  ---- ------- -------  | id | col_1 | col_2 |  ---- ------- -------  |  1 | a     | a     | |  2 | b     | b     | |  4 | c     | cc    |  ---- ------- -------  3 rows in set (0.00 sec)  * slave  slave:lc> show create table test  | test  | create table `test` (   `id` int(10) unsigned not null auto_increment,   `col_1` varchar(100) default null,   `col_2` varchar(100) default null,   primary key (`id`),   unique key `col_1` (`col_1`) ) engine=innodb auto_increment=4 default charset=utf8 |  slave:lc> select * from test  ---- ------- -------  | id | col_1 | col_2 |  ---- ------- -------  |  1 | a     | a     | |  2 | b     | b     | |  4 | c     | cc    |  ---- ------- -------  3 rows in set (0.00 sec) 
  • step3 错误案例产生
* 假设有一天,master 挂了, 由slave 提升为 new mater  原slave:lc> show create table test  | test  | create table `test` (   `id` int(10) unsigned not null auto_increment,   `col_1` varchar(100) default null,   `col_2` varchar(100) default null,   primary key (`id`),   unique key `col_1` (`col_1`) ) engine=innodb auto_increment=4 default charset=utf8 |  原slave:lc> select * from test  ---- ------- -------  | id | col_1 | col_2 |  ---- ------- -------  |  1 | a     | a     | |  2 | b     | b     | |  4 | c     | cc    |  ---- ------- -------  3 rows in set (0.00 sec)   ===注意==  root:lc> replace into test (col_1,col_2) values('d','d'); error 1062 (23000): duplicate entry '4' for key 'primary'  
  • 总结
* row 模式,主从情况下,replace into 和 insert into … on duplicate key update 都会导致以上问题的发生 * 凯发天生赢家一触即发官网的解决方案: 最后可以通过alter table auto_increment值解决,但是这样已经造成mater的表很长时间没有写入了。。。

最后总结

  • replace with unique key
1. 禁止 replace into (错误一,错误二 都会发生) 2. 禁止 insert intoon duplicate key update (错误二 会发生)
  • replace with primary key
1. 禁止 replace into (会发生错误场景一的案例,丢失部分字段数据) 2. 可以使用insert intoon duplicate key update 代替 replace into
posted @ 2018-12-25 19:19 小马歌 阅读(468) | 评论 (0)编辑 收藏
     摘要: from:https://cloud.tencent.com/developer/article/1004475最近研发的项目对 db 依赖比较重,梳理了这段时间使用mysql遇到的8个比较具有代表性的问题,答案也比较偏自己的开发实践,没有 dba专业和深入,有出入的请使劲拍砖!mysql读写性能是多少,有哪些性能相关的配置参数?mysql负载高时,如何找到是由哪些sql引起的?如何针对具体的sq...  阅读全文
posted @ 2018-12-03 15:55 小马歌 阅读(281) | 评论 (0)编辑 收藏
仅列出标题  下一页
 
网站地图