天天看点

openstack快速更改虚拟机配置

在使用nova resize去修改虚拟机的配置的时候,实际调用的是migrate的代码。

  在默认情况下,执行resize的时候,首先会进行磁盘disk镜像和后端镜像进行一个合并成raw,然后转换成qcow2的过程。而且会进行迁移的动作。整个过程会相当的消耗时间,而且我们一般只需要修改cpu和mem的大小,并不需要去合并镜像,更不需要去做迁移。

总之,在单台宿主机上去进行nova resize是一件很让人蛋碎的事情。

事实上,在reboot一个instance的时候,这个instance的libvirt.xml(只考虑kvm环境)会重新从数据库中生成。所以只需要修改数据库就行了。

附上pyhon修改数据库脚本:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

<code>import</code> <code>MySQLdb,sys</code>

<code>ip </code><code>=</code> <code>sys.argv[</code><code>1</code><code>]</code>

<code>size </code><code>=</code> <code>sys.argv[</code><code>2</code><code>]</code>

<code>size_info</code><code>=</code><code>{</code><code>'1'</code><code>:</code><code>'55800df7-5579-45c3-b4b3-584454aa2b77'</code><code>,</code>

<code>           </code><code>'2'</code><code>:</code><code>'6fe54364-e066-460b-89a2-ffe19cb26ae7'</code><code>,</code>

<code>           </code><code>'4'</code><code>:</code><code>'7a457be6-b1a0-48cd-88e1-c4e21d0518c1'</code><code>,</code>

<code>           </code><code>'6'</code><code>:</code><code>'7105ad91-3e49-43ed-9575-1a0535694578'</code><code>,</code>

<code>           </code><code>'8'</code><code>:</code><code>'61fc938c-234a-406b-b102-d535264e914d'</code><code>,</code>

<code>           </code><code>'12'</code><code>:</code><code>'dc5ffd92-eedf-4851-a40a-90e657f799a2'</code><code>,</code>

<code>           </code><code>'16'</code><code>:</code><code>'5c7af872-2089-4ece-bba7-4099d2a3ef24'</code><code>,</code>

<code>          </code><code>}</code>

<code>to_size </code><code>=</code> <code>size_info[size]</code>

<code>get_flavor_info_sql</code><code>=</code><code>"select </code><code>id</code><code>,memory_mb,vcpus </code><code>from</code> <code>instance_types \</code>

<code>                    </code><code>where flavorid </code><code>=</code> <code>'%s'</code><code>;" </code><code>%</code> <code>\</code>

<code>                    </code><code>to_size</code>

<code>class</code> <code>mysqlEng():</code>

<code>    </code><code>def</code> <code>__init__(</code><code>self</code><code>,host</code><code>=</code><code>'127.0.0.1'</code><code>,user</code><code>=</code><code>'root'</code><code>,passwd</code><code>=</code><code>'</code><code>',db='</code><code>None</code><code>',port='</code><code>3306</code><code>'):</code>

<code>        </code><code>self</code><code>.conn </code><code>=</code> <code>MySQLdb.connect(host</code><code>=</code><code>host,user</code><code>=</code><code>user,passwd</code><code>=</code><code>passwd,db</code><code>=</code><code>db,port</code><code>=</code><code>3306</code><code>)</code>

<code>        </code><code>self</code><code>.cur </code><code>=</code> <code>self</code><code>.conn.cursor()</code>

<code>    </code><code>def</code> <code>select(</code><code>self</code><code>,sql</code><code>=</code><code>'show tables;'</code><code>):</code>

<code>        </code><code>self</code><code>.cur.execute(sql)</code>

<code>        </code><code>ret </code><code>=</code> <code>self</code><code>.cur.fetchall()</code>

<code>        </code><code>return</code> <code>ret</code>

<code>    </code><code>def</code> <code>update(</code><code>self</code><code>,sql</code><code>=</code><code>''):</code>

<code>        </code><code>self</code><code>.conn.commit()</code>

<code>    </code><code>def</code> <code>__del__(</code><code>self</code><code>):</code>

<code>        </code><code>self</code><code>.cur.close()</code>

<code>        </code><code>self</code><code>.conn.close()</code>

<code>mysql_object </code><code>=</code> <code>mysqlEng(host</code><code>=</code><code>'127.0.0.1'</code><code>,user</code><code>=</code><code>'root'</code><code>,passwd</code><code>=</code><code>'123456'</code><code>,db</code><code>=</code><code>'nova'</code><code>)</code>

<code>flavor_info </code><code>=</code> <code>mysql_object.select(get_flavor_info_sql)</code>

<code>flavor_id</code><code>=</code><code>flavor_info[</code><code>0</code><code>][</code><code>0</code><code>]</code>

<code>mem</code><code>=</code><code>flavor_info[</code><code>0</code><code>][</code><code>1</code><code>]</code>

<code>vcpus</code><code>=</code><code>flavor_info[</code><code>0</code><code>][</code><code>2</code><code>]</code>

<code>update_flavor_info_sql</code><code>=</code><code>"update instances </code><code>set</code> <code>instance_type_id</code><code>=</code><code>'%d'</code><code>,vcpus</code><code>=</code><code>'%d'</code><code>,memory_mb</code><code>=</code><code>'%d'</code> <code>\</code>

<code>                        </code><code>where hostname</code><code>=</code><code>'%s'</code> <code>AND vm_state !</code><code>=</code> <code>'deleted'</code> <code>AND vm_state !</code><code>=</code> <code>'error'</code><code>;" </code><code>%</code> <code>\</code>

<code>                        </code><code>(flavor_id,vcpus,mem,ip)</code>

<code>mysql_object.update(update_flavor_info_sql)</code>

<code>after_update_info_sql</code><code>=</code><code>"select vcpus,memory_mb </code><code>from</code> <code>instances \</code>

<code>                      </code><code>where hostname</code><code>=</code><code>'%s'</code> <code>AND vm_state !</code><code>=</code> <code>'deleted'</code> <code>AND vm_state !</code><code>=</code> <code>'error'</code><code>;" </code><code>%</code> <code>\</code>

<code>                      </code><code>ip</code>

<code>after_update_info </code><code>=</code> <code>mysql_object.select(after_update_info_sql)</code>

<code>print</code> <code>'+'</code><code>*</code><code>80</code><code>+</code><code>'\n'</code>

<code>print</code> <code>"This server %s now flavor : cpu=%s , mem=%s\n"</code> <code>%</code><code>\</code>

<code>      </code><code>(ip,after_update_info[</code><code>0</code><code>][</code><code>0</code><code>],after_update_info[</code><code>0</code><code>][</code><code>1</code><code>])</code>

修改脚本中size_info里的对应openstack中flavor的id号,还有mysql_obejcet对象中的mysql相关信息

使用方式:python update_size.py  instance_name flavor

修改完成后必须使用nova reboot --hard instance_id 去重启,必须带上--hard去强制重启实例,不然不会生效。

本文转自lustlost 51CTO博客,原文链接:http://blog.51cto.com/lustlost/1367575,如需转载请自行联系原作者