Redis服务器崩溃的故事
首次投稿!我喜爱的圣诞节降临日历的第18天。
我将讲述一个关于一年目基础架构工程师在我们公司的Redis服务器迁移中搞砸了的故事。我们给相关各方带来了很大的麻烦,而且在恢复工作中也得到了你们的合作与谅解,非常感激。再次感谢你们。
结论 (jié
对于不太了解的事物,最好不要在没有理解的情况下去碰它。
首先,Redis是什么?
-
- NoSQLデータベースの1つ
-
- 馴染み深いMySQLのようなRDBとはデータの保存形式が違う
-
- RDBが1レコードに複数のカラムを紐づけて保存するのに対し、Redisはkey-value型でデータを保存する
-
- keyを指定することでvalueを呼び出す
- データがすべてメモリに乗っているため爆速
闹出的细节
由于种种缘故,我们决定迁移Redis服务器。
之前我们也多次进行过服务器迁移,并且由于我们的Redis有冗余配置,所以并不太担心这次迁移。
然后,那个时候就到了。
按照之前的处理方式,关闭目标服务器。
在进行接下来的工作时,突然收到了来自公司内部的通知。
“在服务器上有任何异常吗?”
“这个页面无法显示…”
这是一个使用Redis的出色页面。
((((;゚Д゚))))ガクガクブルブル
(內心發抖)
立刻确认一下自己得到教授的页面,但是没有显示出来。
查看相同服务器配置的另一页
→ 不可见
「嗯,肯定是Redis吧…哎,难道不是冗余备份吗!?」
看到本应该没有关闭的Redis服务器,但是它确实在运行。
只是负载太低了。。。
这是什么意思…??????????
先暫停Redis,立即啟動並進行恢復作業。
发生了什么事情?
根据恢复中和恢复后的调查等,我们了解到了Redis的特性。
・Redis通过集群(cluster)的形式实现冗余备份。
・可以在一个服务器上通过不同的端口设置主节点和从节点。
・如果主节点宕机,相应的从节点将晋升为主节点。
・集群内的各个节点会相互发送ping来持续确认对方的存活。
・如果无法维持足够的主节点数量,整个集群将会失败下线。
考虑到以上特点,可能发生了以下情景。
・当服务器关闭时,服务器中的Redis(主、从)都会关闭。
・从另一个服务器的Redis发送了确认存活的 ping,但没有收到存活回应。
・对于已关闭的主Redis,将其对应的从Redis升级为主Redis,但由于整个服务器都关闭了,无法收到主Redis发来的“我已经挂掉了”的ping,因此无法升级。
・就整个集群而言,无法保持足够的主Redis数量,已经安全死亡。
我应该这样分配我的时间。
在关闭服务器之前,请确认集群内主节点和从节点之间的关系。
停止Redis,并确认相应的从节点已经晋升为主节点。
在进行上述确认之后,关闭服务器。
总结
-
- ソフトウェア、ミドルウェア、ハードウェアの別に関わらず、作業前には構成をしっかりと把握する
-
- 似たような作業はやったことがあるかもしれないけどその作業はやったことがないと自覚する
-
- 手順書をさぼらず書く。
- 慢心しない。油断しない。日々勉強。
在进行调查时我所参考的文章。
Redis Cluster验证: https://qiita.com/ono-soic/items/a41044c977da5231297b