จะแยกเว็บเครื่องนึง Database อีกเครื่องนึงยังไงครับ

ใช้ Centos + Directadmin
ตอนนี้เว็บคนเข้าเยอะ อยากจะแยก database ไปอีกเครื่องนึง
ซื้อเครื่องมาลง os + directadmin เรียบร้อยแล้ว
อยากทราบว่าจะต้องทำไงต่อ จึงจะทำให้เว็บมาใช้ database ที่เครื่องใหม่ได้ครับ

  • ลง db (mysql?) ที่เครื่องสอง
  • ตั้งค่าให้ mysql ยอมให้เรียกผ่าน ip จากเครื่องแรกได้
  • สร้าง db, user & grant privileges ในเครื่องสอง ให้เหมือนเครื่องแรก
  • copy ข้อมูลใน db จากเครื่องแรก ไปเครื่องสอง
  • แก้ไขโค้ดที่เรียกใช้ db ที่เครื่องแรก แทนที่เรียก localhost ให้เรียกไปที่ ip ของเครื่องสอง

หมายเหตุ: การเชื่อมต่อ ควรผ่าน private ip (192.168.x.x) ซึ่งเอาสาย cross เสียบตรงจาก eth1 (เครื่อง 1) <----> eth1 (เครื่อง 2) หรือ อะไรทำนองนี้ครับ

ทำให้คุณ pizzaman ว่ามา
แต่ผมมีวิธีที่ง่ายกว่าการแก้ code ครับ
ใช้ unix2tcp ช่วย มันจะสร้าง unix socket ไว้ที่ web server แล้วก็ pass traffic ผ่าน tcp ไปเครื่อง database ให้

แต่… ระวัง ถ้า process มันดับ ก็ดับหมดเหมือนกันครับ

หลอก hosts ว่า localhost 127.0.0.1 เป็น 192.168.1.2 ไรงี้สิคับ อิอิ

DA รองรับการแยก db ไปอีกเครื่องอยู่แล้วครับ โดยที่เครื่อง db ไม่ต้องลง da
เพียงแค่แก้ไขไฟล์ /usr/local/directadmin/conf/mysql.conf ไฟล์เดียวครับ

แต่ควรทำตั้งแค่แรก เพราะมาทำทีหลังก็จะยุ่งยากเรื่อง permission ที่ต้องแก้ไขให้กับทุก database
และยังต้องไปแก้ไขไฟล์ db config ของ script php จาก localhost เป็น ip ของเครื่อง db ด้วย

unix2tcp ประมาณนั้น แต่…มันไม่ใช่การหลอกว่า 127.0.0.1 เป็น 192.168.1.2

มันคือการจำลอง socket ของ service อะไรก็ได้ที่เป็น unix socket แล้วแปลงให้กลายไปเป็น tcp ซะ เพื่อที่เราจะชี้ไปเครื่องไหนก็ได้ครับ

วิธีการนี้ผมเคยทำมาแล้ว และไม่กระทบ code ของลูกค้าเลย ลูกค้ายังคงเห็นว่าเรียกใช้งาน mysql แบบ unix socket ไปตามปกติ ยกเว้น บางรายที่เรียกใช้งานผ่าน tcp/ip แทน อันนี้คงต้องให้ลูกค้าแก้ไข ip นะครับ

ปล. ถ้าแจ้งลูกค้าให้แก้ไข ip ได้ ก็ควรจะทำครับ เพื่อลดโอกาสที่จะล่มเพราะว่า service ทั้งระบบจะมี depend on unix2tcp process ครับ ถ้า process ตัวนี้ดับ ก็ดับหมดอย่างที่บอกไป

ถ้าหลอกแบบนี้ จะมีผลกระทบมากครับผม

จะลองทำตามที่พี่ pizzaman แนะนำ ตอนนี้ติดที่ private ip มันยัง ping หากันไม่เจอครับ
ขั้นตอนที่ผมทำคือ
Server 1 มี IP จริงติดตั้ง DA แล้วสามารถทำงานได้ปกติแล้ว ทีนี้ก็ไป เพิ่ม ip 192.168.1.2 eth1
เครื่องนี้ใช้ APF เป็น Firewall

Server2 มี IP จริงติดตั้ง DA แล้วใช้งานในส่วนของมันได้ปกติแล้วครับ ที่ลง DA ไว้ด้วยเผื่อเวลาใช้งานจะได้สะดวกน่ะครับ
เครื่องนี้ใช้ KISS เป็น Firewall ไปเจอว่าเขาว่ากันว่า KISS ดีกว่า APF เลยลองดู
ทีนี้ก็เพิ่ม IP 192.168.1.3 eth1

เสร็จแล้วก็เสียบสายแลนด์จากเครื่องที่ 1 มาเครื่องที่ 2 โดยใช้สายแลนธรรมดา สาย CAT6 ( เคยเห็นมีคนโพสบอกว่าเครื่อง Dell สามารถใช้สายธรรมดาเสียบได้เลย มันจะครอสให้เองประมาณ ออโต้ครอสน่ะครับ )

ทีนี้ปัญหาตอนนี้คือ ผมเข้าเครื่องที่

เปิด port บน firewall หรือยังครับ?

^ เปิด FW หรือยังครับ

คนเราอ่านะ… หลอกสาวๆไม่พอ…ยังไม่หลอกเครื่องอีกนะ

แนะนำให้เพิ่มชื่อ lookup ใน /etc/hosts ลงไปว่า mysql_db

ตอนนี้ ping เจอแล้วครับ
ต้องไป all_host ในเครื่องที่ใช้ apf น่ะครับ

ส่วนเครื่องที่สองที่ใช้ KISS ก็ต้องไปเอา comment ของ eth1 ออกครับ

ทีนี้ขั้นตอนต่อไป

  • ตั้งค่าให้ mysql ยอมให้เรียกผ่าน ip จากเครื่องแรกได้
    ผม add % เข้าไปที่เครื่อง database แล้วครับ ซึ่งน่าจะทำให้เรียก database จากเครื่องแรกได้

  • สร้าง db, user & grant privileges ในเครื่องสอง ให้เหมือนเครื่องแรก
    ตอนนี้สร้าง db แล้ว จะ grant privileges ในเครื่องสอง ให้เหมือนเครื่องแรก ต้องใช้คำสั่งยังไงบ้างครับ

  • copy ข้อมูลใน db จากเครื่องแรก ไปเครื่องสอง
    db มีขนาด 500 กว่า MB ผมลองใช้ phpmyadmin dump มาไม่สำเร็จครับ
    พอจะมีวิธีไหนที่จะย้าย db จากเครื่องนึงไปเครื่องนึงตรง ๆ บ้างมั้ยครับ

อย่างที่พี่เขาว่าดีที่สุดแล้วครับ ง่ายๆ แก้ไฟล์เดียวบรรทัดเดียว
และที่สำคัญใครมาดูต่อจะได้ไม่งง อ่อมันอยู่ที่ไอพีนั้นนะ ไม่ใช่มานั่งงเป็นไก่ตาแตกหา db ไม่เจอ

copy ไปตรงๆเลยครับ มันน่าจะอยู่ที่นี่ /var/lib/mysql/dbname
ก็ copy ไปใส่เครื่องใหม่แล้วก็ chown -R mysql:mysql /var/lib/mysql/dbname
เพื่อความชัวร์รีสตาร์ท mysql ด้วยนะครับ

http://dev.mysql.com/doc/refman/5.1/en/grant.html

ถ้า root สามารถ ssh จากเรื่องแรกไปเครื่องสองได้ ก็ทำง่ายๆ ครับ

server 1# rsync -av -e ssh /var/lib/mysql/db_name 192.168.x.x:/var/lib/mysql/

(ลองดูครับ ไม่ได้เช็ค code)

หลายๆ ท่านแนะนำหลายๆ วิธี ดีครับ หลากหลายดี แชร์แนวทางกัน

เรื่องทุกเรื่อง มีวิธีการทำหลายแบบทั้งนั้น เลือกใช้ตามความถนัด และความเหมาะสม

ส่วนตัว อะไรทำง่ายๆ ได้ ก็จะพยายามทำให้ง่ายๆ ตามหลักการ KISS
เพราะ วันหลังจะได้ไม่งง ทั้งเรา และคนอื่นครับ