阿里云redis服务迁移记录

总有那么一段废话

因为某个项目前期数据量比较小,所以就直接使用 docker 起的 redis 服务,由于现在的业务规模上升,原有的 reids 服务不能进行数据监控以及不方便数据管理和维护,所以在阿里云单独买了一个云 redis 服务,我前期为了安全,也没有将 redis 服务的端口映射到宿主机,所以给我的迁移也带来了挑战。

正式步骤

开启宿主机端口映射

docker-compose.yml 文件下修改 redis service,增加 ports 字段。

1
2
3
4
5
6
7
8
9
10
redis:
container_name: redis-pro
image: redis:4.0.10
sysctls:
net.core.somaxconn: 65535
ports:
- "6380:6379"
networks:
- backend
restart: always

更新 redis 服务

1
$ docker-compose up -d redis

查看端口映射状态

1
2
3
$ docker-compose ps

redis docker-entrypoint.sh redis ... Up 0.0.0.0:6380->6379/tcp

开启阿里云 DTS 服务

选择和宿主机以及 redis 在同一个地域的数据传输服务,理论上这样的服务会延迟更低,稳定性更好。

upload successful

分别配置好源库信息和目标库信息,阿里云还是很贴心,测试连接如果都是通过就可以下一步下一步了。

等待到全量更新为 「100%」就说明本次迁移已完成很大一部分了。

为什么要使用 DTS 服务,而不是自己将 redis 保存成文件,导入到新的 redis 服务呢?主要是 DTS 服务支持增量更新,后面可能会持续有数据的读写覆盖等,这些 DTS 服务会一条龙服务解决掉。

配置 redis 地址

开启云 reids 外网地址

实际过程中我是直接用的内网地址,发现内网根本连不上。

这里直接说外网地址,保证系统先调通,这里注意两点。

  • 购买的 reids 版本,阿里云 Redis4.0 及以上版本密码格式为“账号:密码”,其他版本就只有密码,没有账户概念,当然我是追求极致体验全部选最新。
  • 点击申请外网链接,是需要等待 20 秒左右才能使用的,不是立即生效。

upload successful

修改 web 服务中的 redis 地址

因为我在使用 swoft,直接修改 redis 的配置文件 config/pro/redis.php

upload successful

将代码部署到线上,发现服务正常运行。如果你能接受外网访问,那么到这里就可以结束了,我一个追求极致的人,当然是不能容忍线上服务就这么暴露在外网中,即使有白名单机制。

出现的问题

主要是 redis 配置这块碰到了一个大坑,和阿里云的技术客服来来去去聊了一天,他们每半小时或者一个小时才给我回复一条消息,到晚上才给我解决,感觉白天的阿里云客服技术水平完全是值班的,一些很简单的问题和我绕了半天,结果道歉说他弄错了,是在怀疑我不专业吗?不过最后那个技术客服一下就能抓住重点,问题一下就解决了。给了我一个文档也不知道是哪位大佬的博客,是这位客服自己的么?🙃🙃

我在使用内网地址的时候一直会反馈一个错误。发现 redis 连接一直超时。
然后我去 ping 了一下他的地址

1
2
3
$ ping r-xxxxxxxxxx.redis.rds.aliyuncs.com

Destination Host Unreachable

给我反馈的 Destination Host Unreachable 就是这个错误,简单的说就是 dns 解析不到,网络无法连通。我开始以为这个可能是阿里云故意关闭了 ping 所需要的 icmp 包。

我就使用 reids 客户端去实验,参数 h 是地址,参数 a 是密码。

1
2
3
$ redis-cli -h r-xxxxxxxxxx.redis.rds.aliyuncs.com -a xxxxx

Name or service not known

发现这个内网真的访问不上,和阿里云客服百般沟通之后,提供的解决方案来看,是通信的网卡走错了。

配置 docker

1
$ vi  /etc/docker/daemon.json

daemon.json 文件里面增加一个网段信息

1
2
3
{
"bip": "192.168.200.1/24"
}

重启 docker 服务

1
$ systemctl restart docker

但是我这里重启 docker 服务还是报错了,最后不得已重启了机器。

ping 了一下地址确实是能 ping 到,重新配置了 reids 的内网地址,一切都恢复正常了。

关闭阿里云 DTS 服务

因为 DTS 服务是收费服务,线上既然可以正常运行,就可以先暂停服务,然后释放掉就可以了。

总结

这个总结我研究了好几天,感觉还是不要总结了,因为有些知识还是需要我去发掘,因为对于这个内网地址我实在有点不太明白,它的原理是什么,为什么我在使用 dns 8.8.8.8 的时候,还是可以解析到内网地址?

后面我会补充一篇内容专门讨论阿里云的内网技术。

参考文档

坚持原创技术分享,您的支持将鼓励我继续创作!