ทำ Hot backup percona MongoDB อย่างไร? by

15
Nov
0

** Blog นี้ใช้งาน Percona Mongodb เป็นหลักนะครับซึ่งวิธีการ Backup จะต่างจาก Mongodb เวอร์ชั่นธรรมดาที่ใช้ mongodump หากต้องการทราบรายละเอียดเพิ่มเติม คลิกเพื่ออ่าน Blog เก่าได้ที่นี่

คำสั่ง Backup Percona MongoDB ง่ายมากเลยครับ ขั้นแรกให้เข้า mongo shell ก่อน แล้วใช้คำสั่งตามด้านล่าง

use admin
db.runCommand({backupStart:"/my/backup/data/path"})

โดยแก้ไขส่วนของ /my/backup/data/path เป็น path ที่เราต้องการเซฟ backup ไว้เท่านี้ก็เรียบร้อย ง่ายสุดๆ สั่ง Backup ระหว่างใช้งานโดยไม่กระทบกับผู้ใช้งานปัจจุบันได้เลยครับ แต่ถ้าหากต้องการรันผ่าน linux shell ตรงๆ โดยไม่ต้องเข้า Mongo shell ก่อนก็สั่งดังนี้ได้เลยครับ

mongo --eval "db = db.getSiblingDB('admin'); db.runCommand({backupStart:\"/my/backup/data/path\"});"
tar -cv -C /my/backup/data path | pbzip2 -cv > my_backup.tar.gz2

เพียงเท่านี้ก็จะสามารถตั้ง cron สั่ง backup รายวันได้ทันที แก้ไขตำแหน่งไฟล์ที่ backup ได้ตามสะดวก และสั่ง pbzip2 ให้รวมเป็นไฟล์เดียวเล็กๆ เรียบร้อย

สำหรับวิธี Restore ไม่มีอะไรซับซ้อน ไฟล์ที่เรา backup มานั่นแหละคือ data ของฐานข้อมูล mongodb เต็มๆ สิ่งที่ต้องทำมีเพียง stop mongodb ที่รันอยู่แล้วลบไฟล์ database mongodb ทั้งหมดออกไป (ตัวทั่วไปมักจะอยู่ที่ /var/lib/mongodb) แล้วเอาไฟล์ที่เรา backup ไว้ไปใส่แทน แล้วแก้ owner ของไฟล์เป็น mongod ผ่านคำสั่ง chown แล้วสั่ง start mongodb ขึ้นมาอีกรอบเป็นอันเรียบร้อย ง่ายมากๆ

MongoDB Cheat list และขั้นตอนการทำ Replication by

28
Feb
0

สรุปคำสั่ง mongoDB ที่ใช้บ่อยๆ

  • use db1 – ใช้งาน database db1 หรือสร้าง database ใหม่
  • show dbs – แสดงรายชื่อ database ทั้งหมด
  • db.getCollectionNames() – แสดง collection (ตาราง) ทั้งหมด
  • db.createCollection(“users”) – สร้าง collection ชื่อ users
  • db.users.drop() – ลบ collection users
  • db.createCollection(“new”, {capped:true, size:1073741824}); – สร้าง capped collection ขนาด 1073741824 bytes
  • db.logMoney.find({time:{$gte: new Date(2013,2,5)}}); – query date มากกว่าเท่ากับวันที่ๆ กำหนด
  • db.logMoney.ensureIndex({‘time’:1},{background:true}) – new index field time โดย background ไว้สั่งให้ทำโดยไม่ lock collection
  • db.logMoney.getIndexes()  - ดู Index ทั้งหมดขณะนั้น
  • db.logMoney.find({time:{$gt:new Date()}}) – query ระบุเวลา สามารถใช้ร่วมกับ mongodump ได้
  • db.logMoney.aggregate({$match:{time:{$gt:new Date(2013,1,1)},chng:{$lt:0}}},{$group:{_id:{usrId:1, }, count:{$sum:1}, sumAll:{$sum:”$chng”}}}) – ตัวอย่างการใช้งาน query ลักษณะเดียวกับ GROUP BY ใน MySQL
    (SELECT *, COUNT(*) as count,  SUM(chng) as sumAll FROM logMoney WHERE time > “2013-01-01″ AND chng < 0  GROUP BY usrId)

วิธีทำ Replication

ก่อนอื่น MongoDB แนะนำว่าควรมีเครื่องในวงอย่างน้อย 3 เครื่องครับ (แต่เราอาจจะใช้ 2 เครื่อง แล้วใช้อีกเครื่องเป็น Arbiter หรือตัวหลอกแทนได้) ขั้นตอนมีดังนี้

  1. Edit /etc/mongodb.conf ด้วยโปรแกรมที่ถนัด
  2. กำหนด replSet = <ชื่อกลุ่มที่ต้องการ> ในที่นี้ผมตั้งว่า rs0
  3. restart mongodb
  4. ทำข้อ 1-3 ใหม่กับเครื่องที่จะเป็น Slave ทุกเครื่อง
  5. เข้าเครื่องที่จะให้เป็น Master (สมมติว่า ip ภายในของเครื่อง master คือ 10.0.0.1) แล้วพิมพ์ mongo 10.0.0.1 (สำคัญมาก ห้ามลืมพิมพ์ ip หรือพิมพ์ผิดเด็ดขาด ไม่อย่างนั้นจะใช้ไม่ได้)
  6. ถ้าหน้าจอปรากฏดังนี้แสดงว่าทำได้ถูกต้อง

    mongo 10.0.0.1
    MongoDB shell version: 2.2.2
    connecting to: 10.0.0.1/test
    rs0:PRIMARY>
  7. สั่ง rs.initiate()
  8. สั่ง rs.add(“10.0.0.2″) (สมมติเครื่อง slave ip 10.0.0.2) และเครื่อง slave เครื่องอื่นๆ
  9. เสร็จ!

สรุปคำสั่ง replication ที่ใช้บ่อย

  • rs.initiate() – เริ่ม replica set
  • rs.status() – status replica set
  • rs.add(“ip”) – เพิ่ม secondary node
  • rs.addArb(“ip”) – เพิ่ม secondary node แบบตัวหลอกเพื่อโหวตตอน fail-over เท่านั้น ไม่มีข้อมูลจริง
  • rs.stepDown() – ถอนตัวจากการเป็น master
  • db.printReplicationInfo() – เช็คว่า oplog มีอายุกี่วัน

วิธี Backup MongoDB

เทียบเท่า mysqldump นั่นเอง ตัวอย่างนั้นใช้ dump เฉพาะตารางที่กำหนด และ query ในช่วงเวลาที่กำหนด ดังนี้

mongodump –host –port –db <ชื่อ database> –collection <ชื่อ collection> -q ‘{“time”:{“$gte”:{“$date”:1360627200000}}}’

วิธี Restore MongoDB

mongorestore

ขอให้สนุกกับ MongoDB :D

การ backup และทำ replication database โดยไม่ต้องปิด server by

31
May
1

โดยปกติแล้ว การ backup database เรามักจะใช้คำสั่ง mysqldump กันใช่ไหมครับ แต่คำสั่งนี้มีข้อเสียที่ร้ายแรงอย่างหนึ่งคือตารางที่ backup ทุกตารางจะต้องถูก Lock จนกว่าจะทำการ backup เสร็จ ทำให้ผู้ใช้ไม่สามารถให้บริการเว็บไซต์ของเราในระหว่าง backup ได้ ส่งผลให้ต้องมีการปิด maintenance ระหว่าง backup หรือถูกบังคับให้ทำ Replication แบ่งสองเครื่องทั้งที่เราเองก็มีทรัพยากรจำกัด เนื้อที่จำกัด ไม่สามารถทำ Replication กับทุกๆ ฐานข้อมูลได้ วันนี้ผมมีวิธีช่วย backup ดีๆ ง่ายๆ มาแนะนำคือเราจะใช้ Xtrabackup ซึ่งเป็นชุดซอฟต์แวร์ของ Percona Server นั่นเอง

ก่อนอื่นต้องอธิบายก่อนว่า Percona Server คือ MySQL เวอร์ชั่นปรับปรุงนั่นเอง โดยทางทีมพัฒนาได้นำเอา InnoDB Engine ไปพัฒนาและปรับปรุงประสิทธิภาพหลายๆ อย่าง และใส่ฟีเจอร์เด็ดๆ เพิ่มเข้ามามากมายจนสุดท้ายออกมาเป็น Percona Server ซึ่งเจ้านี่มีความเข้ากันได้กับ InnoDB Engine ตัวเดิมของ MySQL 100% ครับ ใช้แทน MySQL ได้ทุกประการ รวมไปถึง Tools ต่างๆ ที่เคยใช้กับ MySQL ได้ก็จะใช้กับ Percona Server ได้เช่นกัน (แม้จะเป็น MyISAM ก็สามารถใช้งานได้ปกติไม่มีปัญหาใดๆ ครับ แค่ performance จะยังคงเหมือน MySQL ไม่ได้ถูกปรับปรุงขึ้นตามด้วย)

ส่วน Tools ที่เราจะใช้สำหรับ Backup จริงๆ ชื่อ XtraBackup ครับ ซึ่งเป็นทีมพัฒนาทีมเดียวกับ Percona Server (และ Percona Data Recovery Tool for InnoDB จากบทความที่แล้วด้วยเช่นกัน) เจ้าตัว Xtrabackup นี้จริงๆ ใช้งานกับ mysql ธรรมดาที่ไม่ใช่ Percona Server ก็ได้แต่จะมีความสามารถบางอย่างที่ทำไม่ได้หากไม่ได้ใช้ Percona Server ครับ เช่น การ Backup/Restore ฐานข้อมูลเฉพาะตารางบางตารางที่เราต้องการ (เพื่อประหยัดเวลา/cpu ของ server) เป็นต้น ซึ่ง Tools ตัวนี้จะช่วย Backup แบบไม่ต้องปิด server (ไม่ต้อง Lock Table ระหว่างทำการ backup) ได้เฉพาะตารางที่ใช้งานฐานข้อมูลชนิด InnoDB เท่านั้น (จริงๆ MyISAM ก็ใช้ Tools ตัวนี้ช่วย backup ได้ครับ แค่จะยังติด lock อยู่เหมือนเดิม) นอกจากนี้หากเราใช้งานฐานข้อมูลบน VPS หรือ Cloud ที่ให้พื้นที่ใช้งานน้อยๆ ยังสามารถ Backup เป็นแบบ Incremental หรือส่งไฟล์ Backup เป็น stream ไปเข้า server ตัวอื่นที่มีพื้นที่เยอะกว่าได้อีกด้วย! (Amazing ไหมละ!) ซึ่งการ Backup โดยที่ Server ยังคงให้บริการได้ปกติแบบนี้เราจะเรียกว่า Hot Backup ครับ ส่วนการ Backup ที่จำเป็นต้องปิด Server ระหว่าง Backup เราจะเรียกว่า Cold Backup เอาละหลังจากติดตั้งเสร็จแล้ว (และต้องมี account root ของ OS ด้วยนะครับ) ลองมาดูวิธีใช้งานกันดีกว่าครับ (ทุกขั้นต้อนต้องทำขณะเป็น root ครับ)

Backup MySQL Database method by

30
Jul
0

การ backup database แบ่งออกเป็นสองประเภทหลักๆ ได้แก่

  1. Physical Backup - เป็นการ backup ข้อมูลโดยการ copy โครงสร้างข้อมูลมาทั้ง directory และ file ทั้งหมดนั่นเอง การ backup แบบนี้มีข้อดีคือสามารถ recovery คืนกลับได้รวดเร็ว และการ backup ก็ใช้เวลาน้อยกว่า Logical เนื่องจากเป็นเพียงการ copy file ธรรมดาๆ แต่มีข้อเสียคือการย้ายฐานข้อมูลจากเครื่องหนึ่งไปยังอีกเครื่องหนึ่งซึ่งเป็นคนละ OS หรือเป็น mysql คนละเวอร์ชั่น จะไม่สามารถกระทำได้ โดยปกติมักใช้ mysqlhotcopy(MyISAM), ibbackup (InnoDB) เป็นเครื่องมือในการ backup
  2. Logical Backup – เป็นการ backup ข้อมูลโดย export ข้อมูลทั้งหมดมาเป็นคำสั่ง SQL โดยมีการ CREATE TABLE และข้อมูลทั้งหมดใหม่ มีข้อดีคือสามารถโยกย้ายไปยังเครื่องอีกเครื่องอีกเครื่องหนึ่งได้ง่าย import ได้เลยทันที ไม่ว่าจะเป็น OS คนละตัวหรือไม่ก็ตาม โดยปกติแล้วมักใช้ mysqldump เป็นเครื่องมือในการ backup