Tuesday, July 21, 2020

PostgreSQL Multiple Instances : ตอนที่ 2 การติดตั้ง startup script สำหรับ PostgreSQL หลาย instance บนเครื่องเดียวกัน

ในบทความที่แล้ว ผมได้พูดถึงการสร้าง Cluster Directory และการแก้ไขไฟล์ postgresql.conf เพื่อให้สามารถเรียกใช้ postgres ได้หลายๆ instance พร้อมๆ กัน ได้แล้ว แต่ยังขาดวิธีการสร้าง start up script ที่ทำให้ PostgreSQL หลาย instance นั้น auto start ขึ้นมาทำงานพร้อมๆ กันได้เมื่อมีการ reboot หรือ เปิดเครื่อง ในบทความนี้เราจะมาพูดเรื่องนี้ต่อกันครับ

 Linux ในปัจจุบัน มี การใช้งาน startup script อยู่หลายแบบ ผมคงขอพูดถึงสองแบบที่ผมคุ้นเคยละกันนะครับ แบบแรก คือ systemd และแบบที่สองคือ init.d

ไม่ว่าเครื่อง Linux จะใช้ startup script แบบไหน หลักการก็คือ เราจะคัดลอก startup script ของ postgres instance แรกที่มีอยู่เดิมมาแก้ไข เพื่อเป็น startup script สำหรับ Postgres instance อื่นๆครับ

การสร้าง systemd startup script สำหรับ PostgreSQL instance ที่สอง

1) เริ่มต้น เราต้องหา startup script ของ Postgres ในระบบ systemctl ของเดิมก่อนว่าอยู่ที่ไหน โดยเรียกใช้คำสั่ง systemctl postgresql status ตามตัวอย่างในรูป


จากรูปตัวอย่างนี้ จะมีบรรทัดหนึ่ง ที่ขึ้นต้นด้วยคำว่า "Loaded:"  จะแสดงให้เห็นว่า startup script ของ PostgreSQL ดั้งเดิมอยู่ที่ไหน จากรูปจะอยู่ในกรอบสีเขียว ซึ่งก็คือ

/usr/lib/systemd/system/postgresql.service 

2)   หลังจากรู้ว่าเครื่อง Linux ของเรา ใช้ systemd startup script ชื่ออะไร อยู่ที่ directory ไหน  ก็ทำการ copy โดยใช้ชื่อใหม่ที่ไม่ซ้ากัน โดยตัวอย่างนี้ผมจะตั้งชื่อเป็น postgresql2.service และให้อยู่ที่ directory เดียวกันกับของเดิม (/usr/lib/systemd/system) โดยใช้คำสั่งตามนี้





ถึงจุดนี้ผมจะมี startup script สำหรับ postgresql instance ที่สอง อยู่ที่

/usr/lib/systemd/system/postgresql2.service 

3) ใช้โปรแกรม Editor ที่คุณถนัด ไม่ว่าจะเป็น vi, nano, pico ทำการเปิด startup script ของ Postgres instance ที่สอง ที่เราเพิ่ง copy มาทำการแก้ไข หาดูที่บรรทัด ที่ขึ้นต้นว่า

Environment=PGDATA=....

โดยแก้ ชื่อ directory ที่อยู่หลัง PGDATA= เป็นชื่อ Cluster Directory (PGDATA) ของ instance ที่สอง โดยจากบทความที่แล้ว ผมสร้างไว้อยุ่ที่ /pgdata2 เสร็จแล้วทำการ save 


4) กำหนดให้ startup script นี้ถูกเรียกทำงาน โดยอัตโนมัติ ตอนเครื่องถูก boot โดยใช้คำสั่ง

systemctl enable postgresql2 

โดย  postgresql2 เป็นชื่อ startup script ที่เราสร้างและแก้ไขเรียบร้อยแล้วก่อนหน้านี้

หมายเหตุ 
1) เราสามารถละ .service ไม่ต้องป้อนตอนเรียกใช้คำสั่ง systemctl ได้
2) ถ้าไม่ต้องการให้ service นี้ start โดยอัตโนมัติ ให้ข้ามขั้นตอนนี้ไป  
ตัวอย่างเช่น


5) เสร็จแล้วทดลอง start postgresql2 service ได้โดยใช้คำสั่ง

systemctl start postgresql2 

ตามตัวยอย่างนี้



 ถ้า service  ถูก start สำเร็จคำสั่งนี้จะไม่แสดงผลลัพท์อะไร

6) ตรวจสอบ service postgresql2 ว่าถูก  start หรือไม่ โดยใช้คำสั่ง

systemctl status postgresql2 

ถ้า postgresql instance ที่สอง ถูก start ผ่านทางคำสั่ง  systemctl  หรือถูก auto start ผ่านทาง systemd จะเห็น output ของคำสั่งคล้ายกับตัวอย่างนี้