1 高可用弹性伸缩实践
- 背景
弹性伸缩是云服务架构的重要优势,能够很好的解决高并发场景下的性能瓶颈, 同时节省运营成本。
在 IaaS 端,能够弹性伸缩的最实用的产品形态,一般是虚拟机编组。阿里云提供了弹性伸缩的功能。
要实现弹性伸缩服务, 还需要负载均衡器作为辅助组件,它可以将流量均匀地,或者按照一定权重或规则,分发到多台虚拟机上。
- 创建ECS实例
实例创建完成之后, 需要绑定弹性IP
如果没有弹性公网IP, 需要付费开通:
- 创建负载均衡SLB
根据实际场景, 选择对应的实例规格。
在实例管理里面,选择【点我开始配置】
协议监听配置:
这里配置的80端口, 可以根据需要, 在高级配置里面, 设置不同的调度算法: 加权轮询 (WRR)、加权最小连接数 (WLC)、轮询 (RR)、一致性哈希 (CH)。
接下来, 设定ECS服务的运行端口:
开启健康检查:
最后确认提交即可。
- 配置服务运行方式(服务部署方式)
- 编写服务接口
计算斐波那契数列:
public int fibonacci(int n){ if(n==1||n==2){ flag[n]=1; return 1; } else{ if(flag[n-1]!=0&&flag[n-2]!=0){ flag[n]=(flag[n-1]+flag[n-2])%10007; return flag[n]; } else { flag[n]=(fibonacci(n-2) + fibonacci(n-1))%10007; return flag[n]; } } }
- 打包上传服务
maven clean install
- 设置开机启动
创建开机脚本:
vi /usr/lib/systemd/system/elastic.service
添加以下内容:
[Unit] Description=elasticservice After=network.target remote-fs.target nss-lookup.target [Service] Type=simple PIDFile=/run/elasticservice.pid ExecStart=/usr/local/elasticstart.sh ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID ExecReload= PrivateTmp=true RemainAfterExit=yes ExecStartPre= [Install] WantedBy=multi-user.target
创建elasticstart.sh脚本:
#!/bin/bash
nohup /usr/bin/java -jar /usr/local/app-basic.jar >/dev/null 2>&1 &
设置权限:
chmod 777 /usr/local/elasticstart.sh
设置开机启动:
systemctl enable elastic
启动服务:
systemctl restart elastic
- 测试验证(服务部署方式)
通过接口进行访问:
http://47.105.205.141/calcFib?num=123
- 配置服务运行程序(非服务部署方式)
进入ECS虚拟机, 创建配置一个Nodejs服务。
- 配置NodeJS环境
下载:
wget https://nodejs.org/dist/v10.13.0/node-v10.13.0-linux-x64.tar.xz
解压:
tar -xvf node-v10.13.0-linux-x64.tar.xz
创建软链接:
ln -s /usr/local/node-v10.13.0-linux-x64/bin/node /usr/bin/node
ln -s /usr/local/node-v10.13.0-linux-x64/bin/npm /usr/bin/npm
- 安装运行模块依赖
npm install express
npm install ip
npm install os
- 创建server.js脚本:
vi /usr/local/server.js :
const express = require('express'); const ip = require('ip'); const os = require('os'); const app = express(); //使用递归方式计算斐波那契数列 function fibo (n) { return n > 1 ? fibo(n-1) + fibo(n-2) : 1; } app.get('/', function(req,res) {res.write('I am healthy'); res.end();} ); app.get('/fibo/:n', function(req, res) { var n = parseInt(req.params['n']); var f = fibo(n); res.write(`Fibo(${n}) = ${f} \n`); res.write(`Server: ${os.hostname()} , private ip: ${ip.address()} \n`); res.end(); }); app.listen(80);
- 运行程序
node server.js
- 设置开机启动
创建开机脚本:
vi /usr/lib/systemd/system/nodeapp.service
添加以下内容:
[Unit] Description=nodeappservice After=network.target remote-fs.target nss-lookup.target [Service] Type=simple PIDFile=/run/nodeapp.pid ExecStart=/bin/setsid /usr/bin/node /usr/local/server.js Restart=/bin/pkill node && /bin/setsid /usr/bin/node /usr/local/server.js ExecStop=/bin/pkill node ExecReload= PrivateTmp=true RemainAfterExit=yes ExecStartPre= [Install] WantedBy=multi-user.target
设置开机启动:
systemctl enable nodeapp