利用数据库自定义并发 bunket 功能

场景

防止由于停电后大规模 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;"
时间: 2025-01-26 17:09:48

利用数据库自定义并发 bunket 功能的相关文章

java struts2-怎样利用Java 中的struts2框架实现数据库中用户登录功能?

问题描述 怎样利用Java 中的struts2框架实现数据库中用户登录功能? 在Action中LoginAction怎样写? 配置文件中怎样写? 总体实现能够使数据库中已经存在的用户凭自己的密码与用户名登录成功呢?数据库是Oracle数据库.

阿里巴巴 JAVA开发手册 内含大量规范,应用范例.涉及数据库,高并发,集合,索引等等大量干货

  阿里巴巴 JAVA开发手册 Java开发手册 版本号 制定团队 更新日期 备  注 1.0.0 阿里巴巴集团技术部 2016.12.7 首次向Java业界公开 一.编程规约 (一)命名规约 1.  [强制]所有编程相关命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束. 反例:  _name  /  __name  /  $Object  /   name_  /  name$  /  Object$ 2.  [强制]所有编程相关的命名严禁使用拼音与英文混合的方式,更不允许直接使

PHP结合Mysql数据库实现留言板功能_php实例

先给大家展示下留言板效果图: 最近看了下PHP基础语法,就想利用这些基本东西实现留言板,也是对基础知识的一个巩固. 什么是留言板?一种可以用来记录,展示文字信息的载体. 现切入正题,说说本次留言板是怎么实现! 首先用户提交留言后,相关内容存入服务器,当他想看的时候后台再把所有留言读出来,最后显示在浏览器上,用户就可以看到留言了. 这其中后台需要便于读写数据的一个工具,我选择mysql数据库来帮助我完成这些事. 我写了主要是三个php文件,分别是: conn.php 连接数据库: addmsg.p

T-SQL语句实现数据库备份与还原功能

我是使用T-SQL语句方式来完成数据库备份还原的功能的. 需要指出下面这些存储过程是在网上搜索到的.谢谢代码的提供者.在此转载 利用T-SQL语句,实现数据库的备份与还原的功能 体现了SQL Server中的四个知识点: 1. 获取SQL Server服务器上的默认目录 2. 备份SQL语句的使用 3. 恢复SQL语句的使用,同时考虑了强制恢复时关闭其他用户进程的处理 4. 作业创建SQL语句的使用 1.得到数据库的文件目录 @dbname 指定要取得目录的数据库名 如果指定的数据不存在,返回安

利用PS CS6的新功能保持ICON细节饱满完美

  一些本来尺寸很大,质量很不错的高清png图片,经过缩小转为icon时却变得惨不忍睹(图标的细节损失严重)而当我们去看那些专业人士制作的icon时,却发现,对方制作的icon尺寸虽小,但是细节却保持的非常好,这里面难道有什么技巧么?今天分享一篇关于利用Photoshop cs6网格对齐功能绘制高清icon的文章. Photoshop CS6自发布以来,一直颇受好评,细心的朋友可能发现最新的PS CS6支持矢量对象绘制.变换时像素自动对齐网格,而且非常好用.PS CS6的像素自动对齐网格功能在绘

hibernate-eclipse如何利用数据库反向生成Hibernate多对多、一对多实体类(生成全部为int类型)。

问题描述 eclipse如何利用数据库反向生成Hibernate多对多.一对多实体类(生成全部为int类型). 如题 解决方案 如果你表的关系建好了,,直接通过dataSource就能反向生成了 解决方案二: Myeclipse 连接到你的数据库,在对应的表上右击,点hibernate reserve ,然后一步步操作下去,就会成功 解决方案三: /* SQLyog Ultimate v10.00 Beta1 MySQL - 5.6.26-log : Database - db_template

[WCF权限控制]利用WCF自定义授权模式提供当前Principal[实例篇]

在<原理篇>中我们谈到:如果采用自定义安全主体权限模式,我们可以通过自定义AuthorizationPolicy或者ServiceAuthorizationManager实现对基于当前认证用于相关的安全主体的提供,进而达到授权的目的.为了让大家对此有个更加深刻的认识,在这篇文章中我们会提供一个具体的例子.[源代码从这里下载] 目录: 一.创建自定义AuthorizationPolicy 二.创建自定义ServiceAuthorizationManager 三.通过自定义Authorizatio

利用jquery.autocomplete自动完成功能实现百度搜索下拉功能

利用jquery.autocomplete自动完成功能实现百度搜索下拉功能 --> <script language="网页特效" src="jquery.autocomplete.js"></script> <script> $().ready(function() {  $("#borough_name").autocomplete("z.php教程", {   minchars:

如何在多租户环境下使用数据库的闪回功能

编辑手记:对于数据库的闪回功能,可能大家都不陌生,那么如何在多租户环境下使用该功能,如果关闭了表空间的闪回功能,会给数据库带来哪些影响?我们一起来学习. 本文来自周四大讲堂内容整理. 我们先说一下Flashback这个单词,我们大家常称它为闪回,可能有的人称它为回闪.Flashback 是oracle 9i 版本开始提供的一项特性,利用oracle查询多版本一致的特点,实现从回滚段中读取一定的时间内在表中操作过的数据. Flashback Database是Oracle10g的新增功能,在启动F