1. מבוא
שילוב של Magento עם קצה עורפי של Cloud Spanner
Magento היא פלטפורמת מסחר אלקטרוני בקוד פתוח פופולרית שמבוססת על PHP, שמאחסנת נתונים ב-MySQL.
ה-Codelab הזה הוא הוכחת קונספט לשימוש ב-Cloud Spanner במקום ב-MySQL בשביל המודול של Catalog. זו שיטה שימושית לכל מי שרוצה לשלב, לבדוק ולפרוס את Magento או אפליקציות PHP אחרות עם Spanner.
Spanner הוא מסד נתונים מנוהל, ברמת הארגון, מבוזר ועקבי ב-Google Cloud שמשלב את היתרונות של מודל מסד הנתונים הרלציוני עם מדרגיות אופקית לא יחסית. היא תוכננה לתמוך בפריסות גלובליות של עיבוד טרנזקציות באינטרנט, בסמנטיקה של SQL, בהתאמה אופקית בזמינות גבוהה ובעקביות טרנזקציות. Spanner יכול לטפל בכמויות גדולות של נתונים. השימוש בו לא מוגבל לאפליקציות גדולות, אלא מאפשר ליצור סטנדרטיזציה של מנוע מסד נתונים אחד לכל עומסי העבודה שמחייבים RDBMS. Spanner מספק זמן השבתה לצורך תחזוקה מתוכננת או כשלים באזור, עם הסכם רמת שירות לזמינות של 99.999%. הוא תומך בזמינות גבוהה ומדרגיות באפליקציות מודרניות.
מה תלמדו
- איך להתקין את Magento ב-GCE
- איך להגדיר את אמולטור Spanner
- איך להעביר סכימת MySQL קיימת ל-Spanner באמצעות HarbourBiger
- מה צריך לשנות כדי לשלב אפליקציות PHP כמו Magento שמשתמשות ב-MySQL כדי שהקצה העורפי של מסד הנתונים יפעל עם Spanner
מה תפַתחו
ה-Codelab הזה מתמקד בשילוב של Magento עם Spanner. בלוקים של קוד והוראות הגדרה ניתנים להעתקה ולהדבקה, אבל אין הסבר מפורט עליהם.
ב-Codelab הזה, אתם עומדים להתחיל לשלב את Magento עם Spanner. אתם:
- הגדרת מופע של GCE שמותקן בו Magento
- מתקינים את אמולטור Spanner
- התקנת HarbourBiger Tool להעברת נתונים מ-MySQL ל-Spanner
- שינוי האוספים ב-Magento כדי לטעון את קטלוג המוצרים מ-Spanner
למה תזדקק?
- פרויקט ב-Google Cloud שמחובר לחשבון לחיוב.
- ידע בתצורה של PHP, Linux ו-Apache - יתרון.
- השימוש ב-Magento יהיה שימושי, אבל לא חובה.
2. הכנת מכונת GCE
יצירת מכונת GCE
כדי ליצור מכונה של Compute Engine ב-Google Cloud Platform, פועלים לפי השלבים שמפורטים כאן.
כשיוצרים את מכונת GCE, צריך לשנות את סוג המכונה ל-e2-standard-2 ואת גודל דיסק האתחול ל-20GB. אפשר להשאיר את הכול כברירת מחדל, אבל חשוב לבחור באפשרות 'Allow HTTP traffic' ו"Allow HTTPs traffic", מכיוון שנשתמש בממשק האינטרנט של Magento.
התוצאה היא סוג מכונה של e2-standard-2, שהוא לא מופע ליבה משותף ויש לו 2vCPU, 8GB של RAM ונפח דיסק של 20GB.
מערכת ההפעלה היא Debian 10. תהליך היצירה של מכונה יכול להימשך דקה או שתיים.
לאחר יצירת הקישור, אפשר להתחבר באמצעות לחיצה על 'SSH' במסוף Cloud:
פעולה זו תפתח חלון דפדפן חדש ותעביר אותך למסוף.
התקנת התוכנה הנדרשת המוקדמת
כדי שנוכל להפעיל את Magento, יהיה צורך להתקין תוכנה נדרשת מראש. באופן ספציפי, יש להתקין את PHP, Elastic, MySQL ו-Apache כמפורט למטה.
- מתקינים כמה חבילות נדרשות.
sudo apt update sudo apt -y install lsb-release apt-transport-https ca-certificates wget git screen composer google-cloud-sdk-spanner-emulator gcc
- התקנת מודולים של PHP שנדרשים ל-Magento.
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 והתחלת השירות
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
אתם מתקינים את MySQL כדי להתקין את סכימת ברירת המחדל של Magento. לאחר מכן, תעבירו את הסכימה ל-Spanner באמצעות HarbourBiger.
wget https://dev.mysql.com/get/mysql-apt-config_0.8.13-1_all.deb sudo dpkg -i mysql-apt-config*
הפקודה dpkg שלמעלה תציג הנחיה אינטראקטיבית להתקין את שרת MySQL 5.7. בוחרים אחת מהאפשרויות הבאות:
- שרת MySQL ו אשכול
- mysql-5.7
- אישור
sudo apt update && sudo apt -y install mysql-server # You will be prompted to enter a root password
- התקנת Apache2
sudo apt -y install apache2 sudo a2enmod proxy_fcgi rewrite
התקנה והגדרה של Magento2
הפרויקט Magento Commerce Cloud כולל סכימה של מסד נתונים ושירותים כדי לקבל גישה מלאה לאתר ולחנות של Magento.
הדרך הקלה ביותר להתקין ולהפעיל את התוסף הזה היא לפעול לפי ההוראות של Magento להתקנה באמצעות 'מלחין':
- התקנת גרסה 2.4.2 של Magento באמצעות המלחין. ל-Magento 2 נדרשת גרסת מלחין של 1.x. יכול להיות שיופיעו אזהרות לגבי הפסקת התמיכה בגרסה הזו.
composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition=2.4.2 magento2
- הגדרת הרשאות לתיקיות
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 {} +
- מגדירים את המארח הווירטואלי של Magento על ידי יצירת /etc/apache2/sites-available/magento.conf עם התוכן שלמטה.
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>
- יצירת הקישורים הסמליים והפעלה מחדש של apache2.
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
- יצירה של מסד הנתונים והמשתמש של Magento ב-MySQL
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/.
- אימות סביבת העבודה המקומית כדי לוודא שהסביבה המקומית מארחת את השרת, צריך לגשת לחנות באמצעות כתובת ה-URL הבסיסית שהעברת בפקודת ההתקנה. לצורך הדוגמה הזו, תוכלו לגשת לחנות המקומית של Magento באמצעות הפורמטים הבאים של כתובות URL:
- http://<GCEexternalIP>/
- http://<GCEexternalIP>/<adminuri>
אפשר למצוא את GCEexternalIP במסוף Cloud:
כדי לשנות את ה-URI של חלונית הניהול, משתמשים בפקודה הבאה כדי לאתר אותו:
php bin/magento info:adminuri
- השבתת השמירה במטמון של דף מלא למטרות פיתוח, אפשר להשבית את השמירה של כל הדפים במטמון של Magento2. כך תהיה לך אפשרות לשנות את הנתונים ב-Spanner ולשקף אותם באתר בלי שתהיה לכך השפעה על הערכים שנשמרו במטמון.
php bin/magento cache:disable full_page
הגדרת Spanner
התקנת אמולטור Spanner
Cloud SDK מספק אמולטור מקומי בזיכרון, שבעזרתו אפשר לפתח ולבדוק אפליקציות בחינם, בלי ליצור פרויקט GCP או חשבון לחיוב. מכיוון שהאמולטור מאחסן נתונים רק בזיכרון, כל המצבים, כולל נתונים, סכימה והגדרות, אובדים בהפעלה מחדש. האמולטור מציע את אותם ממשקי API שיש בשירות הייצור של Spanner, ונועד לפיתוח ולבדיקה מקומיים, ולא לפריסות בסביבת ייצור.
בקישור הבא ניתן לקבל מידע נוסף על ההתקנה, השימוש והפריסה של האמולטור:
# 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 ל-Spanner
לפני שנתעמק בשילוב של Spanner, נשתמש בכלי בשם HarbourBridge כדי להמיר את מסד הנתונים של MySQL שנוצר כחלק מההתקנה של Magento שלמעלה ל-Spanner.
הליבה של HarbourBiger מספקת תהליך עבודה אוטומטי לטעינת התוכן של מסד נתונים קיים מסוג MySQL או PostgreSQL ב-Spanner. אין צורך לקבוע הגדרות אישיות בשביל זה – אין מניפסטים או מפות נתונים לצורך כתיבה. במקום זאת, המערכת מייבאת את מסד הנתונים המקורי, יוצרת סכימת Spanner, יוצרת מסד נתונים חדש ב-Spanner שמאוכלס בנתונים ממסד הנתונים המקורי ומפיקה דוח הערכה מפורט. HarbourBiger מיועד לטעינת מסדי נתונים עד כמה עשרות GB למטרות הערכה, ולא להעברות בקנה מידה מלא.
אתחול אתחול HarbourBiger מבצע העברה בשלב מוקדם ל-Spanner באמצעות מסד נתונים קיים של מקור ב-MySQL או ב-PostgreSQL, כדי לעזור לך להתחיל לעבוד במהירות ב-Spanner. היא יוצרת דוח הערכה עם ציון התאמה כולל להעברה ל-Spanner, ניתוח טבלה של מיפויי הסוגים ורשימה של התכונות שנמצאות בשימוש במסד הנתונים של המקור שלא נתמכות על ידי Spanner.
אפשר להשתמש ב-HarbourBiger באמצעות האמולטור Spanner או ישירות באמצעות המכונה של Spanner.
הקובץ HarbourBiger README מכיל מדריך מפורט למתחילים לשימוש בכלי עם מכונת Spanner.
התקנת HarbourBiger
מורידים את הכלי למחשב ומתקינים אותו. כדי שזה יעבוד, צריך להתקין golang. יכול להיות שיעבור קצת זמן עד שמתקינים את כל המודולים הנדרשים במכונה חדשה בלי להגדיר את Go.
# 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
מעבירים את הנתונים
כדי להעביר את מסד הנתונים של Magento ל-Spanner, משתמשים בפקודה הבאה:
mysqldump --user='root' --password=$ROOT_PASSWORD magento | go run github.com/cloudspannerecosystem/harbourbridge -driver=mysqldump -dbname=magento
הגדרת כלי מפתח הברגים
go install github.com/cloudspannerecosystem/spanner-cli@latest
3. המרת Magento לעבודה עם Spanner
עכשיו, אחרי שהתחלנו להפעיל את Magento והמכונה של Spanner שנוצרה באמצעות מסד הנתונים של Magento הועברה, נעבוד על שינוי של Magento כך שתעבוד עם הנתונים שמאוחסנים ב-Spanner.
השלבים הבאים יבוצעו כדי להמיר את ההתקנה של Magento:
- שכפול הפרויקט magento-spanner-port
- שינוי החיבור ל-Spanner
- בדיקה שפרטי הקטלוג מאוכלסים מ-Spanner
שכפול המזלג של פרויקט Magento
משכפלים את קוד האפליקציה PHP של Magento, שמכיל את השינויים במודולים Catalog, Wishlist ו-Cart, מכתובת ה-URL של Git שמופיעה בהמשך.
cd ~ git clone https://github.com/searceinc/magento-spanner-port
ספריית הבית אמורה להיראות כך:
$ ls go harbourbridge magento-spanner-port magento2
כאשר magento2 הוא ה-codebase שנשנה, באמצעות קוד מ-magento-spanner-port.
שינוי החיבור ל-Spanner
כדי לבדוק אם השינויים בקוד מופיעים בממשק המשתמש, אפשר לפעול לפי השלבים הבאים:
להטמעה לדוגמה, אפשר לעיין בקישור של GitHub https://github.com/searceinc/magento-spanner-port.
- נדרשת ספריית הלקוח google/cloud-spanner PHP
- צריך להוסיף מתאם Spanner כדי ליצור חיבור ל-Spanner.
- הגדרת פרטי השרת והמכונה של Spanner.
- צריך להוסיף את SpannerInterface ו-Spanner במתאם כדי להטמיע את החיבור ל-Spanner.
ראשית, עלינו להתקין את ספריית ה-PHP עם מפתח הברגים בענן באמצעות המלחין. בספרייה magento2, מריצים את הפקודה הבאה:
cd ~/magento2 composer require google/cloud-spanner
לאחר מכן מוסיפים את הקבצים במתאם Spanner מ-magento-spanner-port ל-codebase שלנו מסוג magento2:
~/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
עכשיו, משנים את הקובץ DB/Adapter/Spanner/Spanner.php כדי להזין את פרטי הקישוריות של Spanner עבור $project_id, $instance, ו-$database:
$ 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(); }
משנים את המחלקה AbstractDB ב-Magento כדי להתחבר ל-Spanner באמצעות פונקציית החיבור החדשה שנוצרה במתאם Spanner. מוסיפים את הקווים הירוקים אחרי הקווים הלבנים בקובץ. מידע נוסף זמין בקטע vendor/magento/framework/Data/Collection/AbstractDb.php
$ 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; } ...
לאחר יצירת החיבור, עלינו לשנות את השיטה לאחזור הנתונים ממתאם MySQL למתאם Spanner . משנים את השיטה _loadAttributes ב-AbstractCollection כדי להתחבר ל-Spanner ולאחזר את הנתונים מ-Spanner. מחליפים את הקו האדום בקווים הירוקים.
מידע נוסף זמין בכתובת /app/code/Magento/Eav/Model/Entity/Collection/AbstractCollection.php
$ 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); ...
בדיקה שפרטי הקטלוג מאוכלסים מ-Spanner
זהו! עכשיו אפשר לעבור ל-Magento בדפדפן ולבדוק אם הנתונים נטענים.
לדוגמה, רשומות הקטלוג של שעונים הם:
משנים את הנתונים של Spanner דרך הטרמינל עבור אחד מהמוצרים ומריצים שאילתות על הנתונים דרך הטרמינל כדי לאשר את השינוי ב-Spanner.
$ 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)
עכשיו צריך לטעון מחדש את המסך כדי לאשר ששם השעון השתנה ל-'Aim Analog Spanner' כפי עודכן דרך מסוף Spanner.
4. מזל טוב
מזל טוב, חיברת בהצלחה את מודול הקטלוג של Magento כדי לעבוד עם Spanner! זה לא שילוב מלא, אבל עכשיו אתם מכירים את הרכיבים שנדרשים כדי לחבר אפליקציית PHP כמו Magento למכונה של Spanner.
מנקה
לאחר השלמת ההגדרה והאימות של ה-POC, כדאי למחוק את משאבי ה-GCP שנוצרו במהלך התהליך. הפריטים האלה יכללו את המכונה הווירטואלית של Compute Engine וגם את המכונה של Cloud Spanner, אם תחליטו להשתמש במכונה הווירטואלית במקום ב-Eמולטור.
מה השלב הבא?
זהו רק מודל אב טיפוס של איש קשר ב-Spanner.
ריכזנו כאן כמה מקורות מידע נוספים שיעזרו לכם ללמוד על העבודה עם Spanner ועל הטכנולוגיות שבהן אנחנו משתמשים ב-Codelab הזה: