DDoS Community

yisrael rosen
yisrael rosen

Posted on

הגיק היומי: Raft,TiKV ומה שביניהם

לפני כמה ימים נתקלתי בפרוייקט של SQLite מבוזר באמצעות פרוטוקול raft

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

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

raft בנוי מכמה חלקים

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

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

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

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

וכאן מגיע המסד נתונים TiKV ולוקח את זה כמה צעדים קדימה.
TiKV זה מסד נתונים של Key-Val שעושה Sharding על קלאסטרים קטנים של raft כשכל קלאסטר מוגבל ל94MB, כך למשל אם יש לנו 150 MB של מידע, אז המפתחות A-M יהיו בקלסטר 1, ומפתחות N-Z יהיו בקלאסטר 2.
אם המידע גודל אז צריך לעשות פיצול וזה פרוטוקול בפני עצמו.
מעל TiKV יש מנוע שאילתות תומך MYSQL וכך יש לנו מסד נתונים עם אמינות וזמינות גבוהה.

Discussion (0)