1. Введение
Интеграция 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. Вы будете:
- Настройте экземпляр GCE с установленным Magento.
- Установите эмулятор гаечного ключа
- Установите инструмент HarbourBridge для миграции данных из MySQL в 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» в облачной консоли :
Откроется новое окно браузера и вы попадете в терминал.
Установите необходимое программное обеспечение
Прежде чем мы сможем запустить Magento, потребуется установить необходимое программное обеспечение. В частности, вы установите PHP, Elastic, MySQL и Apache, как описано ниже.
- Установите несколько необходимых пакетов.
sudo apt update sudo apt -y install lsb-release apt-transport-https ca-certificates wget git screen composer google-cloud-sdk-spanner-emulator gcc
- Установите модули 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
- Установите 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
- Установить 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
- Хорошо
sudo apt update && sudo apt -y install mysql-server # You will be prompted to enter a root password
- Установить Апач2
sudo apt -y install apache2 sudo a2enmod proxy_fcgi rewrite
Установите и настройте Magento2.
Проект Magento Commerce Cloud включает в себя схему базы данных и сервисы для полного доступа к сайту и магазину Magento.
Самый простой способ установить и запустить это — следовать инструкциям Magento по установке с помощью композитора:
- Установите 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
- Установить права доступа к папке
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 {} +
- Настройте виртуальный хост 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>
- Создайте символические ссылки и перезапустите 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
- Создайте базу данных и пользователя для 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/.
- Проверка локальной рабочей области. Чтобы убедиться, что в локальной среде размещен сервер, получите доступ к хранилищу, используя базовый URL-адрес, который вы передали в команде установки. В этом примере вы можете получить доступ к локальному хранилищу Magento, используя следующие форматы URL:
- http://<GCEexternalIP>/
- http://<GCEexternalIP>/<adminuri>
GCEexternalIP можно найти в Cloud Console :
Чтобы изменить URI для панели администратора, используйте следующую команду, чтобы найти ее:
php bin/magento info:adminuri
- Отключить полностраничный кеш. В целях разработки вы можете отключить полностраничный кеш 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 в браузере и проверить, загружаются ли данные.
Например, это записи каталога часов:
Измените данные 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.
4. Поздравления
Поздравляем, вы успешно подключили модуль Каталога Magento для работы с Spanner! Это не полная интеграция, но теперь вы знаете, как подключить PHP-приложение, такое как Magento, к экземпляру Spanner.
Уборка
После завершения настройки и проверки POC вы можете удалить ресурсы GCP, созданные в ходе процесса. Сюда будет входить виртуальная машина Compute Engine, а также экземпляр Cloud Spanner, если вы решите использовать его вместо эмулятора.
Что дальше?
Это всего лишь прототип модели Spanner POC.
Если вы хотите узнать больше о работе с Spanner и технологиях, которые мы использовали в этой лаборатории кода, вот несколько дополнительных ресурсов: