利用数据库自定义并发 bunket 功能
2015-09-24 16:00
330 查看
场景
防止由于停电后大规模 HV 启动, 导致 OPENSTACK NEUTRON SERVER 服务由于 HV 并发注册量太大而拒绝服务
思路
1. 数据库中创建表, COUNT, 列 id int 表中定义并发量, (例如 30)
2. 当 HV 启动时候, 假如需要启动 NEUTRON 服务, 则先要向 COUNT 表中获得信息,
假如 count.id 中值 > 1 , 则可以获得启动权限, 并 count.id -1,
当 neutron 服务注册完成, 则向数据库执行 count.id +1
参考表结构
参考存储过程
获得 bunket 数据的存储过程
完成neutron 注册后回调 bunket 的存储过程
参加 compute 节点启动时候的启动脚本
防止由于停电后大规模 HV 启动, 导致 OPENSTACK NEUTRON SERVER 服务由于 HV 并发注册量太大而拒绝服务
思路
1. 数据库中创建表, COUNT, 列 id int 表中定义并发量, (例如 30)
2. 当 HV 启动时候, 假如需要启动 NEUTRON 服务, 则先要向 COUNT 表中获得信息,
假如 count.id 中值 > 1 , 则可以获得启动权限, 并 count.id -1,
当 neutron 服务注册完成, 则向数据库执行 count.id +1
参考表结构
用于做 bunket 算法 create table count ( id int ) engine innodb; mysql> desc count; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 1 row in set (0.00 sec) 用于做数据记录的表, 可有可无 CREATE TABLE node ( id int(11) DEFAULT NULL, name varchar(50) DEFAULT NULL ) ENGINE=InnoDB; mysql> desc node; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(50) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
参考存储过程
获得 bunket 数据的存储过程
drop procedure startup; delimiter // create procedure startup( in d varchar(50), out n varchar(5) ) begin declare a int; declare b int; declare c varchar(50); select id into a from compute.count for update; set autocommit=0; if a > 0 then select name into c from compute.node where name=d; if c is null then set b=a-1; insert into compute.node values ( a, d); update compute.count set id=b; set n='ready'; else set n='faile'; end if; end if; commit; select n from dual; end // delimiter ;
完成neutron 注册后回调 bunket 的存储过程
drop procedure startend; delimiter // create procedure startend( in d varchar(50) ) begin declare a int; declare b int; declare c varchar(50); select id into a from compute.count for update; set autocommit=0; set b=a+1; update compute.count set id=b; delete from compute.node where name=d; commit; end // delimiter ;
参加 compute 节点启动时候的启动脚本
#!/bin/bash # # source params <--- 注意: 公共变量, 公共函数存放的位置, 下文中缺的函数与变量都来自这里, 与整个算法无关, 忽略吧 service_type=compute sqlstartpath='/root/manager/get_status.sql' sqlendpath='/root/manager/end.sql' status='faile' if [ ! -d '/root/manager/' ] then mkdir -p '/root/manager' fi cat <<EOF > $sqlstartpath set @a='ok'; use compute; call startup('$hostname',@a); EOF cat <<EOF > $sqlendpath use compute; call startend('$hostname'); EOF if [ ! -f "/usr/bin/mysql" ] then yum install -y mysql > /dev/null 2>&1 fi while [ "$status" != "ready" ] do status=`mysql -h $sql_server -u $sql_user -p"$sql_passwd" --skip-column-names $sql_db -e "source $sqlstartpath;"` if [ "$status" != "ready" ] then sleep 5 fi done start_server messagebus messagebus start_server libvirtd libvirtd start_server openstack-nova-compute nova_compute start_server neutron-openvswitch-agent openvswitch_agent start_server openvswitch openvswitch start_server openstack-ceilometer-compute ceilometer_compute mysql -h $sql_server -u $sql_user -p"$sql_passwd" --skip-column-names $sql_db -e "source $sqlendpath;"
相关文章推荐
- MySQL Meta中的length字段 -- (4) 玩儿MySQL代码
- MySQL必知必会笔记(八)安全管理 数据库维护 改善性能
- Titan漫谈(二)——安装配置
- MySQL必知必会笔记(七)事务处理 全球化和本地化(字符集和校对)
- SQL Server中DateTime与DateTime2的区别是什么
- mysql安装及使用语句
- Oracle命令
- MySQL必知必会笔记(六)存储过程 游标 触发器
- MySQL必知必会笔记(五)插入数据 创建和操纵表
- 获取MS SQL TABLE列名列表
- MySQL必知必会笔记(四)SELECT语句 联结表 高级联结 组合查询 全文本搜索
- windows-----MySQL下载安装、配置与使用(win7x64)
- MySQL必知必会笔记(三)SELECT语句 计算字段 数据处理函数 汇总函数 分组数据 子查询
- mysql读写分离(一)----------mysql安装
- mysql中的多行查询结果合并成一个
- MySQL必知必会笔记(二)SELECT语句 检索 排序 过滤 通配符搜索 正则表达式搜索
- MySQL必知必会笔记(一)基础知识和基本操作
- 浅谈基于SQL Server分页存储过程五种方法及性能比较
- Redis(2.8.3) 命令学习 - Keys
- 问题:oracle LISTAGG 连接字符串;结果:Oracle 连接字符串的方法