אם אתה מריץ את הדאטאבייס על אותו שרת ביחד עם קבצי האפליקציה, אתה עשוי להיתקל יום אחד ב…הצלחה! .
נניח שהאתר שלך / של הלקוח שלך יוצר עניין ומטפס בדירוג, ונכנסים אליו עוד ועוד אנשים… ואתה רואה שחלק מהשרת כבר לא עומד בעומס, .. בדיוק בשביל מצב כזה, מפרידים מראש בין שרת הנתונים לשרת האפליקציה.
הרעיון הוא פשוט, מרימים שרת נוסף, שמיועד רק עבור MySql, בשרת הזה, לא מאחסנים קבצי אפליקציה כלל.
בנוסף, חוסמים אותו לגישה דרך פורט 80 ומאפשרים אליו גישה רק לצרכי MySql ורק מ-IP ספציפי / ספציפיים, של שרת האפליקציה.
למצב כזה יש מספר יתרונות :
- הנתונים לא חשופים למישהו מבחוץ.
- כל שרת משתמש במשאבים שלו רק עבור משהו מסוים, אין חלוקת משאבים (זיכרון, מעבד וכו') בין האפליקציה לבין MySql .
- זה מאפשר התרחבות עתידית, כלומר אם נרצה לגדול, נוכל לשכפל את שרת האפליקציה, וליצור שרת נוסף עם מרכיב Load Balancer שמקבל את הפניות ומווסת אותן בין השרתים שלנו.
אז קדימה, לעבודה.
הרמת VPS נוסף עבור MySql
גם לממשק של Digital Ocean והקם שרת (בשפה של Digital Ocean זה נקרא Droplet כאמור ) נוסף מבוסס Ubunto.
עכשיו היכנס אליו ב-SSH, בצע את האבטחה שברצונך לעשות.. ולאחר מכן התקן את MySql
נעדכן את המאגר של apt-get
sudo apt-get update
עכשיו נתקין את MySql
sudo apt-get install mysql-server
תתבקש להקליד סיסמא עבור משתמש ה-Root
ולאחר ההתקנה הרץ את הסקריפט הבא , שיוצר את טבלאות הנתונים הבסיסיות של MySql
sudo mysql_install_db
וגם הרץ את הסקריפט הבא שדואג למספר ענייני אבטחה
sudo mysql_secure_installation
עכשיו הגיע הזמן להגדרות המשמעותיות, נערוך את קובץ ההגדרות של mysql באמצעות nano :
sudo nano /etc/mysql/my.cnf
בתוכו חפש את ההגדרה bind-address
סמן אותה בסולמית בתחילת השורה – כלומר הפוך אותה להערה.
בנוסף סמן בסולמית את השורה skip-networking
הערה : תיאורטית יש אפשרות להגדיר פה IP ספציפי וכו', אבל אני מוצא שיותר פשוט, לחסום את כל שאר ה-IP באמצעות ה-Firewall .
צא מהעורך ושמור (Ctrl+X ואחרי כן Y ) .
נאתחל את שירות mysql בשרת הוירטואלי שלנו :
sudo service mysql restart
כאן המקום להעתיק את הדאטאבייס אל השרת החדש. יש המון צורות לעשות זאת, אני אישית מעדיף באמעות Import של קובץ SQL דרך phpmyadmin. ומכיוון שהעניין מוכר, אציין אותו בקיצור נמרץ – יכול להציץ במקור באנגלית https://www.digitalocean.com/community/tutorials/how-to-migrate-a-mysql-database-to-a-new-server-on-ubuntu-14-04
בגדול יש 2 שיטות מהירות להעביר דאטאבייס :
1. ליצור גיבוי דרך Export ב-PHPmyAdmin ואז לעשות Import ב-phpMyAdmin בשרת החדש
2. בכל מקרה שהקובץ sql שיוצא גדול מ-2 מגה, עדיף להשתמש באפשרות הבאה
דרך ssh, בשרת הדאטאבייס
mysql -u root -p < YourSqlFileName.sql
יצירת יוזר חדש ב MySql עם הרשאות לגשת ל- IP של שרת הנתונים
כעת, צור יוזר חדש, נעשה זאת באמצעות שורת הפקודה של MySql (ה-Console ) :
כדי להיכנס ל- Console נקליד
mysql -u root -p
(הפרמטר u מציין יוזר, ואז רשמנו את היוזר שנקרא root, ולאחר מכן הפרמטר p מציין סיסמא – password, ובמידה ולא נקליד סיסמא, נתבקש מייד אחרי כן להקליד אותה).
[notice]הערה : אני לא מסביר איך לנעול את הטבלאות לכתיבה , כיוון שאני מניח שברוב המקרים זה לא נחוץ, אם מדובר בדאטאבייס פעיל, גדול, שכל שניה שהוא לא זמין היא קריטית, תשקלו לעשות זאת. יחד עם זאת התהליך כולו לוקח פחות מחמש דקות…[/notice]
כדי לראות את רשימת היוזרים הנוכחיים ב-Mysql נקליד את השאילתא הבאה :
SELECT user,host FROM mysql.user;
בטבלה שקיבלנו נוכל לראות שכל יוזר מוגדר יחד עם ה-Host שממנו הוא שולח את הפקודות, כלומר אם נרצה שאותו יוזר ישלח פקודות מכמה -IP, צריך להגדיר אותו שוב ושוב לכל הוסט.
במקרה שלנו נגדיר יוזר שיהיה מקושר אל ה-IP של שרת האפליקציה.
CREATE USER 'YourNewUser'@'YourAppServerIP' IDENTIFIED BY 'password';
עכשיו נטפל בהרשאות,
כדי לראות הרשאות נוכחיות של יוזר, כותבים שאילתא כזו
SHOW GRANTS FOR YourNewUser@YourAppServerIP;
וכדי לתת הרשאות מלאות , נכתוב את השאילתא הבאה
GRANT ALL PRIVILEGES ON `YourDBname`.* TO 'YourNewUser'@'YourAppServerIP';
[warning]אזהרת אבטחה : בעיקרון, מומלץ תמיד לתת לכל יוזר רק את ההרשאות שהוא באמת צריך. במקרה הזה הענקנו הרשאות מלאות, שזה כולל מחיקת טבלאות, יצירת טבלאות חדשות וכו'… ולא בטוח שהאפליקציה שלנו באמת צריכה את זה, אבל מכיוון שזה לא מדריך על MySql לא הרחבתי בנושא. וכל אחד שיקח את ההמלצה הזו לפי ראות עיניו.[/warning]
כדי לראות האם ההרשאות החדשות התקבלו נקליד שוב
SHOW GRANTS FOR YourNewUser@YourAppServerIP;
וכדי לרענן ("להחיל") את ההרשאות נקליד
FLUSH PRIVILEGES;
וכדי לצאת נקליד
EXIT
[important]למעשה , סיימנו, ברגע זה שרת האפליקציה יכול כבר לתקשר עם הדאטאבייס.[/important]
נותרו לנו עוד 3 דברים לעשות :
1. לעדכן את האפליקציה בכתובת החדשה וביוזר החדש ולראות שהכל עובד
לגבי השלב הזה, תלוי איזו אפליקציה יש לכם שם, אתם צריכים לעדכן את ההגדרות של דף ה-PHP או של מערכת ה-CMS (וורדפרס, ג'ומלה וכדו') שלכם.
2. לחסום כל כניסה אחרת לשרת הדאטאבייס, כלומר שהוא יוכל לתקשר רק עם שרת האפליקציה
3. להפסיק את שירות mysql בשרת האפליקציה, ובכך בעצם לשחרר משאבי זיכרון ועיבוד .
נעבור כעת על שלבים 2+3 היות ושלב 1 הוא אינדוידואלי לכל אחד.
איך לחסום את שרת הדאטאבייס לכל תקשורת אחרת
ניכנס SSH לשרת הדאטאבייס
ונגדיר מספר כללים בחומת האש iptables (אם עוד לא עברת על המדריך של iptables, זה המקום לעשות זאת).
הרעיון הוא לקבל רק 2 סוגי תקשורת , SSH, ותקשורת רגילה (tcp) רק מה-IP של שרת האפליקציה, ורק דרך הפורט 3306 שזהו הפורט שאליו מאזין שירות mysql.
הכלל האחרון יהיה כלל שחוסם הכל, וכך בעצם יצרנו מצב בו אין תקשורת לשרת, מלבד תקשורת שלנו ב-SSH, ותקשורת של שרת האפליקציה.
ראשית נפעיל את הכלל שמצלם את התקשורת הקיימת, כדי שלא נחסום את עצמנו בטעות:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
הכלל הבא מתיר את ה-SSH
sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT
הכלל הבא מתיר תקשורת רק מ-IP של שרת האפליקציה
sudo iptables -A INPUT -p tcp -s 123.456.789.10 --dport 3306 -j ACCEPT
כמובן – תתאימו את ה-IP ל-IP של שרת האפליקציה שלכם.
והכלל הבא חוסם כל תקשורת אחרת
sudo iptables -A INPUT -j DROP
עכשיו נתקין את התוכנה הקטנה ששומרת את הכללים של iptables
sudo apt-get install iptables-persistent
נפעיל את התוכנה
sudo service iptables-persistent start
ואם אתם ממש רוצים, אתם מוזמנים לעשות ריסט לשרת (reboot) ולבדוק שהכללים נשמרו (sudo iptables -L – ).
איך להפסיק את שירות mysql בשרת האפליקציה
אחרי שהפרדנו את השרתים, נרצה לפנות משאבים בשרת האפליקציה, ולצורך כך נעשה פעולה פשוטה של הפסקת השירות.
הכנס לשרת האפליקציה באמצעות SSH
sudo service mysql stop
ניכנס לתיקיה המתאימה
cd /etc/init
נעשה override לקובץ השירות
sudo touch mysql.override
וכעת נערוך את הקובץ באמצעות nano
sudo nano mysql.override
תוסיפו את המילה manual (=ידני) לקובץ ,
צאו מ-nano (כלומר ctlr+x ואחר כך Y לשמירה)
וזהו! בוצע!
(אפשר לעשות זאת בצורה קצרה יותר, אבל משום מה זה נותן לי לפעמים הודעת שגיאה , למי שרוצה לנסות פקודה מקוצרת במקום ה-3 אפשר לרשום
sudo sh -c "echo 'manual' > /etc/init/mysql.override"
)
סיכום – הפרדת VPS של דאטאבייס מה-VPS של ה-web :
עכשיו, אחרי שהפרדת את שרת הנתונים משרת האפליקציה, הסביבה שיצרת (2 השרתים) צריכה להיות מסוגלת להתמודד עם תנועה מסיבית יותר, כיוון שיותר משאבים מוקדשים לכל רכיב בנפרד.
כמו כן, עשית את הצעד הראשון לקראת Load Balance ולקראת רפליקציה של מסד הנתונים (אם צריך כמובן…).
מקור להפסקת שירות ה-mysql
http://www.worldofnubcraft.com/25/how-to-stop-mysql-from-running-on-boot/