เหตุใดจึงควรใช้ระบบไฟล์สำหรับบันทึกแทน RDBMS


44

คำถามควรชัดเจนจากชื่อ ตัวอย่างเช่น Apache บันทึกการเข้าถึงและบันทึกข้อผิดพลาดในไฟล์แทน RDBMS ไม่ว่าจะมีการใช้งานขนาดใหญ่หรือขนาดเล็กเพียงใดก็ตาม

สำหรับ RDMS เราเพียงแค่ต้องเขียนแบบสอบถาม SQL และมันจะทำงานในขณะที่สำหรับไฟล์ที่เราต้องตัดสินใจในรูปแบบเฉพาะแล้วเขียน regex หรืออาจจะแยกวิเคราะห์เพื่อจัดการกับพวกเขา และสิ่งเหล่านั้นอาจล้มเหลวในกรณีพิเศษหากไม่ได้รับการดูแลที่ดี

ดูเหมือนว่าทุกคนจะชอบระบบไฟล์เพื่อบำรุงรักษาบันทึก ฉันไม่ได้ลำเอียงกับวิธีการใด ๆ เหล่านี้ แต่ฉันอยากจะรู้ว่าทำไมมันถึงมีประสบการณ์เช่นนี้ มันคือความเร็วหรือการบำรุงรักษาหรืออย่างอื่น?


10
ดังนั้นคุณจะบันทึกข้อผิดพลาด DB (เช่น db ไม่พร้อมใช้งาน) ถ้าระบบบันทึกของคุณบันทึกลงในฐานข้อมูลได้อย่างไร
Marjan Venema

17
@Marjan ฉันจะบันทึกข้อผิดพลาดของระบบไฟล์ได้อย่างไรหากมันล้มเหลว!
Yasir

5
ค่อนข้างเป็นจริง แต่ถ้ามันล้มเหลวโอกาสที่ DB ของคุณก็จะไม่สามารถเข้าถึงได้เช่นกัน ... หลังจากนั้นมันจะเขียนไปยังตารางที่ไม่มีระบบไฟล์ที่ไหน?
Marjan Venema

2
@Yasir: ส่งข้อความเข้าสู่ระบบทั้งหมดไปยังเซิร์ฟเวอร์ syslog ก่อนที่จะเข้าสู่ระบบไปยังระบบแฟ้ม :)
ไบรอัน

1
@MarjanVenema จะเกิดอะไรขึ้นถ้าเกมนั้นไม่มีจุดหมาย จะเกิดอะไรขึ้นถ้าโลคัลดิสก์เต็มการบันทึกของคุณจะล้มเหลว แต่แอพและระบบปฏิบัติการสามารถทำงานต่อไปได้ หากคุณเข้าสู่เซิร์ฟเวอร์ฐานข้อมูลระยะไกลแม้ว่าคุณจะยังสามารถเข้าสู่ระบบได้ มีข้อดีข้อเสียสำหรับการจัดเก็บข้อความบันทึกและที่ดีที่สุดขึ้นอยู่กับสิ่งที่คุณพยายามออกจากการเข้าสู่ระบบ ขออภัยฉันจะให้ฝูงกลับไปที่ไฟล์บันทึกเป็นวิธีจริง
Andy

คำตอบ:


37
  1. มีหลายสิ่งเกินไปที่จะล้มเหลวในฐานข้อมูลและการบันทึกความล้มเหลวเหล่านี้ก็มีความสำคัญเช่นกัน

  2. ถ้าคุณไม่มีระบบฐานข้อมูลที่อนุญาตการทำธุรกรรมอัตโนมัติ (หรือไม่มีธุรกรรมใด ๆ ) การบันทึกจะต้องมีการเชื่อมต่อแยกต่างหากดังนั้นการย้อนกลับหรือการเข้าสู่ระบบในการเข้าสู่ระบบจะไม่รบกวนการย้อนกลับหรือกระทำในแอปพลิเคชัน

  3. มีหลายสิ่งที่มีค่าการบันทึกเกิดขึ้นระหว่างการเริ่มต้นเช่นอาจเป็นไปได้ก่อนที่การเชื่อมต่อฐานข้อมูลจะถูกสร้าง

  4. ในสิ่งที่อาจเป็นการตั้งค่าทั่วไปล็อกไฟล์ใหม่จะถูกสร้างขึ้นทุกวันไฟล์บันทึกเก่าจะถูกบีบอัดและเก็บไว้เป็นเวลา 2 สัปดาห์ก่อนที่จะถูกลบในที่สุด ไม่ใช่เรื่องง่ายที่จะทำเช่นเดียวกันใน RDBMS


1
ฉันลองการทดลองนี้และมันใช้งานไม่ได้ RDBMS ได้รับการออกแบบรอบ ๆ แนวคิดที่ว่าข้อมูลถูกเขียนค่อนข้างสัมพันธ์กับจำนวนครั้งที่อ่าน การบันทึกนั้นเป็นสิ่งที่ตรงกันข้าม คุณเขียนตลอดเวลาและอ่านไม่ค่อย นี่เป็นวิธีที่ดีในการรบกวน DBA ของคุณ
JimmyJames

1
หนึ่งอาจพิจารณาใช้ระบบฐานข้อมูลอนุกรมเวลาเช่น InfluxDB เพื่อเก็บบันทึกแม้ว่า; ฉันคิดว่ามันเหมาะกับงานมากกว่าเช่น PostgreSQL ถึงกระนั้นข้อดีของไฟล์บันทึกแบบเก่าก็ยังอยู่ที่นั่น
281377

การใช้ฐานข้อมูลที่ไม่สัมพันธ์กับการจัดทำดัชนีโทเค็น ฯลฯ มีประโยชน์อย่างแน่นอนและหากคุณเลือกอย่างชาญฉลาดพวกเขาสามารถจัดการท่อดับเพลิงได้ นี่เป็นส่วนหนึ่งของการทำงานของ splunk และ flume
JimmyJames

# 4 ไม่ใช่ปัญหาจริงๆ DELETE FROM dbo.Log WHERE LogDate < today minus 2 weeks
Robert Harvey

@RobertHarvey วิธีนี้ใช้งานได้ดีจนกว่าคุณจะลองใช้ในสภาพแวดล้อมที่มีการโหลดจำนวนมากซึ่งการดำเนินการจำนวนมากดังกล่าวอาจทำให้เกิดปัญหาร้ายแรงโดยไม่ต้องระมัดระวังเป็นพิเศษ ทำซ้ำบันทึกที่เติมพื้นที่ว่างในดิสก์ของคุณเลิกทำพื้นที่ตารางเต็มเกินไปการจำลองแบบกลายเป็นงานยุ่งมากด้วยการทำซ้ำการลบเป็นต้น
349902 User281377

16

ฉันเคยเห็นบันทึกที่เขียนไปยังฐานข้อมูลมาก่อน (และบางครั้งคุณได้รับตัวเลือกที่กำหนดค่าได้สำหรับการบันทึกโดยที่การติดตามไปที่ไฟล์ข้อผิดพลาดไปยังฐานข้อมูลข้อผิดพลาดไปยังบันทึกเหตุการณ์ Windows)

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


แต่ฉันมีความสับสนในเรื่องนี้ แผ่นจดบันทึก, wordpad, gedit หรือ notepad ++ ของฉันหรือเว็บเบราว์เซอร์ใด ๆ จะไม่มีความสุขในการเปิดไฟล์ขนาด 4GB อย่างไรก็ตามเบราว์เซอร์เดียวกันจะสามารถแสดงรายการพันหน้าให้ฉันแต่ละรายการมีการพิมพ์ 500 รายการ ขวา?
Yasir

7
@Yasir เพราะคุณใช้โปรแกรมแก้ไขที่พยายามโหลดไฟล์ทั้งหมดในหน่วยความจำ ลองใช้เครื่องมือแก้ไขที่ชาญฉลาดซึ่งสามารถ 'สตรีม' ไฟล์ขนาดใหญ่ได้ เป็นกลุ่มตัวอย่างที่ดี
nakhli

6
@Yasir: นี่เป็นความจริง แต่คุณพยายามที่จะปรับสิ่งที่ผิด เวลาส่วนใหญ่บันทึกถูกเขียนและไม่เคยอ่าน ดังนั้นคุณสร้างการบันทึกอย่างรวดเร็วเพราะเป็นกรณีทั่วไป
unholysampler

5
ใช่ฉันทำบันทึกไปยังฐานข้อมูลมาก่อนแล้วและสามารถค้นหาข้อความบันทึกได้อย่างง่ายดายนั้นมีประโยชน์อย่างมากโดยเฉพาะอย่างยิ่งเมื่อเราเปิดการบันทึกระดับการดีบักเพื่อติดตามข้อผิดพลาดที่ทำซ้ำได้ยาก
Andy

2
@gbjbaanb ฉันไม่พบว่ามัน overrated และตรงไปตรงมาคุณแนะนำให้ใช้เส้นเครื่องหมายและตัดและวางเพื่อค้นหาเป็นเรื่องตลก ไม่ใช่เพียงแค่การค้นหาเท่านั้นเราวิเคราะห์แนวโน้มในการค้นหาเซิร์ฟเวอร์ที่มีปัญหามากกว่าปัญหาอื่น ๆ ข้อผิดพลาดที่ผู้ใช้พบเห็นบ่อยครั้งมากที่สุด
Andy

15

ความเร็วคือเหตุผลหนึ่ง อื่น ๆ คือ:

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

3

ก่อนอื่น

และสิ่งเหล่านั้นอาจล้มเหลวในกรณีพิเศษหากไม่ได้รับการดูแลที่ดี

ธุรกรรมฐานข้อมูลไม่สามารถล้มเหลวเมื่อคุณไม่ระวัง?

การเขียนไฟล์ข้อความมีประโยชน์หลายประการสิ่งที่สำคัญที่สุดคือ

  • ข้อความสามารถอ่านได้โดยมนุษย์ ทุกคนสามารถเปิดล็อกไฟล์ด้วยโปรแกรมแก้ไขข้อความพื้นฐานและดูว่าข้อความนั้นคืออะไร คุณไม่จำเป็นต้องเข้าใจวิธีการจัดระเบียบฐานข้อมูล
  • ความเร็ว. การเขียนข้อความลงบนดิสก์นั้นเร็วกว่ามากที่บริการฐานข้อมูลจะทราบว่าข้อความนั้นไปที่ใดในฐานข้อมูลเขียนที่นั่นและสร้างความมั่นใจว่าธุรกรรมเสร็จสมบูรณ์

เห็นได้ชัดว่าทุกสิ่งอาจล้มเหลวหากเราไม่ระวัง แต่สำหรับคำถามนี้ฉันหมายถึงโปรแกรมเมอร์ระดับสูง ตัวอย่างง่ายๆโปรแกรมเมอร์อาจต้องการแยกค่าโดยใช้อักขระเฉพาะ ดังนั้น regex ของเขา / เธอจะทำงานเหมือนมีเสน่ห์ แต่จะล้มเหลวเมื่อตัวละครเดียวกันอยู่ในบล็อกค่า วิธีนี้เขาจำเป็นต้องดูแลกรณีที่เป็นไปได้ที่คล้ายกันและเขาไม่จำเป็นต้องคิดเกี่ยวกับพวกเขาหากเขาบันทึกในฐานข้อมูล นอกจากนี้คุณสามารถเห็นความคิดเห็นของฉันในคำตอบของ gbjbaanb ได้หรือไม่?
Yasir

1
และถ้าคุณเขียน SQL ของคุณคุณมีปัญหาเดียวกัน ความแตกต่างของการเขียนจะล้มเหลว (หรือทำให้ข้อมูลของคุณเสียหาย) แทนที่จะทำให้นักพัฒนาบางคนรำคาญเล็กน้อยเพราะสตริงการค้นหาของเขาทำให้เกิดผลลัพธ์ที่ไม่ดี ใช่มีเฟรมเวิร์กซึ่งหมายความว่าคุณไม่จำเป็นต้องเขียน SQL แต่เลเยอร์พิเศษทุกอันจะทำให้กระบวนการช้าลง และจำไว้ว่านี่เป็นเพียงการบันทึก ทุกรอบที่คุณใช้เพื่อเข้าสู่ระบบคือรอบที่คุณไม่ได้ใช้เพื่อทำงานจริง
unholysampler

@unholysampler อาร์กิวเมนต์ประสิทธิภาพของคุณอ่อนแอการบันทึกสามารถทำได้อย่างรวดเร็วและบนเธรดพื้นหลังไปยังฐานข้อมูลและการบันทึกไปยัง f's ในขณะที่อาจเกิดขึ้นเร็วขึ้นก็ยังไม่ฟรีเช่นกันโดยเฉพาะอย่างยิ่งถ้าไม่ได้ทำในพื้นหลัง
Andy

2

คุณยก Apache ขึ้นมาโดยเฉพาะดังนั้นฉันจะพูดถึงเรื่องนี้โดยละเอียด

Apache สามารถกำหนดค่าเพื่อเข้าสู่ระบบไปยังฐานข้อมูลแม้ว่ามันจะต้องใช้ภายนอกปลั๊กอินจะทำเช่นนั้น การใช้ปลั๊กอินดังกล่าวสามารถทำให้การวิเคราะห์บันทึกง่ายขึ้น แต่ถ้าคุณตั้งใจจะเขียนซอฟต์แวร์วิเคราะห์บันทึกของคุณเอง ตัววิเคราะห์บันทึกนอกระบบมาตรฐานถือว่าบันทึกของคุณอยู่ในไฟล์ดังนั้นคุณจะไม่สามารถใช้สิ่งเหล่านี้ได้

เมื่อฉันทำเช่นนี้ฉันยังประสบปัญหาความน่าเชื่อถือ: ถ้าบัฟเฟอร์การเขียนของเซิร์ฟเวอร์ฐานข้อมูลเต็ม (ซึ่งอาจเกิดขึ้นกับ mysql หากคุณใช้โควต้าระบบไฟล์ของคุณสำหรับผู้ใช้ที่ทำงานภายใต้) มันจะเริ่มคิวคิวแบบสอบถามจนกว่าพวกเขาจะสามารถ เพื่อดำเนินการต่อ ณ จุดใดจุดหนึ่ง Apache จะเริ่มรอให้เสร็จทำให้เกิดคำขอไปยังเว็บไซต์ของคุณ

(ปัญหานี้อาจได้รับการแก้ไขแน่นอน - เป็นเวลาหลายปีแล้วที่ฉันทำสิ่งนี้)


1

ระบบไฟล์เป็นฐานข้อมูล มันเป็นฐานข้อมูลแบบลำดับชั้นที่ง่ายกว่าแทนที่จะเป็น DBMS เชิงสัมพันธ์ แต่ก็เป็นฐานข้อมูล

เหตุผลที่การบันทึกระบบไฟล์เป็นที่นิยมก็คือเพราะการบันทึกข้อความนั้นเข้ากันได้ดีกับปรัชญา Unix: "Text is the interface interface"

Unix พัฒนาขึ้นด้วยเครื่องมือเอนกประสงค์ที่สามารถทำงานได้ดีกับบันทึกข้อความ มันไม่สำคัญว่าบันทึกข้อความจะถูกสร้างขึ้นโดย mysql, apache, แอปพลิเคชันที่คุณกำหนดเอง, ซอฟต์แวร์บุคคลที่สามที่ไม่ได้รับการสนับสนุน sysadmin สามารถใช้เครื่องมือ Unix มาตรฐานเช่น grep, sed, awk, sort, uniq, tail, tail ฯลฯ เพื่อติดตามผ่านบันทึกเหมือนกันทั้งหมด

หากทุกแอปบันทึกลงในฐานข้อมูลของตัวเองหนึ่งไปยัง MySQL อีกหนึ่งไปยัง Postgres และ Elasticsearch อีกคนต้องการเข้าสู่ ELK และอีกคนสามารถเข้าสู่ MongoDB ได้เท่านั้นคุณจะต้องเรียนรู้เครื่องมือที่แตกต่างกันยี่สิบรายการเพื่อติดตามบันทึกของแต่ละรายการ ใบสมัคร ข้อความเป็นสื่อสากลที่ทุกคนสามารถเข้าสู่ระบบได้

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

การเข้าสู่ฐานข้อมูลมักจะไม่ทำให้สิ่งต่าง ๆ ง่ายขึ้นในทางปฏิบัติ

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


0

ลองดูที่เลเยอร์สองสาม:

  1. เครื่องเลเยอร์
  2. เลเยอร์ระบบปฏิบัติการ
  3. ชั้นบริการ
  4. แอพลิเคชันเลเยอร์

โดยย่อ:

  • บนเลเยอร์เครื่องคุณไม่สามารถทำการบันทึกอย่างอื่นนอกเหนือจากการถ่ายโอนข้อมูลบางประเภท
  • บนเลเยอร์ระบบปฏิบัติการคุณสามารถทำการบันทึก แต่คุณมีระบบไฟล์เท่านั้น
  • บริการสามารถเข้าสู่ระบบไฟล์ แต่พวกเขาไม่สามารถไว้วางใจบริการอื่น ๆ ที่จะทำงานเพื่อให้พวกเขาไม่สามารถเข้าสู่ระบบที่นั่น
  • แอปพลิเคชันสามารถเข้าสู่บริการและระบบไฟล์

จากนั้นเรามีวิธีการใช้งานเป็นกรณี ๆ :

คุณต้องการบันทึกข้อผิดพลาดเฉพาะของโหนดไปยัง RDBMS ที่ปรับขนาดในแนวนอนซึ่งคุณต้องใช้งานพิเศษเพื่อค้นหาข้อผิดพลาดของโหนดเฉพาะเมื่อคุณเพิ่งเปิดป๊อปอัปสำหรับโหนดเดียวและดูที่นั่นหรือไม่ ในทางกลับกันแอปพลิเคชันของคุณอาจเข้าสู่ RDBMS เพื่อรวบรวมข้อผิดพลาดและการแจ้งเตือนระดับแอปพลิเคชัน

จะเกิดอะไรขึ้นเมื่อ RDBMS จำเป็นต้องทำการบันทึกด้วยตัวเองเพราะฐานข้อมูลไม่สามารถเขียนลงไปได้


-2

ความซับซ้อน การเพิ่ม RDBMS จะเพิ่มความซับซ้อนของระบบทั้งหมดทางดาราศาสตร์ และความสามารถในการจัดการความซับซ้อนเป็นสิ่งสำคัญที่ทำให้โปรแกรมเมอร์ต่างจากผู้ผลิตซอร์สโค้ด


1
คุณสามารถขยายความหมายของความซับซ้อนที่เกี่ยวข้องกับการบันทึกลงในฐานข้อมูลกับระบบไฟล์ได้หรือไม่? จากประสบการณ์ของฉันไม่ได้มีความซับซ้อนแตกต่างกันในสภาพแวดล้อมทางธุรกิจ
Adam Zuckerman

จริงๆ? SqlLite เพิ่มความซับซ้อนทางดาราศาสตร์หรือไม่ และในขณะที่เว็บเซิร์ฟเวอร์ไม่ต้องการ DB แต่แอพ LOB จำนวนมากใช้อยู่แล้วดังนั้นจึงไม่มีค่าใช้จ่ายเพิ่มเติมเลย
Andy

@ AdamZuckerman แน่นอน RDBMS ใด ๆ ที่ต้องการการบำรุงรักษามีแนวโน้มที่จะเกิดความเสียหายอาจต้องปรับแต่งพิเศษอาจได้รับผลกระทบจากการกำหนดค่าที่ไม่ดีอาจต้องมีการกู้คืนพิเศษนำข้อ จำกัด ของตัวเองมีการพึ่งพาของตัวเอง .
noonex

@ ก่อนอื่น SQLite ไม่ใช่ RDBMS แบบคลาสสิค - เป็น "embedded RDBMS" และใช่ - ต้องมี SQLite สำหรับการบันทึกจะเพิ่มความซับซ้อนมากขึ้น
noonex

1
@ noonex คุณเพียงแค่สร้างความแตกต่างระหว่างเซิร์ฟเวอร์แบบฝังตัวและเซิร์ฟเวอร์แบบเต็มเมื่อ RDBMS ไม่ทำเช่นนั้น SqlLite ให้การปฏิบัติตาม ACID ซึ่งเป็นสิ่งที่ RDBMS กำลังพูดถึง และมันเพิ่มความซับซ้อนมากขึ้น? ฉันนึกได้ว่าคุณไม่ได้ทำงานอะไรเลยนอกจากแอปพลิเคชั่นที่น่าสนใจที่สุด ในที่สุดงานที่ดีก็ไม่สนใจจุดของฉันเกี่ยวกับแอปพลิเคชัน LOB จำนวนมากที่ต้องการฐานข้อมูลอยู่แล้ว
Andy

-4

มันคือความเร็วหรือการบำรุงรักษาหรืออย่างอื่น?

ความเร็ว.

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