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

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

เมื่อไม่มีแอปพลิเคชันไคลเอนต์อีกต่อไปใช้เวอร์ชันสคีมาเก่าการโยกย้ายจะเสร็จสมบูรณ์ สิ่งนี้จะลบสคีมาเก่าและใหม่จะเป็นสิ่งเดียวที่มีอยู่ ไม่จำเป็นต้องถอดตารางและคอลัมน์อีกต่อไป (ไม่มีไคลเอนต์ใช้สิ่งนี้ ณ จุดนี้) และจะเปลี่ยนชื่อใหม่เป็นชื่อสุดท้ายของพวกเขา แอปพลิเคชันไคลเอนต์ยังคงทำงานในช่วงนี้เนื่องจากมุมมองยังคงแมปกับตารางและคอลัมน์ที่เหมาะสม
ไบนารีพร้อมใช้งานสำหรับ Linux, MacOS & Windows ตรวจสอบรุ่นของเรา
ในการติดตั้ง pgroll จากแหล่งที่มาให้เรียกใช้คำสั่งต่อไปนี้:
go install github.com/xataio/pgroll@latestหมายเหตุ: ต้องใช้ GO 1.23 หรือใหม่กว่า
ในการติดตั้ง pgroll ด้วย homebrew ให้เรียกใช้คำสั่งต่อไปนี้:
# macOS or Linux
brew tap xataio/pgroll
brew install pgroll ทำตามขั้นตอนเหล่านี้เพื่อดำเนินการโยกย้ายสคีมาครั้งแรกของคุณโดยใช้ pgroll :
pgroll จำเป็นต้องจัดเก็บสถานะภายในบางอย่างในฐานข้อมูล ตารางถูกสร้างขึ้นเพื่อติดตามเวอร์ชันสคีมาปัจจุบันและประวัติเวอร์ชันจัดเก็บ ในการเตรียมฐานข้อมูลให้เรียกใช้คำสั่งต่อไปนี้:
pgroll init --postgres-url postgres://user:password@host:port/dbname สร้างไฟล์การโยกย้าย คุณสามารถตรวจสอบโฟลเดอร์ตัวอย่างสำหรับตัวอย่าง ตัวอย่างเช่นใช้ไฟล์การโยกย้ายนี้เพื่อสร้างตาราง customers ใหม่:
{
"name" : " initial_migration " ,
"operations" : [
{
"create_table" : {
"name" : " customers " ,
"columns" : [
{
"name" : " id " ,
"type" : " integer " ,
"pk" : true
},
{
"name" : " name " ,
"type" : " varchar(255) " ,
"unique" : true
},
{
"name" : " bio " ,
"type" : " text " ,
"nullable" : true
}
]
}
}
]
}จากนั้นเรียกใช้คำสั่งต่อไปนี้เพื่อเริ่มการโยกย้าย:
pgroll --postgres-url postgres://user:password@host:port/dbname start initial_migration.jsonสิ่งนี้จะสร้างเวอร์ชันสคีมาใหม่ในฐานข้อมูลและใช้การดำเนินการโยกย้าย (สร้างตาราง) หลังจากเสร็จสิ้นคำสั่งนี้ทั้งสคีมาเวอร์ชันเก่า (ที่ไม่มีตารางลูกค้า) และหนึ่ง (พร้อมตารางลูกค้า) จะสามารถเข้าถึงได้พร้อมกัน
หลังจากเริ่มการโยกย้ายแอปพลิเคชันไคลเอนต์สามารถเริ่มใช้เวอร์ชันสคีมาใหม่ ในการทำเช่นนั้นพวกเขาจะต้องกำหนดค่าเพื่อเข้าถึง สามารถทำได้โดยการตั้งค่า search_path เป็นชื่อรุ่นสคีมาใหม่ (จัดทำโดย pgroll start output) ตัวอย่างเช่น:
SET search_path TO ' public_initial_migration ' ;เมื่อไม่มีแอปพลิเคชันไคลเอนต์อีกต่อไปโดยใช้เวอร์ชันสคีมาเก่าการย้ายถิ่นจะเสร็จสมบูรณ์ สิ่งนี้จะลบสคีมาเก่า เพื่อให้การย้ายข้อมูลดำเนินการให้เรียกใช้คำสั่งต่อไปนี้:
pgroll --postgres-url postgres://user:password@host:port/dbname completeณ จุดใด ๆ ในระหว่างการย้ายถิ่นมันสามารถย้อนกลับไปยังเวอร์ชันก่อนหน้า สิ่งนี้จะลบสคีมาใหม่และปล่อยให้เก่าเหมือนเดิมก่อนที่จะเริ่มการย้ายถิ่น หากต้องการย้อนกลับการย้ายถิ่นให้เรียกใช้คำสั่งต่อไปนี้:
pgroll --postgres-url postgres://user:password@host:port/dbname rollbackสำหรับการใช้งานขั้นสูงการสอนและตัวเลือกโดยละเอียดเพิ่มเติมโปรดดูคำแนะนำและการอ้างอิงในเอกสารประกอบ
เกณฑ์มาตรฐานประสิทธิภาพบางอย่างดำเนินการในแต่ละการกระทำที่ main เพื่อติดตามประสิทธิภาพเมื่อเวลาผ่านไป เกณฑ์มาตรฐานแต่ละอันดำเนินการกับ postgres 14.8, 15.3, 16.4, 17.0 และ "ล่าสุด" แต่ละบรรทัดในแผนภูมิแสดงจำนวนแถวที่เกณฑ์มาตรฐานถูกเรียกใช้กับแถว 10K, 100K และ 300K
Backfill: แถว/s เพื่อย้อนกลับคอลัมน์ข้อความด้วย placeholder มีค่า เราใช้กลยุทธ์การแบตช์เริ่มต้นของเราที่ 10k แถวต่อแบทช์โดยไม่ต้องย้อนกลับWriteAmplification/NoTrigger: แถวพื้นฐาน/s เมื่อเขียนข้อมูลไปยังตารางที่ไม่มีทริกเกอร์ pgrollWriteAmplification/WithTrigger: rows/s เมื่อเขียนข้อมูลไปยังตารางเมื่อมีการตั้งค่าทริกเกอร์ pgrollReadSchema: ตรวจสอบจำนวนการดำเนินการต่อวินาทีของฟังก์ชัน read_schema ซึ่งเป็นฟังก์ชั่นหลักที่ดำเนินการบ่อยครั้งในระหว่างการย้ายถิ่นพวกเขาสามารถเห็นได้ที่นี่
เรายินดีต้อนรับการมีส่วนร่วมจากชุมชน! หากคุณต้องการมีส่วนร่วมใน pgroll โปรดปฏิบัติตามแนวทางเหล่านี้:
สำหรับโครงการนี้เราให้คำมั่นว่าจะดำเนินการและโต้ตอบในรูปแบบที่นำไปสู่ชุมชนที่เปิดกว้างต้อนรับหลากหลายรวมและมีสุขภาพดี
นี่คือรายการของโครงการและบทความที่ช่วยเป็นแรงบันดาลใจหรืออื่น ๆ คล้ายกับ pgroll :
โครงการนี้ได้รับอนุญาตภายใต้ Apache License 2.0 - ดูไฟล์ใบอนุญาตสำหรับรายละเอียด
หากคุณมีคำถามใด ๆ พบปัญหาหรือต้องการความช่วยเหลือเปิดปัญหาในที่เก็บนี้เข้าร่วม Discord ของเราและชุมชนของเรายินดีที่จะช่วยเหลือ
ทำด้วย❤โดย Xata?