1. Pengantar
Mengintegrasikan Magento dengan backend Cloud Spanner
Magento adalah platform e-commerce open source berbasis PHP yang sangat populer dan digunakan untuk menyimpan data di MySQL.
Codelab ini adalah Bukti Konsep untuk memanfaatkan Cloud Spanner, bukan MySQL, untuk modul Katalog. Spanner akan berguna bagi siapa saja yang tertarik mengintegrasikan, menguji, dan men-deploy Magento, atau aplikasi PHP lainnya.
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 dengan ketersediaan tinggi, dan konsistensi transaksional. Spanner mampu menangani data dalam volume yang besar. Penggunaannya tidak terbatas pada aplikasi berukuran besar tetapi memungkinkan standardisasi satu mesin database untuk semua beban kerja yang memerlukan RDBMS. Spanner menyediakan periode nonaktif untuk pemeliharaan terencana atau kegagalan region, dengan SLA ketersediaan 99,999%. Platform ini mendukung aplikasi modern dengan menyediakan 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
- Yang perlu Anda ubah untuk mengintegrasikan aplikasi PHP seperti Magento yang menggunakan MySQL agar backend database dapat berfungsi dengan Spanner
Yang akan Anda build
Codelab ini berfokus pada mengintegrasikan Magento dengan Spanner. Blok kode dan petunjuk penyiapan disediakan untuk Anda salin dan tempel, tetapi tidak dibahas secara mendetail.
Dalam codelab ini, Anda akan mulai mengintegrasikan Magento dengan Spanner. Anda akan:
- Menyiapkan instance GCE dengan Magento yang sudah terinstal
- Instal Emulator Spanner
- Instal HarbourBridge Tool untuk migrasi data dari MySQL ke Spanner
- Mengubah koleksi Magento untuk memuat Katalog produk dari Spanner
Yang Anda butuhkan
- Project Google Cloud yang terhubung ke akun penagihan.
- Memiliki lebih banyak pengetahuan tentang konfigurasi PHP, Linux, dan Apache.
- 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 boot disk menjadi 20 GB. Anda dapat membiarkan semuanya sesuai 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:
Ini akan membuka jendela browser baru dan menempatkan Anda di terminal.
Instal software prasyarat
Magento memerlukan beberapa perangkat lunak prasyarat untuk diinstal sebelum kita dapat menjalankan Magento. Secara khusus, Anda akan menginstal PHP, Elastic, MySQL, dan Apache seperti yang dijelaskan di bawah ini.
- 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
- 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
- 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
- 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 prompt interaktif untuk menginstal Server MySQL 5.7. Pilih opsi:
- Server MySQL & Gugus
- mysql-5.7
- Oke
sudo apt update && sudo apt -y install mysql-server # You will be prompted to enter a root password
- 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:
- 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
- Tetapkan 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 {} +
- Konfigurasi host virtual Magento dengan membuat /etc/apache2/sites-available/magento.conf dengan konten di bawah ini.
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>
- 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
- 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/.
- 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://<GCEexternalIP>/<adminuri>
GCEexternalIP dapat ditemukan di Cloud Console:
Guna mengubah URI untuk panel Admin, gunakan perintah berikut untuk menemukannya:
php bin/magento info:adminuri
- 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 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 merujuk lebih lanjut tentang penginstalan, penggunaan, dan deployment Emulator:
# 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, fitur ini akan mengimpor database sumber, membuat skema Spanner, membuat database Spanner baru yang diisi dengan data dari database sumber, dan membuat laporan penilaian yang 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 kebugaran migrasi secara keseluruhan untuk Spanner, analisis tabel demi tabel pemetaan jenis, serta daftar fitur yang digunakan dalam database sumber yang tidak didukung oleh Spanner.
HarbourBridge dapat digunakan dengan Emulator Spanner, atau secara langsung dengan instance Spanner.
HarbourBridge README berisi panduan memulai cepat langkah demi langkah untuk menggunakan alat ini dengan instance Spanner.
Instal HarbourBridge
Unduh alat ke komputer Anda dan instal. Anda perlu menginstal golang agar berfungsi. Diperlukan 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
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 tercermin di UI, kita dapat mengikuti langkah-langkah di bawah ini -
Lihat Link GitHub https://github.com/searceinc/magento-spanner-port untuk melihat contoh penerapan.
- Mewajibkan library klien PHP google/cloud-spanner
- Menambahkan Adaptor Spanner untuk membuat koneksi ke Spanner.
- Mengonfigurasi informasi server dan instance Spanner.
- Menambahkan SpannerInterface dan Spanner di Adaptor untuk mengimplementasikan 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 AbstrakCollection untuk terhubung ke Spanner dan mengambil data dari Spanner. Ganti garis merah dengan garis 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:
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 sekarang telah diubah menjadi "Aim Analog Spanner" yang diperbarui melalui terminal Spanner.
4. Selamat
Selamat, Anda telah berhasil menghubungkan modul Katalog Magento untuk bekerja dengan Spanner. Ini bukanlah integrasi penuh, tetapi sekarang Anda mengetahui elemen-elemen untuk mendapatkan aplikasi PHP, seperti Magento yang terhubung ke instance Spanner.
Pembersihan
Setelah penyiapan dan validasi POC selesai, Anda dapat menghapus 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 Spanner POC.
Jika Anda ingin mempelajari lebih lanjut cara menggunakan Spanner dan teknologi yang kita manfaatkan dalam codelab ini, berikut beberapa referensi tambahan: