博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用数据库自定义并发 bunket 功能
阅读量:4078 次
发布时间:2019-05-25

本文共 3103 字,大约阅读时间需要 10 分钟。

场景

防止由于停电后大规模 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=computesqlstartpath='/root/manager/get_status.sql'sqlendpath='/root/manager/end.sql'status='faile'if [ ! -d '/root/manager/' ]then    mkdir -p '/root/manager'ficat <
$sqlstartpathset @a='ok';use compute;call startup('$hostname',@a);EOFcat <
$sqlendpathuse compute;call startend('$hostname');EOFif [ ! -f "/usr/bin/mysql" ]then yum install -y mysql > /dev/null 2>&1fiwhile [ "$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 fidonestart_server messagebus messagebusstart_server libvirtd libvirtdstart_server openstack-nova-compute nova_computestart_server neutron-openvswitch-agent openvswitch_agentstart_server openvswitch openvswitchstart_server openstack-ceilometer-compute ceilometer_computemysql -h $sql_server -u $sql_user -p"$sql_passwd" --skip-column-names $sql_db -e "source $sqlendpath;"

转载地址:http://ronni.baihongyu.com/

你可能感兴趣的文章
.net强制退出主窗口的方法——Application.Exit()方法和Environment.Exit(0)方法
查看>>
c# 如何调用win8自带的屏幕键盘(非osk.exe)
查看>>
build/envsetup.sh 简介
查看>>
Android framework中修改或者添加资源无变化或编译不通过问题详解
查看>>
linux怎么切换到root里面?
查看>>
linux串口操作及设置详解
查看>>
安装alien,DEB与RPM互换
查看>>
编译Android4.0源码时常见错误及解决办法
查看>>
Android 源码编译make的错误处理
查看>>
linux环境下C语言中sleep的问题
查看>>
ubuntu 12.04 安装 GMA3650驱动
查看>>
新版本的linux如何生成xorg.conf
查看>>
xorg.conf的编写
查看>>
启用SELinux时遇到的问题
查看>>
virbr0 虚拟网卡卸载方法
查看>>
No devices detected. Fatal server error: no screens found
查看>>
新版本的linux如何生成xorg.conf
查看>>
virbr0 虚拟网卡卸载方法
查看>>
Centos 6.0_x86-64 终于成功安装官方显卡驱动
查看>>
Linux基础教程:CentOS卸载KDE桌面
查看>>