כיצד להגדיר את שילוב הקבוצה של MySQL ב-Ubuntu 20.04

הקדמה

שיקוף ב-MYSQL משקף באופן אמין את הנתונים והפעולות ממסד נתונים אחד לאחר. שיקוף מסורתי משתלב בשרת ראשי שמוגדר לקבל פעולות כתיבת מסד נתונים עם שרתים משניים שמעתיקים ומחילים פעולות מיומנות של השרת הראשי לקבוצות הנתונים שלהם. שרתים אלו יכולים לשמש לקריאות, אך בדרך כלל אינם יכולים לבצע כתיבות לנתונים.

שיקוף קבוצתי הוא דרך ליישום מנגנון שיקוף גמיש יותר ועמיד בשגיאות. התהליך הזה כולל הקמת בריכת שרתים שכל אחד מהם מעורב בהבטחת העתקת הנתונים בצורה נכונה. אם השרת הראשי נתקל בבעיות, בחירות חברים יכולות לבחור שרת ראשי חדש מהקבוצה. זה מאפשר לצומת הנותרת להמשיך לפעול, גם בפני בעיות. מו"מ, איתור כשלון ומסירת הודעות מסופקים דרך היישום של אלגוריתם הסכמה של פקסוס.

במדריך זה, תקבל גישה להקמת שיקוף קבוצתי של MYSQL באמצעות סט של שלושה שרתי Ubuntu 20.04. שים לב ששלושה הם מספר המינימלי של מופעי MYSQL שעליך להפעיל שיקוף קבוצתי ב-MYSQL, בעוד תשעה הוא המקסימום. במהלך המדריך, יהיה לך אפשרות להגדיר את הקבוצה כקבוצת שיקוף ראשי יחיד או כקבוצת שיקוף ראשי מרובה.

הערה: שרתי מסד נתונים יכולים להיות באחת משתי תפקידים בהגדרת שיבוץ: הם יכולים להיות מופע ראשי (שם נוסף: מקור), שמשתמשים יכולים לכתוב נתונים אליו; או שיבוץ (או מופע משני), שמאחסן העתק של כל הנתונים במקור. היסטורית, תפקידים אלה הוזכרו כ- מופע ראשי ו- מופע עבד, בהתאמה. ב- פוסט בבלוג שפורסם ביולי 2020, צוות MySQL הכיר במקור שלילי של המונחון הזה והודיע על מאמציהם לעדכן את תוכנת מסד הנתונים ואת התיעוד שלה לשימוש בשפה יותר כוללת.

עם זאת, זה תהליך שהולך וגדל. אף על פי שהתיעוד של MySQL ורוב הפקודות בגרסה 8 של התוכנה עודכנו כדי להתייחס במקום לשרתים בטופולוגיית שיבוץ כ- ראשי ואת משניו (או למקור ול- שיבוציו), ישנם מקומות שבהם המונחים השליליים עדיין מופיעים. מדריך זה יעדיף את המונחים הכוללים יותר בכל דבר שניתן, אך ישנם מקרים בהם המונחים הישנים עדיין מתעוררים באופן בלתי נמנע.

דרישות מוקדמות

להשלמת מדריך זה, תצטרכו:

למען הבהירות, המדריך הזה יתייחס לשלושת השרתים בשמות חבר1, חבר2, ו-חבר3. בדוגמאות במהלך המדריך יש לשלושת החברים את הכתובות ה-IP הבאות:

Member IP address
member1 203.0.113.1
member2 203.0.113.2
member3 203.0.113.3

כל פקודה שיש להפעיל על חבר1 תהיה עם רקע כחול, כמו כן:

באופן דומה, כל פקודה שיש להפעיל על חבר2 תהיה עם רקע אדום:

וכל פקודה שיש להפעיל על חבר3 תהיה עם רקע ירוק:

לבסוף, כל פקודה שיש להפעיל על כל אחד משלושת השרתים תהיה עם רקע סטנדרטי:

שלב 1 — יצירת UUID כדי לזהות את קבוצת MySQL

לפני פתיחת קובץ התצורה של MySQL כדי להגדיר את הגדרות השילוב של הקבוצה, עליך ליצור UUID שתוכל להשתמש בו כדי לזהות את קבוצת MySQL שתיצור.

על member1, השתמש בפקודת uuidgen כדי ליצור UUID תקין עבור הקבוצה:

  1. uuidgen
Output
168dcb64-7cce-473a-b338-6501f305e561

העתק את הערך שתקבל, מאחר ותצטרך להתייחס אליו ברגע שתגדיר את שם הקבוצה עבור מאגר השרתים שלך.

שלב 2 — הגדרת שילוב קבוצתי בקובץ התצורה של MySQL

עכשיו אתה מוכן לשנות את קובץ התצורה של MySQL. פתח את קובץ התצורה הראשי של MySQL על כל שרת MySQL באמצעות העורך הטקסט המועדף עליך. כאן, נשתמש ב־nano:

  1. sudo nano /etc/mysql/my.cnf

על Ubuntu, MySQL מותקן עם מספר קבצים שונים שניתן להשתמש בהם כדי להגדיר שינויי תצורה שונים. ברירת המחדל, קובץ my.cnf משמש רק לשוליים קבצים נוספים מתת ספריות. עליך להוסיף את התצורה שלך מתחת לשורות !includedir. זה יאפשר לך לדרוס כל הגדרות מהקבצים הכלולים.

כדי להתחיל, התחל מקטע חדש על ידי כלול כותרת [mysqld] ואז הוסף את ההגדרות שאתה צריך כדי להפעיל קבוצת שימוש, כפי שמודגש בדוגמה הבאה. שים לב שההגדרות הללו משתנות מההגדרות המינימליות הנדרשות לקבוצת שימוש על פי תיעוד MySQL הרשמי. התחיליות loose- מאפשרות ל-MySQL להתמודד עם אפשרויות שהיא אינה מכירה בצורה נאה ובלי כישלון. תצטרך למלא ולהתאים אישית חלק מההגדרות הללו בקרוב:

/etc/mysql/my.cnf
. . .
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

[mysqld]

# General replication settings
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
log_bin = binlog
binlog_format = ROW
transaction_write_set_extraction = XXHASH64
loose-group_replication_bootstrap_group = OFF
loose-group_replication_start_on_boot = OFF
loose-group_replication_ssl_mode = REQUIRED
loose-group_replication_recovery_use_ssl = 1

# Shared replication group configuration
loose-group_replication_group_name = ""
loose-group_replication_ip_whitelist = ""
loose-group_replication_group_seeds = ""

# Single or Multi-primary mode? Uncomment these two lines
# for multi-primary mode, where any host can accept writes
#loose-group_replication_single_primary_mode = OFF
#loose-group_replication_enforce_update_everywhere_checks = ON

# Host specific replication configuration
server_id = 
bind-address = ""
report_host = ""
loose-group_replication_local_address = ""

כדי להסביר את כל האפשרויות הללו של התצורה בצורה מפורטת יותר, הן נחלקו לתת-מקטעים הבאים. אנא קרא אותם בזהירות, מאחר וחלק מהמקטעים מציגים בחירות בנוגע לאופן שבו אתה רוצה להשתמש בקבוצת השימוש שלך או מחייבים אותך להזין פרטים ספציפיים עבור התצורה האישית שלך.

הגדרות תבניתיות לשימוש בקבוצה

המקטע הראשון מכיל הגדרות כלליות הנדרשות עבור השילוב הקבוצתי שאינן דורשות שינוי:

/etc/mysql/my.cnf
. . .
# הגדרות שילוב כלליות
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
log_bin = binlog
binlog_format = ROW
transaction_write_set_extraction = XXHASH64
loose-group_replication_bootstrap_group = OFF
loose-group_replication_start_on_boot = OFF
loose-group_replication_ssl_mode = REQUIRED
loose-group_replication_recovery_use_ssl = 1
. . .

דרישה מסוימת לשילוב קבוצתי ב־MySQL היא שהנתונים חייבים להיות מאוחסנים במנוע אחסון InnoDB. המסמך של MySQL ממליץ על השבתת השימוש במנועי אחסון אחרים שעשויים לגרום לשגיאות באופן דומה לשורת הפעלה הראשונה וללא הערות במקטע זה.

ההגדרות הנותרות מפעילות מזהים עולמיים לעסקאות, מגדירות את יישום הלוג שנדרש לשילוב הקבוצתי ומגדירות SSL עבור הקבוצה. ההגדרה הזו גם מגדירה כמה פריטים נוספים שמסייעים בשחזור ובאתחול. לא נדרש לשנות דבר במקטע זה והוא צריך להיות זהה בכל שלושת השרתים שלך, כך שניתן להמשיך לאחר שהוספתו.

הגדרות שילוב קבוצתי משותף

המקטע השני מגדיר הגדרות משותפות עבור הקבוצה. עליך להתאים אישית את זה פעם אחת ולאחר מכן להשתמש באותן ההגדרות בכל אחד מהצמתים שלך. למעשה, עליך להוסיף את UUID של הקבוצה (שיצרת בשלב הקודם), רשימה של חברי הקבוצה המורשים ואת חברי הזרע הנדרשים ליצירת קשר על מנת לקבל את הנתונים הראשוניים כאשר מצטרף לקבוצה.

הגדר את loose-group_replication_group_name לערך UUID שיצרת קודם עם הפקודה uuidgen. וודא שאתה מכניס את ה-UUID בין גרשיים ריקים.

לבארץ, הגדר loose-group_replication_ip_whitelist לרשימת כל כתובות ה-IP של שרתי MySQL שלך, מופרדות בפסיקים. ההגדרה של loose-group_replication_group_seeds צריכה להיות כמעט זהה לרשימת האיפיים הלבנים, אך עליך להוסיף פורט של קבוצת השקיפות המיוחדת לסוף כל חבר. לצורך המדריך, השתמש בפורט המומלץ של קבוצת השקיפות, 33061:

/etc/mysql/my.cnf
. . .
# הגדרת קבוצת שקיפות משותפת
loose-group_replication_group_name = "168dcb64-7cce-473a-b338-6501f305e561"
loose-group_replication_ip_whitelist = "203.0.113.1,203.0.113.2,203.0.113.3"
loose-group_replication_group_seeds = ""203.0.113.1:33061,203.0.113.2:33061,203.0.113.3:33061"
. . .

חלק זה צריך להיות זהה בכל שרתי MySQL שלך, אז הקפד להעתיק אותו בקפידה בכל אחד.

בחירת ראשי יחיד או ראשי מרובים

בשלב הבא, עליך להחליט האם להגדיר קבוצת ראשי יחיד או קבוצת ראשי מרובים. בתצורת ראשי יחיד, MySQL מכריחה שרת ראשי יחיד (כמעט תמיד החבר הראשון בקבוצה) לטפל בפעולות כתיבה. קבוצת ראשי מרובים מאפשרת לכל אחד מחברי הקבוצה לבצע פעולות כתיבה.

אם ברצונך להגדיר קבוצה מרכזית מרובה, בטל את ההערות מתחת לקוד loose-group_replication_single_primary_mode וגם loose-group_replication_enforce_update_everywhere_checks. זה יגדיר קבוצה מרכזית מרובת מרכזים. עבור קבוצה מרכזית יחידה, פשוט השאר את שתי השורות האלו פסוקות:

/etc/mysql/my.cnf
. . .
# מצב יחיד או מרכזי מרובה? בטלו את ההערות משתי שורות אלו
# עבור מצב מרכזי מרובה, שבו כל מארח יכול לקבל כתיבות
#loose-group_replication_single_primary_mode = OFF
#loose-group_replication_enforce_update_everywhere_checks = ON
. . .

הגדרות אלו חייבות להיות זהות בכל שרתי MySQL שלך.

ניתן לשנות את ההגדרה הזו מאוחר יותר, אך לאחר כך עליך לאתחל מחדש את כל אחד מחברי קבוצת MySQL שלך. כדי לשנות את ההגדרה להגדרה חדשה, עליך לעצור את כל המופעים של MySQL בקבוצה, להפעיל כל חבר עם ההגדרות החדשות ולאחר מכן לאתחל מחדש את הקבוצה. זה לא ישפיע על נתוניך בשום צורה, אך זה דורש חלון קטן של זמן מנוחה.

הגדרות ספציפיות למארח

הסעיף הרביעי מכיל הגדרות שיהיו שונות בכל אחד מהשרתים, כולל:

  • מזהה השרת
  • כתובת הקשב
  • כתובת הדיווח לחברים אחרים
  • כתובת השידור המקומית והפורט של האזנה

ההוראה של הפקודה server_id חייבת להיות מוגדרת למספר ייחודי. עבור החברה הראשונה, יש להגדיר זאת ל־1 ולהגדיל את המספר בכל שרת נוסף. יש להגדיר את bind-address ואת report_host לכתובת ה־IP של השרת הרלוונטי כך שהמופע של MySQL יקשיב לחיבורים חיצוניים וידווח על הכתובת שלו כראוי לשרתים אחרים. ה־loose-group_replication_local_address גם צריך להיות מוגדר לכתובת ה־IP הנוכחית של השרת עם פתח הקבוצה לשיבוץ (33061), מוסיף לכתובת ה־IP.

כדוגמה, הנה חלק זה של התצורה עבור חבר1 באמצעות כתובת ה־IP הדוגמאית שלו:

/etc/mysql/my.cnf
. . .
# הגדרת שפותחה רפליקציה מסוימת
server_id = 1
bind-address = "203.0.113.1"
report_host = "203.0.113.1"
loose-group_replication_local_address = "203.0.113.1:33061"

השלמת תהליך זה על כל שרתי ה־MySQL שלך. הנה ההגדרה עבור חבר2:

/etc/mysql/my.cnf
. . .
# הגדרת שפותחה רפליקציה מסוימת
server_id = 2
bind-address = "203.0.113.2"
report_host = "203.0.113.2"
loose-group_replication_local_address = "203.0.113.2:33061"

והנה ההגדרה עבור חבר3:

/etc/mysql/my.cnf
. . .
# הגדרת שפותחה רפליקציה מסוימת
server_id = 3
bind-address = "203.0.113.3"
report_host = "203.0.113.3"
loose-group_replication_local_address = "203.0.113.3:33061"

וודא שתעדכן כל כתובת IP שהודגשה לזו של השרת שעליו אתה עורך את ההגדרה.

כאשר תסיים, ודא כי ההגדרות המשותפות לרפליקציה זהות בכל שרת ושההגדרות המותאמות לכל שרת מותאמות לכל שרת. שמור וסגור את הקובץ בכל שרת כאשר תסיים. אם השתמשת ב־nano כדי לערוך את הקובץ, תוכל לעשות זאת על ידי לחיצה על CTRL + X, Y, ואז ENTER.

כל אחד מקבצי התצורה של MySQL שבשרתים שלך מכיל כעת את ההוראות הדרושות כדי להפעיל את הקבוצה של כפל MySQL. כדי ליישם את ההגדרות החדשות למופע MySQL, יש לאתחל את השירות על כל אחד מהשרתים שלך באמצעות הפקודה הבאה:

  1. sudo systemctl restart mysql

עם זאת, ניתן להמשיך אל הפעלת גישה מרחוק על ידי עדכון חוקי האש של כל אחד מהשרתים שלך.

שלב 3 — עדכון חוקי UFW של כל השרתים

בהנחה שעקבת אחרי המדריך להגדרת השרת הראשונית שנדרש, כעת יש להפעיל חומת אש על כל השרתים שבהם התקנת MySQL והפעלת גישה לפרופיל UFW של OpenSSH. זהו סימן אבטחה חשוב, מכיוון שחומות האש הללו מונעות חיבורים לכל יציאה בשרתים שלך, למעט חיבורים ssh שמציגים מפתחות המתאימים לקובץ authorized_keys הרלוונטי של כל שרת.

בקובץ התצורה של MySQL, הגדרת את השירות להאזין לחיבורים חיצוניים ביציאה המקובלת 3306. גם קבעת את 33061 כיציאה שיחברים צריכים להשתמש בה לסינכרון הכפל.

על כל אחד משרתי החברים שלך, עליך לפתוח גישה לשני יציאות אלו עבור החברים האחרים בקבוצה זו כך שיהיה ניתן לתקשר זה עם זה. כדי לפתוח גישה ליציאות אלו על חבר1 עבור חבר2, הרץ את הפקודות הבאות של ufw על חבר1:

  1. sudo ufw allow from member2_server_ip to any port 3306
  2. sudo ufw allow from member2_server_ip to any port 33061

ודא שאתה משנה את כתובת ה-IP_של_חבר2 כך שתשקף את כתובת ה-IP האמיתית של השרת של חבר2. לאחר מכן, כדי לפתוח את אותן היציאות עבור חבר3, הרץ את הפקודות האלה:

  1. sudo ufw allow from member3_server_ip to any port 3306
  2. sudo ufw allow from member3_server_ip to any port 33061

לבסוף, עדכן את כללי הגישה לגישה שלך על שני השרתים האחרים. הרץ את הפקודות הבאות על חבר2, וודא שאתה משנה את כתובת ה-IP כך שתשקף את אלה של חבר1 ו-חבר3 בהתאם:

  1. sudo ufw allow from member1_server_ip to any port 3306
  2. sudo ufw allow from member1_server_ip to any port 33061
  3. sudo ufw allow from member3_server_ip to any port 3306
  4. sudo ufw allow from member3_server_ip to any port 33061

לבסוף, הרץ את שתי הפקודות הללו על חבר3. שוב, וודא שאתה מזין את כתובות ה-IP הנכונות עבור כל שרת:

  1. sudo ufw allow from member1_server_ip to any port 3306
  2. sudo ufw allow from member1_server_ip to any port 33061
  3. sudo ufw allow from member2_server_ip to any port 3306
  4. sudo ufw allow from member2_server_ip to any port 33061

לאחר הוספת כללי UFW אלה, כל אחת מהמופעים של MySQL שלך תקבל גישה ליציאות שבהן משמש MySQL על שני השרתים האחרים.

עם גישה ליציאות MySQL פתוחה, כעת ניתן ליצור משתמש של שיבוץ ולהפעיל את תוסף השיבוץ של הקבוצה.

שלב 4 — הגדרת משתמשי שיבוץ והפעלת תוסף השיבוץ של הקבוצה

כדי להקים חיבורים עם שרתי השכפול בקבוצת השכפול, על כל מופע MySQL להיות בעל משתמש שכפול מיועד.

ב-כל אחד משרתי MySQL שלך, התחבר למופע MySQL שלך עם המשתמש המנהלי כדי להתחיל בסשן אינטראקטיבי:

  1. sudo mysql

הערה: וודא שאתה מפעיל כל אחת מהפקודות בסעיף זה על כל אחד מהשרתים שלך של MySQL.

מכיוון שכל שרת יכול להיות לו משתמש שכפול משלו, עליך לכבות את הרישום הבינארי במהלך תהליך היצירה. אחרת, לאחר שהשכפול מתחיל, הקבוצה תנסה להעביר את המשתמש שכפול מהשרת הראשי אל שרתים האחרים, יוצרת סכסוך עם המשתמש השכפול שכבר קיים. בצע את הפקודה הבאה מההוראה של MySQL בכל אחד מהשרתים שלך:

  1. SET SQL_LOG_BIN=0;

עכשיו תוכל להריץ פקודת CREATE USER כדי ליצור את משתמש השכפול שלך. בצע את הפקודה הבאה, שמייצרת משתמש בשם repl. הפקודה מציינת כי משתמש השכפול חייב להתחבר באמצעות SSL. ודא שאתה משתמש בסיסמה מאובטחת במקום password בעת יצירת משתמש השכפול הזה:

  1. CREATE USER 'repl'@'%' IDENTIFIED BY 'password' REQUIRE SSL;

לאחר מכן, הענק למשתמש החדש הרשאות שכפול על השרת:

  1. GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

לאחר מכן, זרוק את ההרשאות כדי ליישם את השינויים:

  1. FLUSH PRIVILEGES;

לאחר מכן, הפעל מחדש את הרישום הבינארי כדי להמשיך בפעולות רגילות:

  1. SET SQL_LOG_BIN=1;

לבסוף, הגדר את ערוץ ההחלמה של group_replication_recovery להשתמש במשתמש השכפול החדש שלך ובסיסמתו המתאימה. כל שרת ישתמש באישורים אלה כדי לאמת את הקבוצה:

  1. CHANGE REPLICATION SOURCE TO SOURCE_USER='repl', SOURCE_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';

הערה: אם אתה משתמש בגרסה של MySQL הישנה מ- 8.0.23, תצטרך להשתמש בתחביר הישן של MySQL כדי להגדיר זאת:

  1. CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';

עם המשתמש לשיבוץ זמין, תוכל להפעיל את התוסף group_replication כדי להתכונן לאתחול הקבוצה:

  1. INSTALL PLUGIN group_replication SONAME 'group_replication.so';

וודא שהתוסף פעיל על ידי הרצת הפקודה הבאה:

  1. SHOW PLUGINS;

התוסף group_replication יופיע בתחתית הרשימה מאחר והוא הוסף לאחרונה:

Output
+----------------------------+----------+--------------------+----------------------+---------+ | Name | Status | Type | Library | License | +----------------------------+----------+--------------------+----------------------+---------+ | | | | | | | . . . | . . . | . . . | . . . | . . . | | | | | | | | group_replication | ACTIVE | GROUP REPLICATION | group_replication.so | GPL | +----------------------------+----------+--------------------+----------------------+---------+ 45 rows in set (0.00 sec)

הפלט מאשר כי התוסף נטען ופעיל כרגע. לפני שתמשיך לשלב הבא, ודא שהפקודות בסעיף זה הורצו על כל אחד מהשרתים של MySQL שלך.

שלב 5 — הפעלת השיבוץ של הקבוצה

עכשיו שלכל שרת MySQL יש משתמש של שיבוץ השיבוץ והתוסף של השיבוץ הקבוצתי מופעל, תוכל להתחיל להעלות את הקבוצה שלך.

אתחול השרת הראשון

כדי להתחיל את הקבוצה, השלם את השלבים הבאים על חבר בודד בקבוצה. לצורך הדגמה, מדריך זה ישלים את השלבים הללו על חבר1

חברי הקבוצה סומכים על חברים קיימים לשלוח נתוני שכפול, רשימות חברים מעודכנות ומידע אחר בעת הצטרפותם הראשונית לקבוצה. בשל כך, עליך להשתמש בפרוצדורה מעט שונה כדי להתחיל בהמרת החבר הראשוני כך שידע לא לצפות למידע זה מחברים אחרים ברשימת הזרע.

אם מוגדר, המשתנה group_replication_bootstrap_group מודיע לחבר שאינו אמור לצפות לקבלת מידע מעמיתים ובמקום זאת עליו להקים קבוצה חדשה ולבחור את עצמו כחבר ראשי. ניתן להפעיל משתנה זה באמצעות הפקודה הבאה:

  1. SET GLOBAL group_replication_bootstrap_group=ON;

אז ניתן להתחיל בשכפול עבור חבר הקבוצה הראשי:

  1. START GROUP_REPLICATION;

לאחר מכן ניתן להגדיר מחדש את המשתנה group_replication_bootstrap_group כשערך OFF, מאחר והמצב המתאים לכך הוא רק כאשר לא קיימים חברי קבוצה קיימים:

  1. SET GLOBAL group_replication_bootstrap_group=OFF;

הקבוצה תתחיל עם השרת הזה כחבר היחיד. ניתן לוודא זאת על ידי בדיקת הרשומות בטבלת replication_group_members במסד הנתונים performance_schema:

  1. SELECT * FROM performance_schema.replication_group_members;

שאילתת זו תחזיר שורה יחידה המייצגת את המארח הנוכחי:

Output
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK | +---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+ | group_replication_applier | 13324ab7-1b01-11e7-9dd1-22b78adaa992 | 203.0.113.1 | 3306 | ONLINE | PRIMARY | 8.0.28 | XCom | +---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+ 1 row in set (0.00 sec)

הערך ONLINE לשדה MEMBER_STATE מציין כי צומת זו פעילה לחלוטין בתוך הקבוצה.

לאחר מכן יש ליצור מסד נתונים לבדיקה וטבלה עם נתונים דמו. כאשר נוספים חברים נוספים לקבוצה זו, הנתונים האלה ישתפפו אוטומטית אליהם.

נתחיל על ידי יצירת מסד נתונים לדוגמה בשם playground:

  1. CREATE DATABASE playground;

צור דוגמא של טבלה בשם equipment בתוך מסד הנתונים playground עם הפקודה הבאה:

  1. CREATE TABLE playground.equipment (
  2. id INT NOT NULL AUTO_INCREMENT,
  3. type VARCHAR(50),
  4. quant INT,
  5. color VARCHAR(25),
  6. PRIMARY KEY(id)
  7. );

הטבלה מכילה ארבע עמודות הבאות:

  • id: עמודה זו תכיל ערכים של מספרים שלמים המתבצעים באופן אוטומטי, כלומר אין צורך לציין ערכים עבור עמודה זו בעת טעינת הטבלה עם נתוני דוגמה
  • type: עמודה זו תכיל ערכים מחרוזתיים המתארים את סוג הציוד של גן המשחק שהשורה מייצגת
  • quant: עמודה זו תכיל ערכים של מספרים שלמים כדי לייצג את כמות הציוד של סוג מסוים של גן המשחק
  • color: עמודה זו תכיל ערכים מחרוזתיים המציינים את הצבע של הציוד הנתון

כמו כן, שים לב שעמודת id מוגדרת כמפתח ראשי של הטבלה הזו. ב-MySQL, כל טבלה המשוכפלת לקבוצה חייבת לכלול עמודה המיועדת כמפתח ראשי של הטבלה.

לבסוף, הריץ את הפקודה הבאה כדי להכניס שורה אחת של נתונים לטבלה:

  1. INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue");

שאילתה את הטבלה כדי לוודא שהנתונים הוזנו כהלכה:

  1. SELECT * FROM playground.equipment;
Output
+----+-------+-------+-------+ | id | type | quant | color | +----+-------+-------+-------+ | 1 | slide | 2 | blue | +----+-------+-------+-------+ 1 row in set (0.00 sec)

לאחר אימות כי השרת הזה הוא חבר בקבוצה וכי יש לו יכולות כתיבה, השרתים האחרים יכולים להצטרף לקבוצה.

התחלת הפעלת הצומת הנותרת

אחרי כך, התחל את השקיפות הקבוצתית על חבר2. מכיוון שכבר יש לך חבר פעיל, אין צורך להתקין מחדש את הקבוצה והחבר הזה יכול להצטרף מיידית:

  1. START GROUP_REPLICATION;

על חבר3, התחל את השקיפות הקבוצתית באותו הדרך:

  1. START GROUP_REPLICATION;

בדוק שוב את רשימת החברים על אחת השרתים השלושה. הפעם, יהיו שלושה שרתים מופיעים בפלט:

  1. SELECT * FROM performance_schema.replication_group_members;
Output
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK | +---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+ | group_replication_applier | 13324ab7-1b01-11e7-9dd1-22b78adaa992 | 203.0.113.1 | 3306 | ONLINE | PRIMARY | 8.0.28 | XCom | | group_replication_applier | 1ae4b211-1b01-11e7-9d89-ceb93e1d5494 | 203.0.113.2 | 3306 | ONLINE | SECONDARY | 8.0.28 | XCom | | group_replication_applier | 157b597a-1b01-11e7-9d83-566a6de6dfef | 203.0.113.3 | 3306 | ONLINE | SECONDARY | 8.0.28 | XCom | +---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+ 3 rows in set (0.00 sec)

כל החברים צריכים להצביע על ערך MEMBER_STATE של ONLINE. לקבוצה חדשה, אם כל אחד מהצמתים מופיע כ RECOVERING למעלה מכמה שניות, זה בדרך כלל אומר שקרתה שגיאה או שהוגדר משהו בצורה שגויה. בדוק את הלוגים ב- /var/log/mysql/error.log כדי לקבל מידע נוסף על מה קרה.

בשלב הבא, בדוק האם מידע מסד הנתונים לבדיקה הועתק לחברים החדשים:

  1. SELECT * FROM playground.equipment;
Output
+----+-------+-------+-------+ | id | type | quant | color | +----+-------+-------+-------+ | 1 | slide | 2 | blue | +----+-------+-------+-------+ 1 row in set (0.01 sec)

אם הנתונים זמינים על החברים החדשים, זה אומר שהשקיפות הקבוצתית פועלת בצורה תקינה.

שלב 6 — בדיקת יכולות הכתיבה של חברי הקבוצה החדשים

לבסוף, תוכל לנסות לכתוב לבסיס הנתונים מחברי הקבוצה החדשים שלך. האם זה יצליח או לא תלוי באם בחרת להגדיר קבוצת צמתים יחידה או רבותית.

בדיקת כתיבה בסביבת ראשית יחידה

בקבוצה ראשית יחידה, יש לצפות כי כל פעולות הכתיבה משרת לא ראשי יידחו מסיבות עקביות. תוכל למצוא את הראשי הנוכחי בכל עת על ידי הפעלת השאילתה הבאה באחד מחברי קבוצת השכפול שלך:

  1. SHOW STATUS LIKE '%primary%';
Output
+----------------------------------+--------------------------------------+ | Variable_name | Value | +----------------------------------+--------------------------------------+ | group_replication_primary_member | 13324ab7-1b01-11e7-9dd1-22b78adaa992 | +----------------------------------+--------------------------------------+ 1 row in set (0.01 sec)

ערך השאילתה יהיה MEMBER_ID שתוכל להתאים למארח על ידי שאילתת רשימת חברי הקבוצה כמו שעשית קודם:

  1. SELECT * FROM performance_schema.replication_group_members;
Output
+---------------------------+--------------------------------------+--------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+--------------+-------------+--------------+ | group_replication_applier | 13324ab7-1b01-11e7-9dd1-22b78adaa992 | 203.0.113.1 | 3306 | ONLINE | | group_replication_applier | 1ae4b211-1b01-11e7-9d89-ceb93e1d5494 | 203.0.113.2 | 3306 | ONLINE | | group_replication_applier | 157b597a-1b01-11e7-9d83-566a6de6dfef | 203.0.113.3 | 3306 | ONLINE | +---------------------------+--------------------------------------+--------------+-------------+--------------+ 3 rows in set (0.01 sec)

כפי שמציין פלט הדוגמה הזו, המארח בכתובת 203.0.113.1member1 — הוא כרגע השרת הראשי. אם תנסה לכתוב למסד הנתונים מחבר אחר, הפעולה תיכשל:

  1. INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");
Output
ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement

זה צפוי מאחר והקבוצה מוגדרת כרגע עם ראשי כתיבה יחיד. אם לשרת הראשי יש בעיות והוא עוזב את הקבוצה, הקבוצה תבחר באופן אוטומטי חבר חדש להיות הראשי ולקבל כתיבות.

בדיקת כתיבה בסביבת ראשי מרובים

עבור קבוצות שהוגדרו בהפניה של ראשי מרובים, כל חבר יכול לבצע כתיבות למסד הנתונים.

ניתן לבדוק שהקבוצה שלך פועלת במצב רב ראשי על ידי בדיקת ערך המשתנה group_replication_primary_member שוב:

  1. SHOW STATUS LIKE '%primary%';
Output
+----------------------------------+-------+ | Variable_name | Value | +----------------------------------+-------+ | group_replication_primary_member | | +----------------------------------+-------+ 1 row in set (0.02 sec)

אם המשתנה ריק, זה אומר שאין מארח ראשי מצויין וכי כל חבר צריך להיות מסוגל לקבל כתיבות.

בדוק זאת ב־חברה 2 על ידי ניסיון לכתוב נתונים לטבלת equipment:

  1. INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");
Output
Query OK, 1 row affected (0.00 sec)

חברה 2 ביצעה את פעולת הכתיבה בלי שגיאות.

ב־חברה 3, הריצו את השאילתה הבאה כדי לבדוק האם הפריט החדש נוסף:

  1. SELECT * FROM playground.equipment;
Output
+----+-------+-------+--------+ | id | type | quant | color | +----+-------+-------+--------+ | 1 | slide | 2 | blue | | 2 | swing | 10 | yellow | +----+-------+-------+--------+ 2 rows in set (0.00 sec)

זה מאשר כי כתיבת המידע של חברה 2 הועתקה בהצלחה.

עכשיו, בדוק את יכולות הכתיבה על חברה 3 על ידי הרצת הצהרת INSERT הבאה:

  1. INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");
Output
Query OK, 1 row affected (0.02 sec)

בחזרה אל חברה 1, בדוק כדי לוודא כי פעולות הכתיבה משני החברים החדשים הועתקו בחזרה:

  1. SELECT * FROM playground.equipment;
Output
+----+--------+-------+--------+ | id | type | quant | color | +----+--------+-------+--------+ | 1 | slide | 2 | blue | | 2 | swing | 10 | yellow | | 3 | seesaw | 3 | green | +----+--------+-------+--------+ 3 rows in set (0.01 sec)

זה מאשר כי השכפול פועל בכל כיוון וכי כל חבר מסוגל לבצע פעולות כתיבה.

שלב 7 — הרכבת הקבוצה מחדש

פעם שהקבוצה מתחילה, אנשי פרטים יכולים להצטרף ולעזוב בלי להשפיע על הזמינות, כל עוד יש מספיק חברים כדי לבחור שרתים ראשיים. אם יתבצעו שינויים בתצורה מסוימים (כמו החלפה בין סביבות ראשיות יחידות ורבות), או אם כל חברי הקבוצה יעזבו, עשויים להיות צורך להתחיל מחדש את הקבוצה באותו אופן שבו עשית זאת בתחילה.
ב־

על חבר1, הגדר את המשתנה group_replication_bootstrap_group ל־ON:

  1. SET GLOBAL GROUP_REPLICATION_BOOTSTRAP_GROUP=ON;

לאחר מכן, אתחל את הקבוצה:

  1. START GROUP_REPLICATION;

לאחר מכן, ניתן להגדיר את המשתנה group_replication_bootstrap_group חזרה ל־OFF:

  1. SET GLOBAL GROUP_REPLICATION_BOOTSTRAP_GROUP=OFF;

פעם שהחבר הראשון התחיל את הקבוצה, חברים אחרים יכולים להצטרף:

  1. START GROUP_REPLICATION;

עקוב אחר התהליך הזה עבור חברים נוספים:

  1. START GROUP_REPLICATION;

הקבוצה כעת צריכה להיות מקוונת עם כל החברים זמינים:

  1. SELECT * FROM performance_schema.replication_group_members;
Output
+---------------------------+--------------------------------------+--------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+--------------+-------------+--------------+ | group_replication_applier | 13324ab7-1b01-11e7-9dd1-22b78adaa992 | 203.0.113.1 | 3306 | ONLINE | | group_replication_applier | 1ae4b211-1b01-11e7-9d89-ceb93e1d5494 | 203.0.113.2 | 3306 | ONLINE | | group_replication_applier | 157b597a-1b01-11e7-9d83-566a6de6dfef | 203.0.113.3 | 3306 | ONLINE | +---------------------------+--------------------------------------+--------------+-------------+--------------+ 3 rows in set (0.01 sec)

ניתן להשתמש בתהליך זה כדי להתחיל מחדש את הקבוצה בכל עת שיש צורך.

שלב 8 — הצטרפות אוטומטית לקבוצה בהפעלת MySQL

עם ההגדרות הנוכחיות, אם שרת חבר מפעיל מחדש, הוא לא יצטרף באופן אוטומטי לקבוצה בעת ההפעלה. אם ברצונך שחברים יצטרפו באופן אוטומטי לקבוצה, ניתן לשנות את קובץ התצורה באופן קלה קצת.

ההגדרה שמתוארת בשלב זה מועילה כאשר ברצונך שחברים יצטרפו באופן אוטומטי כאשר הם מפעילים את המערכת. אך יש מספר דברים שחשוב לקחת בחשבון. לראשונה, הגדרה זו משפיעה רק כאשר ההופקדות של MySQL עצמה מתחילה. אם החבר מוסר מהקבוצה בגלל בעיות זמן קצב, אך ההופקדות של MySQL נשארת מקוונת, החבר לא יצטרף באופן אוטומטי.

שנית, כשמפעילים את ההגדרה הזו בעת בצע קבוצה בראשון יכול להיות מזיק. כאשר אין קבוצה קיימת להצטרף אליה, תהליך MySQL יקח זמן ממושך להתחיל מכיוון שהוא ינסה ליצור קשר עם חברים אחרים שאינם קיימים כדי לאתחל. רק לאחר פסק זמן ממושך הוא יוותר ויתחיל באופן רגיל. לאחר מכן, עליך להשתמש בהליך שמתואר למעלה כדי לאתחל את הקבוצה.

עם התראות אלו בראש, אם ברצונך להגדיר צמתים להצטרף לקבוצה אוטומטית בעת התחלת MySQL, יש לפתוח את קובץ התצורה הראשי של MySQL:

  1. sudo nano /etc/mysql/my.cnf

בתוכו, יש למצוא את המשתנה loose-group_replication_start_on_boot, ולהגדיר אותו ל־ON:

/etc/mysql/my.cnf

[mysqld]
. . .
loose-group_replication_start_on_boot = ON
. . .

שמור וסגור את הקובץ כאשר תסיים. החבר ינסה להצטרף לקבוצה באופן אוטומטי בפעם הבאה שההופקדות של MySQL שלו מתחילה.

סיכום

על ידי השלמת המדריך הזה, למדת כיצד להגדיר את השקעת קבוצת MySQL בין שלושה שרתי Ubuntu 20.04. עבור הגדרות עם שרת ראשי יחיד, החברים יבחרו באופן אוטומטי שרת ראשי שיכול לכתוב כאשר נדרש. עבור קבוצות שרתים ראשיים מרובים, כל חבר יכול לבצע כתיבות ועדכונים.

השקעת הקבוצה מספקת טופולוגיה לשקעה גמישה המאפשרת לחברים להצטרף או לעזוב לפי רצונם בעוד נותנת אחריות לגבי עדכניות הנתונים וסדר ההודעות. השקעת MySQL מספקת יכולות שאינן אפשריות בהשקעה מסורתית, אף על פי שהגדרתה עשויה להיות מעט מורכבת יותר.

Source:
https://www.digitalocean.com/community/tutorials/how-to-configure-mysql-group-replication-on-ubuntu-20-04