แต่ในบางสถานะการณ์ เครื่อง server เรามีทรัพยากรเหลือ เราอยากจะมี PGDATA และมี PostgreSQL อยู่หลายๆ ชุด บนเครื่อง server เครื่องเดียวกัน ทำงานพร้อมๆกัน แทนที่จะต้องหา Linux Server เครื่องใหม่ และติดตั้ง Postgres บน Linux Server อีกเครื่อง
คำถามที่มีคนถามผมบ่อยๆ คือ ทำได้หรือไม่
คำตอบก็คือ ทำได้ครับ โดยใน server หนึ่งเครื่อง เราจะทำการสร้าง PGDATA ได้หลายชุด โดย PGDATA แต่ละชุด จะมีชุดของ PostgreSQL Process ถูก start ขึ้นมาทำงานแยกกัน เราเรียก PostgreSQL Process แต่ละชุดนี้ว่าเป็น PostgreSQL instance ครับ ซึ่งในกรณีนี้ข้อมูลต่างๆ ของ Postgres แต่ละ instance นี้จะอยู่แยกกันต่างหาก เหมือนอยู่คนละเครื่องกันเลยครับ
![]() |
| Diagram โครงสร้างการทำงานในกรณีที่มี Postgres 2 instance ทำงานอยู่บนเครื่องเดียวกัน |
ขั้นตอนการ setup
สมมติว่า เรามี PostgreSQL ทำงานอยู่บนเครื่องแล้ว เราอยากจะสร้าง PostgreSQL อีกหนึ่ง instance ขึ้นมาทำงาน ซึ่งเราสามารถทำได้ครับ ตราบเท่าที่ทรัพยากรของระบบเพียงพอ โดยขั้นตอนก็คลายๆ กับการสร้าง PostgreSQL Cluster Directory ขึ้นมาใหม่ โดยมีขั้นตอนเพิ่มเติมอีกนิดหน่อยดังนี้ครับ
หมายเหตุ เนื่องจากส่วนใหญ่ เราใช้ PostgreSQL บน Linux Server ในบทความนี้ จะขอพูดถึงขั้นตอนการติดตั้งบน Linux Server เป็นหลักนะครับ
1) สร้าง Directory ที่เก็บข้อมูลของ PostgreSQL ขึ้นมาใหม่แยกออกจากของเดิมโดยใช้คำสั่ง mkdir ตัวอย่างเช่น ผมต้องการสร้าง directory ชื่อ /pgdata2
2) กำหนด permission ของ directory ที่ถูกสร้างในข้อ 1) ให้เป็น 700 (rwx------) และกำหนด owner ซึ่งปกติ เราะจะกำหนดให้ เจ้าของ directory นี้เป็นของ user ที่ชื่อ postgres
3) ทำการ initial database โดยใช้คำสั่ง initdb โดยรูปแบบของคำสั่งคือ
initdb -D pgdata_path
โดยแทนที่ pgdata_path ด้วยชื่อ cluster directory
และนอกจากนี้ การเรียกใช้คำสั่งนี้ ต้องเรียกใช้ในขณะที่เป็น user ชื่อ postgres ดังนั้นในตัวอย่างข้างล่างนี้ จากที่ login เป็น root อยู่ ผมเลยต้องทำการ switch user เป็น postgres โดยใช้คำสั่งsu - postgres
ตัวอย่างเช่น
ซึ่งในบางเครื่อง การเรียกใช้คำสั่งนี้อาจจะต้องระบุเป็น full path name คือเรียกชื่อโดยระบุ directory แบบเต็มตั้งแต่ / (เช่น /usr/local/pgsql/bin/initdb) ซึ่ง full path name ของคำสั่ง initdb ในแต่ละเครื่องจะไม่เหมือนกัน ขึ้นอยู่กับว่าคำสั่ง initdb ถูกติดตั้งอยู่ที่ directory ไหน
ในบางกรณี เราต้องการย้าย PGDATA directory ที่เคยใช้งานแล้วจากเครื่องอื่น หรือจาก media ที่ถูก backup ไว้ ก็ไม่จำเป็นต้องทำการ initdb ใหม่ แต่ต้องให้แน่ใจครับ หลังจากที่ restore มาแล้ว file และ directory ใน cluster directory ตัว user postgres บน Linux มีสิทธ์เขียนอ่านทุกไฟล์
4) แก้ไขไฟล์ postgresql.conf ใน Cluster Directory (จากตัวอย่างในข้อ 3 ไฟล์นี้คือ /pgdata2/postgresql.conf) โดยแก้ให้ Port ที่เปิดหรือ ip address ไม่ซ้ำกับ postgres instance อื่นๆที่อยู่ในเครื่องเดียวกัน ซึ่งโดยปกติ เราจะแก้ไข parameter ที่ชื่อ port ยกตัวอย่างเช่น เราแก้ไข ค่า port ให้เป็น 5433 แทนที่ค่า default ที่เป้น 5432 ตามรูป
ซึ่งถ้าเราไม่แก้ให้ไม่ซ้ำกับ instance อื่น จะ start postgres ไม่ขึ้นนะครับ ที่จริงเรา port เดียวกัน แต่แก้ ip address ที่ postgres เปิด port รอรับ connection จาก client ไม่ให้ซ้ำกัน ก็ได้ แต่ยากไป และผลลัพท์อาจจะทำให้ เราะ connect postgres ผิดตัว(ผิด instance ) ก็ได้ครับ เลยไม่ขอกล่าวถึง
5) ทดลอง start postgres instance นี้โดยใช้คำสั่ง มีรูปแบบดังนี้
pg_ctl -D pgdata_path
โดยแทนที่ pgdata_path ด้วยชื่อ cluster directory ที่เราสร้างขึ้นในข้อ 3)
และในขั้นตอนนี้ถ้าเราต้องเรียกใช้คำสั่ง ขณะที่เป็น user postgres นะครับ ( ถ้าเรา login เป็น root อยู่ เราต้อง switch user เป็น postgres ก่อน ) ตัวอย่างเช่น
su – postgres
/usr/local/pgsql/bin/pg_ctl -D /pgdata2
6) ถ้าต้องการ ให้ instance ที่ติดตั้งใหม่นี้ ถูกเรียกขึ้นมาใช้งานโดยอัตโนมัติ (auto start) เมื่อมีการเปิดหรือ reboot เครื่อง ต้องสร้าง startup file สำหรับ instance นี้นะครับ เพื่อความสะดวก เราจะใช้วิธีเอา startup file ของเดิมมาแก้ ที่นี้ก็ขึ้นอยู่ว่า ระบบของคุณใช้ startup ไฟล์แบบไหน ซึ่งผมขอพูดถึงในบทความตอนต่อไปก็แล้วกันนะครับ



No comments:
Post a Comment