1. 初识倍市得

从陌生到熟悉,再从熟悉到陌生

入职开始接触倍市得私有化部署,通过编写shell脚本,不仅在技术上有所收获,因为工作上有了共同话题,也更快的融入到了团队中,初步得到大家的认可。
虽然shell的部署方式在刚哥的筹划中,但在其中扮演着承上启下的角色,当时也带来了小小的骄傲。
cem-01.pngcem-02.png

2. SaaS的前世今生

SaaS 虐我千百遍,我待SaaS如初恋

倍市得SaaS是个爱漂亮的小姑娘,从相遇开始,就迫不及待的想要让自己变的更漂亮更完美。于是在迁移的道路上一往无前,勇敢的让人心疼…

2.1 邋遢的小姑娘

最初,倍市得SaaS就像一个邋遢的小姑娘,爹不亲娘不爱。各种资源名称随意命名,更新迭代的文件配置让人分不清真假,配置文件路径时常跟你玩躲猫猫,混乱的安全组规则仿佛在向入侵者呐喊:“向我开炮…”,各个服务器上的iptables规则和扫雷游戏差不多……哇哦,真是糟糕透了!

2.2 开始蜕变

俗话说,没有丑女人只有懒女人。来吧,让我们开始梳妆打扮,gogogo!
SaaS 迁移改造.pdf
越是了解你,越是感觉像一层层的剥开洋葱的外衣,让我泪流满面…
可怜的孩子,我发大宏愿:愿用下一个照顾你的人的全部幸运,来换取你以后的幸福。
首先,号召江湖的能人志士来出谋划策(SaaS迁移启动会)。
image.png
接下来,大大小小的会议沟通数十次,每一次的变动都是为了预见更好的你 心得小结

  1. 多思考,多请教,多沟通
  2. 开小会,开短会,每日小会的时长10分钟,与各接口人同步进度
  3. 明确议题,相关资料提前准备好,会必议,议必决,决必行,行必果
  4. 提高团队协作,挖掘进度难点,努力解决其他人的困难
  5. 小事当日毕,大事领导定,发现无法协调解决的问题及时升级反馈

image.png
最终,我们制定了详细的上线变更步骤(194次变更)和对应的进度迁移排期,与各路豪杰抱着三千越甲可吞吴的气势来迎接你的到来。
image.png
image.png

2.3 破茧成蝶

3baacb1bc35c2d11edd667b4613a0ee7.gifimage.png
历时18小时的改头换面,在各路英雄的不懈努力下,我们宣布倍市得涅槃重生,新生的你美的不可方物。 应用标准化

1.1 统一命名

1.1.1 环境名称

image.png

1.1.2 资源命名

image.png

1.1.3 应用命名

应用名-模块名-环境-编号-资源类型
xm-apisix-prod-10001-ecs
xm-app-prod-10001-ecs

1.1.4 容器命名

应用名-模块名功能
xm-apprpc app组件的rpc模块
xm-biapi bi组件的api模块
xm-miniproblem 前端小程序

1.2 安全组

根据安全组的使用方式,我们将安全组进行如下定义:

  • VPC级别的安全组:所有属于这个VPC的服务器都必须要加入这个安全组,对这个安全组的调整只会影响服务器的管理,不会对业务造成影响禁止在这个安全组中添加允许出的策略,禁止 0.0.0.0
    image.png
  • 层级的安全组:所有属于这个层级的服务器都必须要加入这个安全组,这个安全组设置一些针对这个层级的安全组策略,比如数据层需要开放应用层的访问,应用层之间开通一些互访端口

    • 应用层安全组 :允许应用之间服务器互访
      • 8000/9000
      • 80
      • 443
    • 数据层安全组: 允许数据之间服务器互访,允许应用层的服务器访问

      • 6379
      • 27017
      • 5672 15672 25672 4369
      • 2181 3888 2888

      • 8123 9000 9009

      • 2379 2380

  • 特殊安全组:常规标准端口外的额外端口,如通过zeus反代到可视化的应用服务,如rabbitmq 管理界面,apisix dashboard等

    • 15672
    • 9000

      1.3 日志

      用户:www
      用户组:docker
      应用路径:/data/www
      日志路径:/data0/logs
      数据路径:/data/www/h5 ,挂载nas

日志切割保留7天,日志接入日志服务SLS存放30天

1.4 nginx

优化apisix的默认nginx.conf文件

  1. user www www;
  2. worker_processes auto;
  3. error_log /data0/logs/nginx/nginx_error.log error;
  4. pid /var/run/nginx.pid;
  5. worker_rlimit_nofile 65535;
  6. events {
  7. use epoll;
  8. worker_connections 65535;
  9. multi_accept on;
  10. }
  11. http {
  12. server_tokens off;
  13. include mime.types;
  14. default_type application/octet-stream;
  15. server_names_hash_bucket_size 128;
  16. client_header_buffer_size 32k;
  17. large_client_header_buffers 4 32k;
  18. client_max_body_size 50m;
  19. proxy_ignore_client_abort on;
  20. variables_hash_max_size 2048;
  21. ssl_session_cache shared:SSL:10m;
  22. proxy_next_upstream http_503 http_504 error timeout invalid_header;
  23. sendfile on;
  24. tcp_nopush on;
  25. tcp_nodelay on;
  26. gzip on;
  27. gzip_min_length 1k;
  28. gzip_comp_level 4;
  29. gzip_types font/ttf font/otf font/opentype application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-javascript application/xml application/xml+rss application/xhtml+xml font/truetype image/svg+xml text/css text/javascript text/js text/json text/plain text/x-component text/xml;
  30. gzip_vary on;
  31. log_format json '{'
  32. '"agent":"$http_user_agent",'
  33. '"status":"$status",'
  34. '"host":"$host",'
  35. '"hostname":"$hostname",'
  36. '"method":"$request_method",'
  37. '"request_uri":"$request_uri",'
  38. '"port":"$remote_port",'
  39. '"protocol":"$server_protocol",'
  40. '"real_ip":"$http_x_forwarded_for",'
  41. '"referer":"$http_referer",'
  42. '"remote":"$remote_addr",'
  43. '"request_length":"$request_length",'
  44. '"request_time":$request_time,'
  45. '"scheme":"$scheme",'
  46. '"server_addr":"$server_addr",'
  47. '"size":$body_bytes_sent,'
  48. '"time":"$time_iso8601",'
  49. '"upstream_addr":"$upstream_addr",'
  50. '"upstream_response_time":"$upstream_response_time",'
  51. '"upstream_status":"$upstream_status",'
  52. '"uri":"$uri",'
  53. '"user":"$remote_user"'
  54. '}';
  55. access_log /data0/logs/nginx/accesslog.log json;
  56. proxy_set_header Host $host;
  57. proxy_set_header X-Real-IP $http_x_real_ip;
  58. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  59. proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
  60. proxy_set_header X-SERVER-IP $server_addr;
  61. proxy_http_version 1.1;
  62. proxy_set_header Connection "";
  63. include conf.d/*.conf;
  64. }

1.5 docker

端口规划:
image.png

2、组件配置

2.1 系统镜像

packer 打包基础镜像,需求如下:

  1. 系统centos7.9,修复最新漏洞
  2. 新增系统用户www
  3. 新增系统组docker,www用户添加到docker组
  4. 新增docker应用,版本:20.10.3
  5. 新增docker-compose应用,版本:1.25.5
  6. daemon.json配置如下

    {
    "log-driver": "json-file",
    "log-opts": {
     "max-size": "100m",
     "max-file": "3"
    },
    "max-concurrent-downloads": 10,
    "max-concurrent-uploads": 10,
    "registry-mirrors": ["https://7bezldxe.mirror.aliyuncs.com"],
    "bip": "172.17.10.1/24",
    "storage-driver": "overlay2",
    "data-root": "/data/docker",
    "iptables": true,
    "storage-opts": [
     "overlay2.override_kernel_check=true"
    ]
    }
    
  7. iptables需要关闭

2.2 ECS

磁盘优化,80G系统盘,40G日志盘,数据盘(如需)
好处:
更换操作系统,不影响数据
快速扩缩容
镜像重新打包,修复最新漏洞,磁盘容量缩容,定义日志和应用路径

安全改造image.png 数据备份image.png 弹性伸缩一、 配置弹性伸缩的核心服务有:
1、 xm-ds-prod
2、 xm-surveyapi-prod
3、 xm-nexus-prod
4 、xm-appgrpc-prod
5、 xm-rpc-prod
6、 xm-celery-prod
7、 xm-tinyurl-prod
8、 xm-bigrpc-prod
9、 xm-appapi-prod
10、xm-biapi-prod
11、xm-dstask-prod
12、xm-nexusadmin-prod
13、xm-fed-prod
14、xm-fedapaas-prod
15、xm-other-prod
16、xm-push-prod
二 、不支持扩缩容的服务有:
xm-tools-prod 服务为仅支持单节点启动
三 、 自动扩缩容规则:
cpu 使用率(平均) > 80 (1分钟连续3次) 扩容 1 台 cpu < 20 (1分钟连续5次)缩容 1 台
每次执行完需要360秒后才能进行再次触发执行

成本控制SaaS:为什么要控制成本?
我:老板说你胖,不好看…
https://wiki.idiaoyan.cn/pages/viewpage.action?pageId=49615145 准入控制image.png
https://wiki.idiaoyan.cn/pages/viewpage.action?pageId=41985037

  • JumpServer 权限申请控制
  • 阿里云 RAM 用户权限控制
  • 数据库 DMS 用户操作控制
  • OA 权限申请指引 more and more
  1. grpc 调优,解决负载不均衡
  2. 数据库云盘开启加密,引入KMS
  3. 优化 WAF 跨站规则
  4. 优化 CDN 跨域问题 CDN请求跨域问题分析.pdf
  5. 优化CK、MQ配置参数
  6. OSS 权限公共读改为私有
  7. 完成倍市得三级等保
  8. 监控优化(prometheus、grafana、sls)

    3. Terraform

    terraform,一生之“敌”

terraform.png 倍市得SaaS 目录结构tf-alicloud-xm-pre
├── action_trail
├── kms
├── pvtz
├── ram
├── res_grp
└── snapshot


tf-alicloud-xm-prod
├── action_trail
├── kms
├── pvtz
├── ram
├── README.md
├── res_grp
├── snapshot
└── tf-backend


tf-xm-network
├── pre
│ ├── backend.tf
│ ├── locals.tf
│ ├── main.tf
│ ├── ngw.tf
│ ├── variables.tf
│ ├── versions.tf
│ └── vpc.tf
└── prod
├── backend.tf
├── locals.tf
├── main.tf
├── ngw.tf
├── variables.tf
├── versions.tf
└── vpc.tf


tf-xm-security
├── pre
│ ├── backend.tf
│ ├── locals.tf
│ ├── main.tf
│ ├── sg-data.tf
│ ├── sg-ds.tf
│ ├── sg-service.tf
│ ├── sg-vpc.tf
│ ├── sg-xm-appapi.tf
│ ├── sg-xm-fed.tf
│ ├── sg-xm-nexusadmin.tf
│ ├── sg-xm-rabbitmq.tf
│ ├── variables.tf
│ └── versions.tf
└── prod
├── backend.tf
├── locals.tf
├── main.tf
├── sg-data.tf
├── sg-ds.tf
├── sg-service.tf
├── sg-vpc.tf
├── sg-xm-appapi.tf
├── sg-xm-fed.tf
├── sg-xm-nexusadmin.tf
├── sg-xm-rabbitmq.tf
├── variables.tf
└── versions.tf


tf-xm-product
├── pre
│ ├── data
│ │ ├── clickhouse
│ │ ├── etcd
│ │ ├── mysql
│ │ ├── nas
│ │ ├── oss
│ │ ├── rabbitmq
│ │ └── redis
│ └── service
│ ├── cdn
│ ├── ecs
│ ├── ess
│ └── pvtz
└── prod
├── data
│ ├── clickhouse
│ ├── etcd
│ ├── mongodb
│ ├── mysql
│ ├── nas
│ ├── oss
│ ├── rabbitmq
│ └── redis
└── service
├── cdn
├── ecs
├── ess
└── pvtz

image.png

3.1 配置本地离线源

# zero 服务器自己的家目录
mkdir -p $HOME/.terraform.d/plugin-cache

[chao.huang@ops-zero-prod-00000-ecs ~]$ cat .terraformrc 
plugin_cache_dir   = "$HOME/.terraform.d/plugin-cache"
disable_checkpoint = true

provider_installation {
  network_mirror {
    url = "https://terraform.idiaoyan.cn/pub/terraform/providers/"
  }
}

image.pngimage.pngimage.png

4.2 kompose

https://github.com/kubernetes/kompose

image.png

5. 结束语

聚是一团火,散是满天星……

2021年6月入职众言科技,感恩遇见,感谢成长;
愿诸君有始料不及的运气,也有突如其来的惊喜;
青山不改,绿水长流;
人生有梦,各自精彩;
江湖再见!


莫愁前路无知己,天下谁人不识君
地表最强.jpg