Magento'yu Cloud Spanner ile entegre etme

Magento'yu Cloud Spanner ile entegre etme

Bu codelab hakkında

subjectSon güncelleme Oca 5, 2022
account_circleYazan: Derek Downey

1. Giriş

424db48d9db91638.png

Magento, verileri MySQL'de depolayan, yaygın olarak popüler PHP tabanlı açık kaynak e-ticaret platformudur.

Bu codelab, Katalog modülü için MySQL yerine Cloud Spanner'dan yararlanmaya 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 tümüyle yönetilen, kurumsal düzeyde, dağıtılmış ve tutarlı bir veritabanıdır. İlişkisel veritabanı modelinin avantajlarını ilişkisel olmayan yatay ölçeklenebilirlikle bir araya getirir. 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 ucunun Spanner ile çalışması için MySQL kullanan Magento gibi PHP uygulamalarını entegre etmek üzere neyi değiştirmeniz gerekir?

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

Bu codelab'de, Magento'yu Spanner ile entegre etmeye başlayacaksınız. Bu kurstan sonra:

Gerekenler

  • Faturalandırma hesabına bağlı bir Google Cloud projesi.
  • PHP, Linux ve Apache yapılandırması hakkında bilgi sahibi olmak büyük bir 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 "HTTP trafiğine izin ver"i seçtiğinizden emin olun ve "HTTPs trafiğine izin ver" seçeneklerini belirleyeceğiz. Çünkü Magento'nun web arayüzünden yararlanacağız.

Bu, paylaşılan temel bir örnek olmayan ve 2vCPU, 8 GB RAM ve 20 GB disk alanına sahip makine türü e2-standard-2 ile sonuçlanır.

İşletim sistemi Debian 10'dur. Örnek oluşturma işlemi bir veya iki dakika sürebilir.

Kod oluşturulduktan sonra "SSH"yi tıklayarak giriş yapın. Cloud Console'da:

4bf915ef8d37c942.png

Bu işlem, yeni bir tarayıcı penceresi açar ve sizi bir terminale yerleştirir.

Ön koşul yazılımını yükleyin

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ükleyin

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üklemeniz için etkileşimli bir istem açar. Seçenekleri belirleyin:

  • MySQL Sunucusu ve Küme
  • 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 olarak erişmek için veritabanı şeması ve hizmetleri içerir.

Bunu yüklemenin ve çalıştırmanın en kolay yolu, oluşturucuyu 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ıldığına dair 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. Sembolik bağlantılar 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://&lt;GCEexternalIP&gt;/
  • http://&lt;GCEexternalIP&gt;/&lt;adminuri&gt;

GCEexternalIP, Cloud Console'da bulunabilir:

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ırakın 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'ı kurun

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 etme amacıyla 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'a 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 doldurulan 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 sürüm, Spanner için genel taşıma uygunluk puanının yanı sıra tür eşlemelerinin tablo bazında analizini ve kaynak veritabanında kullanılan ancak Spanner tarafından desteklenmeyen özelliklerin listesini içeren bir değerlendirme raporu oluşturur.

HarbourBridge, Spanner Emulator 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 indirin ve 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&#39;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 yüklemesini dönüştürmek için aşağıdaki adımlar uygulanır:

  • magento-spanner-port projesini klonlama
  • 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 şu şekilde görünmelidir:

$ ls
go  harbourbridge  magento-spanner-port  magento2

magento2, magento-spanner-port kodu kullanılarak 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ı uygulayabiliriz:

Örnek uygulama için https://github.com/searceinc/magento-spanner-port GitHub bağlantısını inceleyin.

  • google/cloud-spanner PHP istemci kitaplığını gerekli kıl
  • Spanner ile 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

Şimdi, $project_id, $instance ve $database için Spanner bağlantı bilgilerini girmek için 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();
    }

Şimdi Spanner Bağdaştırıcısı içinde yeni oluşturulan Bağlantı işlevini kullanarak Spanner'a bağlanmak için Magento içindeki AbstractDB sınıfını değiştirin. Dosyadaki beyaz çizgilerin 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, veri getirme yöntemini MySQL adaptöründen Spanner adaptörüne değiştirmemiz gerekir . Spanner'a bağlanmak ve verileri Spanner'dan getirmek için AbstractCollection'daki _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 birinin terminali aracılığıyla Spanner verilerini değiştirin ve Spanner'da değişikliği onaylamak için verileri terminal aracılığıyla 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)

Şimdi, saatin adının "Aim Analog Spanner" olarak değiştirildiğini onaylamak için ekranı yeniden yükleyin. şekilde güncellendiğini görürsünüz.

63a9c7b065c7051f.png

4. Tebrikler

Tebrikler, Spanner ile çalışmak için Magento'nun Katalog modülünü başarıyla bağladınız. Tam bir entegrasyon değildir, ancak artık Magento gibi bir PHP uygulamasını bir 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 Cloud Spanner kullanmaya karar verdiyseniz bir Cloud Spanner örneği de dahildir.

Sırada ne var?

Bu, yalnızca bir Spanner POC için prototip modelidir.

Spanner ile çalışma ve bu codelab'de yararlandığımız teknolojiler hakkında daha fazla bilgi edinmek isterseniz aşağıdaki ek kaynaklardan yararlanabilirsiniz: