הפרדת הדאטאבייס מהנתונים, יצירת שרת נפרד עבור MySql

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

הרעיון הוא פשוט, מרימים שרת נוסף, שמיועד רק עבור 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 ולקראת רפליקציה של מסד הנתונים (אם צריך כמובן…).

מקור : https://www.digitalocean.com/community/tutorials/how-to-migrate-a-mysql-database-to-a-new-server-on-ubuntu-14-04

מקור להפסקת שירות ה-mysql

http://www.worldofnubcraft.com/25/how-to-stop-mysql-from-running-on-boot/

 

 

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *