ฉันจะกำหนดค่า MySQL Innodb ให้จัดการกับเม็ดมีด 1000 ต่อชั่วโมงได้อย่างไร


10

ฉันมีเว็บไซต์ที่มีปริมาณการใช้งานสูงซึ่งเป็นไปได้ที่จะมีการแทรกระเบียนใหม่ 1,000 รายการทุกชั่วโมง

ข้อผิดพลาดเดียวนี้ทำให้หมดอำนาจเว็บไซต์:

PDOException: SQLSTATE[40001]: Serialization failure: 1213 
Deadlock found when trying to get lock; 
try restarting transaction: INSERT INTO {location_instance} 
(nid, vid, uid, genid, lid) VALUES (:db_insert_placeholder_0, 
:db_insert_placeholder_1, :db_insert_placeholder_2, 
:db_insert_placeholder_3, :db_insert_placeholder_4); 
Array ( [:db_insert_placeholder_0] => 1059 [:db_insert_placeholder_1] => 
1059 [:db_insert_placeholder_2] => 0 [:db_insert_placeholder_3] => 
cck:field_item_location:1059 [:db_insert_placeholder_4] => 1000 )

ฉันจะแปลกใจมากถ้า MySQL ไม่สามารถรองรับการโหลดประเภทนี้ได้ ดังนั้นคำถามของฉันเป็นปัญหาฐานข้อมูลและฉันจะกำหนดค่า MySQL เพื่อให้สามารถจัดการปริมาณการใช้นี้หรือไม่

ฉันมีสำเนาเว็บไซต์ของฉันติดตั้งบนเซิร์ฟเวอร์การพัฒนาพร้อมสคริปต์ที่จำลองการโหลดเนื้อหาที่ถูกเพิ่มเข้าไปในเว็บไซต์ ฉันใช้ Ubuntu, LAMP stack, พร้อม 16GB RAM

เป็นที่ยอมรับว่าฉันไม่ค่อยมีความรู้เกี่ยวกับฐานข้อมูล ในความเป็นจริงฉันเริ่มต้นด้วยค่าเริ่มต้น my.cnf ที่มาพร้อมกับมันหลังจาก 'apt-get install' เสร็จสิ้น ตารางเป็น Innodb ทั้งหมด คุณต้องการแนะนำการตั้งค่าการกำหนดค่าเริ่มต้นใดและเริ่มแก้ไขปัญหานี้อย่างไร

แจ้งให้เราทราบว่าคุณต้องการข้อมูลอะไรเพิ่มเติม

ขอบคุณ


คุณเริ่มต้นด้วย my.cnf เริ่มต้นสำหรับการผลิตหรือไม่ ผู้ชายคุณต้องเพิ่มประสิทธิภาพให้มากขึ้น จะให้รายละเอียดกับคุณมากขึ้นในคำตอบของฉัน :-)

คำตอบ:


11

คุณกำลังจัดการกับการหยุดชะงักไม่ใช่ปัญหาคอขวดของประสิทธิภาพ

หากคุณมีบันทึกใหม่หลายพันรายการต่อชั่วโมงคุณอยู่ไกลจากการเข้าถึงข้อ จำกัด ของ MySQL MySQL สามารถรองรับภาระงานของคุณได้อย่างน้อย 50 เท่า

การหยุดชะงักเกิดจากรหัสแอปพลิเคชันและไม่ใช่ความผิดของเซิร์ฟเวอร์ฐานข้อมูล Deadlock ไม่สามารถแก้ไขได้ในฝั่งเซิร์ฟเวอร์ MySQL ยกเว้นในบางสถานการณ์

InnoDBคุณสามารถแสดงรายละเอียดข้อมูลการหยุดชะงักโดยการทำงานSHOW ENGINE INNODB STATUSที่ MySQL mysql -uroot -p... -e "SHOW ENGINE INNODB STATUS"พรอมต์หรือ

อย่างไรก็ตามนี่แสดงเฉพาะการหยุดชะงักครั้งสุดท้ายที่เกิดขึ้นไม่มีบันทึกการหยุดชะงัก

โชคดีที่มีเครื่องมือpt-deadlock-loggerที่จัดการกับปัญหานั้นจะดูแลInnoDBสถานะการลงคะแนนและบันทึกข้อมูลการหยุดชะงักโดยละเอียดทั้งหมดก่อนที่จะรีเฟรชด้วยการหยุดชะงักใหม่


ดีแล้วที่รู้! ฉันเห็นในคำสั่ง show status ข้อมูลเกี่ยวกับการล็อคและแบบสอบถามและตารางที่เกี่ยวข้อง ระบุว่านี่เป็นรหัสของฉันฉันจะใช้ข้อมูลนี้จากคำสั่งสถานะเพื่อเริ่มแก้ไขปัญหาได้อย่างไร แบบสอบถาม PHP PDO ค่อนข้างตรงไปตรงมา - เชื่อมต่อเตรียมดำเนินการทำซ้ำ ฉันยินดีที่จะโพสต์รหัสหรือข้อความสถานะหากจะช่วย
user658182

@ user658182 ตรวจสอบโพสต์นี้ใน stackoverflow เกี่ยวกับวิธีจัดการกับ deadlocks: วิธีหลีกเลี่ยงการหยุดชะงัก mysql ที่พบเมื่อพยายามล็อค
Valor

1
@ max-vernon ขอบคุณสำหรับการแก้ไขไวยากรณ์ชัดเจนว่าภาษาอังกฤษไม่ใช่ภาษาของฉัน :-)
Valor

1
-e "สถานะเครื่องมือแสดงสถานะของเครื่องยนต์"
glyph

8

นี่อาจเป็นเพียงส่วนหนึ่งของรหัสของคุณในการทำธุรกรรม:

insert into t1...
insert into t2...
commit;

ในขณะที่อีกส่วนหนึ่งของรหัสของคุณปรับเปลี่ยนตารางเดียวกันในลำดับที่แตกต่างกัน:

delete from t2 where...
delete from t1 where...
commit;

หากธุรกรรมทั้งสองนั้นทำงานพร้อมกันเงื่อนไขการแข่งขันอาจเกิดขึ้น: ธุรกรรมแรกไม่สามารถแก้ไขได้t2เนื่องจากธุรกรรมนั้นถูกล็อคโดยธุรกรรมที่สอง ในขณะที่การทำธุรกรรมที่สองถูกบล็อกในทำนองเดียวกันเพราะt1ถูกล็อคโดยการทำธุรกรรมครั้งแรก MySQL เลือกหนึ่งธุรกรรมให้เป็น "เหยื่อ" ที่ INSERT / UPDATE / DELETE ล้มเหลว แอปพลิเคชันจำเป็นต้องตรวจจับข้อผิดพลาดนั้นแล้วลองคำสั่งอีกครั้ง - อาจจะหลังจากหยุดชั่วคราวเพื่อให้ธุรกรรมอื่นมีเวลาให้เสร็จสิ้น ไม่มีอะไรเกี่ยวข้องกับขีดจำกัดความจุเพียงแค่ช่วงเวลาที่โชคร้ายที่สามารถทำให้รุนแรงขึ้นได้โดยวิธีการจัดเรียงโค้ด สลับไปที่การลบในการทำธุรกรรม # 2 หรือ INSERT ในการทำธุรกรรม # 1 จากนั้นไม่มีข้อขัดแย้ง - แต่ละธุรกรรมจะรอการเข้าถึงตารางที่ต้องการ

ใน MySQL 5.6 คุณสามารถเรียกใช้โดยใช้ตัวเลือกinnodb_print_all_deadlocksเพื่อรวบรวมข้อมูลเกี่ยวกับการหยุดชะงักทั้งหมด (ไม่เพียง แต่ล่าสุด) ในบันทึกข้อผิดพลาด MySQL

[ข้อจำกัดความรับผิดชอบ: ฉันเป็นพนักงานของ Oracle ด้านบนเป็นมุมมองส่วนตัวของฉันไม่ใช่แถลงการณ์อย่างเป็นทางการ]

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