1. Giriş

Magento'yu Cloud Spanner arka ucuyla entegre etme
Magento, verileri MySQL'de depolayan, PHP tabanlı açık kaynaklı ve yaygın olarak kullanılan bir 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 kurs, 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ı veritabanıdır. İlişkisel veritabanı modelinin avantajlarını ilişkisel olmayan yatay ölçeklenebilirlikle birleştirir. Küresel online işlem işleme dağıtımlarını, SQL semantiğini, yüksek düzeyde kullanılabilir yatay ölçeklendirmeyi ve işlemsel tutarlılığı destekleyecek şekilde tasarlanmıştır. Spanner, büyük hacimli verileri işleyebilir. Yalnızca büyük boyutlu uygulamalarla sınırlı değildir. İlişkisel veritabanı yönetim sistemi gerektiren tüm iş yükleri için tek bir veritabanı motorunun standartlaştırılmasına olanak tanır. Spanner, planlanmış bakım veya bölge hataları için sıfır kapalı kalma süresi ve %99,999 kullanılabilirlik HDS'si sunar. Yüksek kullanılabilirlik ve ölçeklenebilirlik sağlayarak modern uygulamaları destekler.
Neler öğreneceksiniz?
- GCE'ye Magento'yu yükleme
- Spanner Emulator'ı ayarlama
- HarbourBridge kullanarak mevcut bir MySQL şemasını Spanner'a taşıma
- Veritabanı arka ucu için MySQL kullanan Magento gibi PHP uygulamalarını Spanner ile çalışacak şekilde entegre etmek için değiştirmeniz gerekenler
Ne oluşturacaksınız?
Bu codelab, Magento'yu Spanner ile entegre etmeye odaklanmaktadır. Kod blokları ve kurulum talimatları kopyalayıp yapıştırmanız için 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'nun yüklü olduğu 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ı, ürün kataloğunu Spanner'dan yükleyecek şekilde değiştirme
İhtiyacınız olanlar
- Bir faturalandırma hesabına bağlı olan Google Cloud projesi.
- PHP, Linux ve Apache yapılandırması hakkında bilgi sahibi olmak tercih sebebidir.
- Magento deneyimi faydalı olacaktır 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, önyükleme diski boyutunu ise 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" seçeneklerini belirlediğinizden emin olun.
Bu işlem, paylaşılan çekirdekli bir örnek olmayan ve 2 vCPU, 8 GB RAM ve 20 GB disk alanına sahip e2-standard-2 makine türüyle sonuçlanır.
İşletim sistemi Debian 10 olmalıdır. Örnek oluşturma işlemi bir veya iki dakika sürebilir.
Oluşturulduktan sonra Cloud Console'da "SSH"ı tıklayarak giriş yapın:

Bu işlem yeni bir tarayıcı penceresi açar ve sizi bir terminale yönlendirir.
Ön koşul yazılımını yükleme
Magento'yu çalıştırabilmemiz için öncelikle bazı ön koşul yazılımlarının yüklenmesi gerekir. Aşağıda ayrıntılı olarak açıklanan şekilde PHP, Elastic, MySQL ve Apache'yi yükleyeceksiniz.
- Gerekli bazı 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 gerekli 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örüntüler. 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 hizmetler içerir.
Bu paketi yükleyip çalıştırmanın en kolay yolu, composer kullanarak yüklemek için Magento talimatlarını uygulamaktır:
- Composer'ı kullanarak Magento 2.4.2 sürümünü yükleyin. Magento 2, Composer 1.x sürümünü gerektirir. 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>
- 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
- 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 Yerel ortamın sunucuyu 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 paneli için URI'yi değiştirmek üzere şu komutu kullanarak URI'yi bulun:
php bin/magento info:adminuri
- Tam sayfa önbelleğini devre dışı bırakma Geliştirme amacıyla Magento 2'nin tam sayfa önbelleğini devre dışı bırakabilirsiniz. Bu sayede, Spanner'daki verileri önbelleğe alınmış değerlerden etkilenmeden değiştirebilir ve web sitesine yansıtabilirsiniz.
php bin/magento cache:disable full_page
Spanner'ı ayarlama
Spanner Emulator'ü yükleme
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 olmak üzere tüm durum 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.
Emülatörün yüklenmesi, kullanımı ve dağıtımıyla ilgili daha fazla bilgi 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'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, temel olarak mevcut bir MySQL veya PostgreSQL veritabanının içeriğini Spanner'a yüklemek için otomatik bir iş akışı sağlar. Hiç yapılandırma gerektirmez. Yazılacak manifest veya veri haritası yoktur. Bunun yerine kaynak veritabanını içe aktarır, 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şımalar için değil, değerlendirme amacıyla birkaç on GB'a kadar olan veritabanlarını yüklemek için tasarlanmıştır.
HarbourBridge, Spanner'da hızlıca çalışmaya başlamanız için mevcut bir MySQL veya PostgreSQL kaynak veritabanını kullanarak Spanner'a taşıma işleminin ilk aşamalarını başlatır. Spanner için genel bir taşıma uygunluğu puanı, tür eşlemelerinin tablo bazında analizi 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 hızlı başlangıç kılavuzu içerir.
HarbourBridge'i yükleme
Aracı makinenize indirip yükleyin. Bu özelliğin çalışması için golang'in yüklenmesi gerekir. Go'nun daha önce ayarlanmadığı yeni bir örnekte gerekli tüm modüllerin 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
Magento çalışır duruma geldiğine ve Magento veritabanı taşınarak Spanner örneği oluşturulduğuna göre, Magento'yu Spanner'da depolanan verilerle çalışacak şekilde değiştirmek için çalışacağı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ğrulayın.
Magento projesinin çatalını klonlayın
Aşağıda belirtilen Git URL'sinden Katalog, İstek Listesi ve Alışveriş Sepeti modüllerinde değişiklikler 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 kodunu 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ıyıp yansımadığını kontrol etmek için aşağıdaki adımları uygulayabiliriz:
Örnek uygulama için Github bağlantısı https://github.com/searceinc/magento-spanner-port adresine bakın.
- google/cloud-spanner PHP istemci kitaplığını gerektirir.
- Spanner'a bağlantı oluşturmak için Spanner bağdaştırıcısını ekleyin.
- Spanner örneğini ve sunucu bilgilerini yapılandırın.
- Spanner'a bağlantıyı uygulamak için bağdaştırıcıya SpannerInterface ve Spanner'ı ekleyin.
Öncelikle, composer kullanarak cloud-spanner PHP kitaplığını yüklememiz gerekir. magento2 dizininde şu komutu çalıştırın:
cd ~/magento2 composer require google/cloud-spanner
Ardından, magento-spanner-port klasöründeki 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 DB/Adapter/Spanner/Spanner.php dosyasını değiştirerek $project_id, $instance ve $database için Spanner bağlantı bilgilerini girin:
$ 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 Adapter'da yeni oluşturulan Connection işlevini kullanarak Spanner'a bağlanacak şekilde değiştirin. Dosyaya beyaz çizgilerden sonra yeşil çizgileri ekleyin. vendor/magento/framework/Data/Collection/AbstractDb.php adresine 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 bağdaştırıcısından Spanner bağdaştırıcısına değiştirmemiz gerekir . Spanner'a bağlanmak ve Spanner'dan verileri 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 adresine 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ğrulayın.
İşte bu kadar. Şimdi tarayıcıda Magento yüklemenize gidip verilerin yüklendiğini kontrol edebilirsiniz.
Örneğin, saatlerle ilgili katalog girişleri şunlardır:

Ürünlerden biri için terminal üzerinden Spanner verilerini değiştirin ve Spanner'daki değişikliği onaylamak için terminal üzerinden verileri 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, ekranı yeniden yükleyerek saatin adının, Spanner terminali üzerinden güncellendiği gibi "Aim Analog Spanner" olarak değiştirildiğini onaylayın.

4. Tebrikler
Tebrikler, Magento'nun Katalog modülünü Spanner ile çalışacak şekilde başarıyla bağladınız. Bu tam bir entegrasyon olmasa da 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, süreç sırasında oluşturulan GCP kaynaklarını silebilirsiniz. Bu, Compute Engine sanal makinesinin yanı sıra, Emulator yerine kullanmaya karar verdiğiniz bir Cloud Spanner örneğini de içerir.
Sırada ne var?
Bu, yalnızca bir Spanner POC'si için prototip modeldir.
Spanner ile çalışma ve bu codelab'de kullandığımız teknolojiler hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklardan yararlanabilirsiniz: