รีวิว CockroachDB: ฐานข้อมูล SQL ที่ปรับขนาดออกมาเพื่อความอยู่รอด

ก่อนหน้านี้เมื่อคุณซื้อฐานข้อมูลคุณต้องเลือก: ความสามารถในการปรับขนาดหรือความสม่ำเสมอ? ฐานข้อมูล SQL เช่น MySQL รับประกันความสม่ำเสมอที่ดี แต่ไม่ปรับขนาดในแนวนอนได้ดี (การชาร์ดด้วยตนเองเพื่อความยืดหยุ่นไม่ใช่เรื่องสนุก) ฐานข้อมูล NoSQL เช่น MongoDB scale สวยงาม แต่ให้ความสอดคล้องในที่สุดเท่านั้น (“ รอนานพอแล้วคุณจะอ่านคำตอบที่ถูกต้อง” ซึ่งไม่ใช่วิธีการทำธุรกรรมทางการเงินใด ๆ )

Google Cloud Spanner ซึ่งเป็นบริการฐานข้อมูลเชิงสัมพันธ์ที่มีการจัดการเต็มรูปแบบซึ่งทำงานบน Google Compute Engine (GCE) ซึ่งเปิดตัวในเดือนกุมภาพันธ์ 2017 มีความสามารถในการปรับขนาดของฐานข้อมูล NoSQL ในขณะที่ยังรักษาความเข้ากันได้ของ SQL สคีมาเชิงสัมพันธ์ธุรกรรม ACID และความสอดคล้องภายนอกที่แข็งแกร่ง Spanner เป็นฐานข้อมูลเชิงสัมพันธ์ที่กระจายตัวทั่วโลกและจำลองแบบที่ใช้อัลกอริทึมของ Paxos เพื่อให้ได้มาซึ่งฉันทามติระหว่างโหนด

อีกทางเลือกหนึ่งสำหรับ Spanner และหัวข้อของการตรวจสอบนี้คือ CockroachDB ซึ่งเป็นฐานข้อมูล SQL แบบกระจายแบบโอเพ่นซอร์สที่ปรับขนาดได้ในแนวนอนที่พัฒนาโดยอดีต Googler ที่คุ้นเคยกับ Spanner CockroachDB ยืมจาก Spanner ของ Google สำหรับการออกแบบระบบจัดเก็บข้อมูลและใช้อัลกอริทึม Raft เพื่อให้บรรลุฉันทามติระหว่างโหนด

เช่นเดียวกับ Cloud Spanner CockroachDB เป็นฐานข้อมูล SQL แบบกระจายที่สร้างขึ้นจากที่เก็บคีย์ - ค่าธุรกรรมและสอดคล้องกันในกรณีของ CockroachDB บน ​​RocksDB เป้าหมายการออกแบบหลักของ CockroachDB คือการรองรับธุรกรรม ACID ความสามารถในการปรับขนาดในแนวนอนและความสามารถในการอยู่รอด (ส่วนใหญ่) จึงเป็นชื่อ

CockroachDB ได้รับการออกแบบมาเพื่อเอาตัวรอดจากความล้มเหลวของดิสก์เครื่องชั้นวางและแม้แต่ศูนย์ข้อมูลโดยมีการหยุดชะงักของเวลาแฝงน้อยที่สุดและไม่มีการแทรกแซงด้วยตนเอง แน่นอนว่าคุณต้องเรียกใช้คลัสเตอร์ของโหนดสมมาตรของ CockroachDB หลายอินสแตนซ์โดยใช้ดิสก์เครื่องจักรชั้นวางและศูนย์ข้อมูลหลายตัว

แตกต่างจาก Cloud Spanner ซึ่งใช้ TrueTime API ที่พร้อมใช้งานสำหรับการซิงโครไนซ์เวลาในศูนย์ข้อมูลของ Google CockroachDB ไม่สามารถนับนาฬิกาอะตอมและนาฬิกาดาวเทียม GPS เพื่อซิงโครไนซ์เวลาได้อย่างแม่นยำระหว่างโหนดและศูนย์ข้อมูล ที่มีผลกระทบหลายประการ ในการเริ่มต้น Google TrueTime ให้ขอบเขตบนสำหรับการชดเชยนาฬิการะหว่างโหนดในกลุ่มเจ็ดมิลลิวินาที มีขนาดเล็กพอที่โหนด Spanner จะรอเพียงเจ็ดมิลลิวินาทีหลังจากเขียนก่อนที่จะรายงานว่าธุรกรรมได้ตกลงเพื่อรับประกันความสอดคล้องภายนอก

หากไม่มี TrueTime หรือสิ่งอำนวยความสะดวกที่คล้ายกัน CockroachDB จะต้องถอยกลับไปที่ NTP ซึ่งให้ขอบเขตบนในการซิงโครไนซ์นาฬิการะหว่าง 100 มิลลิวินาทีถึง 250 มิลลิวินาที ด้วยหน้าต่างเวลาที่ใหญ่ขึ้น CockroachDB ไม่รอหลังจากเขียน แต่บางครั้งมันก็รอก่อนที่จะอ่านโดยทั่วไปจะเริ่มต้นธุรกรรมใหม่หากอ่านค่าที่มีการประทับเวลามากกว่าจุดเริ่มต้นของธุรกรรมอีกครั้งเพื่อรับประกันความสอดคล้อง

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

วิธีการทำงานของ CockroachDB

แต่ละโหนด CockroachDB ประกอบด้วยห้าชั้น:

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

เลเยอร์ SQL จะแยกวิเคราะห์คำค้นหากับไฟล์ Yacc และเปลี่ยนเป็นโครงสร้างไวยากรณ์แบบนามธรรม จากโครงสร้างไวยากรณ์นามธรรม CockroachDB จะสร้างแผนภูมิของโหนดแผนซึ่งมีรหัสคีย์ - ค่า จากนั้นโหนดแผนจะถูกดำเนินการโดยสื่อสารกับชั้นธุรกรรม

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

ชั้นการแจกจ่ายรับคำขอจากชั้นธุรกรรมบนโหนดเดียวกัน จากนั้นระบุว่าโหนดใดควรรับคำขอและส่งคำขอไปยังเลเยอร์การจำลองแบบของโหนดที่เหมาะสม

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

ชั้นเก็บข้อมูลจัดเก็บข้อมูลเป็นคู่คีย์ - ค่าบนดิสก์โดยใช้ RocksDB CockroachDB อาศัยการควบคุมพร้อมกันหลายเวอร์ชัน (MVCC) เพื่อประมวลผลคำขอพร้อมกันและรับประกันความสอดคล้อง งานนี้ส่วนใหญ่ทำได้โดยใช้การประทับเวลานาฬิกาลอจิคัลแบบไฮบริด (HLC)

เช่นเดียวกับ Spanner CockroachDB รองรับข้อความค้นหาการเดินทางข้ามเวลา (เปิดใช้งานโดย MVCC) สิ่งเหล่านี้สามารถย้อนกลับไปได้ไกลถึงการรวบรวมขยะในฐานข้อมูลล่าสุดของคุณซึ่งทำโดยค่าเริ่มต้นเป็นประจำทุกวัน

การติดตั้งและการใช้งาน CockroachDB

CockroachDB ทำงานบนระบบปฏิบัติการ Mac, Linux และ Windows อย่างน้อยก็เพื่อการพัฒนาและทดสอบ ฐานข้อมูลแมลงสาบการผลิตมักจะทำงานบน Linux VMs หรือคอนเทนเนอร์ที่จัดระเบียบซึ่งมักโฮสต์บนคลาวด์สาธารณะในศูนย์ข้อมูลหลายแห่ง ไบนารี Windows ของ CockroachDB ยังอยู่ในช่วงเบต้าและไม่แนะนำให้ใช้งานจริงและ Apple ไม่ได้ผลิตฮาร์ดแวร์เซิร์ฟเวอร์อีกต่อไป

ห้องปฏิบัติการแมลงสาบ

ดังที่คุณเห็นในภาพหน้าจอด้านบนมีสี่ตัวเลือกสำหรับการติดตั้ง CockroachDB บนเครื่อง Mac ฉันเลือก Homebrew น่าจะง่ายที่สุดในสี่

โดยวิธีการที่ Cockroach Labs โพสต์คำเตือนบนไซต์ที่ระบุว่าการเรียกใช้แอปพลิเคชันที่มีสถานะเช่น CockroachDB ใน Docker นั้นยุ่งยากไม่แนะนำสำหรับการปรับใช้งานจริงและให้ใช้เครื่องมือการจัดเตรียมเช่น Kubernetes หรือ Docker Swarm เพื่อเรียกใช้คลัสเตอร์แทน ฉันจะพูดถึงตัวเลือกการจัดระเบียบคอนเทนเนอร์ในส่วนถัดไป

การติดตั้งบน Mac ทำได้ง่ายดังbrew install cockroachที่แสดงไว้ด้านบน ในกรณีของฉันการอัปเดต Homebrew โดยอัตโนมัติใช้เวลานานกว่า (เวลาในการชงชามากพอ) กว่าการติดตั้ง CockroachDB จริงซึ่งใช้เวลาเพียงไม่กี่วินาที

เมื่อคุณติดตั้ง CockroachDB แล้วการหมุนคลัสเตอร์ภายในเครื่องนั้นค่อนข้างง่ายแม้ว่าจะมีขั้นตอนเพิ่มเติมในการสร้างใบรับรองความปลอดภัยด้วยcockroach certคำสั่งหากคุณต้องการให้คลัสเตอร์ปลอดภัย เมื่อคุณมีคลัสเตอร์ทำงานอยู่ (ใช้cockroach startคำสั่งหนึ่งครั้งสำหรับแต่ละโหนดโดยมีการตั้งค่าโหนดที่ตามมาเพื่อเข้าร่วมคลัสเตอร์ของโหนดแรก) คุณสามารถเชื่อมต่อกับเพจการดูแลระบบเว็บบนโหนดใดก็ได้ที่มีเบราว์เซอร์และใช้cockroach sqlไคลเอ็นต์แบบฝังเพื่อส่ง SQL สอบถามไปยังโหนดใด ๆ เบราว์เซอร์ส่วนใหญ่จะบ่นเกี่ยวกับไซต์ที่มีใบรับรองที่สร้างโดย CockroachDB แต่คุณควรจะสามารถคลิกผ่านคำเตือนที่น่ากลัวนั้นและไปที่ไซต์ได้

การตั้งค่าการผลิต CockroachDB ที่แนะนำแตกต่างจากค่าเริ่มต้นซึ่งตั้งค่าสำหรับอินสแตนซ์การพัฒนาและการทดสอบ คุณสามารถพัฒนาบนคลัสเตอร์โหนดเดียวได้หากต้องการ สำหรับการใช้งานจริงคุณควรมีอย่างน้อยสามโหนดเรียกใช้แต่ละโหนดบนเครื่อง VM หรือคอนเทนเนอร์ที่แยกจากกันและให้แต่ละอินสแตนซ์แคชและหน่วยความจำ SQL เพิ่มเติม การตั้งค่าเริ่มต้นคือ 128 MB สำหรับหน่วยความจำแคชและ SQL การตั้งค่าการผลิตที่แนะนำคือให้ RAM 25 เปอร์เซ็นต์:

cockroach start --cache=25% --max-sql-memory=25%

ยิ่งคุณรันโหนดมากเท่าใดความยืดหยุ่นก็จะยิ่งดีขึ้นเท่านั้น ยิ่งโหนดใหญ่และเร็วเท่าไหร่ประสิทธิภาพก็จะยิ่งดีขึ้นเท่านั้น หากคุณต้องการมีโหนดที่มีประสิทธิภาพเทียบเคียงได้กับโหนด Google Cloud Spanner ซึ่งให้การเขียน 2,000 ครั้งต่อวินาทีและการอ่าน 10,000 ครั้งต่อวินาทีคุณต้องการบางอย่างเช่นอินสแตนซ์ n1-highcpu-8 ของ GCE ซึ่งมี CPU แปดตัวและ RAM 8 GB กับดิสก์ SSD ภายใน (แทนที่จะหมุนดิสก์)

ยิ่งคุณกระจายโหนดของคุณไปยังศูนย์ข้อมูลต่างๆมากเท่าไหร่คุณก็ยิ่งมั่นใจได้ว่าจะมีภูมิคุ้มกันต่อความล้มเหลวในระดับศูนย์ข้อมูล อย่างไรก็ตามมีค่าใช้จ่าย: เวลาในการตอบสนองแบบไปกลับระหว่างศูนย์ข้อมูลจะมีผลโดยตรงต่อประสิทธิภาพของฐานข้อมูลของคุณโดยคลัสเตอร์ข้ามทวีปมีประสิทธิภาพแย่กว่าคลัสเตอร์ที่โหนดทั้งหมดอยู่ใกล้กันทางภูมิศาสตร์อย่างเห็นได้ชัด

Cockroach Labs ให้คำแนะนำโดยละเอียดสำหรับการปรับใช้บน AWS, Digital Ocean, GCE และ Azure การกำหนดค่าที่แนะนำจะใช้ตัวจัดสรรภาระงานไม่ว่าจะเป็นบริการโหลดบาลานซ์ที่มีการจัดการดั้งเดิมหรือตัวโหลดบาลานเซอร์แบบโอเพนซอร์สเช่น HAProxy

Orchestration สามารถลดค่าใช้จ่ายในการดำเนินงานของคลัสเตอร์ CockroachDB ลงจนแทบไม่เหลืออะไรเลย Cockroach Labs จะจัดทำเอกสารเกี่ยวกับวิธีการผลิตด้วย Kubernetes และ Docker Swarm ที่เก็บ CockroachDB-CloudFormation บน GitHub แสดงวิธีใช้ AWS CloudFormation และ Kubernetes ในโซนความพร้อมใช้งานเดียวสำหรับการพัฒนาและทดสอบ การปรับสิ่งนี้สำหรับการใช้งานจริงจะเกี่ยวข้องกับการปรับเปลี่ยนเทมเพลต CloudFormation เพื่อใช้โซนความพร้อมใช้งานหลายโซน

การเขียนโปรแกรมและการทดสอบ CockroachDB

CockroachDB รองรับโปรโตคอล PostgreSQL wire ดังนั้นคุณจึงเขียนโค้ดราวกับว่าคุณกำลังเขียนโปรแกรมกับ Postgres หรืออย่างน้อยก็เป็นส่วนย่อยของ Postgres หน้านี้แสดงรายการไดรเวอร์ที่ทดสอบแล้วสำหรับการเชื่อมโยงภาษาโปรแกรมต่างๆรวมถึงภาษาฝั่งเซิร์ฟเวอร์ที่เป็นที่นิยมมากที่สุด หน้านี้แสดงตัวอย่างภาษาโปรแกรม 10 ภาษาและห้า ORM ฉันไม่พบความประหลาดใจใด ๆ เมื่ออ่านโค้ดแม้ว่าฉันจะพบข้อบกพร่องเล็กน้อยที่น่าจะเป็นไปได้บางประการในรายชื่อในเอกสาร คุณยังสามารถเรียกใช้ SQL ของคุณโดยใช้ไคลเอนต์แบบโต้ตอบที่มีอยู่ในcockroachไฟล์ปฏิบัติการ

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

ข้อเท็จจริงอีกประการหนึ่งที่ต้องคำนึงถึงคือฐานข้อมูล SQL ทั่วไปส่วนใหญ่ไม่ทำงานในโหมดการแยกที่เป็นอนุกรมตามค่าเริ่มต้น แทนที่จะใช้โหมดที่เข้มงวดน้อยกว่าพร้อมประสิทธิภาพที่ดีกว่า CockroachDB ใช้โหมดแยกอนุกรมตามค่าเริ่มต้น นอกจากนี้การทดสอบประสิทธิภาพการเข้าร่วม SQL ของ CockroachDB อาจไม่ยุติธรรมซึ่งยังอยู่ระหว่างดำเนินการกับชุด TPC-C

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

การสาธิตที่น่าประทับใจยิ่งขึ้นแสดงให้เห็นการย้ายข้ามคลาวด์โดยอัตโนมัติภายในคลัสเตอร์ CockroachDB มันต้องใช้วิดีโอเพื่อความยุติธรรม วิดีโอถูกโฮสต์ในบล็อกโพสต์ที่เชื่อมโยง

CockroachDB SQL 

SQL ใน CockroachDB เป็นมาตรฐานมากหรือน้อยต่างจาก SQL ใน Cloud Spanner ซึ่งใช้ไวยากรณ์ที่ไม่ได้มาตรฐานในการจัดการข้อมูล อย่างไรก็ตาม CockroachDB SQL ยังขาดคุณสมบัติหลายประการ

ตัวอย่างเช่น V1.1 ขาดการสนับสนุน JSON ซึ่งวางแผนไว้สำหรับ V1.2 นอกจากนี้ยังขาดการแยกวิเคราะห์ XML ซึ่งไม่ได้อยู่ในแผนงาน ไม่มีการลดหลั่นระดับแถวที่วางแผนไว้สำหรับ V1.2 และไม่มีเคอร์เซอร์และทริกเกอร์ซึ่งไม่ได้อยู่ในแผนงาน ดัชนีภูมิสารสนเทศเป็นส่วนเสริมที่ "มีศักยภาพ" ซึ่งอาจทำให้เป็นไปตามแผนงานในอนาคต

สิ่งที่น่าสังเกตมากที่สุดคือการใช้งาน CockroachDB ครั้งแรกของการรวม SQL ในปี 2559 เป็นไปโดยเจตนาที่เรียบง่ายและแสดงการปรับขนาดกำลังสองทำให้ไม่มีประโยชน์สำหรับการสืบค้นชุดข้อมูลขนาดใหญ่ เวอร์ชันใน V1.0 ซึ่งทำโดยนักเรียนแบบร่วมมือดำเนินการรวมแฮชทำให้การดำเนินการเข้าร่วมจำนวนมากปรับขนาดเป็นเส้นตรง ที่มี CockroachDB อยู่ในระดับ SQLite บางครั้งในปี 2018 เมื่อได้รับการระดมทุนรอบล่าสุด CockroachDB ควรเข้าร่วมประสิทธิภาพที่ปรับขนาดได้มากขึ้นเช่นการรวม PostgreSQL รวมถึงการประมวลผลการเข้าร่วม SQL ที่กระจายไปทั่วคลัสเตอร์