本站的一些技术优化

Sept. 7, 2019, 11:15 a.m.

最近离职了,在找新工作,稍微有点空闲时间,就花了1天时间来优化一下这个上线了快3年博客。期间也陆陆续续有过一些优化,不过这次的动作比较大。

先说一下放弃的内容

  • 放弃了关系型数据库 MySQL 5.5
  • 放弃了阿里云的ECS、RDS服务
  • 放弃了较为复杂的页面风格
  • 放弃了原来在海南工作时使用的公司二级域名 lizhaochao.sanya105.com
  • 放弃了原来的网站备案号

优化的内容

  • 使用了 sqlite3 作为存储后端
  • 使用了 Redis 5.0 的 Cluster 架构作为缓存
  • 使用了 Kubernetes 1.13 来进行部署和集群管理
  • 使用了 Docker 来对应用代码进行打包
  • 使用了独立的 git repo 来管理生产环境的所有密钥,并使用 git-crypt 来进行加密
  • 使用了谷歌云
  • 删除了页面中所有的图片元素,大幅度裁剪了 css 文件并合并到了 html 中,去除所有的js
  • 增加了具有可读性的短链接功能,形式:http://../python_list_allocate_rule
  • Django 升级到了 2.2
  • Python 升级到了 3.7
  • 启用了雪藏已久的我的名字全拼的.com域名 lizhaochao.com
  • 申请了一个深圳的个人网站备案号

为什么会是这样的架构

和几个朋友聊的时候,他们都觉得很奇怪,主要有这些问题:

  • sqlite3不是一般用在客户端的吗?用在服务器端不就没有了并发了吗?
  • 你的博客访问量很大吗?需要集群吗?有必要用 Kubernetes 来管理吗?
  • Redis Cluster、 Kubernetes 都需要一定数量的节点数,这些机器的开销有必要吗?
  • 人家的页面都是越设计越丰富,你是越来越简单,现在的是90年代的风格?

这些问题如果孤立的看,很难回答;任何事情都是有前提条件的,或者说是需求,我先说一下我的需求吧:

  • 我需要1个的可以随时随地进行实验的云端的 Kubernetes 服务,这样才可以不断保持我的个人竞争力
  • 我仅仅将这个博客提供个人的笔记记录和联系方式的展示,并不打算投入精力和财力去进行额外的运营,所以只需要保留最核心的功能即可,而且没有任何机密数据
  • 在产生的费用方面,谷歌云现在有促销活动,可以以很低很低的成本来满足我的这些需求,下面是促销活动免费赠送的金额,单位为港币
| Promotion ID | Expires     | Promotion value | Amount remaining |
| Free Trial   | Sep 5, 2020 | $2,351.97       | $2,261.15        |

下面我来解释一下这个架构

  • 使用 sqlite3
    • 是为了使用 Django 的 admin site 功能
    • 备份方便,只需要将 db.sqlite3 这1个文件下载即可
    • 对于主页和文章详情页是不会有机会访问到的sqlite3的(只有这2个类型的页面)
  • 使用 Redis Cluster
    • 使用 Redis 是为了提升性能,
    • 访问加速
    • 解决 sqlite3 不支持并发的问题
    • 解决 Django Template Engine 的开销,将 html 的所有内容存到 Redis 中,包括 css 文件的内容内嵌到 html 中(非独立文件的形式)
    • 而使用 Redis Cluster 是因为我在 Github 上维护了一个 easy_redis_cluster 项目,首先在自己的项目里使用,是不断完善的方式之一
  • 使用 Kubernetes
    • 为了方便,感觉已经回不到传统的管理模式了
    • 方便个人日常的研究和试验,常常会假想本站有性能需求是多大多大,从而进行升级,以达到熟悉新特性等目的
    • 谷歌云有促销活动,可以用较低的成本来满足我的这些需求
  • 其它

    • 如果 Redis Cluster 不可用了,会导致本站不可用,由于 sqlite3 不支持并发,在这个情况下,把流量给它,是没有意义的
    • 在 admin site 中,数据会先保存到 sqlite3 中,然后再写入 Redis,如果数据在 Redis 中丢失,并不会影响数据的完整性
    • 由于数据量很小,为了最大化控制成本,Redis 中的 maxmemory 设置为 80mb,有6个redis node,就是 480mb 了,3个 master node 可以提供 240mb 的存储空间,一篇文章10kb的大小(文章详情页html的大小,不仅仅是文章内容的大小),需要写2万4567篇文章;由于同时开启了 aof 的 rdb 两种持久化方式,每个 redis node 实际需要的内存空间为200mb,是maxmemory的2.5倍

需要完善的地方

  • 使用 https 来替换 http,由于数据不存在机密性,主要是解决浏览器中的 Not secure 标识
  • 配置一个支持 ReadWriteMany Mode 的 persistent volume,目前Django应用代码的 Deployment 的 replicas 只能设置为1,是因为使用的是 gcloud 默认的 standard persistent volume,只支持 ReadWriteOnce Mode

  • 其它还未发现的 bugs 哈哈哈哈

返回首页