ครั้งที่แล้วพาเล่น MQTT Cluster กันไปบ้างแล้ว ครั้งนี้เรามาลองวิธีง่ายๆ โดยใช้บริการของ AWS กันบ้าง AWS เครื่องมือพร้อมสำหรับการทำ Load Balance และการทำ Auto Scaling มาให้ด้วย เพราะฉนั้นการทำ Horizontal Scaling จะทำได้ง่ายมากๆ เพียงแค่คลิกเท่านั้นเอง จากภาพเดิมเราจะ Scale MQTT Broker โดยใช้ Elastic Scaling ของ AWS กัน

เนื้อหาไม่รวม Authentication, Secure Connection สำหรับ Persistance Storage คุณอาจเลือกใช้ DynamoDB หรือ RDS ได้ หากต้องการใช้ MongoDB Cluster อ่าน Reference Guide เพิ่มเติมได้ที่ MongoDB บน AWS Cloud

ขั้นตอนมีดังนี้

  • สร้าง instance พร้อม private network 2 เครื่อง
  • ติดตั้ง MongoDB ไปยังเครื่องที่ 1 เพื่อใช้เป็น Persistent Storage
  • ติดตั้ง Ponte ไปยังเครื่องที่ 2 ตั้งค่าเก็บข้อมูลมายังเครื่องที่ 1
  • สร้าง Snapshot ของเครื่องที่ 2
  • สร้าง Scaling Groups กำหนดขนาดของและเงื่อนไขในการ Scale
  • สร้าง Load Balancer และเพิ่ม instance ที่ Scaling Groups สร้างมาให้
  • กำหนด Load Balancer ให้ Scaling Groups ใช้เป็น Elastic Scaling

มาลงมือกันได้เลย เลือก EC2 จากนั้นสั่ง Launch Instance

เลือก AIM ใช้ Ubuntu 64bits

เลือกขนาด instance

กำหนดจำนวนที่ต้องการสร้าง

กำหนดขนาดของ Storage

กำหนดชื่อ Instance

กำหนด Security Group เปิดพอร์ท 27017 และ 22

กำหนด ssh key และสั่ง Launch ได้เลย

เราจะได้ instance แรกดังนี้

จากนั้นให้ ssh เข้าไปติดตั้ง MongoDB ดังนี้

sudo apt-get update

sudo apt-get install mongodb

แก้ไข /etc/mongodb.conf ให้ mongodb bind ที่ private network ดังนี้

bind_ip = 127.0.0.1,[EC2 Instance IP Address]

สั่ง restart mongodb

sudo service mongodb restart

สร้าง Instance ที่ 2 สำหรับ Ponte สั่ง Launch Instance เลือก AIM ใช้ Ubuntu 64bits

กำหนดจำนวนที่ต้องการสร้าง

กำหนดขนาดของ Storage

กำหนดชื่อ

กำหนด Security Group เป็น MQTT เปิด port 3000, 1883, 22

กำหนด ssh key และสั่ง Launch ได้เลย เราจะได้ instance ดังนี้

จากนั้นให้ ssh เข้าไปติดตั้ง Ponte ดังนี้

sudo apt-get update

sudo apt-get install libzmq-dev build-essential nodejs npm

sudo ln -s /usr/bin/nodejs /usr/bin/node

sudo npm install -g ponte bunyan

สร้างไฟล์ config.cfg กำหนดให้ Ponte เก็บข้อมูลไปยัง persistence storage คือ MongoDB ของเรา แก้ไข ip address เครื่อง MongoDB ให้ถูกต้อง

แก้ไข /etc/rc.local เพิ่ม

/usr/local/bin/ponte -v -c /home/ubuntu/config.cfg | /usr/local/bin/bunyan

เพื่อให้ Ponte เริ่มทำงานทุกครั้งหลัง boot เครื่อง ทดสอบ reboot เครื่องเราจะพบว่า Ponte เริ่มทำงานแล้ว

กลับมาที่ AWS Console สั่งสร้าง snapshot เครื่อง Ponte คลิกขวาที่ Instance เลือก Image > Create Image

กำหนดชื่อ snapshot และขนาด

รอจนกระทั่งสร้าง Image เสร็จ

จากนั้นเราจะมาสร้าง Scaling Group เพื่อรองรับ Auto Scaling กัน คลิกไปที่ Auto Scaling Group

เลือก Create Launch Configuration

เลือก AMI ที่เราต้องการสร้าง Instance คือ Snapsot ของ Ponte

เลือกขนาด

กำหนดชื่อ Launch Configuration

กำหนดขนาด Disk ที่ใช้

เลือก Security Group กรณีนี้เป็น MQTT

ดูความเรียบร้อย กด Create ได้เลย

สร้าง Auto Scaling Group ตั้งชื่อและกำหนด Network ที่ใช้ ในกรณีที่ต้องการ scale 2 zone, balance 2 zone

กำหนด Scaling Policy เช่น CPU Load มากกว่า 70% ให้เพิ่ม 1 instance ถ้าลดลงมาต่ำกว่า 20% ให้ลดลง 1 instance เป็นต้น แล้วแต่ว่าจะกำหนด resource อะไรมาวัด

ตั้งชื่อ Scaling Group

กด Create Auto Scaling Group ได้เลย

เราจะพบว่า Auto Scaling พยายามสร้าง instance ให้ตรงกับ config ที่ตั้งไว้โดยการสร้าง instance ขึ้นมา 1 ตัว รอจนเสร็จ

ไปที่ Load Balancer เพื่อสร้าง Load Balance กัน กด Create Load Balancer

ตั้งชื่อ กำหนด port ให้ Load Balance และ port ของ instance

กำหนด Security Group คือ MQTT

กำหนด Health Check

เพิ่ม instace ที่ Auto Scaling Group สร้างมาให้ ชื่อ scl-mqtt

กำหนดชื่อให้ Load Balancer

จากนั้นสั่งสร้างได้เลย

กลับไปที่ Auto Scaling Group เพื่อกำหนด Elastic Load Balance แก้ไข Launch Configuration ใหม่ กำหนด Load Balancers เป็น lb-mqtt กำหนด Desied = 2 และ Min = 2 สั่ง Save

Auto Scaling Group จะเข้าใจว่ามี instance ไม่ครบเพราะค่า Desired เป็น 2 แต่มี instance อยู่แค่ตัวเดียว Auto Scaling Group จะสร้าง instance มาเพิ่มให้ตามค่า Desired

และเพิ่ม instance ใหม่ไปยัง Load Balance ให้อัตโนมัติ

จากนั้นลองใช้ URL ของ Load Balance ที่ได้มาลองสั่ง Pub/Sub กันดู

for i in {1..1000}; do mosquitto_pub -r -h lb-mqtt-939965735.ap-southeast-1.elb.amazonaws.com -t hello -m "hello-"$i ; done

และ

mosquitto_sub -h lb-mqtt-939965735.ap-southeast-1.elb.amazonaws.com -t hello

Comments are closed.