เปิด SSH Tunnel port ให้รับ connection จากเครื่องอื่นๆได้

ปกติการสร้าง SSH Tunnel จะมีเอาไว้เพื่อให้เครื่องตัวเองใช้งานเพื่อทะลุไปยังเครื่องปลายทางที่ต้องการโดยการเปลี่ยน port ที่เชื่อมต่อ เช่น

ssh -L 3307:TARGET-IP:3306 USER@CURRENT-IP -N

แบบนี้ คือการเปิด port 3307 ที่เครื่องตัวเอง ถ้ามีการใช้งาน port 3307 จะเสมือนว่าทำงานอยู่บน TARGET-IP ที่ port 3306 เลย หรือ พูดอีกแบบกลับกันคือ เราสามารถทำงานกับข้อมูล บนเครื่อง TARGET-IP ที่ port 3306 ได้จาก port 3307 ในเครื่องตัวเอง

ทีนี้ถ้าเราต้องการให้เครื่องเรารับ connection จากเครื่องอื่นๆได้ละ เสมือนว่ากำลังจะทำให้ตัวเองเป็น proxy เพื่อผ่านต่อไปเครื่องอื่น หรือ โจทย์คือ

ทำอย่างไร ให้เครื่องใครก็ได้ ใช้งานข้อมูลของ TARGET-IP ,port 3306 ได้จากการเชื่อมต่อเข้ามาที่ เครื่องนี้ ที่ port 3307

กรณีแบบนี้จะใช้ในกรณีที่เครื่องที่ออก internet ไปข้างนอกได้รับอนุญาตเพียงเครื่องเดียว(คือเครื่องที่ใช้งานอยู่นี้) ทุกเครื่องจึงต้องมาอ้อมผ่านเครื่องนี้ เพื่อออกไปทำงานอื่นๆที่ข้างนอกได้

วิธีการ setup ก็มีไม่กี่ขั้นตอน ขั้นแรก คือเปลี่ยน Command ให้เป็นแบบนี้

ssh -R "[::]:3307:TARGET-IP:3306" USER@CURRENT-IP -N

ก็คือเปลี่ยน -L ให้เป็น -R และเติม binding IP เข้าไป กรณีนี้ผมใช้ [::] หมายถึงรับ connection หมดเลย ทั้ง ip v4 v6 และทุก subnet ip

จากนั้นอีกสิ่งที่ต้องทำคือ เปลี่ยนค่า config ใน /etc/ssh/sshd_config ให้เป็นดังนี้

GatewayPorts yes

โดยปกติจะเป็น no แล้ว restart sshd และอย่าลืม เปิด firewall port 3307 ให้รับ connection จากเครื่องอื่นๆด้วย ก็เรียบร้อย ใช้งานได้ครับ

Redis automatic shutdown on CentOS 7

I found this problem on myself.

Fresh install CentOS 7 with latest update and clean install Redis 4.10.0 then it automatic shutdown by log ‘Received SIGTERM scheduling shutdown’

Full log are

8570:signal-handler (1529821941) Received SIGTERM scheduling shutdown...
8570:M 24 Jun 13:32:21.211 # User requested shutdown...
8570:M 24 Jun 13:32:21.211 * Removing the pid file.
8570:M 24 Jun 13:32:21.211 # Redis is now ready to exit, bye bye...

Easy solution just change config daemonize to yes.

It working without automate shutdown.

แด่ programmer ผู้สับสนในชีวิต

manager or specialist

น้องที่เคยทำงานด้วยกันมาปรึกษา ด้วยคำถามง่ายว่า “ทำไมงานคุยกับคนแม่งยากจังวะพี่” ผมก็ตอบไปสั้นๆว่า “ถ้าเอ็งจะเป็น manager เองก็ต้องเจอเรื่องแบบนี้แหล่ะ” แล้วผมก็คุยต่ออีกพักนึง เลยคิดว่า เอาเรื่องนี้มาเล่าให้ทุกคนได้ฟังดีกว่า เพราะว่าคำถามนี้ “ผมผ่านมันมาก่อนแล้ว” โดยผมจะเขียนเนื้อหานี้ เพื่อให้ programmer/developer/manager ที่กำลังตัดสินใจว่าตัวเองจะเลือกเดินทางไหน ระหว่าง manager หรือ specialist เพราะมันจะมีผลในระยะยาวต่อหน้าที่ การงาน การเติบโตต่างๆทั้งหมด

อ่านต่อ… “แด่ programmer ผู้สับสนในชีวิต”

เริ่มต้นใช้ AWS Amazon S3 – Storage

S3 เป็นชื่อ Storage service ของ AWS เป็นเครื่องมือที่ใช้ง่าย ทำความเข้าใจง่าย และมีโอกาสได้ใช้บ่อยมาก วันนี้มาทำความรู้จักกัน

อ่านต่อ… “เริ่มต้นใช้ AWS Amazon S3 – Storage”

เริ่มต้น Python มือใหม่ แบบง่ายๆ แต่เจ๋ง

Jupyter Notebook

วันนี้จะมาแนะนำการรัน python ง่ายๆ ด้วยเครื่องมือ Jupyter Notebook ที่มันจะทำให้ Python ของเรา เจ๋งกว่า python ปกติมากๆ

อ่านต่อ… “เริ่มต้น Python มือใหม่ แบบง่ายๆ แต่เจ๋ง”

redis กับ MongoDB เปรียบเทียบ ใช้ตัวไหนดีกว่ากัน

presented-by

คำถามยอดฮิด ผมเองก็เคยถามตัวเองเหมือนกัน ว่าเราจะเลือกได้อย่างไร ว่าเราจะใช้ redis หรือ MongoDB ดีกว่ากัน

ก่อนอื่น คงต้องให้คนอ่านทำความเข้าใจก่อน ว่า redis คืออะไร คือ database ที่ทำงานได้เร็วมาก และ mongoDB คืออะไร และตัวอย่าง mongoDB

เก็บข้อมูลถาวรหรือเปล่า

ง่ายมาก ถ้าข้อมูลที่เราต้องทำงานด้วยเป็นข้อมูลที่สำเนาชุดเดียว ไม่มีเก็บที่อื่นอีก อันนี้ MongoDB แน่นอนเพราะ มีความน่าเชื่อถือในการเก็บข้อมูลถาวรมากกว่า redis

ต้องการความเร็วสุดๆมั้ย

ถ้าต้องการความเร็วสุดๆ Redis ให้คุณได้มากกว่า MongoDB อย่างแน่นอน ทั้งอ่านและเขียนเลย โดยเฉพาะเมื่อเรา config ให้ redis ทำงานบน ram อย่างเดียวแล้วจะเร็วกว่ามากๆ และไม่รวนด้วย

ความซับซ้อนของข้อมูลที่เก็บ

ทั้ง redis ,mongoDB รองรับการเก็บข้อมูลเชิงโครงสร้างที่ซับซ้อนระดับหนึ่งทั้งคู่ คือไม่ใช่แค่ key value อย่างเดียว มี field ต่างๆด้วยในด้วย ถือว่า ข้อนี้ให้เสมอกัน

ความหลากหลายในการทำงาน

ข้อนี้ redis กินขาดเลย เพราะว่า redis รองรับการทำงานที่หลากหลาย ทั้ง sort, set, list, pub/sub และอื่นๆ ที่ต่างจาก mongoDB ทำงานเน้นที่ storage เป็นหลักเลย

ขนาดของข้อมูล

ถ้าใหญ่ ให้ mongoDB เลย เพราะ redis ทำงานบน RAM ที่ราคาแพงกว่า Harddisk/SSD มากๆ ทำให้ทรัพยากรที่รองรับการทำงานมีจำกัดด้วย

ความนิยม

mongoDB ได้รับความนิยมกว่ามาก คนใช้เยอะ คู่มือหลากหลาย ตัวอย่างอีกเพียบ redis ก็ยังตามมาอยู่ห่างๆ ไม่ได้หยุดอยู่กับที่

ความยากง่ายในการใช้งานจริง

ถ้าเป็นคนที่เข้าใจการใช้งานแล้ว (ไม่พูดถึงมือใหม่) redis ใช้งานง่ายกว่ามากๆ เพราะคำสั่งที่ให้จำเพิ่มมีไม่เยอะ และตรงไปตรงมา เงื่อนไขเวลาทำงานก็แทบไม่มีเลย

แล้วทำไมต้องเลือก database ตัวเดียว?

ข้อนี้ผมอยากให้ทุกคนที่ได้อ่าน ลองคิดสักนิดหนึ่ง ทุกอย่างในโลกไม่ได้มีคำตอบเดียว ระบบต่างๆ ก็ไม่จำเป็นต้องทำงานบน database ชนิดเดียว ผมมีงานหนึ่งที่ implement ให้ลูกค้า ราคา project นี้หลายแสนบาท ผมทำงานอยู่คนเดียวทั้งหมด ผมใช้ database MySQL + Redis โดยแบ่งส่วนการทำงานจากกันเป็นส่วนๆ เช่น เก็บข้อมูลถาวรก็เก็บลง MySQL เวลาใช้งานก็อ่านขึ้นมาเก็บ Redis จากนั้นก็อ่านจาก redis ตลอดไป เหล่านี้เป็นต้น ซึ่งถ้าคุณทำงานแล้วจะใช้ MySQL + mongoDB + Redis + memcache ก็ไม่ผิด แต่ต้องแยกแยะให้ออกว่า จังหวะไหนต้องใช้ตัวไหน เพราะการที่เรามี database หลากหลาย นั่นหมายถึงการ maintenance ยากและใช้เวลามากขึ้นรวมถึงใช้ resource ที่มากขึ้นด้วย

ดังนั้น อยากให้พิจารณาที่เรื่องการออกแบบเชิง software architecture มากกว่า เพราะว่าสุดท้ายเมื่อเราออกแบบเสร็จและพิจารณาจากการใช้งาน ความถี่ ขนาดของข้อมูลและอื่นๆแล้วเราก็จะได้คำตอบเอง