העברת שרתי Linux: ניסיון, כלים ואפס זמן השבתה

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

היכולות שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1359
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

מיגרציית Linux ללא השבתה: היכן המעבר נשבר

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

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

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

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

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

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

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

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

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

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

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

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

דרכי העברה: העתקה מלאה, מעבר מדורג, היברידי

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

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

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

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

סדר העבודה: ממיפוי ועד מסירת התמיכה

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

  1. מיפוי שרתים. אוספים תפקידים, הפצות והענפים שלהן, ליבות, פורטים תפוסים, נקודות עיגון, לוחות זמנים של משימות ובעלים של כל צומת. הפלט — מרשם שמראה מה מועבר כמו שהוא, ומה דורש החלפה.
  2. מפת תלויות. מתעדים מי מדבר עם מי: מאזנים, תורים, מסדי נתונים, שירותים חיצוניים לפי רשימות לבנות, אחסונים משותפים. בנפרד מסמנים קשרים משתמעים — אלה שלא מתוארים בתיעוד, אך צצים בלוגים.
  3. תכנון הסכימה היעד. מפזרים תפקידים בין צמתים, סוגרים גישות רשת מיותרות, מעבירים סודות ותעודות, מכינים תצורה להתקנה אוטומטית. הסכימה מסוכמת לפני תחילת העבודה, ולא תוך כדי.
  4. הכנת הסביבה ובדיקה על העתקת תעבורה. צמתי היעד עולים מראש, ועליהם מריצים העתקה של זרימה אמיתית עם נתונים אנונימיים. זה תופס פערים בגרסאות ספריות ובהרשאות גישה, כל עוד סביבת הייצור לא נגעת.
  5. תוכנית החלפה ונקודת חזרה. מפרטים את הרצף לפי שלבים עם חלונות, אחראים וקריטריוני מוכנות. לכל שלב מוגדרת נקודת חזרה: תמונת מצב של נתונים, קונפיג שמור, החלפה חזרה של המאזן.
  6. החלפה. התעבורה מועברת במנות, עם הפסקות לבדיקת מדדי השהיה, שיעור שגיאות ותורים. חריגה מעבר לנורמה — חזרה לפי נוהל שנכתב מראש, בלי אלתור.
  7. בדיקה לאחר ההעברה. משווים יומנים, לוחות זמנים, הרשאות, תגובת מערכות סמוכות, שלמות נתונים. רק לאחר מכן מוציאים את הצמתים הישנים מהסכימה, ומשאירים אותם זמינים לתקופת החזרה.
  8. מסירת התמיכה. מוסרים נהלים, סכימת רשת, מפת תלויות, הוראות לתקלות אופייניות וגישות. הצוות של הלקוח תורן לפי מסמך, ולא לפי הזיכרון של מהנדס שעזב.

מה נשאר אצלכם: תצורות, סכימות, נהלים

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

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

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

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

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

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

מה שינו

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

חלון התחזוקה בוטל — התעבורה הועברה במנות: 1%, 5%, 25%, 50%, 100%, עם הפסקה בכל מדרגה, כל עוד שיעור השגיאות והשהיות בטווח הנורמה.

מדדים לפני ואחרי

מדד לפני אחרי
השבתה בעת החלפה 4–6 שעות בלילה אין, החלפה על תעבורה חיה
חזרה העברה לילית חוזרת החזרת משקל תוך דקה
כשלים ברבעון 2–3 אפס במהלך כל תקופת המיגרציה
תגובה לתקלה עד 40 דקות עד 5 דקות
אתר ישן הוחזק "ליתר ביטחון" הוצא משירות אחרי 3 שבועות

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

במה מיגרציית Linux שונה מבנייה מחדש של הסביבה

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

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

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

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

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

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

מה מבררים לפני ההתחלה: ספקות ותשובות

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

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

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

האם יהיה צורך לעצור את השירות?

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

אצלנו חלק מהשירותים נפרסו ידנית — האם הם ישרדו את המעבר?

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

כיצד בודקים שהתוצאה תקינה?

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

האם יש גיבויים והעברה חזרה?

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

איך זה ישפיע על עבודת המפתחים?

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

נדון במשימה ונחזור עם הערכה ותוכנית

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

בנוסף אילוצים: חלון אי-זמינות מותר, דרישות למיקום נתונים, תלות בחומרה או ברישיונות, קיום מתאר רזרבה.

לאחר מכן אנו מרכיבים זאת לתוכנית העברה וחוזרים עם פרטים מוחשיים:

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

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