原文地址: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 支持的警告:

自MySQL 8.0.13以来,这不再是问题 !MDS 也总是使用最新版本的 MySQL。
要求
要使用 MySQL 数据库服务 (MDS) 和 HeatWave 在 Oracle 云基础设施 (OCI) 上部署 Magento,您需要:
互联网连接
一个 OCI 帐户(您可以在 https://www.oracle.com/mysql上免费试用)
而且……没有别的了😉
准备就绪后,OCI 仪表板与此类似:

部署
在 OCI 上部署全栈架构最简单的方法是使用资源管理器和堆栈。复杂性将由堆栈本身处理,Terraform 将自动部署所有必需的资源。
您可以在我的 GitHub 存储库中获得一个堆栈来部署 Magento 架构以及所有必需的资源: https 😕/github.com/lefred/oci-magento-mds
如果您想手动部署 zip 文件,则需要它:


如果你想自动部署一切,你只需要点击按钮
部署到 Oracle 云
如果单击它,您将启动 Stack Creation 向导,您需要首先接受 Oracle 使用条款:

一旦被接受,所有信息都将被预先填写,您只需填写一些必填变量:

架构
使用此堆栈,您必须能够部署不同的架构。由您决定哪一个符合您的需求。
架构 1 – 默认
默认架构是这样的:

如您所见,只有一个 Magento Webserver(计算实例)使用一个 MySQL 数据库服务实例和一个 OpenDistro 用于 ElasticSearch 计算实例。
MDS 必须始终位于私有子网上。
架构 2 – 多个网络服务器

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

如您所见,在这第三个也是最后一个架构中,您可以部署多个完全隔离的 Magento。他们每个人都使用自己的 MDS 实例和自己的 OpenDistroES 实例。
您可以简单地从 Stack Creation 屏幕部署这些架构:

如果您已经拥有 VCN、Internet 网关、子网、安全列表等……并且想要使用它们,也可以使用现有基础架构。
当您选择部署多个 Web 服务器时,您也需要填写此表单:

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

现在,应用作业将运行一段时间(大约 10 到 15 分钟)。您可以按照日志控制台中的所有步骤操作:

重要信息也将在最后打印。您还可以从左侧的菜单中检索这些输出变量:

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

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

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

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

定时任务
然后,您将看到 cron 作业未启用:

要启用 cron 作业,您需要通过 SSH 访问 Web 服务器。
SSH 到计算实例
在 OCI 中,要通过 ssh 访问公共子网中的计算实例,我们需要 IP,还需要密钥。通常,当您手动部署资源时,会要求您粘贴、上传或生成此类密钥。资源管理器为我们生成了一个。
我们需要检索该密钥并将其保存在我们的计算机中。像往常一样,我们可以在 Stack 的输出中找到它:

我们将它粘贴到一个名为 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):

MySQL 热潮
HeatWave 是一项仅在 MDS 中可用的旗舰技术,可显着加快过长或过于复杂的查询。
使用 HeatWave 的第一个要求是有一个与之兼容的 MDS Instance Shape。
即使您不打算直接使用 HeatWave,我也建议始终为 MDS 使用兼容 HeatWave 的形状。在本例中,使用的形状是 MySQL.HeatWave.VM.Standard.E3。您可以直接看到该形状与 HeatWave 兼容。
如果您有这样的形状,您可以立即在其上启用 HeatWave(如果没有,您将不得不部署一个新实例):


随着指令

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

使用 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 中受益。




