题外话:
笔者就职于某上市游戏发行公司,主导整个发行业务线从双 IDC 到腾讯云的搬迁。在此过程中踩了不少坑,便以文章的形式记录下来。
如有错漏之处,敬请指正。
我先简单介绍下我自己:
我是业务开发出身,负责渠道登录/支付业务,熟悉前端,研究后台开发框架后,逐步往运维方向摸索。
业务除了登录/支付业务,也做过风控系统、聊天监控系统,主要是一些防刷保护、敏感词判别、垃圾信息过滤等等。
本系列篇幅较长,共有 7 篇文章,本文是第 4 篇。文章列表:
某上市游戏公司从 IDC 上腾讯云的落地经验(1)——上云必要性与方案设计
某上市游戏公司从 IDC 上腾讯云的落地经验(2)——方案实施之接入层上云
某上市游戏公司从 IDC 上腾讯云的落地经验(3)——方案实施之应用层上云
某上市游戏公司从 IDC 上腾讯云的落地经验(4)——方案实施之缓存层上云
某上市游戏公司从 IDC 上腾讯云的落地经验(5)——方案实施之数据层上云
某上市游戏公司从 IDC 上腾讯云的落地经验(6)——方案实施之中间件上云
某上市游戏公司从 IDC 上腾讯云的落地经验(7)——总结与回顾
缓存层上云
缓存,业务主要使用 Redis 和 Memcached 两大组件。
- Memcached 数据量非常小(几十兆,大部分是登录态缓存),我们没有做数据搬迁,直接切换 DNS 解析上云。
Redis 做了一次主从切换,切换前我们参考了 Go 常见的错误信息,对 PHP 的操作类做了重连处理,保证切换过程无损。
- 对于部分业务没有改造的不支持重连的,可以配合 CLIENT LIST 和 CLIENT KILL 命令,关闭连接使其重连。
- 多次 KILL 不掉的业务,我们最终排查发现有台机器绑定了 hosts 到 IDC 机房,此时去掉之后也成功切过去了。
注:切换 DNS 解析,需要留意 TTL,内网 DNS 可以缩短到秒级,具体看业务体量和 DNS 服务器的承载量。
附:go-redis 的重试逻辑:
// github.com/go-redis/redis/[email protected]/error.go:27
func shouldRetry(err error, retryTimeout bool) bool {
switch err {
case io.EOF, io.ErrUnexpectedEOF:
return true
case nil, context.Canceled, context.DeadlineExceeded:
return false
}
if v, ok := err.(timeoutError); ok {
if v.Timeout() {
return retryTimeout
}
return true
}
s := err.Error()
if s == "ERR max number of clients reached" {
return true
}
if strings.HasPrefix(s, "LOADING ") {
return true
}
if strings.HasPrefix(s, "READONLY ") {
return true
}
if strings.HasPrefix(s, "CLUSTERDOWN ") {
return true
}
return false
}
总之,缓存这块的上云风险应该是比较低的。
不管怎样,业务都不应该强依赖缓存,如果强依赖,也不是缓存了,而是数据。
我们通过 某上市游戏公司从 IDC 上腾讯云的落地经验(1)——上云必要性与方案设计 提及的神器 packetbeat,配合 Elasticsearch,可以清晰的知道 Redis 具体执行的命令、来源 IP 地址。
开发惊讶地看到自己业务的 Redis 操作可以搜索、过滤,也是兴奋不已,大呼神奇!既然知道它执行了什么命令,用法有误的,该整改就整改。
今天就先写到这里,下一篇继续写数据层上云。感谢您的阅读:)