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 populer dan menyimpan data di MySQL.

Codelab ini adalah Proof of Concept 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 sepenuhnya terkelola, tingkat perusahaan, terdistribusi, dan konsisten yang menggabungkan berbagai 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 data dalam volume 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 Emulator Spanner
  • Cara memigrasikan skema MySQL yang sudah ada ke Spanner menggunakan HarbourBridge
  • Apa yang perlu Anda ubah untuk mengintegrasikan aplikasi PHP seperti Magento yang menggunakan MySQL agar backend database berfungsi dengan Spanner

Yang akan Anda build

Codelab ini berfokus pada mengintegrasikan Magento dengan Spanner. Blok kode dan petunjuk penyiapan disediakan agar Anda dapat menyalin dan menempel, 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 adalah nilai tambah.
  • Pengalaman Magento akan membantu, tetapi hal tersebut tidak diwajibkan.

2. Menyiapkan instance GCE

Membuat 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 disk booting menjadi 20 GB. Anda dapat membiarkan semuanya sebagai default, tetapi pastikan untuk memilih "Allow HTTP traffic" dan "Allow HTTPs traffic", karena kita akan memanfaatkan antarmuka web Magento.

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

Sistem operasinya adalah Debian 10. Mungkin perlu waktu satu atau dua menit untuk membuat instance.

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

4bf915ef8d37c942.pngS

Ini akan membuka jendela browser baru dan menempatkan Anda di terminal.

Instal software prasyarat

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

  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. Menginstal Elasticsearch dan memulai 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. Kemudian, 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 perintah interaktif untuk menginstal Server MySQL 5.7. Pilih opsi:

  • Server &Cluster MySQL
  • mysql-5.7
  • Oke

a018bfc2ee00bdf5.png 1a126e452ca7312e.pngS ae39c6f4bbe3be74.png

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

sudo a2enmod proxy_fcgi rewrite

Menginstal dan mengonfigurasi Magento2

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

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 komposer 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. Konfigurasikan 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. Membuat 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 instal. Untuk contoh ini, Anda dapat mengakses toko Magento lokal menggunakan format URL berikut:
  • http://<GCEexternalIP>/
  • http://&lt;GCEexternalIP&gt;/&lt;adminuri&gt;

GCEexternalIP dapat ditemukan di Cloud Console:

3947f1164e1d5409.png

Guna mengubah URI untuk panel Admin, gunakan perintah berikut untuk menemukannya:

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

Menyiapkan Spanner

Menginstal Emulator Spanner

Cloud SDK menyediakan emulator lokal dalam memori, 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 seperti layanan produksi Spanner dan ditujukan untuk pengembangan dan pengujian lokal, bukan untuk deployment produksi.

Gunakan link di bawah untuk mengetahui lebih lanjut cara menginstal, menggunakan, dan men-deploy 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 Magento MySQL ke Spanner

Sebelum membahas 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 Spanner. Tidak memerlukan konfigurasi—tidak ada manifes atau peta data untuk 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 menggunakan database sumber MySQL atau PostgreSQL yang ada agar Anda dapat segera mengaktifkan dan menjalankan Spanner. Alat ini menghasilkan laporan penilaian dengan skor kesesuaian migrasi secara keseluruhan untuk Spanner, analisis pemetaan jenis per tabel, dan daftar fitur yang digunakan di database sumber yang tidak didukung oleh Spanner.

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

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

Instal HarbourBridge

Unduh alat ke komputer Anda dan instal. Anda harus menginstal golang agar fungsi ini berfungsi. Mungkin perlu waktu beberapa saat untuk menginstal semua modul yang diperlukan pada instance baru tanpa menyiapkan Go sebelumnya.

# 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 berfungsi dengan Spanner

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

Langkah-langkah berikut akan dilakukan untuk mengonversi penginstalan Magento:

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

Meng-clone fork project Magento

Clone kode aplikasi PHP untuk Magento yang berisi modifikasi untuk modul Katalog, Wishlist, dan Cart dari URL Git yang disebutkan di bawah.

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

Direktori utama Anda akan terlihat seperti ini:

$ ls
go  harbourbridge  magento-spanner-port  magento2

Dengan magento2 adalah codebase yang akan kita modifikasi, menggunakan kode dari magento-spanner-port.

Mengubah koneksi ke Spanner

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

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

  • Mewajibkan library klien PHP google/cloud-spanner
  • Menambahkan Spanner Adapter untuk membuat koneksi ke Spanner.
  • Mengonfigurasi 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 ini:

cd ~/magento2
composer require google/cloud-spanner

Kemudian, kita menambahkan file Adaptor Spanner 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 guna 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 AbstrakDB dalam Magento agar sekarang terhubung ke Spanner menggunakan fungsi Koneksi yang baru dibuat dalam Adaptor Spanner. Tambahkan garis hijau setelah garis putih dalam {i>file<i}. 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 baris merah dengan baris berwarna 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);

...

Memvalidasi bahwa detail Katalog diisi dari Spanner

Selesai. Sekarang, buka instal Magento di browser dan periksa apakah data sudah dimuat.

Misalnya, berikut adalah entri katalog untuk jam tangan:

13b54ba4482408fc.png

Memodifikasi data Spanner melalui terminal untuk salah satu produk dan membuat 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 telah diubah menjadi "Aim Analog Spanner" seperti yang diperbarui melalui terminal Spanner.

63a9c7b065c7051f.pngS

4. Selamat

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

Pembersihan

Setelah penyiapan dan validasi POC selesai, sebaiknya hapus resource GCP yang dibuat selama proses tersebut. 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 manfaatkan dalam codelab ini, berikut beberapa referensi tambahan: