Mengintegrasikan Magento dengan Cloud Spanner

1. Pengantar

424db48d9db91638.png

Mengintegrasikan Magento dengan backend Cloud Spanner

Magento adalah platform e-Commerce open source berbasis PHP yang sangat populer dan menyimpan data di MySQL.

Codelab ini adalah Bukti Konsep untuk memanfaatkan Cloud Spanner, bukan MySQL, untuk modul Katalog. Hal ini berguna bagi siapa saja yang tertarik untuk mengintegrasikan, menguji, dan men-deploy Magento, atau aplikasi PHP lainnya, dengan Spanner.

Spanner adalah database Google Cloud yang terkelola sepenuhnya, berkelas perusahaan, terdistribusi, dan konsisten yang menggabungkan manfaat model database relasional dengan skalabilitas horizontal non-relasional. Layanan ini dirancang untuk mendukung deployment pemrosesan transaksi online global, semantik SQL, penskalaan horizontal yang sangat tersedia, dan konsistensi transaksional. Spanner mampu menangani volume data yang besar. Penggunaannya tidak terbatas pada aplikasi berukuran besar, tetapi memungkinkan standarisasi satu mesin database untuk semua beban kerja yang memerlukan RDBMS. Spanner memberikan periode nonaktif nol untuk pemeliharaan terencana atau kegagalan region, dengan SLA ketersediaan 99,999%. Solusi ini mendukung aplikasi modern dengan memberikan ketersediaan dan skalabilitas tinggi.

Yang akan Anda pelajari

  • Cara menginstal Magento di GCE
  • Cara menyiapkan Spanner Emulator
  • Cara memigrasikan skema MySQL yang ada ke Spanner menggunakan HarbourBridge
  • Yang perlu Anda ubah untuk mengintegrasikan aplikasi PHP seperti Magento yang menggunakan MySQL untuk backend database agar dapat berfungsi dengan Spanner

Yang akan Anda build

Codelab ini berfokus pada integrasi Magento dengan Spanner. Blok kode dan petunjuk penyiapan disediakan agar Anda dapat menyalin dan menempelkannya, tetapi tidak dibahas secara mendetail.

Dalam codelab ini, Anda akan mulai mengintegrasikan Magento dengan Spanner. Anda akan:

Yang Anda butuhkan

  • Project Google Cloud yang terhubung ke akun penagihan.
  • Pengetahuan tentang konfigurasi PHP, Linux, dan Apache akan menjadi nilai tambah.
  • Pengalaman menggunakan Magento akan sangat membantu, tetapi tidak wajib.

2. Menyiapkan instance GCE

Buat instance GCE

Buat instance Compute Engine di Google Cloud Platform dengan mengikuti langkah-langkah yang disebutkan di sini.

Saat membuat instance GCE, ubah jenis instance menjadi e2-standard-2 dan ukuran boot disk menjadi 20 GB. Anda dapat membiarkan semuanya sebagai default, tetapi pastikan untuk memilih "Izinkan traffic HTTP" dan "Izinkan traffic HTTPS", karena kita akan memanfaatkan antarmuka web Magento.

Hal ini menghasilkan jenis mesin e2-standard-2 yang bukan instance inti bersama dan memiliki 2vCPU, RAM 8 GB, dan ruang disk 20 GB.

Sistem operasinya adalah Debian 10. Pembuatan instance mungkin memerlukan waktu satu atau dua menit.

Setelah dibuat, lanjutkan login dengan mengklik 'SSH' di Cloud Console:

4bf915ef8d37c942.png

Tindakan ini akan membuka jendela browser baru dan menempatkan Anda di terminal.

Instal software prasyarat

Magento memerlukan beberapa software prasyarat untuk diinstal sebelum kita dapat menjalankan Magento. Secara khusus, Anda akan menginstal PHP, Elastic, MySQL, dan Apache seperti yang dijelaskan di bawah.

  1. Instal beberapa paket yang diperlukan.
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. Instal modul PHP yang diperlukan untuk 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. Instal Elasticsearch dan mulai layanan
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. Menginstal MySQL

Anda menginstal MySQL untuk menginstal skema Magento default. Selanjutnya, Anda akan memigrasikan skema ke Spanner menggunakan HarbourBridge.

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

sudo dpkg -i mysql-apt-config*

Perintah dpkg di atas akan menampilkan prompt interaktif untuk menginstal Server MySQL 5.7. Pilih opsi:

  • Server & Cluster MySQL
  • mysql-5.7
  • Oke

a018bfc2ee00bdf5.png 1a126e452ca7312e.png ae39c6f4bbe3be74.png

sudo apt update && sudo apt -y install mysql-server
# You will be prompted to enter a root password
  1. Menginstal Apache2
sudo apt -y install apache2

sudo a2enmod proxy_fcgi rewrite

Menginstal dan mengonfigurasi Magento2

Project Magento Commerce Cloud mencakup skema dan layanan database untuk mengakses situs dan toko Magento sepenuhnya.

Cara termudah untuk menginstal dan menjalankannya adalah dengan mengikuti petunjuk Magento untuk menginstal menggunakan composer:

  1. Instal Magento versi 2.4.2 menggunakan composer. Magento 2 memerlukan composer versi 1.x. Anda mungkin melihat beberapa peringatan tentang dukungan untuk versi ini yang tidak digunakan lagi.
composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition=2.4.2 magento2
  1. Menetapkan izin folder
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. Konfigurasi host virtual Magento dengan membuat /etc/apache2/sites-available/magento.conf dengan konten di bawah.
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. Buat symlink dan mulai ulang 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. Buat database dan pengguna untuk Magento di 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. Verifikasi ruang kerja lokal Anda Untuk memverifikasi bahwa lingkungan lokal menghosting server, akses toko menggunakan URL dasar yang Anda teruskan dalam perintah penginstalan. Untuk contoh ini, Anda dapat mengakses toko Magento lokal menggunakan format URL berikut:
  • http://<GCEexternalIP>/
  • http://<GCEexternalIP>/<adminuri>

GCEexternalIP dapat ditemukan di Cloud Console:

3947f1164e1d5409.png

Untuk mengubah URI panel Admin, gunakan perintah ini untuk menemukannya:

php bin/magento info:adminuri
  1. Nonaktifkan cache halaman penuh Untuk tujuan pengembangan, Anda dapat menonaktifkan cache halaman penuh Magento2. Dengan begitu, Anda dapat mengubah data di Spanner dan menampilkannya di situs tanpa terpengaruh oleh nilai yang di-cache.
php bin/magento cache:disable full_page

Menyiapkan Spanner

Menginstal Spanner Emulator

Cloud SDK menyediakan emulator dalam memori lokal, yang dapat Anda gunakan untuk mengembangkan dan menguji aplikasi secara gratis tanpa membuat Project GCP atau akun penagihan. Karena emulator hanya menyimpan data dalam memori, semua status, termasuk data, skema, dan konfigurasi, akan hilang saat dimulai ulang. Emulator menawarkan API yang sama dengan layanan produksi Spanner dan ditujukan untuk pengembangan dan pengujian lokal, bukan untuk deployment produksi.

Gunakan link di bawah untuk mempelajari lebih lanjut penginstalan, penggunaan, dan deployment Emulator:

Menggunakan Emulator 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

Memigrasikan MySQL Magento ke Spanner

Sebelum mempelajari integrasi Spanner, kita akan menggunakan alat yang disebut HarbourBridge untuk mengonversi database MySQL yang dibuat sebagai bagian dari penginstalan Magento di atas ke Spanner.

Pada intinya, HarbourBridge menyediakan alur kerja otomatis untuk memuat konten database MySQL atau PostgreSQL yang ada ke dalam Spanner. Tidak memerlukan konfigurasi—tidak ada manifes atau peta data yang perlu ditulis. Sebagai gantinya, alat ini mengimpor database sumber, membuat skema Spanner, membuat database Spanner baru yang diisi dengan data dari database sumber, dan membuat laporan penilaian mendetail. HarbourBridge ditujukan untuk memuat database hingga beberapa puluh GB untuk tujuan evaluasi, bukan migrasi skala penuh.

HarbourBridge mem-bootstrap migrasi tahap awal ke Spanner dengan menggunakan database sumber MySQL atau PostgreSQL yang ada untuk membuat Anda dapat menyiapkan dan menjalankan Spanner dengan cepat. Laporan ini menghasilkan laporan penilaian dengan skor kesiapan migrasi keseluruhan untuk Spanner, analisis pemetaan jenis per tabel, dan daftar fitur yang digunakan dalam database sumber yang tidak didukung oleh Spanner.

HarbourBridge dapat digunakan dengan Emulator Spanner, atau langsung dengan instance Spanner.

README HarbourBridge berisi panduan memulai cepat langkah demi langkah untuk menggunakan alat ini dengan instance Spanner.

Menginstal HarbourBridge

Download alat ke mesin Anda, lalu instal. Anda harus menginstal golang agar ini berfungsi. Penginstalan semua modul yang diperlukan pada instance baru tanpa Go yang disiapkan sebelumnya dapat memerlukan waktu beberapa saat.

# 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

Memigrasikan data

Gunakan perintah berikut untuk memigrasikan database Magento ke Spanner:

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

Menyiapkan alat spanner-cli

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

3. Mengonversi Magento agar dapat digunakan dengan Spanner

Setelah Magento berjalan, dan instance Spanner dibuat dengan database Magento yang dimigrasikan, kita akan memodifikasi Magento agar dapat bekerja dengan data yang disimpan di Spanner.

Langkah-langkah berikut akan dilakukan untuk mengonversi penginstalan Magento:

  • Meng-clone project magento-spanner-port
  • Ubah koneksi ke Spanner
  • Validasi bahwa detail Katalog diisi dari Spanner

Meng-clone fork project Magento

Buat clone kode aplikasi PHP untuk Magento yang berisi modifikasi untuk modul Katalog, Daftar Keinginan, dan Keranjang dari URL Git yang disebutkan di bawah.

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

Direktori beranda Anda akan terlihat seperti ini:

$ ls
go  harbourbridge  magento-spanner-port  magento2

Dengan magento2 sebagai codebase yang akan kita ubah, menggunakan kode dari magento-spanner-port.

Ubah koneksi ke Spanner

Untuk memeriksa apakah modifikasi kode tercermin di UI, kita dapat mengikuti langkah-langkah di bawah -

Lihat Link GitHub https://github.com/searceinc/magento-spanner-port untuk contoh implementasi.

  • Mewajibkan library klien PHP google/cloud-spanner
  • Menambahkan Adaptor Spanner untuk membuat koneksi ke Spanner.
  • Konfigurasi informasi server dan instance Spanner.
  • Tambahkan SpannerInterface dan Spanner di Adapter untuk menerapkan koneksi ke Spanner.

Pertama, kita perlu menginstal library PHP cloud-spanner menggunakan composer. Di direktori magento2, jalankan perintah berikut:

cd ~/magento2
composer require google/cloud-spanner

Kemudian, kita menambahkan file Spanner Adapter dari magento-spanner-port ke codebase 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

Sekarang, ubah file DB/Adapter/Spanner/Spanner.php untuk memasukkan informasi konektivitas Spanner untuk $project_id, $instance, dan $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();
    }

Ubah class AbstractDB dalam Magento agar terhubung ke Spanner menggunakan fungsi Connection yang baru dibuat dalam Spanner Adapter. Tambahkan baris hijau setelah baris putih dalam file. Lihat 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;
    }
...

Setelah koneksi dibuat, kita perlu mengubah metode pengambilan data dari adaptor MySQL ke adaptor Spanner . Ubah metode _loadAttributes di AbstractCollection untuk terhubung ke Spanner dan mengambil data dari Spanner. Ganti garis merah dengan garis hijau.

Lihat /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);

...

Validasi bahwa detail Katalog diisi dari Spanner

Selesai! Sekarang, Anda dapat membuka penginstalan Magento di browser dan memeriksa apakah data dimuat.

Misalnya, berikut adalah entri katalog untuk smartwatch:

13b54ba4482408fc.png

Ubah data Spanner melalui terminal untuk salah satu produk dan kueri data melalui terminal untuk mengonfirmasi perubahan di 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)

Sekarang, muat ulang layar untuk mengonfirmasi bahwa nama smartwatch kini diubah menjadi "Aim Analog Spanner" seperti yang diperbarui melalui terminal Spanner.

63a9c7b065c7051f.png

4. Selamat

Selamat, Anda telah berhasil menghubungkan modul Katalog Magento agar berfungsi dengan Spanner. Ini bukan integrasi penuh, tetapi kini Anda mengetahui elemen untuk menghubungkan aplikasi PHP seperti Magento ke instance Spanner.

Pembersihan

Setelah penyiapan dan validasi POC selesai, Anda dapat menghapus resource GCP yang dibuat selama proses tersebut. Hal ini akan mencakup Virtual Machine Compute Engine, serta instance Cloud Spanner jika Anda memutuskan untuk menggunakannya, bukan Emulator.

Apa langkah selanjutnya?

Ini hanyalah model prototipe untuk POC Spanner.

Jika Anda ingin mempelajari lebih lanjut cara menggunakan Spanner dan teknologi yang kami gunakan dalam codelab ini, berikut beberapa referensi tambahan: