暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[译] 在 MySQL 数据库服务和 HeatWave 上部署 Magento

原创 蒙奇D路飞 2022-06-22
530

原文地址:Deploy Magento on MySQL Database Service & HeatWave
原文作者:Frederic Descamps(MySQL Community Manager)

Magento 是一个使用 PHP 编写的开源电子商务平台,使用多个其他 PHP 框架,例如 Laminas 和 Symphony。Magento 源代码在 Open Software License v3.0下分发。

部署 Magento 并不总是那么容易,因为它通常需要注册。然而,源代码也可以在 GitHub 上找到。

Magento 自2.4.0 版 (2020 年 7 月 28 日)起支持 MySQL 8.0 。

在 Magento 的文档中,有一条关于 GTID 支持的警告:

image.png

自MySQL 8.0.13以来,这不再是问题 !MDS 也总是使用最新版本的 MySQL。

要求

要使用 MySQL 数据库服务 (MDS) 和 HeatWave 在 Oracle 云基础设施 (OCI) 上部署 Magento,您需要:

互联网连接
一个 OCI 帐户(您可以在 https://www.oracle.com/mysql上免费试用)
而且……没有别的了😉

准备就绪后,OCI 仪表板与此类似:
image.png

部署

在 OCI 上部署全栈架构最简单的方法是使用资源管理器和堆栈。复杂性将由堆栈本身处理,Terraform 将自动部署所有必需的资源。

您可以在我的 GitHub 存储库中获得一个堆栈来部署 Magento 架构以及所有必需的资源: https 😕/github.com/lefred/oci-magento-mds

如果您想手动部署 zip 文件,则需要它:
image.png
image.png
如果你想自动部署一切,你只需要点击按钮

部署到 Oracle 云

如果单击它,您将启动 Stack Creation 向导,您需要首先接受 Oracle 使用条款:
image.png
一旦被接受,所有信息都将被预先填写,您只需填写一些必填变量:
image.png

架构

使用此堆栈,您必须能够部署不同的架构。由您决定哪一个符合您的需求。

架构 1 – 默认

默认架构是这样的:
image.png

如您所见,只有一个 Magento Webserver(计算实例)使用一个 MySQL 数据库服务实例和一个 OpenDistro 用于 ElasticSearch 计算实例。

MDS 必须始终位于私有子网上。

架构 2 – 多个网络服务器

image.png
通过这种部署,一个数据库和 OpenDistroES 可以作为多个 Magento Web 服务器的后端。当您希望在 Magento 前面为同一站点提供负载均衡器时,这很常见。

架构 3 – 多个隔离站点

image.png
如您所见,在这第三个也是最后一个架构中,您可以部署多个完全隔离的 Magento。他们每个人都使用自己的 MDS 实例和自己的 OpenDistroES 实例。

您可以简单地从 Stack Creation 屏幕部署这些架构:

image.png
如果您已经拥有 VCN、Internet 网关、子网、安全列表等……并且想要使用它们,也可以使用现有基础架构。

当您选择部署多个 Web 服务器时,您也需要填写此表单:
image.png

部署

当一切都填满后,就可以直接部署所有资源了:

image.png

现在,应用作业将运行一段时间(大约 10 到 15 分钟)。您可以按照日志控制台中的所有步骤操作:
image.png
重要信息也将在最后打印。您还可以从左侧的菜单中检索这些输出变量:
image.png

创建资源

您还可以验证为您创建的内容,例如实例:

image.png

Magento

我们可以在浏览器中复制 Magento Webserver 的公共 IP,我们将看到 Magento 的空白主页:

image.png

如果您熟悉 Magento,那么您现在应该知道,您需要 Magento Admin URI 才能访问管理仪表板。这个 URI 可以在 Stack 的日志输出中找到:
image.png

如果您在浏览器中将 URI 添加到公共 IP,您将到达登录表单:

image.png

定时任务

然后,您将看到 cron 作业未启用:
image.png

要启用 cron 作业,您需要通过 SSH 访问 Web 服务器。

SSH 到计算实例

在 OCI 中,要通过 ssh 访问公共子网中的计算实例,我们需要 IP,还需要密钥。通常,当您手动部署资源时,会要求您粘贴、上传或生成此类密钥。资源管理器为我们生成了一个。

我们需要检索该密钥并将其保存在我们的计算机中。像往常一样,我们可以在 Stack 的输出中找到它:
image.png

我们将它粘贴到一个名为 oci.key 并使用它的文件中:

[fred@imac ~/keys] $ chmod 600 oci.key
[fred@imac ~/keys] $ ssh -i oci.key opc@130.xx.xx.xxx
The authenticity of host '130.xx.xx.xxx (130.xx.xx.xxx)' can't be established.
ECDSA key fingerprint is SHA256:+gVvfYsXMfqoUEHuw6myhIfm9ov748jN+Vf20zr573o.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '130.xx.xx.xxx' (ECDSA) to the list of known hosts.
Activate the web console with: systemctl enable --now cockpit.socket

上次登录时间:2021 年 3 月 15 日星期一 11:38:21 来自 132.xxx.xxx.xxx
[opc@magentoserver1 ~]$

我们现在可以使用 magento 命令行实用程序启用 cron 作业:

[opc@magentoserver1 ~]$ cd /var/www/html
[opc@magentoserver1 html]$ sudo -u apache bin/magento cron:install
Crontab has been generated and saved

magento 实用程序也可用于检索管理 URI:

[opc@magentoserver1 html]$ sudo -u apache bin/magento info:adminuriAdmin URI: /admin_1s35px

Magento 样本数据

由于我不是 Magento 开发人员,我将添加一些示例数据。我将使用 git 使用 Magento2 的官方示例数据:

[opc@magentoserver1 ~]$ sudo dnf -y install git
...
[opc@magentoserver1 ~]$ cd /var/www/html/
[opc@magentoserver1 html]$ sudo -u apache git \
  clone https://github.com/magento/magento2-sample-data
...
[opc@magentoserver1 html]$ sudo -u apache php -f \
  magento2-sample-data/dev/tools/build-sample-data.php \
  -- --ce-source="/var/www/html/"
All symlinks you can see at files:
/var/www/html/magento2-sample-data/dev/tools/exclude.log

建议同时增加 PHP 进程允许的最大内存:

[opc@magentoserver1 html]$ sudo sed -i \
  's/memory_limit\s*=.*/memory_limit=512M/g' /etc/php.ini

[opc@magentoserver1 html]$ sudo systemctl reload httpd

完成后,我们可以完成示例数据的安装:

[opc@magentoserver1 html]$ sudo -u apache bin/magento setup:upgrade
...
block_html: 1
full_page: 1
Nothing to import.
[opc@magentoserver1 html]$ sudo -u apache bin/magento cache:flush

我们验证网站是否发生了变化(我们再次在浏览器中使用公共 IP):
image.png

MySQL 热潮

HeatWave 是一项仅在 MDS 中可用的旗舰技术,可显着加快过长或过于复杂的查询。

使用 HeatWave 的第一个要求是有一个与之兼容的 MDS Instance Shape。

即使您不打算直接使用 HeatWave,我也建议始终为 MDS 使用兼容 HeatWave 的形状。在本例中,使用的形状是 MySQL.HeatWave.VM.Standard.E3。您可以直接看到该形状与 HeatWave 兼容。

如果您有这样的形状,您可以立即在其上启用 HeatWave(如果没有,您将不得不部署一个新实例):
image.png
image.png

随着指令
image.png
一旦 HeatWave 节点准备就绪,您就会 在 OCI 的仪表板中看到它们处于活动状态:
image.png

使用 MySQL HeatWave

现在从 Magento 计算实例中,我们可以使用 MySQL Shell 连接到我们的 MDS 实例并验证 HeatWave 是否准备就绪:

SQL> SHOW GLOBAL STATUS LIKE 'rapid_plugin_bootstrapped';
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| rapid_plugin_bootstrapped | YES   |
+---------------------------+-------+
1 row in set (0.0018 sec)

似乎一切都是正确的。我们还有状态变量:

SQL> show status like 'rapid%' ;
+---------------------------------+------------+
| Variable_name                   | Value      |
+---------------------------------+------------+
| rapid_change_propagation_status | ON         |
| rapid_cluster_ready_number      | 2          |
| rapid_cluster_status            | ON         |
| rapid_core_count                | 16         |
| rapid_heap_usage                | 67109005   |
| rapid_load_progress             | 100.000000 |
| rapid_net_authentication        | ON         |
| rapid_plugin_bootstrapped       | YES        |
| rapid_preload_stats_status      | Available  |
| rapid_query_offload_count       | 0          |
| rapid_service_status            | ONLINE     |
+---------------------------------+------------+
 

和 Performance_Schema 表格:

SQL> show tables like 'rpd%';
+-------------------------------------+
| Tables_in_performance_schema (rpd%) |
+-------------------------------------+
| rpd_column_id                       |
| rpd_columns                         |
| rpd_exec_stats                      |
| rpd_nodes                           |
| rpd_preload_stats                   |
| rpd_query_stats                     |
| rpd_table_id                        |
| rpd_tables                          |
+-------------------------------------+

选择要与 HeatWave 一起使用的表格

有必要告诉 MySQL 哪些表可以用于 HeatWave。这意味着哪些表的数据已卸载到 HeatWave 的内存集群中。

对于这个 Magento 站点,我将使用这些 catalog 表格。

这是一个使用示例 catalog_product_index_price:

SQL> ALTER TABLE catalog_product_index_price SECONDARY_ENGINE = RAPID;
SQL> ALTER TABLE catalog_product_index_price SECONDARY_LOAD;

我使用脚本在所有 catalog% 表上执行这些语句。

是时候在我们的 Magento 商店浏览一下,然后验证一些查询是否使用了 HeatWave。

要执行此操作,我们可以使用 rapid_query_offload_count MySQL 中的状态变量:

SQL> SHOW STATUS LIKE 'rapid_query_offload%' ;
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| rapid_query_offload_count | 3     |
+---------------------------+-------+
1 row in set (0.0015 sec)

我们可以看到已经有 3 个查询使用了 HeatWave。Performance_Schema 当然,可以使用table 来查看哪些 rpd_query.stats:

SQL> SELECT query_text, JSON_PRETTY(QEXEC_TEXT)
     FROM performance_schema.rpd_query_stats\G
************************** 1. row ***************************
             query_text: SELECT MAX(count) AS `count` FROM (
                           SELECT count(value_table.value_id) AS `count`
                         FROM `catalog_product_entity_varchar` AS `value_table`
                         GROUP BY `entity_id`,
    `store_id`) AS `max_value`
json_pretty(QEXEC_TEXT): {
  "timings": {
    "queryEndTime": "2021-03-17 09:26:29.208009",
    "queryStartTime": "2021-03-17 09:26:29.016203",
    "joinOrderStartTime": "2021-03-17 09:26:29.016116"
  },
...

使用 MDS 中的 HeatWave,我们还可以比较这些查询。我们来看一下:

SQL> SELECT MAX(count) AS `count` FROM (SELECT count(value_table.value_id)
     AS `count` FROM `catalog_product_entity_varchar` AS `value_table`
     GROUP BY `entity_id`, `store_id`) AS `max_value`;
+-------+
| count |
+-------+
|    10 |
+-------+
1 row in set (0.0507 sec)

SQL>设置会话 use_secondary_engine=OFF ;

SQL> SELECT MAX(count) AS `count` FROM (SELECT count(value_table.value_id)
     AS `count` FROM `catalog_product_entity_varchar` AS `value_table`
     GROUP BY `entity_id`, `store_id`) AS `max_value`;
+--------+
| 计数 |
+--------+
| 10 |
+-------+
1 行(2.3843 秒)

如您所见,这么小的查询已经有很大的不同了!

维护

对于某些操作,例如重新索引所有内容,Magento 会运行​​一些在 HeatWave 处于活动状态时不受支持的 DDL。

因此,如果您遇到与此类似的错误:

SQLSTATE[HY000]: General error: 3890 DDLs on a table with a secondary engine
defined are not allowed., query was:
   TRUNCATE TABLE `catalog_category_product_index_store1_replica`
Product Categories index process unknown error

您只需在维护期间禁用 HeatWave:

SQL> ALTER TABLE catalog_product_index_store1 SECONDARY_ENGINE NULL;

这次可以进行维护而不会出错:

$ sudo -u apache bin/magento indexer:reindex catalog_product_price
Product Price index has been rebuilt successfully in 00:14:03

完成后,您可以启用返回 HeatWave:

SQL> ALTER TABLE catalog_product_index_store1 SECONDARY_ENGINE = RAPID;
SQL> ALTER TABLE catalog_product_index_store1 SECONDARY_LOAD;

如您所见,使用 Resource Manager 在 OCI 上部署 Magento 非常容易,您可以看到 Magento 立即从 HeatWave 中受益。

最后修改时间:2022-06-22 14:18:18
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论