1. Pengantar
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:
- Menyiapkan instance GCE dengan Magento yang diinstal
- Menginstal Emulator Spanner
- Menginstal Alat HarbourBridge 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.
- 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:
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.
- 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
- 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
- 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
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
- 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 {} +
- 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>
- 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 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:
# 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:
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.
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: