Bu codelab hakkında
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ü 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:
- 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
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:
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.
- 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ü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
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 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:
- 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
- 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 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, Cloud Console'da bulunabilir:
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ı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:
# 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'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:
Ü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.
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: