รีสตาร์ท mysql อัตโนมัติเมื่อมันตาย


15

ฉันมีเซิร์ฟเวอร์ rackspace ที่ฉันเช่าเพื่อใช้งานโครงการส่วนตัวของฉัน เนื่องจากฉันราคาถูกมันมี RAM ขนาด 256 เมกะไบต์และไม่สามารถจัดการได้อย่างตรงไปตรงมา ทุกครั้งที่มีการจราจรติดขัดเซิร์ฟเวอร์ตัดสินใจที่จะเริ่มกระบวนการฆ่าและดูเหมือนว่า mysqld เป็นที่นิยมสำหรับการฆ่า ฉันพยายามเยี่ยมชมเว็บไซต์ของฉันและได้รับการต้อนรับด้วยข้อความว่ามีข้อผิดพลาดในการสร้างการเชื่อมต่อฐานข้อมูล การตรวจสอบบันทึกพบว่า mysqld ถูกฆ่าเนื่องจากหน่วยความจำไม่เพียงพอ

ตั้งแต่ฉันยังคงแย่เหมือนเมื่อวานและไม่ต้องการอัพเกรด RAM ของ VM ของ rackspace ฉันมีวิธีที่ฉันบอกให้รีสตาร์ท mysqld โดยอัตโนมัติเมื่อมันตายหรือไม่

ฉันมีความคิดที่จะใช้บางสิ่งบางอย่างเช่น crontab แต่อนิจจาฉันก็ไม่รู้เหมือนกันว่าจะต้องทำอะไรที่นั่น ฉันเดาว่าฉันเป็นผลิตภัณฑ์ของ "Linux บนเดสก์ท็อปของคุณ" เนื่องจากฉันสามารถทำสิ่งต่าง ๆ บนเดสก์ท็อปและแล็ปท็อปของฉันได้ (ซึ่งใช้ Linux เกือบทั้งหมด) แต่ก็ยังขาดทักษะการบริหารเซิร์ฟเวอร์สำหรับ Linux

เซิร์ฟเวอร์รัน CentOS 6.3


distro อะไร ฉันคิดว่าคนธรรมดาจะทำเช่นนี้ในอูบุนตู
Journeyman Geek

อ๊ะ ลืมพูดถึงรายละเอียดนั้น: CentOS
Los Frijoles

เอ๊ะ อาจต้องการรวมรุ่นไว้ด้วย
Journeyman Geek

ไม่ใช่เพื่อเบี่ยงเบนคำถาม แต่อาจเป็นทางออกระยะยาวเพื่อหลีกเลี่ยงเงื่อนไขแทน :) หากคุณต้องการ VPS ที่ไม่มีการจัดการง่ายๆสำหรับโครงการส่วนตัวของคุณคุณอาจจะสามารถดึงราคาที่ดีจากกล่องที่ใหญ่กว่า ผู้ให้บริการที่มีความเชี่ยวชาญในระดับต่ำ ฉันทำสิ่งนี้ด้วยความพึงพอใจอย่างยิ่ง มีหลายสถานที่ในการค้นหาผู้ให้บริการ VPS เช่น lowendtalk.com
John Chadwick

คำตอบ:


16

นี่ไม่ใช่วิธีแก้ปัญหาที่ดี แต่จะดีกว่าหากหลีกเลี่ยงปัญหาตั้งแต่แรก อย่างไรก็ตามผมไม่แน่ใจว่าวิธีการจัดการบริการ CentOS serviceแต่ฉันคิดว่ามันใช้ ถ้าเป็นเช่นนั้นคุณสามารถตรวจสอบว่าmysqlบริการทำงานด้วยหรือไม่

/sbin/service mysql status

คำสั่งนี้จะจบการmysqlทำงานหากเรียกใช้และส่งคืนสถานะการออกที่ไม่ใช่ 0 หากฉันไม่ได้ คุณสามารถเริ่มบริการได้หากไม่ได้ใช้คำสั่งนี้:

/sbin/service mysql status || service mysql start

คุณสามารถเพิ่มบรรทัดนี้/etc/crontabเพื่อเปิดใช้คำสั่งเหล่านี้ทุกนาที:

* * * * * /sbin/service mysql status || service mysql start


6

นี่เป็นเรื่องเล็กน้อยที่น่ารำคาญ

mysqldเริ่มต้นใหม่โดย mysqld_safeเสมอเนื่องจากมีการวนซ้ำไม่สิ้นสุดที่ด้านล่างของmysqld_safeการตรวจสอบการปิดที่ผิดปกติ หากข้อผิดพลาดรุนแรงเกินไปคุณmysqld_safeจะไม่สามารถรีสตาร์ทได้mysqldในครั้งต่อไป

เนื่องจากสถานการณ์ที่mysqld_safeออกแบบมาสำหรับมันอาจไม่ใช่ความคิดที่ดีที่จะบังคับmysqldให้เริ่มถ้าmysqld_safeจะปฏิเสธมันต่อไป

คุณต้องค้นหาบันทึกข้อผิดพลาดใน my.cnf มันจะอยู่ภายใต้

[mysqld]
log-error=log-filename

หรือ

[mysqld_safe]
log-error=log-filename

อ่านไฟล์ข้อความ (อาจเป็นเพราะรันtail -30 log-filename) และค้นหาที่มาของการประมวลผล mysqld ที่กำลังปิด


ที่น่าสนใจ ... ดูที่บันทึกของฉันมันบอกว่า mysqld ถูกเริ่มต้นใหม่ แต่แล้วประมาณ 1-2 ชั่วโมงต่อมาก็จะบอกว่ากระบวนการสิ้นสุดลง หลังจากนั้นระเบียนถัดไปคือคู่มือของฉันเริ่มต้น บางทีฉันมี mysqld_safe กำหนดค่าผิดหรือเปล่า?
Los Frijoles

3

ในความพยายามอันโหดร้ายเพื่อติดตามและทำงานบน VPS หน่วยความจำต่ำฉันใช้การดัดแปลงคำตอบของ terdom เพื่อตรวจสอบและรีสตาร์ท MySQL

/sbin/service mysqld status || service mysqld restart

ฉันต้องเปลี่ยนmysqlเพื่อmysqldให้มันทำงานได้ หากไม่มีมันฉันจะได้รับข้อผิดพลาด " ERROR! MySQL is running but PID file could not be found"

บนระบบ CentOS 7.2 ของฉัน/sbin/serviceเปลี่ยนเส้นทางไปที่/bin/systemctl statusดังนั้นคำสั่งต่อไปนี้จะทำงานได้เร็วขึ้น

/bin/systemctl status  mysqld.service || /bin/systemctl start  mysqld.service

ฉันลงเอยด้วยการเพิ่มบรรทัดต่อไปนี้ลงใน root crontab ของระบบ มันจะตรวจสอบทุกนาทีว่า MySQL กำลังทำงานอยู่หรือไม่และเปลี่ยนเส้นทางไปเป็น null การเริ่มต้นบริการจะไม่แสดงผลใด ๆ เว้นแต่ว่ามีบางอย่างผิดปกติดังนั้นจึงไม่จำเป็นต้องเพิ่มการเปลี่ยนเส้นทางว่างในคำสั่งสุดท้าย

* * * * * /bin/systemctl status mysqld.service > /dev/null || /bin/systemctl start  mysqld.service

double pipe ||หมายถึงORและจะดำเนินการตามคำสั่งที่ 2 หากคำสั่งแรกล้มเหลว (ส่งคืนรหัสออกที่มากกว่าศูนย์)

มันก็เหมือนกับการพูดว่า "เรียกใช้คำสั่งที่ 1 หรือถ้าคำสั่งที่ 1 ล้มเหลวอย่างใดเรียกใช้คำสั่งที่ 2"

สิ่งนี้แตกต่างจากเครื่องหมายแอมเปอร์แซนด์คู่&&ที่คล้ายคำว่า "เรียกใช้คำสั่งที่ 1 และหากคำสั่งที่ 1 ประสบความสำเร็จให้รันคำสั่งที่ 2"


1

ต่อไปนี้มาจาก jonnyreeves.co.uk :


และผู้ร้ายคือ php-fpm! Google ด่วนพบลูกค้า Wordpress รายอื่นที่มีอาการคล้ายกัน คำแนะนำคือปรับแต่งการตั้งค่าพูล php-fpm (/etc/php-fpm.d/www.conf) และปรับแต่งการกำหนดค่า pm การเปลี่ยนแปลงหลักคือการย้ายจากpm = dynamicไปยังpm = ondemandด้วยpm.max_childrenค่าของ5(ขึ้นอยู่กับการสังเกตการใช้งานหน่วยความจำ ~ 5% ต่อคนงาน) หลังจากเปลี่ยนการกำหนดค่าฉันเริ่มบริการทั้งหมดและตรวจสอบการใช้งานหน่วยความจำ

service php-fpm restart
service nginx restart
service mariadb restart

หลังจากรีสตาร์ทการใช้งานหน่วยความจำลดลงอย่างมาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.