2024年4月,在公有云上快速部署一个网上商城

0、部署说明:

与现在火爆的通过云主机快速搭建线上网络游戏服务器类似,本文使用单台云主机快速搭建线上商城,助力创业者低成本快速开始线上商城运营。
本文还进一步为线上商城的运营者提供了业务发展不同阶段的线上业务架构设计及部署方案。
本文部署过程涉及的内网、外网IP地址以及域名等资源,均为临时使用,本文完成后,相关资源已经停止使用
目标:
1.0-从零开始,以最小的云资源消耗在京东云上部署一套可运营的商城系统,单机版本,支撑每日数百单量。1.0阶段你只需要3步操作就可以获得一个可运营的线上商城。需要一台带公网IP的云主机,懂得Linux的基本命令,稍微了解一些容器服务的常用命令和概念。
2.0-根据业务发展,使用云上标准的网络和IAAS及PAAS产品,构建高可用的业务集群,支持每日数万单量。 2.0阶段你需要根据规划网络及存储以及安全,需要懂得一定的网络以及安全知识,了解云上的IaaS服务和PaaS服务产品。
3.0-根据业务发展,在2.0基础上,使用云上提供主机弹性伸缩特性(或使用K8S集群的HPA能力)构建服务于爆品及促销场景的可弹性使用资源的云上业务集群,支持大促活动期间突增的业务访问能力。3.0阶段,你需要使用云上的安全产品及分布式的加速产品,来满足不同区域的业务快速访问及防护各种攻击,通过使用云上资源的弹缩能力,保证业务的大促稳定性,同时兼顾IT的成本支出的管控。
本文写作于2024年1月底,为实际操作过程的完整记录,您可以依照本文过程,完成从1.0到3.0阶段的商城建设,后续商城如果有新的系统及软件版本,可能命令稍有不同。本文较长,涉及较多命令及截图。

商城选择

GitHub上有很多优秀的开源商城框架可以选择,本文主要目标是快速低成本完成京东云网上商城的部署和运营,提供大家高效使用云产品的最佳实践,所以选择功能相对完善、部署相对简单的CRMEB开源商城系统PHP版(开发crmeb商城的公司也是京东云服务的使用者和合作者)。
GitHub链接地址:https://github.com/crmeb/CRMEB
Gitee链接地址: https://gitee.com/ZhongBangKeJi/CRMEB
限于篇幅,商城上线后的业务运营配置,以及部分应用优化细节,未做详细描写,您有业务运营调整需求,可以参考上面的链接中的部署文档操作。

运行环境
运行环境后面有脚本一键构建。
建议的操作系统及docker版本如下:

系统环境:

  操作系统:OpenCloudOS 8.6 64位  (也可以使用OpenEuler或rocky操作系统)

  docker 及docker-compose (也可以使用其他兼容版本):

  Docker version 24.0.6

  Docker Compose version v2.19.0

应用环境:

  Nignx

  PHP 7.1 ~ 7.4

  MySQL 5.7 ~ 8.0

  Redis

其中MySQL及Redis为外部依赖组件,1.0版本与应用混合部署于单台主机(省钱……当然我们通过云服务的主机镜像功能,会定期备份整机数据),2.0版本后开始独立使用云上的PaaS服务。

域名需求
作为可以正式运营的线上商城,需要一个正式的域名,域名可在京东云或其他域名注册机构申请注册,并在京东云上进行备案(在其他服务商备案完成的域名,在京东云需做一次新增接入备案)。
本文模拟从零开始,在1.0阶段使用了公网IP+端口访问模式,在2.0阶段使用一个已有的域名进行业务验证,malltest.xxxloud.cn。

1、第一部分 1.0阶段

在Linux主机上运行几条命令,把一个线上商城启动起来并开始使用。
说明:

安装docker并设置服务自启动

yum install  -y docker-ce 

systemctl start docker

systemctl enable docker

安装docker-compose

curl -L "https://github.com/docker/compose/releases/download/v2.24.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

#如果上面的命令超时(大概率会超时),无法下载,也可以找能从github上下载文件的个人电脑下载,然后上传到主机的/usr/local/bin/ 目录下,并配置可执行权限后使用(我就是这么安装的)。直接下载地址: https://github.com/docker/compose/releases/download/v2.24.2/docker-compose-linux-x86_64

chmod +x /usr/local/bin/docker-compose

ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

创建crmeb的目录并下载应用环境,启动商城环境

mkdir /crmeb

cd /crmeb

git clone https://gitee.com/ZhongBangKeJi/CRMEB.git

chmod -R 777 CRMEB 

cd /crmeb/CRMEB/docker-compose

docker-compose up -d

#主机自动拉取并更新容器镜像,然后启动,这需要几分钟时间(也可能需要更久,与主机网络环境有关),容器启动后,会有容器启动成功的提示。

业务启动完成,访问业务,用浏览器访问主机的公网 IP:8011

现在,可以登录进行初始化配置,完成配置后,用这个商城就可以开始卖货了,但是,作为一个严谨的创业者,你会觉得,这是不是太简单了,我的业务数据存储在哪里?我的业务安全吗?我以后怎么升级到2.0?
是的,为了在业务扩大后顺利过渡到2.0阶段,我们用十分钟,规划一下我们的云上商城的初始架构

1.0阶段,我们的业务路径未必清晰,盈利前景也无法预知,也没有(不需要)专业的IT运维团队。因此,我们最初时期的规划,其目标需要以尽可能小的投入来开始正常业务的运营,同时兼顾业务安全及日后业务的扩展升级。
重点关注2点:

  1. 最省钱的方案
  2. 相对安全

1.1 架构规划

在1.0版本的初期规划,我们重点先考虑网络及数据的可扩展性。一旦网络设定,后期更改极为困难,同时,数据量的增长可能超出预期,需要考虑数据存储的可扩展性。
规划如下:

  • 进行网络做整体规划,一次性完成到3.0阶段的网络规划。
  • 数据存储规划,本阶段使用数据云盘存储数据。以此阶段存储的数据来进行统计,并评估后面存储的长期需求及存储成本。

1.0架构图:

对比一下下面的3.0阶段的架构图,可见在1.0阶段架构是非常精简的。

网络规划:
业务初期,因为基本没有涉及到测试环境,我们规划1VPC,VPC内配置4子网(1.0版本只使用其中的一个主机子网,后续2.0及3.0会使用全部子网):
入口网络 :后续业务入口,负载均衡部署在这个网络
出口网络 :主机通过NAT网关访问公网,NAT网关部署到这个网络
主机网络 :云主机及云文件服务等,部署在主机网络中
数据网络 :数据库及中间件等PaaS服务,部署在这个网络
K8S网络 :后续业务使用K8S部署,需要3个K8S的子网。

存储规划
1.0版本期间,我们把所有业务数据都存储在数据盘上。
京东云主机的云盘支持在线扩容,也可以使用LVM进行分区管理,方便增加数据盘扩展分区容量。
在2.0及后续版本,会把数据与应用分开部署,便于扩展及容灾。

1.2 资源需求及成本评估

项目规格数量说明
云主机2C8G1支持一下国内开源操作系统 :),主机操作系统选择opencloudos ,购买时附加购买一个100G的数据盘
公网IP1个,绑定在云主机上15M带宽,按流量计费,在购买主机的时候直接附加购买

以上的资源,成本一个月300多元,如果你选择的主机规格更小,成本可以更低,但是鉴于我们要运行的是一个在线商城,需要多个容器服务,主机建议2C8G规格。

资源购买
如果您以前没有京东云账号和主机,可以参考如下过程注册京东云账号并购买云主机和公网IP、购买域名并进行网站域名备案:

1. 注册京东云账号并完成实名认证:

  京东云账号注册页面: https://user.jdcloud.com/register 实名认证页面: https://realname.jdcloud.com/account/verify  注册和实名认证非常简单快捷,几分钟即可完成。

2. 购买云主机、硬盘、公网IP

  购买页面: https://cns-console.jdcloud.com/host/compute/list  主机购买帮助文档:https://docs.jdcloud.com/cn/virtual-machines/product-overview

3. 购买域名

  域名购买页面: https://net-console.jdcloud.com/domain/index

4. 进行域名备案(注意进行域名备案需要购买的主机有时长要求,可购买3个月包月主机,如果您开始时只是计划进行测试,也可以不进行域名备案工作)

  备案页面: https://record-console.jdcloud.com/ 备案帮助文档: https://docs.jdcloud.com/cn/icp-license-service/introduction

完成主机购买后,开始登录主机进行应用部署工作(域名备案可后续进行,初始部署可通过IP+非标端口访问)。

1.3 应用部署

在主机上创建crmeb的目录

mkdir /crmeb

对数据盘进行分区及格式化、挂载操作

对数据盘进行分区及格式化,具体过程参考京东云官方文档 https://docs.jdcloud.com/cn/cloud-disk-service/linux-partition

格式化完成后,挂载数据盘到crmeb目录。

cp /etc/fstab fstab.backup

echo "/dev/vdb1 /crmeb       ext4    defaults    1  1 "  >> /etc/fstab

mount -a

[root@opencloudos crmeb]# lsblk

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT

vda    253:0    0  100G  0 disk

└─vda1 253:1    0  100G  0 part /

vdb    253:16   0  100G  0 disk

└─vdb1 253:17   0  100G  0 part /crmeb

[root@opencloudos crmeb]# df -h

Filesystem      Size  Used Avail Use% Mounted on

devtmpfs        3.8G     0  3.8G   0% /dev

tmpfs           3.8G     0  3.8G   0% /dev/shm

tmpfs           3.8G   42M  3.8G   2% /run

tmpfs           3.8G     0  3.8G   0% /sys/fs/cgroup

/dev/vda1        99G   19G   76G  20% /

tmpfs           770M     0  770M   0% /run/user/0

/dev/vdb1        98G  810M   93G   1% /crmeb

[root@opencloudos crmeb]#

可以看到vdb1已经挂载到/crmeb

下面进行应用的部署,参考crmeb官网来进行应用的部署 https://doc.crmeb.com/single/v5/7952 :

进入已经准备好的程序目录,下载最新的程序资源

cd /crmeb

git clone https://gitee.com/ZhongBangKeJi/CRMEB.git

chmod -R 777 CRMEB  #调整目录权限,给与docker运行的容器进程对目录的写权限。

cd /crmeb/CRMEB/docker-compose

ls

下面是docker-compose的目录说明(来自crmeb官网)

    - docker-compose docker compose 配置文件目录

    - - mysql mysql配置文件目录

    -- nginx nginx配置文件目录

    -- php php配置文件目录

    -- redis redis配置文件目录

    - web 程序目录

    - docker-compose.yml docker-compose 运行配置文件

    - READMD.md 使用说明文件

说明:
原则上,我们可以不动任何配置把业务运行起来,但是默认配置有几个非常不安全的项目,我们的业务需要上线运行,提供服务,需要对docker-compose的配置文件进行调整。

从docker-compose.yml文件中,可以看到数据库配置及文件存储配置,我们1.0版本不调整数据存储位置及其他配置,只修改数据库密码。

[root@opencloudos docker-compose]# cat docker-compose.yml #文件为git clone的原始文件调整,后续项目有更新的话,文件内容可能会有不同

version: "3.3"

services:

  # mysql 容器

  mysql:

    container_name: crmeb_mysql #指定容器名

    image: mysql:5.7

    ports:

      - 3336:3306

    # 环境变量

    environment:

      TZ: Asia/Shanghai

      MYSQL_ROOT_PASSWORD: 'password(#hide)'

      MYSQL_USER: 'crmeb'

      MYSQL_PASS: 'password(#hide)'

      MYSQL_DATABASE: 'crmeb'

    privileged: true

    command:

       --character-set-server=utf8mb4

       --collation-server=utf8mb4_general_ci

       --explicit_defaults_for_timestamp=true

       --lower_case_table_names=1

       --max_allowed_packet=128M

       --default-authentication-plugin=mysql_native_password

       --sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

    working_dir: /var/lib/mysql

    volumes:

      - ./mysql/my.cnf:/etc/mysql/my.cnf

      - ./mysql/data:/var/lib/mysql #挂载数据目录到本地(在docker-compose目录中)

      - ./mysql/log:/var/log/mysql

    networks:

      app_net:

        # 固定子网ip,网段必须在子网络192.168.*.*

        ipv4_address: 192.168.10.11

  # redis 容器

  redis:

    container_name: crmeb_redis

    image: 'redis:alpine'

    # image: daocloud.io/library/redis:6.0.5-alpine

    # image: redis:5.0

    ports:

      - "6379:6379"

    command: redis-server /usr/local/etc/redis/redis.conf

    volumes:

      - ./redis/data:/data #挂载数据目录到本地

      - ./redis/redis.conf:/usr/local/etc/redis/redis.conf

    networks:

      app_net:

        ipv4_address: 192.168.10.10

  # php 容器

  phpfpm:

    container_name: crmeb_php #指定容器名

    image: crmeb_php #指定镜像名

    build:

      context: ./php #dockerfile文件路径

      dockerfile: Dockerfile #制定dockerfile文件名称

    restart: always

    environment:

      TZ: Asia/Shanghai

    ports:

      - 9000:9000

      - 20002:20002

      - 20003:20003

    tmpfs: /var/temp #上传临时文件夹

    working_dir: /var/www

    volumes:

      - ../crmeb:/var/www #程序运行目录

      - ../crmeb/runtime:/var/www/temp #程序缓存目录

      - ./php/php-ini-overrides.ini:/etc/php/7.4/fpm/conf.d/99-overrides.ini

    networks:

      app_net:

        ipv4_address: 192.168.10.90

#    command: /bin/bash -c "php -v"

  # nginx 容器

  nginx:

    container_name: crmeb_nginx

    image: 'nginx:alpine'

    restart: always

    ports:

      - 8011:80

      # - 443:443

    # 依赖关系 先跑php

    depends_on:

      - phpfpm

    environment:

      TZ: Asia/Shanghai

    working_dir: /var/www

    volumes_from:

      - phpfpm #继承phpfpm挂载目录

    volumes:

      - ./nginx/vhost.conf:/etc/nginx/conf.d/default.conf

      - ./nginx/log:/etc/nginx/log

    networks:

      app_net:

        ipv4_address: 192.168.10.80

networks: #网络配置

  app_net: #网络名称

    driver: bridge

    ipam: #网络配置

      driver: default

      config:

        - subnet: 192.168.10.0/24 #IP区间

[root@opencloudos docker-compose]#

#网站配置的调整:

#在nginx的配置文件中,有个默认的域名需要进行调整,否则部分访问的链接地址会指向错误的链接,导致图片显示等问题:

vim /crmeb/CRMEB/docker-compose/nginx/vhost.conf

把其中的bz.crmeb.com 字段替换为我们申请的域名即可。

只需要调整这两个配置文件,完成后,我们直接启动服务(初次启动会从互联网拉取镜像,需要一些时间,完成镜像的构建)

docker-compose up -d

[root@opencloudos docker-compose]# docker-compose up -d

[+] Running 5/5

 ✔ Network docker-compose_app_net  Created                                                                                      0.1s

 ✔ Container crmeb_php             Started                                                                                      0.5s

 ✔ Container crmeb_mysql           Started                                                                                      0.5s

 ✔ Container crmeb_redis           Started                                                                                      0.4s

 ✔ Container crmeb_nginx           Started
最终完成启动后,会创建容器网络,并启动4个业务容器。其中的mysql和redis是业务数据库及缓存,nginx和PHP是业务代理及应用层,其中PHP容器会有业务数据写入。

查看运行的容器信息。

[root@opencloudos ~]# docker ps

CONTAINER ID   IMAGE          COMMAND                  CREATED        STATUS        PORTS                                                                                                              NAMES

5d4de883e482   nginx:alpine   "/docker-entrypoint.…"   28 hours ago   Up 28 hours   0.0.0.0:8011->80/tcp, :::8011->80/tcp                                                                              crmeb_nginx

0b15490c7e6f   crmeb_php      "/usr/sbin/php-fpm7.…"   28 hours ago   Up 28 hours   0.0.0.0:9000->9000/tcp, :::9000->9000/tcp, 0.0.0.0:20002-20003->20002-20003/tcp, :::20002-20003->20002-20003/tcp   crmeb_php

deeedd922cdd   mysql:5.7      "docker-entrypoint.s…"   28 hours ago   Up 28 hours   33060/tcp, 0.0.0.0:3336->3306/tcp, :::3336->3306/tcp

           crmeb_mysql

98ac3dbd6dbb   redis:alpine   "docker-entrypoint.s…"   28 hours ago   Up 28 hours   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp

           crmeb_redis

各个容器的具体功能,可以从crmeb官网了解,这里不做具体介绍 。

容器启动后,php容器,启动长连接和队列,在云主机命令行直接运行命令即可:

docker exec   crmeb_php php think timer start –d

docker exec   crmeb_php php think queue:listen –queue &

docker exec   crmeb_php php think workerman start –d

目前我们是手动启动业务,为了便于重启的业务自动拉起,配置一个启动脚本来满足业务自启动需求:
在/root/目录下创建start.sh文件,文件内容如下:

cd /crmeb/CRMEB/docker-compose/

docker-compose up -d

sleep 5

docker exec   crmeb_php php think timer start --d

docker exec   crmeb_php php think queue:listen --queue &

docker exec   crmeb_php php think workerman start --d

给脚本配置可执行属性

chmod  +x /root/start.sh

#把启动命令写入 rc.local

echo "bash /root/start.sh" >> /etc/rc.d/rc.local

chmod +x /etc/rc.d/rc.local

这样系统启动后,会自动启动这个脚本,拉起服务,您的线上商城基础设施建设,已经就绪了。


下面,登录完成安装及配置工作。
访问主机公网IP:8011
配置数据库密码及相关信息,这些信息在CRMEB的docker-compose.yml文件中可以找到,根据安全需要,把数据库密码修改为复杂密码。 而不使用默认的123456

进行安装配置时,注意数据库用户名是root,填写相应的信息后,系统进入安装阶段。
注意:
我们使用了一个非标准端口8011,如果您在初期已经完成了域名备案,可以直接使用80443标准端口。

访问安装地址开始安装

安装完成后
可以看到进入前台和进入后台两个选项,实际链接如下:
http://116.196.x.x:8011/
http://116.196.x.x:8011/admin
注意进入前台前,需要进入后天配置一个网站地址。
输入刚才设置的admin 和密码,进入系统管理后台:

配置网站地址为我们的域名,到这个阶段,我已经拿到了备案过的域名,因此,我这里直接填写了域名:8011 如果您在初期未获取域名,直接在网站地址输入http://ip:8011即可。

配置好后台的网站域名后,所以可通过域名进行访问,并上架商品等。


如果要通过域名访问,域名需要完成备案

已经完成线上商城的架构的搭建:

在手机端访问http://malltest.xxx.cn:8011 ,可以正常访问到手机适配的商城页面,目前还没有做定制,商品也是默认商品。

在PC上访问的页面,默认为移动端,PC端模版需要购买,初期,我们只使用移动端进行运营。


现在,可以到后台去配置商品信息及价格信息等,开始线上的业务运营。具体操作可以参考crmeb的官网文档,本文不对商城运营细节部分做深入讨论。

1.4、安全加固

1.0版本中,我们并未对crmeb的整体配置做更多调整,目标是快速完成上线,但是线上的业务必须要做好安全防护措施,我们这个阶段出于成本考虑,不会购买专业的云上安全服务如WAF或安全运营中心等,但是我们可以使用云上其他的低成本服务来保护主机及数据。

资源安全

首先是基础设施的安全,如果我们的云控制台的密码或AK/SK被窃,我们的所有主机和数据库都直接暴露在危险之中,随时可能被删除。云控制台的登录安全是最核心的防线之一。
启用MFA认证是必须的步骤,启用MFA后,登录控制台,需要通过手机进行认证,而删除云资源也需要进行短信验证,这是保障我们云资产安全的必备工具。
和操作系统一样,我们可以创建多个云控制台的子账号,子账号分配所需的必须权限,这样平时维护可以使用子账号,减少主账号登录的风险。
AK/SK 的防护:
AK/SK类似于我们云服务的密码,通过SDK调用云服务时会用到AKSK,AK/SK的安全风险等同于甚者更甚于云账号密码的安全风险,因此一定要注意保护AK/SK不要泄露。

  1. AK/SK 只在需要的时候创建。
  2. AK/SK 只授权给部分子用户并授权部分功能。
  3. AK/SK 不要通过git等同步到公网开放的平台上。
    资源安全的更多资料,特别是子账号的管理(子账号是团队运维云上业务必须的一个功能),可以阅读京东云上的官方文档,里边有较为详细的信息。

主机及数据安全

现在随着AI的能力及开放度提升,稍有IT经验的人可以轻松获取网络攻击工具和脚本,开放到网络上的各种服务被攻破的可能性大大提升,我们的线上电商平台的服务SLA初期不是考虑重点,需要重点考虑数据安全。
京东云对整机能提供每天自动镜像备份的功能,即使主机被攻破,数据被加密,我们仍然可以恢复上次镜像时所有的数据。成本低,效果好,一定要使用。
重要数据的线下备份或异地备份也是重要的数据安全保障手段,在初期,我们可以定期把重要数据导出到线下本地存储中,后期随着数据量的增加,我们需要对重要数据进行云上备份或云上异地备份。比如,业务部署在京东云的华北区,可以将数据备份到京东云华北区的一台独立的服务器上,或将数据备份到京东云的华东区的服务器或数据库中。

主机整机镜像的配置方法:
通过自动镜像功能每天自动备份云主机整机,数据保留7天,滚动循环,这里设置主机镜像时间在凌晨2点,这个时间一般是业务低峰期,制作镜像对网络的影响较小。

将配置好策略关联到商城云主机,这样以后每天凌晨2点多,会自动给您的主机制作数据镜像,万一您的主机因为操作失误或被攻击而导致数据丢失,可以通过近期的镜像恢复业务数据。

从京东云控制台可以看到历史的镜像数据。我们的主机在前一天晚上已经做了整体镜像,而这个镜像的删除时间是7天后。


也可以通过脚本定时备份数据库,如果您觉得每日的主机数据备份间隔较长,可以使用脚本对MySQL数据库的数据进行定期备份,比如每6小时或3小时,数据量不大的时候,这个频率对数据库访问不会造成大的影响。

网络防护

1.0阶段,我们只使用云上的免费安全服务,那就是云主机的安全组:
安全组是云上免费的安全服务,也是主机层面很好安全服务,可以针对端口及外部地址进行防护配置。安全组配置方法参考京东云官方文档 https://docs.jdcloud.com/cn/virtual-machines/typical-configuration
建议的配置项目:

  1. 22端口:限制只有特定IP可以访问
  2. 业务端口(80,443等,本文使用了非标的8011端口):开放全部访问权限
  3. 其他端口:不开放访问

具体规则示例,请根据您实际需求调整安全组:


密码安全

密码层级:
云控制台的密码
主机的密码
数据库的密码
业务管理的密码
几种不同层级的密码必须不同,且密码复杂度及长度符合安全密码的要求(大小写字母+大写字母+数字+特殊符号,长度不小于12位),密码不要在群里传播,主机密码和控制台密码建议定期更换。

业务访问安全

上线业务务必使用HTTPS协议(因申请SSL证书需要一定时间,本文不配置HTTPS访问),建议设置80到443强制跳转。
在业务上线初期,我们要避免数据库端口暴露在公网上,只开放必须的80和443端口给大众访问。其他接口通过安全组设置为允许特定IP进行访问(安全组具体配置方法见京东云官方文档)。

1.5、业务扩容

1.0阶段业务扩容比较简单,如果我们的业务访问增加,单台主机的CPU或内存可能成为瓶颈,此时,可以对主机进行扩容,从2C8G逐步扩容到4C或8C及至更高规格,需要注意,主机扩容需要关机,可以在某个晚上没有业务流量的时候关机扩容。主机在线扩容方案,在1.0阶段,相对复杂,耗时更长,需要更多的IT技能,因此,我们在这个阶段,选择关机扩容。
可提前在主页公布维护时间,一般10分钟内主机扩容完成。在单台主机提供服务的阶段,磁盘存储空间可以直接进行云硬盘扩容。此部分不做详细说明,具体操作京东云官方文档有较详细说明,可以直接参考京东云官网文档操作。

1.6、业务运营

经过上面的简单操作,您使用了一台主机,一个公网IP,一个域名,每个月300多元IT基础设施成本,就可以开始您的自有线上商城运营。当然,这个业务运行起来以后,还有一些可以优化的细节,还有商城系统的商品上架及小程序配置等具体业务细节,不是本文的重点讨论范围,可以参考crmeb的官网文档。

您可以充分利用互联网及云计算的基础设施红利(和电商竞争的格局类似,国内云厂商也卷的厉害,也是给消费者提供了真正的福利),以很低的成本,这也包括技术成本和时间成本(您不需要在起步阶段聘用专业的IT管理和开发人员),开始您的线上创业之旅,给社会创造价值。

如果您运营有方,业务增长迅速,1.0阶段的美好时光会很快过去,你开始发现主机性能不能满足要求,访问网站和下单会出现卡顿现象,客户的体验下降了,很可能因为主机性能原因流失了客户,这个时候可以开启2.0阶段的建设工作了。

2、第二部分 2.0阶段

重点关注2点:
1. 规划架构并保证业务的稳定性
2.
运维管理安全及业务安全加固

注意
1.0阶段的单台主机,作为2.0阶段的基础,要保留下来,因为我们的业务后面如果切换到2.0出现问题,我们随时可以切换回1.0阶段。
2.0阶段,我们把数据层和应用层做分离,应用层我们仍然使用nginx+PHP,上面启用nginx和PHP的容器来提供服务能力,但是业务数据存储在CFS(云NAS)上,数据库和缓存直接使用京东云的RDS和Redis服务。
这需要重新设计存储及业务架构,下面是我们2.0阶段的业务架构。

2.1 架构规划

进入2.0阶段后,在线商城业务已经进入正轨,订单量增多,可以预期在一定时期内,您的业务还将以一定的增速实现快速增长,需要实现算力及存储能力的在线实时扩容,在考虑合理的成本前提下,我们充分利用京东云的云上IaaS服务和PaaS服务,来实现一个安全稳定的2.0框架。
框架图如下:


可以看到,这个阶段整体框架依然清晰简洁
我们当初规划的各个子网都得到了应用,业务入口通过负载均衡服务,主机访问公网出口,使用NAT网关服务(主机所在子网的默认路由调整为通过NAT网关),所有的云主机不再绑定公网IP,通过堡垒机来管理和记录云主机的访问。数据网络和应用网络使用了不同的子网,我们可以通过网络ACL来管理子网间的互访(不是必须),来增强安全性。
负载均衡后面直接挂载高可用组,加入高可用组的主机,直接被挂载到负载均衡后面,提供算力服务,而不需要对负载均衡进行更多的操作配置。

网络规划:
2.0阶段,我们可能需要对商城进行一些二次开发,这个时候,按照正常的业务需求,我们需要创建测试环境,与生产环境隔离,我们需要新建一个VPC,在里边创建与生产环境一致的网络,部署测试业务,当新的需求需要上线前,我们在测试环境要进行充分的测试,然后部署到生产环境中。本文不对二次开发和测试环境进行详细的说明。从架构上,我们需要的子网包括如下4个子网,在1.0阶段,我们只使用了一个主机网络,2.0阶段,我们使用最初1.0阶段规划的全部4个子网。
入口网络
出口网络
主机网络
数据网络
网络信息在第一部分已经有截图可以参考,我们需要在2.0阶段调整VM主机所在子网的路由,将默认路由指向NAT网关,这样所有主机可以正常访问公网(操作步骤省略,参考京东云官网文档操作即可)。

存储规划
2.0阶段,我们的应用与数据进行分离,使用京东云的CFS服务,来存储业务数据,多台应用主机共同使用CFS业务数据,使用RDS数据库服务存储数据库数据。

多可用区部署
从架构图,我们可以看到从入口的负载均衡到云主机、数据库、NAT网关,我们的服务分布在多个AZ(可用区),京东云可用区是基于IDC级别,这样即使云服务的单个IDC发生故障,无法访问,我们的业务访问可以通过另一个可用区资源支撑,将对正常业务的影响降到最低。

2.2 资源需求及成本评估

项目规格数量说明
云主机2C8G2~X主机操作系统选择opencloudos ,购买时不需要数据盘 数量根据需求随时增加
公网IP1个,绑定在负载均衡上15M带宽,按流量计费,在购买主机的时候直接附加购买
NAT网关小型NAT网关1小规格NAT网关一个,购买时自带一个公网IP ,带宽选择5M,可随时升级带宽及NAT网关规格
负载均衡应用型负载均衡1多可用区部署
RDSMySQL5.71根据需求选择实际规格即可
Redis4.0版本18G 标准基础版
云文件存储CFS1推荐使用性能型,根据使用容量收费,容量及文件数量可在线随时扩容
高可用组无规格1高可用组免费,建议可用区不少于2个

以上的资源,成本每月1000元+,根据使用的主机数量增加或减少,这个架构根据业务需求,至少2台云主机加入高可用组,自动跨多可用区部署。

2.3 应用部署(划重点)

云存储准备
2.0阶段,除了数据库和缓存,其他的业务数据存储到CFS上,云主机不再单独购买数据盘。
在京东云控制台创建文件存储。

在我们的业务主机上挂载这个CFS文件系统,作为CRMEB的非数据库文件目录,为了与数据盘上挂载的crmeb目录区分,我们创建一个cfs-crmeb目录。

mkdir /cfs-crmeb

mount -t nfs -o vers=3 -o noresvport 172.16.x.x:/cfs /cfs-crmeb/

后面的基础镜像制作时,需要通过上面的命令,在主机启动时自动挂载CFS文件系统。

云数据库准备
在京东云上创建一个MySQL5.7版本的数据库。

数据库规格可以随着业务扩展,进行在线升级,项目演示,我创建了一个1C1G,20G存储容量的RDS实例,我们需要导入1,0时代MySQL容器中的所有数据到这个RDS中。
在RDS上创建账号和库crmeb,并给crmeb账号赋予crmeb的全部权限:

进入1.0的单机版的主机的MySQL容器,导出现有所有的数据。

进入现有环境的MySQL容器:

[root@crmeb-base0 crmebdata]# docker exec -it crmeb_mysql bash

bash-4.2#

bash-4.2# mkdir backup

#创建一个备份数据目录,实际存储位置在主机的数据盘上。

#以root用户进入数据库查看现有数据。

bash-4.2# mysql -uroot -p

Enter password:

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 26

Server version: 5.7.44 MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| backup             |

| crmeb              |

| mysql              |

| performance_schema |

| sys                |

+--------------------+

6 rows in set (0.00 sec)

mysql>

#可以看到crmeb和backup数据库,我们要导出crmeb数据库的所有数据到京东云的RDS数据库中,京东云提供了DTS服务,可以在线迁移和同步数据,考虑我们业务数据量不大,可以在迁移窗口期来手动导出导入,本文直接手动dump。

mysql> exit

bash-4.2#mysqldump -h 127.0.0.1 -uroot -p  --databases crmeb > ./backup/crmeb2024.sql

Enter password:

#导出需要一定时间。

bash-4.2# cd backup/

bash-4.2# ls -lh

total 8.8M

-rw-r--r-- 1 root root 8.8M Jan 31 16:48 crmeb2024.sql

bash-4.2#

#直接用这个mysql连接我们创建的京东云上的云数据库

bash-4.2# mysql -h mysql-cn-north-1-6axxx1xxx853.rds.jdcloud.com -ucrmeb -p

Enter password:

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 105299

Server version: 5.7.33-log Source distribution

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| crmeb              |

+--------------------+

2 rows in set (0.00 sec)

mysql>use crmeb;

mysql>show tables;

#查看已经创建的crmeb库,目前是空的,我们导入刚刚备份的历史数据

source /var/lib/mysql/backup/crmeb2024.sql

#导入数据需要一定的时间。完成后查看导入的表,建议通过查询或使用开源工具对两端数据进行一下对比和验证。

mysql> show tables;

+-----------------------------------+

| Tables_in_crmeb                   |

+-----------------------------------+

| eb_agent_level                    |

| eb_agent_level_task               |

| eb_agent_level_task_record        |

| eb_agreement                      |

| eb_app_version                    |

| eb_article                        |

| eb_article_category               |

| eb_article_content                |

| eb_auxiliary                      |

| eb_cache                          |

| eb_capital_flow                   |

| eb_category                       |

| eb_delivery_service               |

| eb_division_agent_apply           |

| eb_diy                            |

| eb_express                        |

| eb_lang_code                      |

| eb_lang_country                   |

| eb_lang_type                      |

| eb_live_anchor                    |

| eb_live_goods                     |

| eb_live_room                      |

| eb_live_room_goods                |

| eb_luck_lottery                   |

| eb_luck_lottery_record            |

| eb_luck_prize                     |

| eb_member_card                    |

……

数据库导入完成。

也可以直接从原地dump导入目标库,因为云上数据库和容器数据库的权限设置不同,可能会遇到权限问题,权限问题可以和京东云客服沟通,可在迁移期间提供相关权限。

云缓存准备
在京东云控制台创建一个Redis。

Redis生产环境建议使用密码访问,设置一个复杂密码。

基础镜像制作及高可用组配置(重点步骤)
因为我们把数据库和缓存已经单独拆分出来,因此,需要对应用基础镜像进行调整,只使用nginx和PHP服务,且把PHP服务的数据存储于CFS的特定目录中。
保持现有单主机环境不变,在割接窗口期暂停线上业务(建议凌晨无业务时操作)制作一个最新的主机镜像,并用主机镜像生成一个新的主机,所有操作在新主机上进行,如前所述,我们在切换到2.0前,保持现有的单主机环境不变,我们需要保留原始的1.0单机环境,不对其进行变动,有问题可以随时切换回1.0的环境。
需要调整新建的主机为高可用组的基础镜像,调整如下:
存储配置的调整如下:

  1. 将业务启动相关文件存储到CFS的文件夹/cfs-crmeb下面(上面步骤已经在主机中创建了/cfs-crmeb目录)。
  2. 取消数据盘挂载,后续主机不使用数据盘
  3. 配置docker-compose.yml文件,配置业务数据保存在CFS文件夹特定目录中
#编辑/root/start.sh,调整启动脚本的目录为/cfs-crmeb/CRMEB/docker-compose/ ,调整后的start.sh内容如下:

cd /cfs-crmeb/CRMEB/docker-compose/

docker-compose up -d

sleep 5

docker exec   crmeb_php php think timer start --d

docker exec   crmeb_php php think queue:listen --queue &

docker exec   crmeb_php php think workerman start --d

#编辑/etc/rc.d/rc.local 增加挂载cfs,调整完的文件内容如下:

mount -t nfs -o vers=3 -o noresvport 172.16.x.x:/cfs /cfs-crmeb/

sleep 2

bash /root/start.sh

#复制现有数据,注意调整复制后的CRMEB目录权限为777

cp /crmeb/CRMEB/ -r /cfs-crmeb

chmod -R 777 /cfs-crmeb

#停止现有docker-compose服务

cd /crmeb/CRMEB/docker-compose/

docker-compose down

#卸载数据盘

umount /crmeb

#修改fstab文件,注释掉数据盘挂载行,调整后的文件内容如下:

#

# /etc/fstab

# Created by anaconda on Tue Apr  4 07:40:29 2023

#

# Accessible filesystems, by reference, are maintained under '/dev/disk/'.

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.

#

# After editing this file, run 'systemctl daemon-reload' to update systemd

# units generated from this file.

#

UUID=ff4xxx-4xx1-4xx-8xx-5xxxx /                       ext4    defaults        1 1

#/dev/vdb1 /crmeb       ext4    defaults    1  1

#在京东云控制台主机界面,卸载掉数据盘

调整业务数据存储目录到CFS目录
vim /cfs-crmeb/CRMEB/docker-compose/docker-compose.yml

调整PHP及nginx的存储数据目录为CFS上的目录。

调整基础镜像中的应用启动配置如下:

  1. 配置业务运行的基础环境,数据库及缓存使用已经创建的京东云服务
  2. 配置业务运行程序,取消本机运行MySQL及Redis容器服务。
    调整启动crmeb的外部依赖配置,替代原有的MySQL和Redis的IP地址为京东云外部依赖的地址,同时调整用户名和密码与京东云配置的数据一致:
    这个文件是个隐藏文件,位置在CRMEB/crmeb/.env ,编辑这个文件,调整其中的MySQL及Redis的配置参数。

调整业务运行配置,调整docker-compose.yml

[root@crmeb-base0 docker-compose]# pwd

/cfs-crmeb/CRMEB/docker-compose

[root@crmeb-base0 docker-compose]#

#删除MySQL和Redis的部分内容即可

[root@crmeb-base0 docker-compose]# cat docker-compose.yml

version: "3.3"

services:

  # php 容器

  phpfpm:

    container_name: crmeb_php #指定容器名

    image: crmeb_php #指定镜像名

    build:

      context: ./php #dockerfile文件路径

      dockerfile: Dockerfile #制定dockerfile文件名称

    restart: always

    environment:

      TZ: Asia/Shanghai

    ports:

      - 9000:9000

      - 20002:20002

      - 20003:20003

    tmpfs: /var/temp #上传临时文件夹

    working_dir: /var/www

    volumes:

      - /cfs-crmeb/CRMEB/crmeb:/var/www #程序运行目录

      - /cfs-crmeb/CRMEB/crmeb/runtime:/var/www/temp #程序缓存目录

      - /cfs-crmeb/CRMEB/docker-compose/php/php-ini-overrides.ini:/etc/php/7.4/fpm/conf.d/99-overrides.ini

    networks:

      app_net:

        ipv4_address: 192.168.10.90

#    command: /bin/bash -c "php -v"

  # nginx 容器

  nginx:

    container_name: crmeb_nginx

    image: 'nginx:alpine'

    restart: always

    ports:

      - 8011:80

      # - 443:443

    # 依赖关系 先跑php

    depends_on:

      - phpfpm

    environment:

      TZ: Asia/Shanghai

    working_dir: /var/www

    volumes_from:

      - phpfpm #继承phpfpm挂载目录

    volumes:

      - /cfs-crmeb/CRMEB/docker-compose/nginx/vhost.conf:/etc/nginx/conf.d/default.conf

      - /cfs-crmeb/CRMEB/docker-compose/nginx/log:/etc/nginx/log

    networks:

      app_net:

        ipv4_address: 192.168.10.80

networks: #网络配置

  app_net: #网络名称

    driver: bridge

    ipam: #网络配置

      driver: default

      config:

        - subnet: 192.168.10.0/24 #IP区间

[root@crmeb-base0 docker-compose]#

#到这里,已经完成应用及数据分离调整

重启主机,配置hosts文件 (为了验证业务,需要通过单机先验证无误后,再进行下一步的操作),将刚刚调整的主机(crmeb-base0)公网IP配置为malltest.kxxxd.cn,确认可以在本机正常访问且数据都正常:

确认本机访问的域名为新建的单机模版

打开一个浏览器隐私窗口访问域名,避免浏览器缓存影响。

访问正常,则我们的单机可以直接使用。
验证单机访问正常后,关机并制作一个高可用组使用的镜像模版。 后续通过高可用组自动创建主机部署于不同的AZ。

  1. 创建这个主机的私有镜像:
  2. 通过私有镜像创建实例模版

    实例模版选择主机所在的VM子网,安全组使用已经配置完成的现有安全组,主机登录方式保持镜像认证方式。
  3. 创建高可用组
    创建高可用组,使用刚刚创建好的crmeb实例模版,可用区选择全部可用区。

    高可用组创建完成后,可以作为负载均衡的后端负载。
    负载均衡配置
    京东云负载均衡支持后端挂载高可用组,挂载高可用组后,不需要对负载均衡再做其他配置,只需增减高可用组中主机即可实现算力的调整。
    首先创建后端服务,因为后端使用高可用组,我们命名为crmeb_ag,端口使用主机docker-compose中使用的8011。

在添加服务器组选项中,选择高可用组



完成负载均衡的后端服务创建.

注意此时高可用组后面还没有加入主机,主机后续创建即可。

为负载均衡创建一个新的监听器,因为域名已经注册并备案完成,我们使用标准的80端口。

在高可用组中增加多台主机承载业务
完成了架构准备工作,我们在高可用组中创建3台主机。3台主机会自动挂载到LB后端,提供应用服务。


在高可用组控制台点击新增实例

在名称设置处填写crmeb_app_[01],数量处选择3,则自动在不同可用区生成3台主机,且名称会自动排序

从云主机控制台可以看到三台主机已经创建完成,分布于A B C 三个可用区。

在高可用组控制台可见有3台主机

登录主机查看是否正常拉起了应用,可以看到主机里边运行了nginx和PHP两个容器服务,提供应用服务,而数据库和缓存则会依据配置文件,访问京东云的云上数据库和缓存。

[root@crmeb-app-01 ~]# docker ps

[root@crmeb-app-01 ~]# docker ps

CONTAINER ID   IMAGE          COMMAND                  CREATED        STATUS        PORTS

                                           NAMES

2455676dc9b9   nginx:alpine   "/docker-entrypoint.…"   16 hours ago   Up 10 hours   0.0.0.0:8011->80/tcp, :::8011->80/tcp

                                           crmeb_nginx

2c340332f2bd   crmeb_php      "/usr/sbin/php-fpm7.…"   16 hours ago   Up 11 hours   0.0.0.0:9000->9000/tcp, :::9000->9000/tcp, 0.0.0.0:20002-20003->20002-20003/tcp, :::20002-20003->20002-20003/tcp   crmeb_php

[root@crmeb-app-01 ~]#

调整业务域名的访问端口为80端口
还记得我们在1.0阶段的一个技术债吗,就是我们当时没有申请域名,只能使用非标端口8011访问业务,现在,我们要偿还这个技术债。来调整业务访问使用正式域名的标准端口,并将配置写入京东云的RDS新的数据库中。
我们需要临时调整负载均衡的8011端口,解析到后端高可用组中的一台主机
先创建一个新的虚拟服务器组“AG单实例”,加入高可用组三台中的一台即可。



编辑后端服务选择为刚创建的虚拟服务器组“AG单实例”


查看后端服务正常:


现在登录域名+8011端口,我们调整为正常网址
调整前:

调整后:


在域名服务商处,将域名解析到负载均衡的公网IP。现在可以正常通过域名来访问业务了(注释掉本机hosts的域名条目)。

现在可以访问网址 http://malltest.xxxd.cn (验证完成后域名已经停止使用) ,通过移动端访问效果会更好。

注意如果服务器访问日志需要开启获取真实IP,需要调整nginx的配置,可直接调整CFS文件存储中的nginx配置文件,本文不做赘述。

2.0阶段的业务已经部署完成

2.4、安全加固

除了需要遵循1.0阶段的相关安全准则外(对整机做镜像备份除外,业务数据不再存储于主机本地,可以不再对主机进行镜像),2.0阶段,我们的业务数据量增加,对数据安全需要做进一步的考量。
数据库安全: 我们的数据库使用了京东云的MySQL数据库服务,MySQL数据库为多可用区主从结构,并且会定期自动备份数据库数据。数据库高可用有云服务的后台保障,我们重点考虑数据库的敏感数据加密,比如商户的信息中涉及电话号码、身份证信息、收发货地址等,对敏感信息,我们可以使用京东云的数据库加密服务和数据库审计服务等安全服务,可参考https://docs.jdcloud.com/cn/rds/mysql-tde 文档进行配置。
CFS文件存储: CFS文件存储因为存储了业务数据,如图片等,建议定期对CFS文件存储进行备份,可将数据备份到对象存储(价格较低)或另一个CFS存储实例当中,避免业务主机被入侵后,数据被删除造成损失。
业务访问层面: 线上业务启用HTTPS协议,京东云公网IP默认提供2G的DDoS攻击流量防护能力。可防护少量网络攻击。出于成本考虑,2.0阶段,我们对访问层面的安全产品暂时不进行购买。
应用层面: 我们需要关注crmeb官网的相关安全更新,如果有安全补丁或应用安全更新,一定及时更新,避免应用漏洞造成安全问题。

2.5、业务扩容

2.0阶段,业务扩容分为两个部分,应用部分的算力扩容,不再需要对单台主机进行纵向扩容,我们随时直接在高可用组内增加主机,提高业务承载能力。也可以在业务量下降,算力盈余时移除主机。


数据库及Redis的扩容,可以直接在控制台进行配置调整,调整到更高的配置,注意,数据库和Redis支持升配,不支持降配。
CFS文件存储是在线扩容模式,无需做其他操作。
负载均衡、NAT网关以及公网IP带宽,都可以根据需要,进行升配或降配操作。
2.0阶段,我们的IT基础设施可以随着我们的业务扩张而方便的进行扩展,这基于京东云的高可扩展特性。

2.6、业务运营

2.0阶段,业务访问会逐步增加,您可能会更多的使用小程序和公众号来进行推广(需要注意的是,根据管局新规,小程序也需要进行备案),另外,随着业务的扩展,您可能会在618或双11、节假日进行一些促销活动,爆品卖的会很好,活动期间,你需要根据活动时间来频繁调整高可用组中的主机数量,提供足够的算力来支持活动高峰的大流量,满足业务需求。
随着业务扩展到全国各地,不同地区访问商城的体验差别很大,部分地区延迟大的问题可能越来越显著。同时,我们的服务器处理大量媒体访问时,会给CPU和网络带来压力,造成业务体验下降,同时,促销券也可能引来网络爬手,甚至攻击,造成业务损失。
这些问题需要进入3.0阶段来解决,这需要更多的IT资源。

3、第三部分 3.0阶段

重点关注2点:
1. 防护网络安全攻击
2.
在控制成本的同时,提高服务SLA,保障业务稳定

3.1 架构规划

进入3.0阶段后,整体业务架构调整目标是:业务高可用、高安全、可扩展(自动化)、低运维。

  1. 使用CDN,利用静态内容-Cache分发,加速业务访问速度
  2. 使用更多的云安全产品,包括云WAF、高防IP、安全运营中心
  3. 使用云主机弹性伸缩,自动化满足业务峰谷算力调整需求
  4. 考虑异地灾备及业务双活的规划(双活成本较高,不在3.0阶段建设)

框架图如下:


如果考虑灾备同步,可增加到异地的数据库灾备同步。

网络规划:
从架构图看到,3.0阶段,在负载均衡前面加入了京东云WAF服务(有受到DDoS攻击时,可以增加高防IP服务,对攻击流量进行清洗,本文不重点讨论),WAF服务配置回源地址到负载均衡的公网地址。
在DNS解析处将域名解析调整为CNAME模式,CNAME填写WAF的域名地址即可,注意这个时候为了避免用户直接访问负载均衡公网IP。
负载均衡的安全防护:为负载均衡配置一个安全组,80和443端口只对WAF集群的IP地址放开,WAF集群地址从京东云官网获取,这些地址有可能会随着WAF集群的更新或扩容而变化,因此,要注意京东云的短信和邮件通知,及时调整负载均衡安全组的白名单,放行对应的WAF公网IP。此部分的配置依据京东云官方文档配置即可,不做详细说明。

存储规划
3.0阶段,图像及视频等静态文件使用对象存储,同时,启用CDN加速方案,主机应用配置文件仍然使用京东云NAS服务(CFS)。
云文件服务存储的数据较多时,如果单个CFS实例提供服务,可能CFS会成为瓶颈,此时可以创建多个CFS,将业务数据目录挂载到不同的CFS上,多个CFS分摊业务数据读写压力,提高业务相应速度。
当商城数据量增多,图片及视频等资源,建议存储到对象存储,并通过CDN提供访问加速。
在商场后台,配置使用对象存储(具体过程省略,因为涉及成本及时间,未对此部分进行验证操作):

3.2 资源需求及成本评估

项目规格数量说明
云主机2C8G2~X主机操作系统选择opencloudos ,购买时不需要数据盘 数量根据需求随时增加
公网IP1个,绑定在负载均衡上15M带宽,按流量计费,在购买主机的时候直接附加购买
NAT网关小型NAT网关1小规格NAT网关一个,购买时自带一个公网IP ,带宽选择5M,可随时升级带宽及NAT网关规格
负载均衡应用型负载均衡1多可用区部署
RDSMySQL5.71根据需求选择实际规格即可
Redis4.0版本18G 标准基础版
云文件存储CFS1推荐使用性能型,根据使用容量收费,容量及文件数量可在线随时扩容
高可用组无规格1高可用组免费,建议可用区不少于2个
对象存储标准存储1创建bucket并赋予权限
WAF高级版/企业版1根据需求选择版本,企业版成本较高
IP高防4.0版本1保底防护20G 峰值防护50G
CDN1配置域名 并配置回源及策略

因为涉及到主机的自动弹缩及安全防护服务,单月成本可能有浮动,具体金额需要根据主机使用及安全服务规格评估,相对我们的业务及营收来讲,这个阶段的IT资源投入成本占比应该在一个合理的区间。

3.3 应用部署

应用仍然以原来的方式通过高可用组下的主机模版来部署,如果要升级程序,需要更新主机模版。
部署架构与原有架构保持一致。
这个阶段,您可能有了开发和运维的专业团队,应用部署也可以通过自建或云上的devops工具,进行应用的发布及运维管理,实现一定的自动化能力。
这个阶段,有需要可以使用K8S服务,替代主机来作为算力承载平台。本文重点关注基于主机的业务快速扩缩容,不对K8S进行讨论。

3.4、安全加固

安全加固在2.0阶段基础上,增加了高防IP及WAF服务,可以对来自网络的攻击流量进行过滤,减少安全风险。
对增加的CDN及对象存储服务,需要注意资源的访问权限,对象存储建议设置私有读写,通过SDK访问时使用AKSK进行认证
如果您的业务需要进行等保认证,那需要根据认证需求,采用相应的安全服务和安全加固,如审计、日志服务、主机安全服务等。
如果没有等保认证要求,也建议使用云上的安全运营中心,对IT资源及业务做整体的安全态势监控和管理。
建立安全管理机制,特别是数据的管理和代码安全管理,制度是安全保障的基础。

3.5、业务自动扩缩容

为了满足业务大促期间的流量波动对算力的弹性需求,使用京东云的主机自动弹缩功能。
自动弹缩功能能够根据监控信息,调整高可用组下主机的数量,应对未知的流量增长,在大促期间会非常方便。
可以设置多种伸缩规则,如以CPU阈值为标准,分批次步进创建云主机,也可以定时弹出定量的云主机,在大促阶段,也支持手动一键创建数十台或数百台主机。


通过自动化的伸缩配置,在无需运维干预的前提下,可以自动对算力进行扩缩容,实现业务成本的最优化。

针对复杂的业务弹缩需求,京东云高可用组的弹缩功能,还可以与京东云的外部服务联动,包括云事件、云监控等对接起来,满足更为复杂的业务弹缩需求,这需要根据京东云的产品SKD进行开发,弹缩流程可以参考下图。
不贴图了……

3.6、业务灾备及双活考虑

这个阶段,数据及业务灾备需要分层考虑,数据灾备成本相对较低,比如使用京东云的DTS数据同步工具或京东云的数据库异地灾备功能,可以方便的实现数据库的异地灾备。
业务灾备,现在已经能实现跨IDC的容灾能力,但是考虑跨region地区的业务容灾能力建设,则要在京东云另一个可用区如上海或宿迁、广州等区域建立第二个业务资源池,这可能涉及到业务的单元化改造及数据跨region的同步问题,较为复杂,也超出了本文的讨论范围,后续我们可以以其他专题进行讨论和学习。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注