۱. مقدمه

ادغام Magento با بکاند Cloud Spanner
Magento یک پلتفرم تجارت الکترونیک متنباز مبتنی بر PHP است که به طور گسترده محبوب است و دادهها را در MySQL ذخیره میکند.
این آزمایشگاه کد، اثبات مفهومی برای استفاده از Cloud Spanner به جای MySQL برای ماژول Catalog است. این برای هر کسی که علاقهمند به ادغام، آزمایش و استقرار Magento یا سایر برنامههای PHP با Spanner است، مفید است.
اسپنر ، پایگاه داده کاملاً مدیریتشده، در سطح سازمانی، توزیعشده و سازگار گوگل کلود است که مزایای مدل پایگاه داده رابطهای را با مقیاسپذیری افقی غیررابطهای ترکیب میکند. این پایگاه داده برای پشتیبانی از استقرار پردازش تراکنشهای آنلاین جهانی، معناشناسی SQL، مقیاسپذیری افقی با دسترسی بالا و سازگاری تراکنشی طراحی شده است. اسپنر قادر به مدیریت حجم زیادی از دادهها است. استفاده از آن محدود به برنامههای کاربردی با اندازه بزرگ نیست، بلکه امکان استانداردسازی یک موتور پایگاه داده واحد را برای همه بارهای کاری که به RDBMS نیاز دارند، فراهم میکند. اسپنر برای نگهداری برنامهریزیشده یا خرابیهای منطقهای، زمان خرابی صفر را با سطح دسترسی ۹۹.۹۹۹٪ فراهم میکند. این پایگاه داده با ارائه دسترسیپذیری و مقیاسپذیری بالا، از برنامههای کاربردی مدرن پشتیبانی میکند.
آنچه یاد خواهید گرفت
- نحوه نصب مجنتو روی GCE
- نحوه تنظیم شبیهساز Spanner
- نحوه انتقال یک طرحواره MySQL موجود به Spanner با استفاده از HarbourBridge
- برای ادغام برنامههای PHP مانند Magento که از MySQL برای backend پایگاه داده استفاده میکنند تا با Spanner کار کنند، چه چیزی را باید تغییر دهید؟
آنچه خواهید ساخت
این آزمایشگاه کدنویسی بر ادغام Magento با Spanner تمرکز دارد. بلوکهای کد و دستورالعملهای راهاندازی برای کپی و پیست شما ارائه شدهاند، اما به طور مفصل مورد بحث قرار نگرفتهاند.
در این آزمایشگاه کد، شما ادغام Magento با Spanner را آغاز خواهید کرد. شما:
- راهاندازی یک نمونه GCE با نصب Magento
- شبیهساز Spanner را نصب کنید
- نصب ابزار HarbourBridge برای انتقال دادهها از MySQL به Spanner
- تغییر مجموعههای Magento برای بارگذاری کاتالوگ محصول از Spanner
آنچه نیاز دارید
- یک پروژه گوگل کلود که به یک حساب صورتحساب متصل است.
- آشنایی با PHP، لینوکس و آپاچی مزیت محسوب میشود.
- تجربه کار با مجنتو مفید خواهد بود، اما الزامی نیست.
۲. آمادهسازی نمونه GCE
نمونه GCE را ایجاد کنید
با دنبال کردن مراحل ذکر شده در اینجا ، یک نمونه Compute Engine در Google Cloud Platform ایجاد کنید.
هنگام ایجاد نمونه GCE، نوع نمونه را به e2-standard-2 و اندازه دیسک بوت را به 20 گیگابایت تغییر دهید. میتوانید همه چیز را به صورت پیشفرض رها کنید، اما حتماً «Allow HTTP traffic» و «Allow HTTPs traffic» را انتخاب کنید، زیرا ما از رابط وب Magento استفاده خواهیم کرد.
این منجر به یک ماشین از نوع e2-standard-2 میشود که یک نمونه هسته مشترک نیست و دارای 2vCPU، 8 گیگابایت رم و 20 گیگابایت فضای دیسک است.
سیستم عامل دبیان ۱۰ است. ایجاد نمونه ممکن است یک یا دو دقیقه طول بکشد.
پس از ایجاد، با کلیک روی «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 نصب شود. بعداً، طرحواره را با استفاده از HarbourBridge به Spanner منتقل خواهید کرد.
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
- مای اس کیو ال ۵.۷
- باشه



sudo apt update && sudo apt -y install mysql-server # You will be prompted to enter a root password
- نصب آپاچی ۲
sudo apt -y install apache2 sudo a2enmod proxy_fcgi rewrite
نصب و پیکربندی مجنتو ۲
پروژه Magento Commerce Cloud شامل یک طرح پایگاه داده و سرویسهایی برای دسترسی کامل به سایت و فروشگاه Magento است.
سادهترین راه برای نصب و اجرای این برنامه، دنبال کردن دستورالعملهای Magento برای نصب با استفاده از composer است:
- نسخه ۲.۴.۲ مجنتو را با استفاده از composer نصب کنید. مجنتو ۲ به نسخه composer 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 پایهای که در دستور نصب ارسال کردهاید، به فروشگاه دسترسی پیدا کنید. برای این مثال، میتوانید با استفاده از قالبهای URL زیر به فروشگاه محلی Magento دسترسی پیدا کنید:
- http://<GCEexternalIP>/
- http://<GCEexternalIP>/<adminuri>
GCEexternalIP را میتوان در Cloud Console یافت:

برای تغییر آدرس URL پنل مدیریت، از این دستور برای یافتن آن استفاده کنید:
php bin/magento info:adminuri
- غیرفعال کردن حافظه پنهان کل صفحه برای اهداف توسعه، میتوانید حافظه پنهان کل صفحه Magento2 را غیرفعال کنید. این به شما امکان میدهد دادهها را در Spanner تغییر دهید و بدون اینکه تحت تأثیر مقادیر ذخیره شده قرار بگیرید، آنها را در وبسایت منعکس کنید.
php bin/magento cache:disable full_page
آچار تنظیم
شبیهساز Spanner را نصب کنید
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
انتقال MySQL از Magento به Spanner
قبل از اینکه به سراغ ادغام Spanner برویم، از ابزاری به نام HarbourBridge برای تبدیل پایگاه داده MySQL که به عنوان بخشی از نصب Magento در بالا ایجاد شده بود به Spanner استفاده خواهیم کرد.
در هسته خود، HarbourBridge یک گردش کار خودکار برای بارگذاری محتویات یک پایگاه داده MySQL یا PostgreSQL موجود در Spanner ارائه میدهد. این ابزار نیازی به پیکربندی ندارد - هیچ مانیفست یا نقشه دادهای برای نوشتن ندارد. در عوض، پایگاه داده منبع را وارد میکند، یک طرحواره Spanner میسازد، یک پایگاه داده Spanner جدید ایجاد میکند که با دادههای پایگاه داده منبع پر شده است و یک گزارش ارزیابی دقیق تولید میکند. HarbourBridge برای بارگذاری پایگاههای داده تا چند ده گیگابایت برای اهداف ارزیابی در نظر گرفته شده است، نه برای مهاجرتهای کامل.
HarbourBridge مهاجرت در مراحل اولیه به Spanner را با استفاده از یک پایگاه داده منبع MySQL یا PostgreSQL موجود، راهاندازی میکند تا شما را به سرعت در Spanner راهاندازی و اجرا کند. این ابزار یک گزارش ارزیابی با امتیاز کلی مهاجرت-تناسب اندام برای Spanner، یک تحلیل جدول به جدول از نگاشتهای نوع و لیستی از ویژگیهای استفاده شده در پایگاه داده منبع که توسط Spanner پشتیبانی نمیشوند، تولید میکند.
HarbourBridge را میتوان با شبیهساز Spanner یا مستقیماً با یک نمونه Spanner استفاده کرد.
فایل راهنمای هاربربریج (HarbourBridge README) شامل یک راهنمای گام به گام و سریع برای استفاده از این ابزار به همراه یک نمونهی 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
۳. تبدیل مجنتو برای کار با Spanner
اکنون که Magento را اجرا کردهایم و نمونه Spanner ایجاد شده با پایگاه داده Magento منتقل شده است، روی اصلاح Magento برای کار با دادههای ذخیره شده در Spanner کار خواهیم کرد.
مراحل زیر برای تبدیل نصب Magento انجام خواهد شد:
- پروژه magento-spanner-port را کلون کنید
- اتصال را به آچار تغییر دهید
- تأیید کنید که جزئیات کاتالوگ از Spanner پر شده است
انشعاب پروژه Magento را کلون کنید
کد برنامه PHP برای Magento را که شامل تغییرات ماژولهای Catalog، Wishlist و Cart است، از آدرس Git ذکر شده در زیر کپی کنید.
cd ~ git clone https://github.com/searceinc/magento-spanner-port
دایرکتوری خانگی شما باید چیزی شبیه به این باشد:
$ ls go harbourbridge magento-spanner-port magento2
جایی که magento2 کدبیس است، ما آن را با استفاده از کد magento-spanner-port اصلاح خواهیم کرد.
اتصال را به آچار تغییر دهید
برای بررسی اینکه آیا تغییرات کد در رابط کاربری منعکس میشود یا خیر، میتوانیم مراحل زیر را دنبال کنیم -
برای نمونه پیادهسازی به لینک گیتهاب https://github.com/searceinc/magento-spanner-port مراجعه کنید.
- کتابخانه کلاینت PHP google/cloud-spanner را الزامی کنید
- برای ایجاد اتصال به آچار، آداپتور آچار را اضافه کنید.
- نمونه Spanner و اطلاعات سرور را پیکربندی کنید.
- برای پیادهسازی اتصال به Spanner، رابط Spanner و Spanner را در Adapter اضافه کنید.
ابتدا، باید کتابخانه PHP مربوط به cloud-spanner را با استفاده از composer نصب کنیم. در دایرکتوری magento2، این دستور را اجرا کنید:
cd ~/magento2 composer require google/cloud-spanner
سپس فایلهای Spanner Adapter را از 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 تغییر دهید تا اکنون با استفاده از تابع Connection که به تازگی در Spanner Adapter ایجاد شده است، به Spanner متصل شوید. خطوط سبز را بعد از خطوط سفید در فایل اضافه کنید. به vendor/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 بهروزرسانی شده است.

۴. تبریک
تبریک میگویم، شما با موفقیت ماژول کاتالوگ مجنتو را برای کار با Spanner متصل کردید! این یک ادغام کامل نیست، اما اکنون عناصر لازم برای اتصال یک برنامه PHP مانند مجنتو به یک نمونه Spanner را میدانید.
تمیز کردن
پس از اتمام راهاندازی و اعتبارسنجی POC، ممکن است بخواهید منابع GCP ایجاد شده در طول فرآیند را حذف کنید. این شامل ماشین مجازی Compute Engine و همچنین یک نمونه Cloud Spanner در صورتی که تصمیم به استفاده از آن به جای Emulator دارید، میشود.
بعدش چی؟
این فقط یک مدل نمونه اولیه برای Spanner POC است.
اگر میخواهید درباره کار با Spanner و فناوریهایی که در این آزمایشگاه کد از آنها استفاده کردیم بیشتر بدانید، در اینجا منابع بیشتری ارائه شده است: