ครั้งที่แล้วพาเล่น 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