Category Archives: 学习

关于读书,关于学习。

在 OpenStack 官方的 RedHat/CentOS/Fedora 平台安装指南上,关于消息中间件里举例用的是 Qpid 所以我也就跟着用 Qpid 作为消息中间件,当然文档也指出了 RabbitMQ、ZeroMQ 均可以。后来才知道原来 RedHat 的 RDO 部署时用的就是 Qpid,不过 RDO 社区也有人指出 Qpid 存在一些 bug 影响使用,应当考虑 RabbitMQ 的文章(链接)。不是很清楚 RedHat 为什么选择 Qpid 作为默认,不过据小道消息说 Qpid 有 RedHat 在 support,我去翻了下 Qpid 托管在 Github 上的 Git 仓库,8个 contributor(让我这种混迹于 OpenStack 社区的人感觉规模真是……),只查到一个是受雇于 RedHat,倒是好几个摩根的……不过也许这就可以说明 RedHat 和 Qpid 关系不错了。

不管怎么样,我花了些时间,稍研究了下 Qpid,下面是一些笔记。 Read More →

实习的实验环境是VM vSphere,也就是在虚拟机上实验部署OpenStack,会遇到一些在安装说明上不涉及的问题,在这里记录下。

1. 启动虚拟机时显示 no valid host ,尽管机器是OK的。
如果是原模原样照着说明装必然会出此错误,因为虚拟机上启虚拟机只能使用qemu,而默认却并非如此,所以需要在 /etc/nova/nova.conf 里设置虚拟后台技术为qemu。

2. 启动了虚拟机后,ssh也能登进去,但是ping不出来。(似乎是这个症状)
vSphere建的网卡默认不是混杂模式,网卡如果不是混杂模式是不允许目的地址不是本机MAC的数据包通过网卡的,所以需要将本机的MAC设为混杂模式。

3. 启动虚拟机如果在计算节点启动,返回:Timeout while waiting on RPC response – topic: “network.compute1″, RPC method: “deallocate_for_instance” info: “
似乎是消息服务器的问题,看日志是rpc的call()等待超时,网上有人说是消息服务器崩溃了,需要重启所有服务,我稍微修改了了下代码,不断查日志,最后不知到是因为动哪的原因结果就好了。 Read More →

今天上午刚把Keystone装利索了,做了几个简单实验,因为实验室虚拟机紧张,也没拿别的机器去做测试,然后跑虚拟机的服务器又是个Windows Server,用起来不爽,自己机器和虚拟机不是一个网段的,ping都ping不同所以只能放弃别的实验了。

安装Keystone基本上很正常,按着官方的 OpenStack Installation Guide for Red Hat Enterprise Linux, CentOS, and Fedora – havana 在 CentOS6.5 上装没有遇到什么问题,唯一的问题就是设置了hostname为controller后,有几个设置操作涉及到这个controller,比如:
openstack-config --set /etc/keystone/keystone.conf \
sql connection mysql://keystone:KEYSTONE_DBPASS@controller/keystone

还有:
export OS_SERVICE_ENDPOINT=http://controller:35357/v2.0
请各位看官们注意,如果你没有设置hosts的话,这里是必然会有问题的,我开始不知道怎么图样图森破居然丧心病狂的以为OpenStack是不是如此牛X,居然能用hostname直接访问,就像loaclhost?后来才想起来localhost也是在hostname里定义的……所以不要忘了在hosts文件里加这么一行:
192.168.0.1 controller
这样后面的操作才能正常啊。当然,你也可以在操作时都用127.0.0.1,不过用controller显然更加赏心悦目啊。

然后,每跑完命令都可以在MySQL里看一看,正常的来说,走完Manual的整个keystone部分后 table status 应该是这样的:


+------------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+
| Name                   | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time         | Check_time | Collation         | Checksum | Create_options | Comment |
+------------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+
| credential             | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |            0 |  11534336 |           NULL | 2014-01-13 21:11:29 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| domain                 | InnoDB |      10 | Compact    |    1 |          16384 |       16384 |               0 |        16384 |  11534336 |           NULL | 2014-01-13 21:11:28 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| endpoint               | InnoDB |      10 | Compact    |    3 |           5461 |       16384 |               0 |        16384 |  11534336 |           NULL | 2014-01-13 21:11:28 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| group                  | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |        16384 |  11534336 |           NULL | 2014-01-13 21:11:28 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| group_domain_metadata  | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |        16384 |  11534336 |           NULL | 2014-01-13 21:11:28 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| group_project_metadata | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |        16384 |  11534336 |           NULL | 2014-01-13 21:11:28 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| migrate_version        | MyISAM |      10 | Dynamic    |    1 |            104 |         104 | 281474976710655 |         4096 |         0 |           NULL | 2014-01-13 21:11:26 | 2014-01-13 21:11:30 | NULL       | latin1_swedish_ci |     NULL |                |         |
| policy                 | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |            0 |  11534336 |           NULL | 2014-01-13 21:11:28 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| project                | InnoDB |      10 | Compact    |    2 |           8192 |       16384 |               0 |        16384 |  11534336 |           NULL | 2014-01-13 21:11:28 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| role                   | InnoDB |      10 | Compact    |    2 |           8192 |       16384 |               0 |        16384 |  11534336 |           NULL | 2014-01-13 21:11:29 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| service                | InnoDB |      10 | Compact    |    1 |          16384 |       16384 |               0 |            0 |  11534336 |           NULL | 2014-01-13 21:11:29 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| token                  | InnoDB |      10 | Compact    |   13 |           8822 |      114688 |               0 |        32768 |  11534336 |           NULL | 2014-01-13 21:11:29 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| trust                  | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |            0 |  11534336 |           NULL | 2014-01-13 21:11:29 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| trust_role             | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |            0 |  11534336 |           NULL | 2014-01-13 21:11:29 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| user                   | InnoDB |      10 | Compact    |    1 |          16384 |       16384 |               0 |        16384 |  11534336 |           NULL | 2014-01-13 21:11:30 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| user_domain_metadata   | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |        16384 |  11534336 |           NULL | 2014-01-13 21:11:29 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| user_group_membership  | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |        16384 |  11534336 |           NULL | 2014-01-13 21:11:29 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
| user_project_metadata  | InnoDB |      10 | Compact    |    1 |          16384 |       16384 |               0 |        16384 |  11534336 |           NULL | 2014-01-13 21:11:29 | NULL                | NULL       | utf8_general_ci   |     NULL |                |         |
+------------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+
 

你可以把表里面的值都翻出来看一看,与 kestone user-list 、 keystone tenant-list 什么的做个对比,可以看到 keystone 确实就是一直在搞数据库。然后假设你退出了(Verify 那一页的两个 unset),再登陆可以这样:
keystone --os-username=admin --os-password=ADMIN_PASS \
--os-auth-url=http://controller:35357/v2.0 token-get

或者:
keystone --os-username=admin --os-password=ADMIN_PASS \
--os-tenant-name=admin --os-auth-url=http://controller:35357/v2.0 token-get

不过最简单的:建立一个keystonerc,里面设置好:
export OS_USERNAME=admin
export OS_PASSWORD=ADMIN_PASS
export OS_TENANT_NAME=admin
export OS_AUTH_URL=http://controller:35357/v2.0

这样再登入只需要 source keystonerc 即可。 Read More →

这几天在实验室,调研OpenStack,主要研究Neutron,话说Neutron好多好多坑,现在还有很多人都只用nova-network不用Neutron/Quantom,大家似乎都认为小型网络/普通企业用nova-network就够用了,而且还能Multi-host。不过前几天看IRC上的讨论,似乎Neutron也可以了,将在Icehouse-2版完成?自己现在对OpenStack还了解甚少,希望将来能成长成大牛……

闲话少说了,OpenStack的数据库推荐是使用MySQL或PostgreSQL?以前为了测试直接在Ubuntu上用devstack装,装完对OpenStack的安装也没留下什么影响(推荐看脚本,但是脚本那么长,看起来好麻烦啊),这样挺不好的,于是今天跟着Manuals自己装下。

关于SQL自己以前只用过一点点SQLServer,所以对SQL不大懂,在这里留点笔记备忘。

MySQL安装:

基本不会有什么问题,跑下mysql_secure_installation,不过要记得自己设的root密码,其他按需求,基本能看懂。

MySQL登陆:

mysql –user=root –password=password db_name
把上面的password换成你上面设的root密码,dbname当然就是数据库名,
db_name是可以不写的,不过为什么不写?当然你也可以进去之后用 use + DB_NAME 来切换数据库。

MySQL基本操作:

进去之后想看目前已有的数据库可以输入show databases;
注意MySQL的命令是以“;”或“\g”结束的。
刚装完keystone而且没有删除test的话,应该输出如下字样:


+--------------------+
| Database           |
+--------------------+
| information_schema |
| keystone           |
| mysql              |
| test               |
+--------------------+
4 rows in set (0.00 sec)

因为我们的目的是对OpenStack二次开发和读懂源码,所以想看看keystone数据库的内容,比如看看keystone里有哪些表:show tables,输出:


+------------------------+
| Tables_in_keystone     |
+------------------------+
| credential             |
| domain                 |
| endpoint               |
| group                  |
| group_domain_metadata  |
| group_project_metadata |
| migrate_version        |
| policy                 |
| project                |
| role                   |
| service                |
| token                  |
| trust                  |
| trust_role             |
| user                   |
| user_domain_metadata   |
| user_group_membership  |
| user_project_metadata  |
+------------------------+

OK,那怎么显示下user这个表的结构呢? Read More →

当初看 Dive into Python 的时候就听过装饰器,不过知道是个语法糖,感觉上没什么用,就没仔细了解,这几天看一段代码用到了装饰器,只好再研究下吧。

为什么使用装饰器?

AstralWind 在他的博客里这么说,“装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。”

打个比方,我是个有怪癖的人,在调用任何函数的时候总希望先输出函数的name和doc,因为我常常反复传递函数,所以最好把这个函数的引用计数也显示下?要么把函数运行时间也显示出来吧!

如果不用装饰器,我们可能在写函数的时候把name、doc什么的都print出来,这样有些麻烦,写多少个函数就得copy多少次,利用Python万物皆对象的特性,我们不妨写个函数来做这件事情:

不过这样在调用函数的时候总得先把函数传给PrintDetail(),既不美观也不方便,那么是时候让装饰器登场了:

这里我们定义了装饰器,不过,等等,我运行完发现怎么我还没调用func,他就运行了?
上面这个装饰器是不合格的,如果你尝试去掉用的话,甚至会发现装饰器只会调用一次。
这是因为我们还没弄清楚究竟什么时装饰器,我先提供一个正确的装饰器:

为什么要提供_PrintDetail,而且还要把它返回?
为什么现在看起来就不会没调用自动运行?
为什么现在多次运行都可以自动调用装饰器了?

虽然没有读过Python关于这部分的源码,但是大概可以推测出Python涉及到装饰器时怎么工作的:
Read More →