如何给老婆解释什么是 Master-Slave

Posted by ZY on May 24, 2019

一天,阳光明媚,天朗气清,正是春游的好日子。

我在家中躺着看权游,老婆在一旁,翻阅着书架上的书。

和往常一样,她在看到一本技术书时,阅读速度骤降下来,我知道她又要对我进行灵魂拷问了。

小命不保

“嘿,发现了一个现象。”,老婆说,手中拿着的书,是《高性能Mysql》。

“嗯哼。”,我故作镇定。

“你们每本技术书,讲到最后,都要讲一个叫 Master-Slave 的东西。”

“你是说主从?”

“主从是个啥子?”

“主从,emmm,就是… 呃,怎么跟你说呢,这是很简单的概念嘛 … ”

“什么,很简单的概念,你意思是说,这么简单的东西我都不懂咯?”

“呃… ”,我感觉我要跪,仿佛挂在悬崖边上,靠臂力支撑着 ……

自我救赎

我不想今晚跪搓衣板、洗碗、洗衣服,我的权游还没看完。

“是这样的,很多东西嘛,一般人都不懂,但只要懂了,就会觉得很简单,比如说去日本旅游,怎么办签证、怎么坐电车、怎么和日本人沟通,没了解之前,都觉得很难,但一旦做成了,就很简单。”,我在悬崖边缘挣扎。

“嗯哼,是这个道理~”

貌似已经靠着臂力和背阔肌,把自己拉上去了,暂时安全了。

“还记得咱们上次坐高铁去长沙,在深圳北那排队取票吗?”

“记得呀~ ”

“嗯,咱们去取票,售票处那里,有很多个窗口吧,而且有的窗口上写着,只限取票,不能买票。”

“嗯嗯,是有这样的。”

“好,现在我们把这个高铁站售票窗口的模型简化一下,我们假设,一开始,只有一个窗口,既负责售票,又负责取票,你觉得会有什么问题?”

“那会很烦吧,像咱们这种在网上买票,到了那再取票的,估计得取好久。只有一个窗口,全部人都挤在一块了。”

“没错,这是只有一个窗口带来的第一个问题:拥挤。”

“还有别的问题?”

“是的,你想想看,假设负责这个窗口的员工尿急,想去上厕所,或者这个窗口的电脑坏掉了,用不了,怎么办?”

“噢,那这时候就一张票也卖不了,一张票也取不了。”

“嗯嗯,这个叫SPOF,Single Point of Failure,意识是系统里一个节点的故障,导致整个系统都不可用。”

“Soga,长见识了。”

“嗯哼,那么,这时候,假设你是高铁站的站长,你会怎么做?”

“呃,我得请更多的员工,开多几个窗口。”

“没错,我们再加多几个窗口,现在就不怕有哪个窗口,因为员工尿急或者电脑坏掉而不能提供服务了,如果无法服务,让排队的乘客去其他窗口就好了。”

“666,那这样就既解决了SPOF,又解决了拥挤问题啦~ ”

“哈,你都会用软件术语来描述生活问题了。SPOF是肯定解决了,但是拥挤嘛,还可以再继续优化的~”

“咋优化?”

“你看,现在各个窗口,都是既可以买票,又可以取票的,但是常识告诉我们,人均买票花费的时间,要远大于人均取票的时间。

“啊,对,要是这条队,前面一百个人都是买票的,但是我一个取票的过来了,排到队尾,那就得奔溃… ”

“是的,所以我们可以优化下,让其中两个窗口,既可以买票又可以取票,或者干脆就只让它们可以买票,这些,我们叫做Master,然后再按需要加多几个窗口,这几个窗口,只能取票。因为他们是为了给 Master 们减轻负担,所以我们叫它们 Slave,这个用软件的术语来描述,就是读写分离

“Wow!原来 Master-Slave 是这样个意思~ ”

其实,很多软件设计的想法,都可以在生活中找到影子,软件设计也是一门“仿生学”。比如刚开业的小店,可能员工都不多,但是一旦生意上去了,就会招更多的小弟过来,因为一旦顾客想点菜或者买单时,找不到服务员,是很影响心情和体验的。软件也是这样,只放一台机器在那,一旦这台机器忙不过来,就会表现为网页发来的请求,响应很慢,同样影响访客的体验和心情,访客点个按钮,半天没响应,那他们可能就把这个网站拉黑了。”

“Wow,可以可以,很6嘛~ ”

我仿佛已经从悬崖边上撑了起来,迎着早晨的阳光,大步往回走 ……

非程序员请就此止步,程序员请继续往前走……

对程序员的话

这篇文章用了售票窗口来类比机器,解释什么是 Master-Slave,什么是SPOF,什么是读写分离。

要说这两者最大的不同,那就是售票窗口并不是数据源。

即我们查询数据时,不会直接从售票窗口查询,而是售票窗口里的服务员,用电脑再去查数据。

而机器呢,很多机器本身就是数据源,比如Mysql,请求过来后,它们直接从自己身上拉数据,返回出去。这样就要求不同机器上的数据,必须要一致,不能客户从机器A查询,得到结果是“aa”,从机器B查询,得到结果却是“bb”,所以就需要当数据写入 Master 时,把数据同步给 Slave,这就是「主从复制」。

「主从复制」期间,Slave的数据会和Master不一致,这是「主从延迟」。

由于「主从延迟」的存在,当Master宕机时,你要优先保证「数据强一致性」还是「服务可用性」,这就是「主从切换」时要考虑的问题了。

如果你看了这篇文章,还想深入了解 「主从复制」、「主从延迟」和「主从切换」是怎么回事 ,可以看我之前写的:Mysql Replication 简明教程