เราได้รับข้อมูล GPS แบบเรียลไทม์ในอัตราประมาณ 5,000 ราคา นาที (จากเซิร์ฟเวอร์ TCP 4 แห่ง) แต่ละเซิร์ฟเวอร์ใช้การเชื่อมต่อเดียวเพื่อแทรกข้อมูลและบัฟเฟอร์ข้อมูลระหว่างแทรก ทุกๆ 15 นาทีหรือมากกว่านั้นบริการจะดึงข้อมูลนี้และประมวลผลไปยังการเดินทาง เมื่อสร้างการเดินทางแล้วข้อมูล GPS ที่แท้จริงมักไม่สำคัญนักหากผู้ใช้ต้องการเห็นเส้นทางบนแผนที่
ปัญหาคือดูเหมือนว่าฐานข้อมูลกำลังดิ้นรนเพื่อให้ทันกับอัตราของข้อมูลที่ถูกแทรก บางครั้งเมื่อโหลดเพิ่มขึ้นเวลาใส่เพิ่มสูงขึ้นอย่างกะทันหัน (> 30 วินาที) ซึ่งจะช่วยให้สามารถบัฟเฟอร์ข้อมูลได้มากขึ้นซึ่งจะส่งผลให้เม็ดมีดมีขนาดใหญ่ขึ้น
ฉันหวังว่าจะได้รับความคิดเห็นเกี่ยวกับการออกแบบในปัจจุบันและความคิดบางอย่างที่เราต้องปรับปรุงประสิทธิภาพและคำตอบสำหรับคำถามของเรา - และเคล็ดลับอื่น ๆ ที่ผู้คนอาจมี!
การออกแบบในปัจจุบัน
ขณะนี้ข้อมูลถูกแยกออกเป็นตารางที่แสดงถึงหนึ่งสัปดาห์และข้อมูลที่เก่ากว่าปีถูกเก็บถาวรลงในฐานข้อมูลรอง สิ่งทั้งหมดถูกรวมเข้าด้วยกันในมุมมองที่แก้ไขได้ซึ่งใช้สำหรับแทรกและอ่าน
ออกแบบโต๊ะ
- รหัส (PK, ตัวระบุที่ไม่ซ้ำ)
- DeviceId (FK, int)
- PersonId (FK, int)
- รหัสยานพาหนะ (FK, int)
- TokenId (FK, int)
- UtcTime (PK, datetime2 (3))
- ละติจูด (ลอย)
- ลองจิจูด (float)
- ความเร็ว (พิมพ์เล็ก)
- หัวเรื่อง (smallint)
- ดาวเทียม (Tinyint)
- IOData (varbinary (100))
- IgnitionState (Tinyint)
- UserInput (Tinyint)
- CreateTimeUtc (datetime2 (3))
ดัชนี
- DeviceId_CreateTimeUtc_Desc
- DeviceId_UtcTime_Desc (ทำคลัสเตอร์)
- PersonId_UtcTime_Desc
- TokenId_UtcTime_Desc
- VehicleId_UtcTime_Desc
ทุกสัปดาห์ปัจจุบันใช้เวลาประมาณ 10 GB รวมถึงดัชนีและปัจจุบันมีข้อมูลประมาณ 300 GB ในฐานข้อมูลหลัก
ตารางข้อมูลในฐานข้อมูลหลักมีกลุ่มไฟล์ของตนเองที่มี 1 ไฟล์ แต่อยู่ในดิสก์เดียวกันกับตารางอื่นทั้งหมดในฐานข้อมูลหลัก ฐานข้อมูลรองอยู่บนดิสก์อื่น แต่อยู่ในเครื่องเดียวกัน
ฉันคิดว่าเรากำลังใช้งานการสร้างดัชนีใหม่ทุกสัปดาห์เมื่อมีการใช้พาร์ติชันตารางใหม่ (สัปดาห์) ไม่มีการหดตัว
เครื่องนี้เป็น HP 8 คอร์ที่มีหน่วยความจำ 12 GB และดิสก์ที่เก็บฐานข้อมูลหลักกำลังเรียกใช้ RAID 10
ไอเดีย
- จำกัด จำนวนข้อมูลที่เก็บไว้ในฐานข้อมูลหลักเช่นสูงสุด 1 เดือน อย่างน้อยที่สุดมันจะทำให้ฐานข้อมูลสามารถจัดการได้มากขึ้นสำหรับการสำรอง / กู้คืน แต่เราคาดหวังว่าจะเห็นการปรับปรุงประสิทธิภาพด้วยการทำเช่นนี้?
- สร้าง 2 ไฟล์ในกลุ่มไฟล์สำหรับข้อมูลปัจจุบันและแจกจ่ายไปยังฟิสิคัลพาร์ติชันที่ต่างกัน 2 ตัว
- สร้างฐานข้อมูล master-slave ที่เก็บข้อมูลปัจจุบันดังนั้นการแทรกและอ่านจะดำเนินการกับฐานข้อมูลที่แตกต่างกัน
- วางไฟล์สำหรับข้อมูลปัจจุบันบนดิสก์ SSD (การทำมิรเรอร์จะทำให้ประสิทธิภาพของดิสก์ SSD แตกต่างกันหรือไม่)
โปรดแจ้งให้เราทราบหากต้องการข้อมูลเพิ่มเติม มีหลายปัจจัยที่มีอิทธิพลต่อการทำงานอย่างน่ากลัวและอาจมีหลายวิธีในการปรับแต่ง