Magento'yu Cloud Spanner ile entegre etme

1. Giriş

424db48d9db91638.png

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:

4bf915ef8d37c942.png

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.

  1. 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
  1. 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
  1. 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
  1. 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

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. 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:

  1. 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
  1. 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 {} +
  1. 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>
  1. 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
  1. 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/. 
  1. 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://&lt;GCEexternalIP&gt;/&lt;adminuri&gt;

GCEexternalIP'yi Cloud Console'da bulabilirsiniz:

3947f1164e1d5409.png

Yönetici panelinin URI'sını değiştirmek için aşağıdaki komutu kullanarak bulun:

php bin/magento info:adminuri
  1. 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:

Spanner Emulator'ı kullanma

# 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:

13b54ba4482408fc.png

Ü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.

63a9c7b065c7051f.png

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: