כמה מילים על Microsoft SQL 2017 ללינוקס

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

אתחיל במידע כללי: מדוע מיקרוסופט בעצם שחררה את שרת ה-SQL שלה ללינוקס? התשובה די פשוטה: להתחרות מול אורקל ולהציע לחברות שמריצות לינוקס בפרודקשן בגלל היציבות – את שרת ה-SQL שלהם. בדרך להציע זאת ללקוחות, מיקרוסופט פתחה לעצמה פתח להציע דברים אחרים ללקוחות עם Linux עם פרויקט Draw bridge וזאת מבלי לשנות שום קבצים באפליקציה שלהם ומבלי לשבור תאימות, כך שהכלים של SQL ב-Windows יוכלו להתחבר לשרת לינוקס ולעשות את אותה עבודה. כלל, מבחינה טכנית, כשאתם מורידים SQL Server של מיקרוסופט ללינוקס, אתם מקבלים את האפליקציה + ספריות וגם קבצים בינאריים של .. Windows 8 (אפשר לקרוא על כך ולשחק עם זה, למעוניינים. פרטים כאן).

נעבור לאספקט הטכני: שרת SQL של מיקרוסופט ללינוקס נראה בדיוק כמו כל אפליקציה אחרת ללינוקס. כשרוצים להתקין לדוגמא על שרת CentOS או RHEL או SLE של SuSE – מורידים קובץ אחד של REPO ומשתמשים ב-YUM להתקין (או zypper במקרה של SuSE) (לצערי מיקרוסופט לא כל כך עקבו אחרי תקן ה-LSB ללינוקס והקבצים ימצאו ב-var/opt/mssql/ בשעה שהסטנדרט מדבר על opt/). הנה וידאו על התקנה של SQL על CentOS 7 כולל שימוש בכלי חדש של מיקרוסופט לעבוד עם ה-SQL (אפשר לעבוד כמובן גם עם הכלים הרגילים):

וכאן יש וידאו כיצד לבצע Auto Tune עם SQL על לינוקס:

כלומר מבחינת עבודה עם SQL Server של מיקרוסופט, אתם יכולים לעבוד עליו בדיוק כאילו התקנתם אותו על שרת Windows. הרשיון הוא אותו רשיון ואין צורך בתשלום נוסף ולאנשי ה-DBA אין שינוי כלשהו שצריך לבצע. לעומת זאת, לאנשים שאוהבים לעבוד ב-CLI, מיקרוסופט מספקת את mssql-cli שמאפשר עבודה ב-cli (כפי שמודגם בוידאו הראשון) ויש גם את פקודת sqlcli שמאפשרת לגבות DB, לשחזר וכו' וכו'. מנסיוני, ה-sqlcli עובד יפה (רק חבל שמיקרוסופט לא הטמיעו שיטה להכנסת סיסמאות מוצפנות דרך ה-cli).

אחד העניינים שכמובן חברות גדולות יתעניינו בו, הוא עניין האשכולות (Clusters). מה עושים כשרוצים להריץ SQL Server כ-Cluster בתשתית? התשובה במקרה הזה די פשוטה: משתמשים בכלי לינוקס כמו CoroSync ו-PaceMaker כדי לבצע זאת (הוראות נמצאות כאן).

אבל אחד היתרונות הגדולים של SQL Server של מיקרוסופט בלינוקס – זה שאפשר להריץ אותו כקונטיינר, ואז כל עניין ה-Cluster מתייתר. כל מה שצריך לעשות זה להריץ את גירסת הקונטיינר של SQL Server של מיקרוסופט תחת Kubernetes או OpenShift ואז תקבלו לא רק ביצועים גבוהים, אלא שרידות הרבה יותר גבוהה ממה שהייתם משיגים מכל פתרון Cluster קלאסי (לינוקס או Windows), החל מרמה פשוטה של הרצת SQL ב-Pod שכשהוא נופל אוטומטית Pod אחר קם ואז ניתן לעבוד שוב, וכלה בפתרון של הרצת 3 PODs כשבכל אחד מהם רץ SQL Server וכאשר אחד מהם נופל, מתקיים תהליך "בחירות" אוטומטי והזוכה נהיה ה-Primary. אפשר לראות הדגמה של כך בלינק הזה.

לסיכום: SQL Server של מיקרוסופט מאפשר לכם לעבור מ-Windows ללינוקס מבלי להיתקל ביותר מדי בעיות ומבלי לשלם על רשיון SQL נוסף. תגבו את כל ה-DB בגירסת SQL ל-Windows, תקימו SQL Server ללינוקס, תשחזרו נתונים על הלינוקס ותתחילו לעבוד (וכן, אפשר לחבר את המכונה ל-AD). אתם יכולים גם להשתמש בכלי אוטומציה שקיימים ללינוקס ולבצע פעולות רבות על ה-SQL ללינוקס בדיוק כמו לכל שרת לינוקס אחר. אין Kernel Modules (מיקרוסופט העיפה את כל ה-syscalls של Windows) כך ששום דבר לא אמור להפריע למערכת לעבוד בצורה נורמלית, יש את כל התמיכה ב-SystemD וכן .. זה רץ גם על אובונטו 🙂

הצורך באיש DBA

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

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

לא חשוב מהו שרות ה-SQL המותקן בשרת, בד"כ הם עושים את העבודה Out of the box בצורה טובה יחסית, אבל במקרים רבים לקוחות מתלוננים על כך שהעבודה שהוא מבצע היא איטית, החשש שהטבלאות גדולות מדי, ומדוע דבר שרץ מקומית על המכונה של המפתח לוקח 0.1 שניות – על השרת לוקח 4 שניות לדוגמא..

כאן הבעיה מתחילה בחלק שלא קשור לסיסטם, אלא בחלק שקשור למפתחי האפליקציות. ישנם לא מעט מקרים שראיתי שבהם שאילתות נכתבות בצורה שתגרום לשרת SQL "להזיע" עם שאילתות באורך 6-10 שורות ובסופו של דבר לא קיימת אופטימיזציה של השאילתות, כך שהשרת SQL עצמו הוא בסדר גמור, אבל מה שהמפתח שולח – "חונק" את השרת, תכפילו את בקשת השאילתות פי 100 או 1000 (פר גולש) – וקיבלתם מערכת שיכולה להיתקע גם אם יש בשרת 32 ליבות!

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

אישית אני מודע לכך שלכל שרת SQL יש הגדרות של Cache שעוזרות בהאצת עיבוד השאילתות וקריאה/עדכון/מחיקת נתונים מה-SQL, אבל בד"כ ממה שראיתי – אם כבר בהתחלה רצים לשנות את גודל ה-Cache, אותן בעיות יצוצו שוב בהמשך, כי הבעיה היא לא ב-Cache והגודל, אלא בצורת השאילתות.

לכן – אם אתם מוצאים ששרת (או שרות) ה-SQL "חנוק" – אני ממליץ לקחת איש DBA שיבדוק את השאילתות וילמד את צוותי הפיתוח איך לכתוב דברים בצורה אופטימלית, ובאותה הזדמנות כדאי גם להכיר את התכונות של אותו שרות SQL ולחשוב אם לדוגמא לעבור לשרות SQL אחר תואם (לדוגמא מ-MySQL ל-MariaDB שתואם 100% ל-MySQL אך יש לו פונקציות מתקדמות יותר).

בהזדמנות זו – אם ישנם אנשי DBA פרילאנסרים – אשמח אם תשלחו לי מייל ([email protected]) עם הפרטים שלכם כך שאם פונים אליי ומבקשים שרות זה – אפנה אותם אליכם.