- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前将 haproxy 配置为对一组 mysql 服务器进行负载平衡和故障转移。我有一个为写入事务配置的后端,如下所示:
backend pool_mysql_write
timeout connect 10s
timeout server 1m
mode tcp
option mysql-check user haproxy_check
server primary <primary_node>:3306 check fastinter 1000
server secondary <secondary_node>:3306 check fastinter 1000 backup
“备份”指令的存在,以便所有写入仅转到主数据库节点,并且仅在主数据库出现故障时才会故障转移到辅助数据库节点。
编辑:数据库节点处于主-主复制模式。
我的问题是,当 haproxy 故障转移到辅助数据库节点时,正在进行的 mysql 写入查询会发生什么?例如,如果 haproxy 需要 5 秒才能提升辅助数据库节点进行写入,那么在 5 秒故障转移时间内可能尝试写入数据库的所有写入查询会发生什么情况?
它们就这样消失了吗?它们是否会在某个地方排队,以便在辅助数据库节点升级后可以提交它们?
最佳答案
当(由客户端)启动到 haproxy 的新 TCP 连接时,它会依次打开到上游服务器的新 TCP 连接。一旦建立了上游 TCP 连接,haproxy 就会将这些 TCP 连接连接在一起,来回中继通信。
如果其中一个 TCP 连接(即它与客户端之间的连接,或者与上游服务器之间的连接)断开,haproxy 只会断开另一个连接,换句话说,haproxy 不会切换现有到备用服务器的 TCP 连接(它只是重定向新连接)。交易对手负责决定下一步做什么。 (为了更智能的方法,您需要像 MariaDB MaxScale 这样的第 7 层代理,它可以重新路由现有连接)。
通常,如果其连接意外断开,客户端将尝试重新连接(此时 haproxy 可能最终将其与不同的上游服务器连接,例如,因为原始服务器不再可用)。
问题是,如果客户端向原始服务器发送了命令,导致其状态发生变化怎么办?
如果客户端在连接断开之前收到提交确认,那么客户端将了解其写入已被提交。因此,您必须确保 primary
不会确认提交,直到写入已复制到 secondary
- 这就是为什么我在上面询问您如何执行该复制:至少,您想要Semisynchronous Replication :
MySQL replication by default is asynchronous. The master writes events to its binary log but does not know whether or when a slave has retrieved and processed them. With asynchronous replication, if the master crashes, transactions that it has committed might not have been transmitted to any slave. Consequently, failover from master to slave in this case may result in failover to a server that is missing transactions relative to the master.
Semisynchronous replication can be used as an alternative to asynchronous replication:
[ deletia ]While the master is blocking (waiting for acknowledgment from a slave), it does not return to the session that performed the transaction. When the block ends, the master returns to the session, which then can proceed to execute other statements. At this point, the transaction has committed on the master side, and receipt of its events has been acknowledged by at least one slave.
如果客户端在连接断开之前未收到提交确认,则客户端应假设写入未提交并进行相应处理 - 例如建立新连接后重新尝试事务。
但是,有可能,primary
实际上已经提交了写入(并且确实将它们复制到secondary
),但就在之前失败了它发送了提交确认,或者它发送了提交确认但在客户端收到之前连接失败。我认为对此我们无能为力(请发表评论?),但风险非常小(因为在完成提交和发送确认之间没有发生任何处理)。
关于mysql - 在 haproxy 中写入故障转移期间,正在进行的 mysql 事务会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35806514/
如果我将我的个人 repo 转移到一个组织(由我创建),我将失去所有 见解 例如来自原始 Repo 的流量历史记录、拉取请求、贡献者、 fork 等? 最佳答案 拉取请求被保留:参见“About re
如何为解析 if-then[-else] 案例制定正确的规则?这是一些语法: { module TestGram (tparse) where } %tokentype { String }
如何为解析 if-then[-else] 案例制定正确的规则?这是一些语法: { module TestGram (tparse) where } %tokentype { String }
我读过有关mutex的信息,这些信息由线程拥有,并且只能由拥有的线程使用。在this answer中,该解决方案建议每个进程在发出互斥信号之前,必须拥有互斥锁的所有权。我必须在这里承认自己的愚蠢,不知
我只能从回调函数之一中想到 curl_close() 。 但是 php 抛出了一个警告: PHP 警告:curl_close():尝试从回调中关闭 cURL 句柄。 任何想法如何做到这一点? 最佳答案
带有冲突的语法的精简版本: body: variable_list function_list; variable_list: variable_list variable | /* empty
我创建了新的开发者帐户,然后将应用程序转移到新帐户。然后我在新帐户下创建了相同的标识符。并构建App并上传到AppStore。 I have got the warning with WARNING
我想像这样管理类主任的所有 Activity : 此外所有 Activity 都扩展基本 Activity 以使用公共(public) View 。 在这种情况下,我想处理传输 Activity ,例
使用 C 中的简单链表实现,我如何告诉 Splint 我正在转让 data 的所有权? typedef struct { void* data; /*@null@*/ void* ne
请参阅以下 yacc 代码。如果我删除生产因素:'!' expr,解析冲突消失。这里发生了什么? %{ #include #include %} %token TRUE %token FALSE
是否可以将 props 向下传输到子组件,其中 { ..this.props } 用于更简洁的语法,但是排除某些 props,如 className 或 id? 最佳答案 您可以使用解构来完成这项工作
如果我有以下数据框: date A B M S 20150101 8 7 7.5 0 20150101 10 9 9
我需要将一个 __m128i 变量(比如 v)移动 m 位,以便位移动所有变量(因此,结果变量表示 v*2^m)。执行此操作的最佳方法是什么?! 请注意 _mm_slli_epi64 分别移动 v0
我需要这样调用我的程序: ./program hello -r foo bar 我从 argv[1] 中打招呼,但我在使用值 bar 时遇到问题,我是否也应该将“r:”更改为其他内容? while((
我是新来的 Bison我在转换/减少冲突方面遇到了麻烦...我正在尝试从文件加载到 array data[] : struct _data { char name[50]; char sur
当然有很多关于解决移位/归约错误的文档和方法。 Bison 文档建议正确的解决方案通常是%期待它们并处理它。 当你遇到这样的事情时: S: S 'b' S | 't' 您可以像这样轻松解决它们: S:
我有以下(大量精简的)快乐语法 %token '{' { Langle } '}' { Rangle } '..' { DotDot } '::' { ColonC
我的 Bison 解析器中有很多错误,即使它运行良好,我也想了解这些冲突。代码如下: 词法分析器: id ([[:alpha:]]|_)([[:alnum:]]|_)* %% {id
在我的项目中,我有这样的情况,一个 Activity 应该将值(value)转移到另一个 Activity 。并且根据这个值应该选择需要的菜单元素。我试图在 bundle 的帮助下做到这一点,但我不知
我一直在阅读 NSIndexPaths 以获得 uitableviews 等。但是我很难操纵现有的索引路径。 我想在保留行的同时采用现有的索引路径递增/移动每个部分。因此 indexPath.sect
我是一名优秀的程序员,十分优秀!