מכונת האיכסון שלי, להלן איירון, כבר די מוכנה.
תצורת דיסקים ומערכת הקבצים
זו התצורה הנוכחית של הZFS באיירון:
[code lang="bash"]
omry@iron:~/dev/zync$ zpool status
pool: rpool
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
mirror ONLINE 0 0 0
c8d0s0 ONLINE 0 0 0
c9d0s0 ONLINE 0 0 0
errors: No known data errors
pool: storage
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
storage ONLINE 0 0 0
mirror ONLINE 0 0 0
c8d0p2 ONLINE 0 0 0
c9d0p2 ONLINE 0 0 0
mirror ONLINE 0 0 0
c9d1 ONLINE 0 0 0
c8d1 ONLINE 0 0 0
errors: No known data errors
omry@iron:~$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
rpool 7.46G 31.7G 81K /rpool
storage 1.54T 672G 1.53T /storage
storage/backup 9.35G 672G 9.35G /storage/backup
…
[/code]
מה מעניין פה?
מערכת הקבצים של מחיצת השורש – הrpool, נמצאת על שני דיסקים (ליתר דיוק – על מחיצות של שני דיסקים), בתצורת ראי, מה שאומר שאם אחד מהם קורס, המערכת ממשיכה לעבוד. כמובן שבמצב כזה כדי להחליף את הדיסק התקול כמה שיותר מהר.
שאר המקום בשני הדיסקים הראשונים, וכל המקום בשני הדיסקים השניים הוקצה למערכת הקבצים storage, שמשמשת לאכסון, לגיבוי של מחשבים אחרים וכנראה גם כמערכת קבצים מרכזית של ספריית הבית שלי.
בהתחלה שקלתי ללכת על תצורת RAIDZ כדי לנצל כמה שיותר מקום.
הבעיה הגדולה מבחינתי עם RAIDZ היא שהדיסקים שמרכיבים את הpool צריכים להיות באותו גודל (אחרת מפסידים את המקום העודף בדיסקים הגדולים יותר).
מהסיבה הזו הלכתי על RAID10, עם שני זוגות של מירורים בנפח כולל של כ2.5 טרה בייט.
ביום שיהיה לי שם צפוף, אני אוכל לזרוק עוד צמד דיסקים פנימה ולקבל מקום נוסף מיד (בלי להזיז נתונים, להגדיל מערכות קבצים או דברים מעצבנים אחרים).
שיתוף קבצים בין מחשבים
יש לי עוד שני מחשבים, אחד מריץ רק לינוקס, ואחד מריץ לינוקס וחלונות (במכונה וירטואלית בשביל iTunes ימח שמו), ובדואל בוט בשביל משחקים.
כדי לשתף קבצים עם הלינוקסים, הגדרתי שיתוף בNFS.
את NFS פיתחו בסאן, והמימוש שלהם הוא המימוש הטוב ביותר של NFS, הבעיה היא שהמימוש של לינוקס הוא לא ממש לפי התקן, לפחות אם נאמין לשמועה הרווחת.
בזמן העברת קבצים מלינוקס לאופן-סולריס על גבי NFS נתקלתי בבעיות, ההעתקה הופסקה מעצמה בהעתקת קבצים גדולים עם שגיאה קלט/פלט סטנדרטית : די מטריד.
אחרי שווידאתי שהבעיה היא בNFS (העתקתי את הקובץ הגדול באמצעות SCP ווידאתי שהוא תקין עם md5sum) התחלתי לשחק בפרמטרים של NFS בצד הלינוקס, באיזה פרוטוקול הוא מתחבר (NFS4? NFS3? אולי אפילו NFS2 השם ישמור?), באיזה תעבורה? UDP או TCP.
בסוף גיליתי את התצורה שעובדת וגם נותנת ביצועים טובים:
NFS3 עם TCP, ועם חוצצי קבלה ושליחה בגודל 32K (בשביל הביצועים, לא היה להם השפעה על השגיאה).
השורה הרלוונטית /etc/fstab בלינוקס נראית ככה:
[code lang="bash"]
iron:/storage /storage nfs rw,soft,timeo=3,rsize=32768,wsize=32768,proto=tcp 0 0
[/code]
כדי לשתף עם חלונות השתמשתי בסמבה של גנו – אותו סמבה בדיוק שיש בלינוקס.
לאופן סולאיס של שני פתרונות לשיתוף קבצים עם חלונות: שרת CIFS שמובנה בתוך הקרנל, שמשום מה לא עבד לי טוב במיוחד, וחבילת samba סטנדרטית למדי, שעבדה הרבה יותר טוב.
גיבוייים של מכונות לינוקס
אין ספק שאיירון היא המכונה הכי עמידה שיש לי בכל מה שקשור לאכסון קבצים ועמידות לקריסת דיסקים (דיסקים קורסים, זו עובדת חיים).
מכיוון שכך, זה רק טבעי שאני ארצה לגבות של מכונות הלינוקס שלי אל איירון.
בעבר תיארתי את אסטרגיית הגיבוי שלי של מכונות לינוקס.
בגדול הרעיון הוא לבצע rsync של הקבצים הרלוונטיים, ולשלב את זה עם רוטציה של ספריות סנאפשוט בזמנים שונים. כדי למנוע בזבוז מיותר של מקום – משתמשים בhard links כך שקובץ שלא שונה מהגיבוי האחרון תופס מקום פעם אחת בלבד.
זה נחמד, אבל די מסורבל : צריך להעתיק את העץ מחדש כל פעם, ולמחוק עצים מיותרים, ובנוסף השיטה של החיסכון במקום לא מושלמת – כי קובץ ששונה רק בביט אחד יתפוס את כל המקום של הקובץ מחדש.
עם הסנאפשוטים של ZFS אפשר לעשות משהו הרבה יותר פשוט ואלגנטי, שגם יותר חסכוני במקום והרבה יותר מהיר.
הרעיון הוא פשוט לסנכרן את הספריה או הספריות הרלוונטיות מהשרת (או השרתים) אל ספריית היעד, ולקחת סנטפשוט של ZFS. כדי למנוע התפוצצות סנטפשוטים, אפשר פשוט למחוק סנאפשוטים ישנים.
כתבתי תוכנה פשוטה בשם zync שמממשת את הרעיון הזה.
כתובה בג'אווה, וקובץ ההגדרות שלה כתוב בswush, אז הוא קריא ונחמד.
הנה קובץ הגדרות לדוגמא:
[code lang="java"]
@swush 1.0
zync
{
backup
{
host : root@10.0.0.2
directory : /
# Exclude files or dirs
exclude
{
/cdrom
/mnt
/dev
/media
/proc
/sys
/tmp
/var/cache
/var/log
/var/lib/mysql
}
}
rsync
{
command : /usr/bin/rsync
destination : "/storage/backup/${host}"
options
{
-a
–force
–delete-excluded
–delete
}
}
zfs
{
backup_file_system : storage/backup
snapshot
{
delete_older : 30d
}
}
}
[/code]
zync כבר די מוכנה לדעתי, ואני מתחיל לגבות איתה את מכונות הלינוקס שלי, כולל את השרת שמריץ את הבלוג.
סך הכל, אני מאוד מרוצה מהצורה שהמערכת תופסת.
יש קשיים פה ושם, אבל שום דבר בלתי פתיר.