เพราะเหตุใด“ ปริมาณไบต์ที่ใช้” จึงเพิ่มขึ้นในคลัสเตอร์ Amazon Aurora ของฉันเสมอ


11

ฉันมีกลุ่มAurora DB ของAmazon (AWS)และทุกวันมัน[Billed] Volume Bytes Usedเพิ่มขึ้นเรื่อย ๆ

VolumeBytesUsed CloudWatch ตัวชี้วัดในช่วงเวลา

ฉันตรวจสอบขนาดของตารางทั้งหมดของฉัน (ในฐานข้อมูลของฉันทั้งหมดในคลัสเตอร์นั้น) โดยใช้INFORMATION_SCHEMA.TABLESตาราง:

SELECT ROUND(SUM(data_length)/1024/1024/1024) AS data_in_gb, ROUND(SUM(index_length)/1024/1024/1024) AS index_in_gb, ROUND(SUM(data_free)/1024/1024/1024) AS free_in_gb FROM INFORMATION_SCHEMA.TABLES;
+------------+-------------+------------+
| data_in_gb | index_in_gb | free_in_gb |
+------------+-------------+------------+
| 30         | 4           | 19         |
+------------+-------------+------------+

ทั้งหมด: 53GB

เหตุใดฉันจึงถูกเรียกเก็บเงินเกือบ 75GB ในเวลานี้

ฉันเข้าใจว่าพื้นที่จัดสรรไม่สามารถถูกปลดปล่อยได้ในวิธีเดียวกับที่ไฟล์ ibdata บนเซิร์ฟเวอร์ MySQL ทั่วไปไม่สามารถย่อขนาดได้ ฉันตกลงกับสิ่งนั้น นี่เป็นเอกสารและยอมรับได้

ปัญหาของฉันคือทุกวันพื้นที่ที่ฉันถูกเรียกเก็บเงินเพิ่มขึ้น และฉันแน่ใจว่าฉันไม่ได้ใช้พื้นที่ 75GB ชั่วคราว ถ้าฉันจะทำอะไรแบบนั้นฉันก็เข้าใจ ราวกับว่าพื้นที่เก็บข้อมูลที่ฉันว่างโดยการลบแถวออกจากตารางของฉันหรือวางตารางหรือแม้แต่ปล่อยฐานข้อมูลจะไม่ถูกใช้ซ้ำ

ฉันติดต่อฝ่ายสนับสนุน AWS (พรีเมียม) หลายครั้งและไม่สามารถรับคำอธิบายที่ดีว่าทำไมถึงเป็นเช่นนั้น
ฉันได้รับคำแนะนำให้เรียกใช้OPTIMIZE TABLEบนตารางที่มีจำนวนมากfree_space(ต่อINFORMATION_SCHEMA.TABLESตาราง) หรือตรวจสอบความยาวประวัติ InnoDB เพื่อให้แน่ใจว่าข้อมูลที่ถูกลบจะไม่ถูกเก็บไว้ในส่วนย้อนกลับ (อ้างอิง: MVCC ) และรีสตาร์ทอินสแตนซ์เพื่อให้แน่ใจว่าส่วนการย้อนกลับถูกทำให้ว่างเปล่า
ไม่มีใครช่วยเหลือ

คำตอบ:


19

มีหลายสิ่งที่เล่นอยู่ที่นี่ ...

  1. แต่ละตารางจะถูกเก็บไว้ใน tablespace ของตัวเอง

    โดยค่าเริ่มต้นกลุ่มพารามิเตอร์สำหรับกลุ่มออโรรา (ชื่อdefault.aurora5.6) innodb_file_per_table = ONกำหนด นั่นหมายความว่าแต่ละตารางจะถูกเก็บไว้ในไฟล์แยกต่างหากในคลัสเตอร์จัดเก็บข้อมูล Aurora คุณสามารถดูว่า tablespace ใดที่ใช้สำหรับแต่ละตารางโดยใช้แบบสอบถามนี้

    SELECT name, space FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES;

    หมายเหตุ: ฉันไม่ได้พยายามที่จะเปลี่ยนแปลงไปinnodb_file_per_table OFFบางทีนั่นอาจช่วย ..

  2. พื้นที่เก็บข้อมูลเพิ่มขึ้นโดยการลบพื้นที่ตารางจะไม่ถูกใช้ซ้ำ

    การเสนอการสนับสนุนระดับพรีเมียมของ AWS:

    เนื่องจากการออกแบบที่เป็นเอกลักษณ์ของเครื่องยนต์ Aurora Storage เพื่อเพิ่มประสิทธิภาพและความทนทานต่อข้อผิดพลาด Aurora ไม่มีฟังก์ชั่นในการจัดระเบียบพื้นที่ตารางต่อตารางไฟล์ในแบบเดียวกับ MySQL มาตรฐาน

    ปัจจุบันออโรร่าโชคไม่ดีที่ไม่มีวิธีลดขนาดพื้นที่ตารางตามที่ MySQL มาตรฐานทำและพื้นที่ที่อยู่อย่างกระจัดกระจายทั้งหมดจะถูกเรียกเก็บเนื่องจากมันรวมอยู่ใน VolumeBytesUsed
    เหตุผลที่ Aurora ไม่สามารถเรียกคืนพื้นที่ของตารางที่ถูกทิ้งในแบบเดียวกับ MySQL มาตรฐานได้คือข้อมูลสำหรับตารางนั้นถูกจัดเก็บในรูปแบบที่แตกต่างไปจากฐานข้อมูล MySQL มาตรฐานโดยมีปริมาณการจัดเก็บเพียงครั้งเดียว

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

    แต่มีบางวิธีที่คลุมเครือในการใช้พื้นที่ว่างเปล่านั้น
    อีกครั้ง... อีกครั้งอ้างการสนับสนุนระดับพรีเมียมของ AWS:

    เมื่อชุดข้อมูลทั้งหมดของคุณเกินขนาดที่กำหนด (ประมาณ 160 GB) คุณสามารถเริ่มต้นเรียกคืนพื้นที่ในบล็อก 160 GB สำหรับนำกลับมาใช้ใหม่เช่นถ้าคุณมี 400 GB ในปริมาณคลัสเตอร์ Aurora ของคุณและ DROP 160 GB หรือมากกว่านั้น นำข้อมูล 160 GB ไปใช้ซ้ำโดยอัตโนมัติ อย่างไรก็ตามสามารถเรียกคืนพื้นที่นี้ได้ช้า
    เหตุผลที่ต้องใช้ข้อมูลจำนวนมากในครั้งเดียวเนื่องจากการออกแบบที่ไม่เหมือนใครของ Auroras ในฐานะเป็นเอ็นจิ้น DB ระดับองค์กรซึ่งแตกต่างจาก MySQL มาตรฐานซึ่งไม่สามารถใช้กับสเกลนี้ได้

  3. ตารางที่เหมาะสมที่สุดคือความชั่วร้าย!

    เนื่องจาก Aurora ยึดตาม MySQL 5.6 OPTIMIZE TABLEจึงถูกแมปALTER TABLE ... FORCEซึ่งจะสร้างตารางใหม่เพื่ออัปเดตสถิติดัชนีและพื้นที่ว่างที่ไม่ได้ใช้ในดัชนีคลัสเตอร์ ได้อย่างมีประสิทธิภาพพร้อมกับinnodb_file_per_table = ONหมายถึงการเรียกใช้การOPTIMIZE TABLEสร้างไฟล์ tablespace ใหม่และลบไฟล์เก่า เนื่องจากการลบไฟล์ tablespace ไม่ได้ทำให้พื้นที่เก็บข้อมูลว่างเพิ่มขึ้นนั่นหมายความว่าOPTIMIZE TABLEจะทำให้มีการจัดเก็บข้อมูลเพิ่มเติมเสมอ อุ๊ย!

    Ref: https://dev.mysql.com/doc/refman/5.6/th/optimize-table.html#optimize-table-innodb-details

  4. ใช้ตารางชั่วคราว

    โดยค่าเริ่มต้นกลุ่มพารามิเตอร์สำหรับอินสแตนซ์ Aurora (ชื่อdefault.aurora5.6) จะกำหนดdefault_tmp_storage_engine = InnoDBไว้ นั่นหมายความว่าทุกครั้งที่ฉันสร้างTEMPORARYตารางมันจะถูกเก็บไว้พร้อมกับตารางปกติทั้งหมดของฉันในคลัสเตอร์จัดเก็บข้อมูล Aurora นั่นหมายถึงพื้นที่ใหม่ถูกจัดเตรียมไว้เพื่อเก็บตารางเหล่านั้นซึ่งจะเป็นการเพิ่ม VolumeBytesUsed ทั้งหมด
    วิธีการนี้ก็เพียงพอที่ง่าย: เปลี่ยนค่าพารามิเตอร์default_tmp_storage_engine MyISAMสิ่งนี้จะบังคับให้ Aurora สร้างTEMPORARYตารางบนที่จัดเก็บในตัวเครื่องของอินสแตนซ์
    หมายเหตุ: พื้นที่เก็บข้อมูลภายในของอินสแตนซ์นั้นมี จำกัด ดูFree Local Storageตัวชี้วัดบน CloudWatch เพื่อดูว่าที่เก็บข้อมูลของคุณมีอินสแตนซ์เท่าใด อินสแตนซ์ที่ใหญ่กว่า (ราคาแพง) มีที่จัดเก็บในตัวเครื่องมากขึ้น

    Ref: ยังไม่มี; เอกสารของ Amazon Aurora ปัจจุบันไม่ได้กล่าวถึงสิ่งนี้ ฉันขอให้ทีมสนับสนุน AWS อัปเดตเอกสารและจะอัปเดตคำตอบถ้า / เมื่อพวกเขาทำ


1
นี่เป็นคำตอบที่ยอดเยี่ยมและyowch นั่นเป็นคำเตือนที่สำคัญ ดีใจที่ฉันเห็นสิ่งนี้
ceejayoz

เหมือนกัน สังเกตว่าเซิร์ฟเวอร์ฐานข้อมูลหนึ่งตัวมีขนาดสูงสุด 300 GB สำหรับฐานข้อมูลที่มีขนาด MySQL รายงาน 54 GB ... หากพื้นที่ไม่เคยถูกเรียกคืนนั่นเป็นตัวอย่างที่ดีของสิ่งที่เกิดขึ้นเมื่อคุณมีตารางที่เขียนเป็นประจำจำนวนมาก ( เช่นตารางบันทึกตารางดัชนี ฯลฯ )
geerlingguy

0

เมื่อข้อมูล Aurora ถูกลบเช่นโดยการวางโต๊ะหรือพาร์ติชั่นพื้นที่ที่จัดสรรโดยรวมจะยังคงเหมือนเดิม พื้นที่ว่างจะถูกใช้ซ้ำโดยอัตโนมัติเมื่อปริมาณข้อมูลเพิ่มขึ้นในอนาคต https://docs.amazonaws.cn/en_us/AmazonRDS/latest/AuroraUserGuide/Aurora.Managing.Performance.html

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