1. Giới thiệu

Tích hợp Magento với phần phụ trợ Cloud Spanner
Magento là một nền tảng thương mại điện tử nguồn mở dựa trên PHP, được sử dụng rộng rãi và lưu trữ dữ liệu trong MySQL.
Lớp học lập trình này là một bằng chứng về khái niệm nhằm tận dụng Cloud Spanner thay vì MySQL cho mô-đun Danh mục. Lớp học này hữu ích cho bất kỳ ai quan tâm đến việc tích hợp, kiểm thử và triển khai Magento hoặc các ứng dụng PHP khác với Spanner.
Spanner là cơ sở dữ liệu được phân phối, nhất quán, ở cấp doanh nghiệp và được quản lý hoàn toàn của Google Cloud. Cơ sở dữ liệu này kết hợp các lợi ích của mô hình cơ sở dữ liệu quan hệ với khả năng mở rộng theo chiều ngang không liên quan. Cơ sở dữ liệu này được thiết kế để hỗ trợ các hoạt động triển khai xử lý giao dịch trực tuyến trên toàn cầu, ngữ nghĩa SQL, khả năng mở rộng theo chiều ngang có tính sẵn sàng cao và tính nhất quán của giao dịch. Spanner có khả năng xử lý lượng dữ liệu lớn. Việc sử dụng cơ sở dữ liệu này không chỉ giới hạn ở các ứng dụng có kích thước lớn mà còn cho phép chuẩn hoá một công cụ cơ sở dữ liệu duy nhất cho tất cả khối lượng công việc yêu cầu RDBMS. Spanner cung cấp thời gian ngừng hoạt động bằng 0 cho việc bảo trì theo kế hoạch hoặc lỗi khu vực, với một SLA về tính sẵn sàng là 99,999%. Cơ sở dữ liệu này hỗ trợ các ứng dụng hiện đại bằng cách cung cấp tính sẵn sàng và khả năng mở rộng cao.
Kiến thức bạn sẽ học được
- Cách cài đặt Magento trên GCE
- Cách thiết lập Trình mô phỏng Spanner
- Cách di chuyển giản đồ MySQL hiện có sang Spanner bằng HarbourBridge
- Những nội dung bạn cần thay đổi để tích hợp các ứng dụng PHP như Magento sử dụng MySQL cho phần phụ trợ cơ sở dữ liệu để hoạt động với Spanner
Sản phẩm bạn sẽ tạo ra
Lớp học lập trình này tập trung vào việc tích hợp Magento với Spanner. Các khối mã và hướng dẫn thiết lập được cung cấp để bạn sao chép và dán, nhưng không được thảo luận chi tiết.
Trong lớp học lập trình này, bạn sẽ bắt đầu tích hợp Magento với Spanner. Bạn sẽ:
- Thiết lập một thực thể GCE đã cài đặt Magento
- Cài đặt Trình mô phỏng Spanner
- Cài đặt Công cụ HarbourBridge để di chuyển dữ liệu từ MySQL sang Spanner
- Sửa đổi các bộ sưu tập Magento để tải Danh mục sản phẩm từ Spanner
Bạn cần có
- Một dự án Google Cloud được kết nối với một tài khoản thanh toán.
- Kiến thức về PHP, Linux và cấu hình Apache là một lợi thế.
- Kinh nghiệm sử dụng Magento sẽ hữu ích nhưng không bắt buộc.
2. Chuẩn bị phiên bản GCE
Tạo phiên bản GCE
Tạo một phiên bản Compute Engine trong Google Cloud Platform bằng cách làm theo các bước được đề cập tại đây.
Khi tạo phiên bản GCE, hãy thay đổi loại phiên bản thành e2-standard-2 và kích thước ổ đĩa khởi động thành 20 GB. Bạn có thể để mọi thứ ở chế độ mặc định, nhưng hãy nhớ chọn "Cho phép lưu lượng truy cập HTTP" và "Cho phép lưu lượng truy cập HTTPs", vì chúng ta sẽ tận dụng giao diện web của Magento.
Điều này dẫn đến một loại máy e2-standard-2 không phải là phiên thể lõi dùng chung và có 2vCPU, 8 GB RAM và 20 GB dung lượng ổ đĩa.
Hệ điều hành là Debian 10. Quá trình tạo phiên bản có thể mất một hoặc hai phút.
Sau khi tạo, hãy tiến hành đăng nhập bằng cách nhấp vào "SSH" trong Cloud Console:

Thao tác này sẽ mở một cửa sổ trình duyệt mới và đưa bạn vào một thiết bị đầu cuối.
Cài đặt phần mềm điều kiện tiên quyết
Magento sẽ cần cài đặt một số phần mềm điều kiện tiên quyết trước khi chúng ta có thể chạy Magento. Cụ thể, bạn sẽ cài đặt PHP, Elastic, MySQL và Apache như trình bày chi tiết bên dưới.
- Cài đặt một số gói bắt buộc.
sudo apt update sudo apt -y install lsb-release apt-transport-https ca-certificates wget git screen composer google-cloud-sdk-spanner-emulator gcc
- Cài đặt các mô-đun PHP cần thiết cho 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
- Cài đặt Elasticsearch và khởi động dịch vụ
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
- Cài đặt MySQL
Bạn đang cài đặt MySQL để cài đặt giản đồ Magento mặc định. Sau đó, bạn sẽ di chuyển giản đồ sang Spanner bằng HarbourBridge.
wget https://dev.mysql.com/get/mysql-apt-config_0.8.13-1_all.deb sudo dpkg -i mysql-apt-config*
Lệnh dpkg ở trên sẽ hiển thị một lời nhắc tương tác để cài đặt Máy chủ MySQL 5.7. Chọn các tuỳ chọn:
- Máy chủ và cụm MySQL
- mysql-5.7
- Ok

sudo apt update && sudo apt -y install mysql-server # You will be prompted to enter a root password
- Cài đặt Apache2
sudo apt -y install apache2 sudo a2enmod proxy_fcgi rewrite
Cài đặt và định cấu hình Magento2
Dự án Magento Commerce Cloud bao gồm một giản đồ cơ sở dữ liệu và các dịch vụ để truy cập đầy đủ vào trang web và cửa hàng Magento.
Cách dễ nhất để cài đặt và chạy dự án này là làm theo hướng dẫn của Magento để cài đặt bằng trình soạn nhạc:
- Cài đặt Magento phiên bản 2.4.2 bằng trình soạn nhạc. Magento 2 yêu cầu phiên bản trình soạn nhạc 1.x. Bạn có thể thấy một số cảnh báo về việc không còn hỗ trợ phiên bản này.
composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition=2.4.2 magento2
- Đặt quyền đối với thư mục
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 {} +
- Định cấu hình máy chủ ảo Magento bằng cách tạo /etc/apache2/sites-available/magento.conf với nội dung bên dưới.
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>
- Tạo các liên kết tượng trưng và khởi động lại 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
- Tạo cơ sở dữ liệu và người dùng cho Magento trong 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/.
- Xác minh không gian làm việc cục bộ Để xác minh môi trường cục bộ đang lưu trữ máy chủ, hãy truy cập vào cửa hàng bằng URL cơ sở mà bạn đã truyền trong lệnh cài đặt. Đối với ví dụ này, bạn có thể truy cập vào cửa hàng Magento cục bộ bằng các định dạng URL sau:
- http://<GCEexternalIP>/
- http://<GCEexternalIP>/<adminuri>
Bạn có thể tìm thấy GCEexternalIP trong Cloud Console:

Để thay đổi URI cho bảng điều khiển Quản trị, hãy sử dụng lệnh này để xác định vị trí của URI:
php bin/magento info:adminuri
- Tắt bộ nhớ đệm toàn trang Vì mục đích phát triển, bạn có thể tắt bộ nhớ đệm toàn trang của Magento2. Điều này sẽ cho phép bạn sửa đổi dữ liệu trong Spanner và phản ánh dữ liệu đó trên trang web mà không bị ảnh hưởng bởi các giá trị được lưu vào bộ nhớ đệm.
php bin/magento cache:disable full_page
Thiết lập Spanner
Cài đặt Trình mô phỏng Spanner
Cloud SDK cung cấp một trình mô phỏng cục bộ trong bộ nhớ. Bạn có thể sử dụng trình mô phỏng này để phát triển và kiểm thử ứng dụng miễn phí mà không cần tạo Dự án GCP hoặc tài khoản thanh toán. Vì trình mô phỏng chỉ lưu trữ dữ liệu trong bộ nhớ, nên tất cả trạng thái, bao gồm cả dữ liệu, giản đồ và cấu hình, sẽ bị mất khi khởi động lại. Trình mô phỏng cung cấp các API giống như dịch vụ chính thức của Spanner và được dùng cho mục đích phát triển và kiểm thử cục bộ, không dùng cho việc triển khai chính thức.
Vui lòng sử dụng đường liên kết bên dưới để tham khảo thêm về cách cài đặt, sử dụng và triển khai Trình mô phỏng:
Sử dụng Trình mô phỏng 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
Di chuyển Magento MySQL sang Spanner
Trước khi đi sâu vào việc tích hợp Spanner, chúng ta sẽ sử dụng một công cụ có tên là HarbourBridge để chuyển đổi cơ sở dữ liệu MySQL đã được tạo như một phần của quá trình cài đặt Magento ở trên sang Spanner.
Về cơ bản, HarbourBridge cung cấp một quy trình làm việc tự động để tải nội dung của cơ sở dữ liệu MySQL hoặc PostgreSQL hiện có vào Spanner. Công cụ này không yêu cầu cấu hình – không cần viết tệp kê khai hoặc bản đồ dữ liệu. Thay vào đó, công cụ này sẽ nhập cơ sở dữ liệu nguồn, tạo giản đồ Spanner, tạo một cơ sở dữ liệu Spanner mới được điền dữ liệu từ cơ sở dữ liệu nguồn và tạo một báo cáo đánh giá chi tiết. HarbourBridge được dùng để tải cơ sở dữ liệu có dung lượng lên đến vài chục GB cho mục đích đánh giá, không dùng cho việc di chuyển trên quy mô đầy đủ.
HarbourBridge khởi động quá trình di chuyển giai đoạn đầu sang Spanner bằng cách sử dụng cơ sở dữ liệu nguồn MySQL hoặc PostgreSQL hiện có để giúp bạn nhanh chóng thiết lập và chạy trên Spanner. Công cụ này tạo một báo cáo đánh giá với điểm số tổng thể về mức độ phù hợp để di chuyển sang Spanner, phân tích từng bảng về việc ánh xạ loại và danh sách các tính năng được sử dụng trong cơ sở dữ liệu nguồn mà Spanner không hỗ trợ.
Bạn có thể sử dụng HarbourBridge với Trình mô phỏng Spanner hoặc trực tiếp với một phiên bản Spanner.
Tệp README của HarbourBridge chứa hướng dẫn bắt đầu nhanh từng bước để sử dụng công cụ này với một thực thể Spanner.
Cài đặt HarbourBridge
Tải công cụ này xuống máy của bạn và cài đặt. Bạn phải cài đặt golang để công cụ này hoạt động. Có thể mất một khoảng thời gian để cài đặt tất cả các mô-đun cần thiết trên một phiên bản mới mà trước đó chưa thiết lập 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
Di chuyển dữ liệu
Sử dụng lệnh sau để di chuyển cơ sở dữ liệu Magento vào Spanner:
mysqldump --user='root' --password=$ROOT_PASSWORD magento | go run github.com/cloudspannerecosystem/harbourbridge -driver=mysqldump -dbname=magento
Thiết lập công cụ spanner-cli
go install github.com/cloudspannerecosystem/spanner-cli@latest
3. Chuyển đổi Magento để hoạt động với Spanner
Bây giờ chúng ta đã chạy Magento và tạo thực thể Spanner với cơ sở dữ liệu Magento đã di chuyển, chúng ta sẽ sửa đổi Magento để hoạt động với dữ liệu được lưu trữ trong Spanner.
Chúng ta sẽ thực hiện các bước sau để chuyển đổi quá trình cài đặt Magento:
- Nhân bản dự án magento-spanner-port
- Thay đổi kết nối sang Spanner
- Xác thực rằng thông tin chi tiết về Danh mục được điền từ Spanner
Nhân bản nhánh của dự án Magento
Nhân bản mã xử lý ứng dụng PHP cho Magento chứa các sửa đổi cho các mô-đun Danh mục, Danh sách yêu thích và Giỏ hàng từ URL Git được đề cập bên dưới.
cd ~ git clone https://github.com/searceinc/magento-spanner-port
Thư mục chính của bạn sẽ có dạng như sau:
$ ls go harbourbridge magento-spanner-port magento2
Trong đó magento2 là cơ sở mã mà chúng ta sẽ sửa đổi, sử dụng mã từ magento-spanner-port.
Thay đổi kết nối sang Spanner
Để kiểm tra xem các sửa đổi mã có phản ánh trong giao diện người dùng hay không, chúng ta có thể làm theo các bước bên dưới –
Tham khảo Đường liên kết Github https://github.com/searceinc/magento-spanner-port để biết mẫu triển khai.
- Yêu cầu thư viện ứng dụng PHP google/cloud-spanner
- Thêm Trình điều hợp Spanner để tạo kết nối với Spanner.
- Định cấu hình thông tin về phiên bản và máy chủ Spanner.
- Thêm SpannerInterface và Spanner vào Trình điều hợp để triển khai kết nối với Spanner.
Trước tiên, chúng ta cần cài đặt thư viện PHP cloud-spanner bằng trình soạn nhạc. Trong thư mục magento2, hãy chạy lệnh này:
cd ~/magento2 composer require google/cloud-spanner
Sau đó, chúng ta thêm các tệp Trình điều hợp Spanner từ magento-spanner-port vào cơ sở mã 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
Bây giờ, hãy sửa đổi tệp DB/Adapter/Spanner/Spanner.php để nhập thông tin kết nối Spanner cho $project_id, $instance, và $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();
}
Sửa đổi lớp AbstractDB trong Magento để kết nối với Spanner bằng hàm Kết nối mới được tạo trong Trình điều hợp Spanner. Thêm các dòng màu xanh lục sau các dòng màu trắng trong tệp. Tham khảo 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;
}
...
Sau khi thiết lập kết nối, chúng ta cần sửa đổi phương thức tìm nạp dữ liệu từ trình điều hợp MySQL sang trình điều hợp Spanner . Sửa đổi phương thức _loadAttributes trong AbstractCollection để kết nối với Spanner và tìm nạp dữ liệu từ Spanner. Thay thế dòng màu đỏ bằng các dòng màu xanh lục.
Tham khảo /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);
...
Xác thực rằng thông tin chi tiết về Danh mục được điền từ Spanner
Vậy là xong! Giờ đây, bạn có thể truy cập vào bản cài đặt Magento trong trình duyệt và kiểm tra xem dữ liệu có đang tải hay không.
Ví dụ: đây là các mục trong danh mục đồng hồ:

Sửa đổi dữ liệu Spanner thông qua thiết bị đầu cuối cho một trong các sản phẩm và truy vấn dữ liệu thông qua thiết bị đầu cuối để xác nhận việc sửa đổi trong 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)
Bây giờ, hãy tải lại màn hình để xác nhận rằng tên của đồng hồ hiện đã được thay đổi thành "Aim Analog Spanner" như đã cập nhật thông qua thiết bị đầu cuối Spanner.

4. Xin chúc mừng
Xin chúc mừng, bạn đã kết nối thành công mô-đun Danh mục của Magento để hoạt động với Spanner! Đây không phải là một quá trình tích hợp đầy đủ, nhưng giờ đây bạn đã biết các thành phần để kết nối một ứng dụng PHP như Magento với một phiên bản Spanner.
Dọn dẹp
Khi quá trình thiết lập và xác thực POC hoàn tất, bạn có thể muốn xoá các tài nguyên GCP được tạo trong quá trình này. Điều này sẽ bao gồm Máy ảo Compute Engine, cũng như một thực thể Cloud Spanner nếu bạn quyết định sử dụng một thực thể thay vì Trình mô phỏng.
Tiếp theo là gì?
Đây chỉ là một mô hình nguyên mẫu cho POC Spanner.
Nếu bạn muốn tìm hiểu thêm về cách làm việc với Spanner và các công nghệ mà chúng tôi đã tận dụng trong lớp học lập trình này, hãy tham khảo thêm một số tài nguyên sau đây: