1. Giriş
Magento'yu Cloud Spanner arka ucuyla entegre etme
Magento, verileri MySQL'de depolayan, yaygın olarak popüler PHP tabanlı açık kaynak e-ticaret platformudur.
Bu codelab, Katalog modülünde MySQL yerine Cloud Spanner'dan faydalanmaya yönelik bir Kavram Kanıtıdır. Bu, Magento'yu veya diğer PHP uygulamalarını Spanner ile entegre etmek, test etmek ve dağıtmak isteyen herkes için faydalıdır.
Spanner, Google Cloud'un ilişkisel veritabanı modelinin avantajlarını ilişkisel olmayan yatay ölçeklenebilirlikle bir araya getiren, tümüyle yönetilen, kurumsal sınıf, dağıtılmış ve tutarlı veritabanıdır. Global online işlem işleme dağıtımlarını, SQL semantiğini, yüksek düzeyde kullanılabilir yatay ölçeklendirmeyi ve işlem tutarlılığını desteklemek için tasarlanmıştır. Spanner, büyük hacimli verileri işleyebilir. Kullanımı büyük boyutlu uygulamalarla sınırlı değildir, ancak RDCMS gerektiren tüm iş yükleri için tek bir veritabanı motorunun standartlaştırılmasına olanak tanır. Spanner, %99,999 kullanılabilirlik HDS'si ile planlı bakım veya bölge arızaları için sıfır kapalı kalma süresi sağlar. Yüksek kullanılabilirlik ve ölçeklenebilirlik sağlayarak modern uygulamaları destekler.
Neler öğreneceksiniz?
- Magento'yu GCE'ye yükleme
- Spanner Emulator kurulumu nasıl yapılır?
- HarbourBridge'i kullanarak mevcut bir MySQL şemasını Spanner'a taşıma
- Veritabanı arka ucu için MySQL kullanan Magento gibi PHP uygulamalarını entegre ederek Spanner ile çalışmasını sağlamak için yapmanız gerekenler
Neler oluşturacaksınız?
Bu codelab, Magento'yu Spanner ile entegre etmeye odaklanmıştır. Kopyalayıp yapıştırmanız için kod blokları ve kurulum talimatları sağlanır, ancak ayrıntılı olarak açıklanmaz.
Bu codelab'de, Magento'yu Spanner ile entegre etmeye başlayacaksınız. Bu kurstan sonra:
- Magento yüklü bir GCE örneği oluşturma
- Spanner Emulator'ı yükleyin.
- MySQL'den Spanner'a veri taşımak için HarbourBridge Aracı'nı yükleyin
- Magento koleksiyonlarını Spanner'dan ürün kataloğunu yükleyecek şekilde değiştirme
İhtiyacınız olanlar
- Bir faturalandırma hesabına bağlı Google Cloud projesi.
- PHP, Linux ve Apache yapılandırma hakkında bilgi sahibi olmak avantajdır.
- Magento deneyimi faydalı olur ancak zorunlu değildir.
2. GCE örneğini hazırlama
GCE örneğini oluşturma
Burada belirtilen adımları uygulayarak Google Cloud Platform'da bir Compute Engine örneği oluşturun.
GCE örneğini oluştururken örnek türünü e2-standard-2 ve önyükleme diski boyutunu 20 GB olarak değiştirin. Her şeyi varsayılan olarak bırakabilirsiniz ancak Magento'nun web arayüzünden yararlanacağımız için "HTTP trafiğine izin ver" ve "HTTPS trafiğine izin ver"i seçtiğinizden emin olun.
Bu işlem sonucunda, paylaşılan çekirdek örneği olmayan, 2 vCPU, 8 GB RAM ve 20 GB disk alanı içeren e2-standard-2 makine türü elde edilir.
İşletim sistemi Debian 10'dur. Örnek oluşturma işlemi bir veya iki dakika sürebilir.
Oluşturulduktan sonra Cloud Console'da "SSH"yi tıklayarak giriş yapın:
Bu işlem, yeni bir tarayıcı penceresi açar ve sizi bir terminale yerleştirir.
Gerekli yazılımı yükleme
Magento'yu çalıştırabilmemiz için önce gerekli bazı yazılımların yüklenmesi gerekecek. Özellikle PHP, Elastic, MySQL ve Apache'yi aşağıda açıklandığı şekilde yükleyeceksiniz.
- Gerekli paketleri yükleyin.
sudo apt update sudo apt -y install lsb-release apt-transport-https ca-certificates wget git screen composer google-cloud-sdk-spanner-emulator gcc
- Magento için gereken PHP modüllerini yükleyin.
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
- Elasticsearch'ü yükleme ve hizmeti başlatma
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
- MySQL'i yükleme
Varsayılan Magento şemasını yüklemek için MySQL'i yüklüyorsunuz. Daha sonra, HarbourBridge'i kullanarak şemayı Spanner'a taşıyacaksınız.
wget https://dev.mysql.com/get/mysql-apt-config_0.8.13-1_all.deb sudo dpkg -i mysql-apt-config*
Yukarıdaki dpkg komutu, MySQL 5.7 sunucusunu yüklemek için etkileşimli bir istem gösterir. Seçenekleri belirleyin:
- MySQL Sunucusu ve Kümesi
- mysql-5.7
- Tamam
sudo apt update && sudo apt -y install mysql-server # You will be prompted to enter a root password
- Apache2'yi yükleme
sudo apt -y install apache2 sudo a2enmod proxy_fcgi rewrite
Magento2'yi yükleme ve yapılandırma
Magento Commerce Cloud projesi, Magento sitesine ve mağazasına tam erişim için bir veritabanı şeması ve hizmetleri içerir.
Bu eklentiyi yükleyip çalıştırmanın en kolay yolu, composer'ı kullanarak yüklemeyle ilgili Magento talimatlarını uygulamaktır:
- Oluşturucu'yu kullanarak Magento sürüm 2.4.2'yi yükleyin. Magento 2 için besteci 1.x sürümü gerekir. Bu sürümün desteğinin sonlandırılmasıyla ilgili bazı uyarılar görebilirsiniz.
composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition=2.4.2 magento2
- Klasör izinlerini ayarlama
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 {} +
- Aşağıdaki içeriklerle /etc/apache2/sites-available/magento.conf dosyasını oluşturarak Magento sanal ana makinesini yapılandırın.
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>
- Simge bağlantılarını oluşturun ve apache2'yi yeniden başlatın.
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
- MySQL'de Magento için veritabanı ve kullanıcı oluşturma
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/.
- Yerel çalışma alanınızı doğrulama Sunucuyu yerel ortamın barındırdığını doğrulamak için yükleme komutunda ilettiğiniz temel URL'yi kullanarak mağazaya erişin. Bu örnekte, aşağıdaki URL biçimlerini kullanarak yerel Magento mağazasına erişebilirsiniz:
- http://<GCEexternalIP>/
- http://<GCEexternalIP>/<adminuri>
GCEexternalIP'yi Cloud Console'da bulabilirsiniz:
Yönetici panelinin URI'sını değiştirmek için aşağıdaki komutu kullanarak bulun:
php bin/magento info:adminuri
- Tam sayfa önbelleğini devre dışı bırakma Geliştirme amacıyla Magento2'nin tam sayfa önbelleğini devre dışı bırakabilirsiniz. Bu, önbelleğe alınan değerlerden etkilenmeden Spanner'daki verileri değiştirmenize ve web sitesine yansıtılmasına olanak tanır.
php bin/magento cache:disable full_page
Spanner'ı ayarlama
Spanner Emulator'ı yükleme
Google Cloud SDK, GCP projesi veya faturalandırma hesabı oluşturmadan uygulamalarınızı ücretsiz olarak geliştirip test etmek için kullanabileceğiniz yerel, bellek içi bir emülatör sağlar. Emülatör verileri yalnızca bellekte depoladığından, yeniden başlatma işleminde veriler, şema ve yapılandırmalar da dahil tüm durum bilgileri kaybolur. Emülatör, Spanner üretim hizmetiyle aynı API'leri sunar ve üretim dağıtımları için değil, yerel geliştirme ve test için tasarlanmıştır.
Emulator'ın yüklenmesi, kullanımı ve dağıtımı hakkında daha fazla bilgi edinmek için lütfen aşağıdaki bağlantıyı kullanın:
# 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
Magento MySQL'i Spanner'e taşıma
Spanner'ı entegre etmeye başlamadan önce, yukarıdaki Magento kurulumumuzun bir parçası olarak oluşturulan MySQL veritabanını Spanner'a dönüştürmek için HarbourBridge adlı bir araç kullanacağız.
HarbourBridge, temelde mevcut bir MySQL veya PostgreSQL veritabanının içeriğini Spanner'a yüklemek için otomatik bir iş akışı sağlar. Sıfır yapılandırma gerektirir; yazılacak manifest veya veri eşleme yoktur. Bunun yerine, kaynak veritabanını içe aktarır, bir Spanner şeması oluşturur, kaynak veritabanındaki verilerle doldurulmuş yeni bir Spanner veritabanı oluşturur ve ayrıntılı bir değerlendirme raporu oluşturur. HarbourBridge, tam ölçekli taşıma işlemleri değil, değerlendirme amacıyla onlarca GB'a kadar olan veritabanlarını yüklemek için tasarlanmıştır.
HarbourBridge, Spanner'da çalışmaya hazır hale gelmenizi sağlamak için mevcut bir MySQL veya PostgreSQL kaynak veritabanını kullanarak Spanner'a erken aşamadaki taşımayı başlatır. Bu işlem, Spanner için genel bir taşıma uygunluk puanı, tür eşlemelerinin tablo tablo analizi ve kaynak veritabanında kullanılan ancak Spanner tarafından desteklenmeyen özelliklerin listesini içeren bir değerlendirme raporu oluşturur.
HarbourBridge, Spanner Emülatörü ile veya doğrudan bir Spanner örneğiyle kullanılabilir.
HarbourBridge README, aracı bir Spanner örneğiyle kullanmak için adım adım açıklamalı bir hızlı başlangıç kılavuzu içerir.
HarbourBridge'i yükleme
Aracı makinenize indirip yükleyin. Bunun çalışması için golang'ı yüklemek gerekir. Go'nun önceden kurulumu yapılmadan gerekli tüm modüllerin yeni bir örneğe yüklenmesi biraz zaman alabilir.
# 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
Verileri taşıma
Magento veritabanını Spanner'a taşımak için aşağıdaki komutu kullanın:
mysqldump --user='root' --password=$ROOT_PASSWORD magento | go run github.com/cloudspannerecosystem/harbourbridge -driver=mysqldump -dbname=magento
spanner-cli aracını ayarlama
go install github.com/cloudspannerecosystem/spanner-cli@latest
3. Magento'yu Spanner ile çalışacak şekilde dönüştürme
Artık Magento çalıştığına ve Magento veritabanıyla oluşturulan Spanner örneğinin taşındığına göre, Magento'yu Spanner'da depolanan verilerle çalışacak şekilde değiştirmeye başlayacağız.
Magento kurulumunu dönüştürmek için aşağıdaki adımlar uygulanır:
- magento-spanner-port projesini klonlayın
- Spanner bağlantısını değiştirme
- Katalog ayrıntılarının Spanner'dan doldurulduğunu doğrulama
Magento projesinin çatalını klonlayın
Aşağıda belirtilen Git URL'sinden Katalog, İstek Listesi ve Cart modüllerinde yapılan değişiklikleri içeren, Magento için PHP uygulama kodunu klonlayın.
cd ~ git clone https://github.com/searceinc/magento-spanner-port
Ana dizininiz aşağıdaki gibi görünmelidir:
$ ls go harbourbridge magento-spanner-port magento2
Burada magento2, magento-spanner-port'taki kodu kullanarak değiştireceğimiz kod tabanıdır.
Spanner bağlantısını değiştirme
Kod değişikliklerinin kullanıcı arayüzüne yansıtılıp yansıtılmadığını kontrol etmek için aşağıdaki adımları izleyebiliriz:
Örnek uygulama için https://github.com/searceinc/magento-spanner-port GitHub bağlantısını inceleyin.
- google/cloud-spanner PHP istemci kitaplığını gerektirir.
- Spanner'a bağlantı oluşturmak için Spanner bağdaştırıcısı ekleyin.
- Spanner örneğini ve sunucu bilgilerini yapılandırın.
- Spanner bağlantısını uygulamak için Adapter'a SpannerInterface ve Spanner'ı ekleyin.
İlk olarak, oluşturucuyu kullanarak bulut anahtarı PHP kitaplığını yüklememiz gerekiyor. magento2 dizininde aşağıdaki komutu çalıştırın:
cd ~/magento2 composer require google/cloud-spanner
Ardından, magento-spanner-port bağlantısındaki Spanner Adapter dosyalarını magento2 kod tabanımıza ekleriz:
~/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
Ardından, $project_id, $instance ve $database için Spanner bağlantı bilgilerini girmek üzere DB/Adapter/Spanner/Spanner.php dosyasını değiştirin:
$ 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(); }
Magento'daki AbstractDB sınıfını, Spanner Bağdaştırıcısı'nda yeni oluşturulan Connection işlevini kullanarak Spanner'a bağlanacak şekilde değiştirin. Dosyadaki beyaz satırların ardından yeşil çizgileri ekleyin. vendor/magento/framework/Data/Collection/AbstractDb.php sayfasına bakın.
$ 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; } ...
Bağlantı kurulduktan sonra MySQL bağlayıcısından Spanner bağlayıcısına veri getirme yöntemini değiştirmemiz gerekir. Spanner'e bağlanmak ve verileri Spanner'den almak için AbstractCollection sınıfındaki _loadAttributes yöntemini değiştirin. Kırmızı çizgiyi yeşil çizgilerle değiştirin.
/app/code/Magento/Eav/Model/Entity/Collection/AbstractCollection.php sayfasına bakın
$ 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); ...
Katalog ayrıntılarının Spanner'dan doldurulduğunu doğrulama
İşte bu kadar. Artık tarayıcıda Magento yüklemenize gidip verilerin yüklenip yüklenmediğini kontrol edebilirsiniz.
Örneğin, kol saatleri için katalog girişleri şunlardır:
Ürünlerden biri için terminal üzerinden Spanner verilerini değiştirin ve Spanner'deki değişikliği onaylamak üzere verileri terminal üzerinden sorgulayın.
$ 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)
Ardından, Spanner terminali üzerinden güncellenen saat adının "Aim Analog Spanner" olarak değiştiğini onaylamak için ekranı yeniden yükleyin.
4. Tebrikler
Tebrikler, Magento'nun Catalog modülünü Spanner ile çalışmak üzere başarıyla bağladınız. Bu tam bir entegrasyon değildir ancak artık Magento gibi bir PHP uygulamasını Spanner örneğine bağlamak için gereken öğeleri biliyorsunuz.
Temizleme
POC kurulumu ve doğrulaması tamamlandığında bu işlem sırasında oluşturulan GCP kaynaklarını silebilirsiniz. Buna Compute Engine sanal makinesi ve Emülatör yerine kullanmaya karar verirseniz bir Cloud Spanner örneği de dahildir.
Sırada ne var?
Bu, Spanner POC'si için yalnızca bir prototip modeldir.
Spanner ile çalışma ve bu codelab'de yararlandığımız teknolojiler hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklardan yararlanabilirsiniz: