Интеграция Magento с Cloud Spanner

1. Введение

424db48d9db91638.png

Интеграция Magento с бэкэндом Cloud Spanner

Magento — широко популярная платформа электронной коммерции с открытым исходным кодом на основе PHP, которая хранит данные в MySQL.

Эта кодовая лаборатория является подтверждением концепции использования Cloud Spanner вместо MySQL для модуля «Каталог». Это полезно для всех, кто заинтересован в интеграции, тестировании и развертывании Magento или других приложений PHP с помощью Spanner.

Spanner — это полностью управляемая распределенная и согласованная база данных корпоративного уровня Google Cloud, которая сочетает в себе преимущества модели реляционной базы данных с нереляционной горизонтальной масштабируемостью. Он предназначен для поддержки глобальных развертываний онлайн-обработки транзакций, семантики SQL, высокодоступного горизонтального масштабирования и согласованности транзакций. Spanner способен обрабатывать большие объемы данных. Его использование не ограничивается приложениями большого размера, но позволяет стандартизировать единое ядро ​​базы данных для всех рабочих нагрузок, требующих РСУБД. Spanner обеспечивает нулевое время простоя в случае планового обслуживания или сбоев в регионе, а соглашение об уровне обслуживания обеспечивает доступность на уровне 99,999 % . Он поддерживает современные приложения, обеспечивая высокую доступность и масштабируемость.

Что вы узнаете

  • Как установить Magento на GCE
  • Как настроить эмулятор гаечного ключа
  • Как перенести существующую схему MySQL в Spanner с помощью HarbourBridge
  • Что вам нужно изменить для интеграции PHP-приложений, таких как Magento, которые используют MySQL для серверной части базы данных для работы с Spanner

Что ты построишь

Эта лаборатория ориентирована на интеграцию Magento с Spanner. Блоки кода и инструкции по настройке предоставляются для копирования и вставки, но подробно не обсуждаются.

В этой лаборатории вы начнете интеграцию Magento с Spanner. Вы будете:

Что вам понадобится

  • Проект Google Cloud, подключенный к платежному аккаунту.
  • Знание конфигурации PHP, Linux и Apache будет плюсом.
  • Опыт работы с Magento будет полезен, но не обязателен.

2. Подготовка экземпляра GCE

Создайте экземпляр GCE

Создайте экземпляр Compute Engine в Google Cloud Platform, выполнив действия, описанные здесь .

При создании экземпляра GCE измените тип экземпляра на e2-standard-2 и размер загрузочного диска на 20 ГБ. Вы можете оставить все по умолчанию, но обязательно выберите «Разрешить HTTP-трафик» и «Разрешить HTTP-трафик», поскольку мы будем использовать веб-интерфейс Magento.

В результате получается машина типа e2-standard-2 , которая не является экземпляром общего ядра и имеет 2 виртуальных ЦП, 8 ГБ ОЗУ и 20 ГБ дискового пространства.

Операционная система — Debian 10. Создание экземпляра может занять минуту или две.

Как только он будет создан, войдите в систему, нажав «SSH» в облачной консоли :

4bf915ef8d37c942.png

Откроется новое окно браузера и вы попадете в терминал.

Установите необходимое программное обеспечение

Прежде чем мы сможем запустить Magento, потребуется установить необходимое программное обеспечение. В частности, вы установите PHP, Elastic, MySQL и Apache, как описано ниже.

  1. Установите несколько необходимых пакетов.
sudo apt update

sudo apt -y install lsb-release apt-transport-https ca-certificates wget git screen composer google-cloud-sdk-spanner-emulator gcc
  1. Установите модули PHP, необходимые для Magento.
sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg

echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php.list

sudo apt update

sudo apt -y install php7.4-fpm php7.4-common php7.4-mysql php7.4-gmp php7.4-curl php7.4-intl php7.4-mbstring php7.4-xmlrpc php7.4-gd php7.4-xml php7.4-cli php7.4-zip php7.4-bcmath php7.4-soap php7.4-grpc
  1. Установите Elasticsearch и запустите службу.
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list

sudo apt update && sudo apt -y install elasticsearch

echo "-Xms1g
-Xmx1g" | sudo tee /etc/elasticsearch/jvm.options.d/jvm.options

sudo systemctl start elasticsearch.service
  1. Установить MySQL

Вы устанавливаете MySQL, чтобы установить схему Magento по умолчанию. Позже вы перенесете схему в Spanner с помощью HarbourBridge.

wget https://dev.mysql.com/get/mysql-apt-config_0.8.13-1_all.deb

sudo dpkg -i mysql-apt-config*

Приведенная выше команда dpkg вызовет интерактивное приглашение для установки сервера MySQL 5.7. Выберите параметры:

  • MySQL-сервер и кластер
  • MySQL-5.7
  • Хорошо

a018bfc2ee00bdf5.png1a126e452ca7312e.pngae39c6f4bbe3be74.png

sudo apt update && sudo apt -y install mysql-server
# You will be prompted to enter a root password
  1. Установить Апач2
sudo apt -y install apache2

sudo a2enmod proxy_fcgi rewrite

Установите и настройте Magento2.

Проект Magento Commerce Cloud включает в себя схему базы данных и сервисы для полного доступа к сайту и магазину Magento.

Самый простой способ установить и запустить это — следовать инструкциям Magento по установке с помощью композитора:

  1. Установите Magento версии 2.4.2 с помощью композитора. Для Magento 2 требуется версия композитора 1.x. Вы можете увидеть некоторые предупреждения о том, что поддержка этой версии устарела.
composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition=2.4.2 magento2
  1. Установить права доступа к папке
cd magento2

find var generated vendor pub/static pub/media app/etc -type f -exec chmod g+w {} +

find var generated vendor pub/static pub/media app/etc -type d -exec chmod g+ws {} +
  1. Настройте виртуальный хост Magento, создав /etc/apache2/sites-available/magento.conf с содержимым, указанным ниже.
sudo nano /etc/apache2/sites-available/magento.conf

<VirtualHost *:80>
        ServerAdmin admin@local-magento.com
        DocumentRoot /var/www/html/magento/

        <Directory /var/www/html/magento/>
                Options Indexes FollowSymlinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        <FilesMatch \.php$>
               SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
        </FilesMatch>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
  1. Создайте символические ссылки и перезапустите apache2.
cd ~/magento2
sudo ln -s $(pwd) /var/www/html/magento 
sudo ln -s /etc/apache2/sites-available/magento.conf  /etc/apache2/sites-enabled/magento.conf
sudo rm /etc/apache2/sites-enabled/000-default.conf

sudo systemctl restart apache2
  1. Создайте базу данных и пользователя для Magento в MySQL.
export ROOT_PASSWORD="<root password from installation>"
export GCE_INSTANCE_IP="<GCE instance IP>"
mysql -uroot -p$ROOT_PASSWORD -e "create database magento"

bin/magento sampledata:deploy

bin/magento setup:install --base-url=http://$GCE_INSTANCE_IP/ --db-host=localhost \
--db-name=magento --db-user=root --db-password=$ROOT_PASSWORD --admin-firstname=admin \
--admin-lastname=demo --admin-email=good@example.com --admin-user=admin \
--admin-password=magento123 --language=en_US --currency=USD --timezone=America/Chicago \
--use-rewrites=1

sudo chown -R :www-data ~/magento2/. 
  1. Проверка локальной рабочей области. Чтобы убедиться, что в локальной среде размещен сервер, получите доступ к хранилищу, используя базовый URL-адрес, который вы передали в команде установки. В этом примере вы можете получить доступ к локальному хранилищу Magento, используя следующие форматы URL:
  • http://<GCEexternalIP>/
  • http://<GCEexternalIP>/<adminuri>

GCEexternalIP можно найти в Cloud Console :

3947f1164e1d5409.png

Чтобы изменить URI для панели администратора, используйте следующую команду, чтобы найти ее:

php bin/magento info:adminuri
  1. Отключить полностраничный кеш. В целях разработки вы можете отключить полностраничный кеш Magento2. Это позволит вам изменять данные в Spanner и отражать их на веб-сайте без влияния кэшированных значений.
php bin/magento cache:disable full_page

Наладочный ключ

Установите эмулятор гаечного ключа

Cloud SDK предоставляет локальный эмулятор в памяти, который вы можете использовать для бесплатной разработки и тестирования своих приложений без создания проекта GCP или учетной записи для выставления счетов. Поскольку эмулятор хранит данные только в памяти, все состояние, включая данные, схему и конфигурации, теряется при перезапуске. Эмулятор предлагает те же API-интерфейсы, что и производственный сервис Spanner, и предназначен для локальной разработки и тестирования, а не для производственного развертывания.

Пожалуйста, используйте ссылку ниже, чтобы получить дополнительную информацию об установке, использовании и развертывании эмулятора:

Использование эмулятора гаечного ключа

# Set up a new configuration to use the emulator
gcloud config configurations create emulator
gcloud config set auth/disable_credentials true
gcloud config set project magento
gcloud config set api_endpoint_overrides/spanner http://localhost:9020/

# Start emulator in a screen session
screen -S magento
gcloud emulators spanner start &
gcloud spanner instances create magento-instance --config=emulator-config --description='Magento Instance' --nodes=1

# Detach from screen 
ctrl+a+d

export SPANNER_EMULATOR_HOST=localhost:9010

Миграция Magento MySQL на Spanner

Прежде чем мы углубимся в интеграцию Spanner, мы воспользуемся инструментом HarbourBridge для преобразования базы данных MySQL, созданной как часть нашей установки Magento выше, в Spanner.

По своей сути HarbourBridge обеспечивает автоматизированный рабочий процесс для загрузки содержимого существующей базы данных MySQL или PostgreSQL в Spanner. Он не требует никакой настройки — никаких манифестов или карт данных для записи. Вместо этого он импортирует исходную базу данных, строит схему Spanner, создает новую базу данных Spanner, заполненную данными из исходной базы данных, и создает подробный отчет об оценке. HarbourBridge предназначен для загрузки баз данных размером до нескольких десятков ГБ в целях оценки, а не полномасштабной миграции.

HarbourBridge выполняет начальную миграцию на Spanner, используя существующую исходную базу данных MySQL или PostgreSQL, чтобы быстро начать работу со Spanner. Он генерирует отчет об оценке с общей оценкой пригодности миграции для Spanner, потабличным анализом сопоставлений типов и списком функций, используемых в исходной базе данных, которые не поддерживаются Spanner.

HarbourBridge можно использовать с эмулятором Spanner или напрямую с экземпляром Spanner.

Файл README HarbourBridge содержит пошаговое краткое руководство по использованию инструмента с экземпляром Spanner.

Установить ХарборБридж

Загрузите инструмент на свой компьютер и установите его. Для работы необходимо установить golang. Установка всех необходимых модулей на новый экземпляр без предварительной настройки Go может занять некоторое время.

# Install golang
cd ~
wget https://golang.org/dl/go1.17.2.linux-amd64.tar.gz
sudo tar -zxvf go1.17.2.linux-amd64.tar.gz -C /usr/local
rm go1.17.2.linux-amd64.tar.gz

echo 'export GOROOT=/usr/local/go' | sudo tee -a /etc/profile
echo 'export PATH=/usr/local/go/bin:$HOME/go/bin:$PATH' | sudo tee -a /etc/profile
source /etc/profile

# Install harbourbridge
git clone https://github.com/cloudspannerecosystem/harbourbridge
cd harbourbridge
go run github.com/cloudspannerecosystem/harbourbridge help

Перенос данных

Используйте следующую команду для миграции базы данных Magento в Spanner:

mysqldump --user='root' --password=$ROOT_PASSWORD magento | go run github.com/cloudspannerecosystem/harbourbridge -driver=mysqldump -dbname=magento

Настройте инструмент spanner-cli

go install github.com/cloudspannerecosystem/spanner-cli@latest

3. Преобразуйте Magento для работы с Spanner.

Теперь, когда у нас запущен Magento и перенесен экземпляр Spanner, созданный с помощью базы данных Magento, мы будем работать над модификацией Magento для работы с данными, хранящимися в Spanner.

Для преобразования установки Magento будут выполнены следующие шаги:

  • Клонируйте проект magento-spanner-port
  • Измените соединение на гаечный ключ
  • Убедитесь, что данные каталога заполнены из Spanner.

Клонировать форк проекта Magento

Клонируйте код приложения PHP для Magento, который содержит изменения для модулей «Каталог», «Список пожеланий» и «Корзина» из URL-адреса Git , упомянутого ниже.

cd ~
git clone https://github.com/searceinc/magento-spanner-port

Ваш домашний каталог должен выглядеть примерно так:

$ ls
go  harbourbridge  magento-spanner-port  magento2

Где magento2 — это кодовая база, которую мы будем модифицировать, используя код из magento-spanner-port .

Измените соединение на гаечный ключ

Чтобы проверить, отражаются ли изменения кода в пользовательском интерфейсе, мы можем выполнить следующие шаги:

См. ссылку на Github https://github.com/searceinc/magento-spanner-port для примера реализации.

  • Требуется клиентская библиотека PHP google/cloud-spanner.
  • Добавьте адаптер гаечного ключа для подключения к гаечному ключу.
  • Настройте экземпляр Spanner и информацию о сервере.
  • Добавьте SpannerInterface и Spanner в адаптер, чтобы реализовать подключение к Spanner.

Во-первых, нам нужно установить PHP-библиотеку Cloud-Spanner с помощью композитора. В каталоге magento2 выполните следующую команду:

cd ~/magento2
composer require google/cloud-spanner

Затем мы добавляем файлы адаптера Spanner из порта magento-spanner-port в нашу кодовую базу magento2 :

~/magento2$ cp -r ../magento-spanner-port/lib/internal/Magento/Framework/DB/Adapter/Spanner vendor/magento/framework/DB/Adapter/.
~/magento2$ ls -l vendor/magento/framework/DB/Adapter/Spanner
total 16
-rw-r--r-- 1 derekdowney derekdowney 10378 Nov  9 21:03 Spanner.php
-rw-r--r-- 1 derekdowney derekdowney  2948 Nov  9 21:03 SpannerInterface.php

Теперь измените файл DB/Adapter/Spanner/Spanner.php, чтобы ввести информацию о подключении Spanner для $project_id, $instance и $database :

$ nano vendor/magento/framework/DB/Adapter/Spanner/Spanner.php

class Spanner implements SpannerInterface
{
    /**
     * Google cloud project id
     * @var string
     */
    private $project_id = 'magento';

    /**
     * Google cloud instance name
     * @var string
     */
    private $instance  = 'magento-instance';

    /**
     * Cloud Spanner database name
     * @var string
     */
    private $database  = 'magento';

    /**
     * Is Cloud Spanner emulator
     * @var bool
     */
    private $is_emulator = true;
...
   /**
    * Set database connection adapter
    *
    * @param \Magento\Framework\DB\Adapter\AdapterInterface $conn
    * @return $this
    * @throws \Magento\Framework\Exception\LocalizedException
    */
   public function setConnection(\Magento\Framework\DB\Adapter\AdapterInterface $conn)
   {
       $this->_conn = $conn;
       $this->_select = $this->_conn->select();
       $this->_isOrdersRendered = false;
       return $this;
   }


   /**
     * Set Cloud Spanner database connection adapter
     *
     * @return void
     * @throws \Magento\Framework\Exception\LocalizedException
     */
    private function setSpannerConnection()
    {
        $this->_spanner_conn = new Spanner();
    }

Измените класс AbstractDB в Magento, чтобы теперь подключаться к Spanner с помощью недавно созданной функции Connection в Spanner Adaptor. Добавьте зеленые линии после белых линий в файле. Обратитесь к поставщику/magento/framework/Data/Collection/AbstractDb.php.

$ nano vendor/magento/framework/Data/Collection/AbstractDb.php
...
use Psr\Log\LoggerInterface as Logger;
use Magento\Framework\DB\Adapter\Spanner\Spanner;
...
    protected $_conn;

    /**
     * Cloud Spanner connection
     *
     * @var \Magento\Framework\DB\Adapter\Spanner\SpannerAdapterInterface
     */
    protected $_spanner_conn;
...
       if ($connection !== null) {
            $this->setConnection($connection);
        }
        $this->setSpannerConnection();
        $this->_logger = $logger;
...
   /**
     * Retrieve connection object
     *
     * @return AdapterInterface
     */
    public function getConnection()
    {
        return $this->_conn;
    }

   /**
     * Retrieve connection object
     *
     * @return SpannerAdapterInterface
     */
    public function getSpannerConnection()
    {
        return $this->_spanner_conn;
    }
...

Как только соединение установлено, нам нужно изменить метод выборки данных с адаптера MySQL на адаптер Spanner. Измените метод _loadAttributes в AbstractCollection, чтобы он мог подключаться к Spanner и получать данные из Spanner. Замените красную линию линиями зеленого цвета.

Обратитесь к /app/code/Magento/Eav/Model/Entity/Collection/AbstractCollection.php.

$ nano ./vendor/magento/module-eav/Model/Entity/Collection/AbstractCollection.php

use Magento\Framework\Exception\LocalizedException;
use Google\Cloud\Spanner\SpannerClient;

...
               try {
                    if (is_array($selects)) {
                        $select = implode(' UNION ALL ', $selects);
                    } else {
                        $select = $selects;
                    }
                   $values = $this->getConnection()->fetchAll($select);
                   $con = $this->getSpannerConnection();

                    /**
                     * Cloud Spanner follows strict type so cast the columns in common type
                     */
                    $select = $con->addCast($select, "`t_d`.`value`", 'string');
                    $select = $con->addCast($select, "`t_s`.`value`", 'string');
                    $select = $con->addCast($select, "IF(t_s.value_id IS NULL, t_d.value, t_s.value)", 'string');
                    
                    $values = $con->fetchAll($select);

...

Убедитесь, что данные каталога заполнены из Spanner.

Вот и все! Теперь вы можете перейти к установке Magento в браузере и проверить, загружаются ли данные.

Например, это записи каталога часов:

13b54ba4482408fc.png

Измените данные Spanner через терминал для одного из продуктов и запросите данные через терминал, чтобы подтвердить изменение в Spanner.

$ spanner-cli -pmagento -i magento-instance -d magento
spanner> SELECT * FROM catalog_product_entity_varchar WHERE value LIKE "Aim Analog%";
+----------+--------------+----------+-----------+--------------------+
| value_id | attribute_id | store_id | entity_id | value              |
+----------+--------------+----------+-----------+--------------------+
| 390      | 73           | 0        | 36        | Aim Analog Watch |
+----------+--------------+----------+-----------+--------------------+
1 rows in set (80.711542ms)

spanner> UPDATE catalog_product_entity_varchar SET value = "Aim Analog Spanner" WHERE value_id=390;
Query OK, 1 rows affected (0.19 sec)

spanner> SELECT * FROM catalog_product_entity_varchar WHERE value_id=390;
+----------+--------------+----------+-----------+--------------------+
| value_id | attribute_id | store_id | entity_id | value              |
+----------+--------------+----------+-----------+--------------------+
| 390      | 73           | 0        | 36        | Aim Analog Spanner |
+----------+--------------+----------+-----------+--------------------+
1 rows in set (80.711542ms)

Теперь перезагрузите экран, чтобы убедиться, что название часов теперь изменено на «Aim Analog Spanner», обновленное через терминал Spanner.

63a9c7b065c7051f.png

4. Поздравления

Поздравляем, вы успешно подключили модуль Каталога Magento для работы с Spanner! Это не полная интеграция, но теперь вы знаете, как подключить PHP-приложение, такое как Magento, к экземпляру Spanner.

Уборка

После завершения настройки и проверки POC вы можете удалить ресурсы GCP, созданные в ходе процесса. Сюда будет входить виртуальная машина Compute Engine, а также экземпляр Cloud Spanner, если вы решите использовать его вместо эмулятора.

Что дальше?

Это всего лишь прототип модели Spanner POC.

Если вы хотите узнать больше о работе с Spanner и технологиях, которые мы использовали в этой лаборатории кода, вот несколько дополнительных ресурсов: