cloudstack通过agent实现生产机远端控制功能

cloudstack_agent_gray

agent分别使用NioConnection派生的NioClient和NioServer管理出链接和入链接。

NioServer收到请求数据后通过配置的工厂(factory->agent.create)生产Task(ServerHandler),并执行,将Task数据交给AgentRequestHandler处理(最终是调用Agent.processRequest)。

若cmd非系统操作命令(cron,upgrade,shutdown等会有相应操作,不再往下走)则会调用实现ServerResource接口的相应资源操作插件处理。

而相应的资源插件则通过进一步调用libvirt、shell、python等等途径实现对生产机资源的管理。

哈哈,cloudstack代码涉嫌故意卖萌

cloudstack 4.2.1
AgentManagerImpl.java: 469

assert noDbTxn() : "I know, I know.  Why are we so strict as to not allow txn across an agent call?  ...  Why are we so cruel ... Why are we such a dictator .... Too bad... Sorry...but NO AGENT COMMANDS WRAPPED WITHIN DB TRANSACTIONS!";
Command[] cmds = commands.toCommands();
assert cmds.length > 0 : "Ask yourself this about a hundred times.  Why am I  sending zero length commands?";

虽然这样的报错不太恰当,不够简洁明确,但是我喜欢这样的态度和风格。
coding不应该是枯燥无趣的工作。

CloudStack Virtual Router功能分析

cloudstack_virtualRouter
  ①Virtual Router为一系统功能虚机,链接内网与外网.
  ②系统通过agent控制Virtual Router,如配置StaticNat时 routerMgr 会调用 agentMgr.send 把控制指令发送给Virtual Router 上的Agent 处理。
  ③Virtual Router的VM中包含DHCP、FW、NAT等多种网络服务。
  ④当vm添加网卡到network时,DHCP会在网桥的subnet上添加Host记录,实现内网IP、MAC、Name绑定。
  ⑤network分为基本共有共享和高级私有隔离。其中高级模式中每个用户都有一个独立的Virtual Router和subnet,而基本模式则为多用户共享。
  ⑥外网IP统一通过Virtual Router的Static Nat、LB、Port Forwarding关联到内网的一台或多台虚机上。

OpenVZ备份

一、fsfreeze
fsfreeze – suspend access to a filesystem (Linux Ext3/4, ReiserFS, JFS, XFS)
fsfreeze -f mountpoint
fsfreeze -u mountpoint
挂起被冻结的分区上的写操作,所有写动作被阻塞,直至分区被解冻

二、vzdump

  1.stop
  备份时停止VM,离线时间较长。
  
  2.suspend
  ①对于OpenVZ,这一模式使用rsync拷贝VM到一个临时位置(–tmpdir选项),然后挂起VM做第二次rsync同步改变的文件,最后VM继续运行,这一备份模式需要极小的离线时间,但需要额外的空间做VM拷贝
  
  ②对于Qemu,这一备份模式与stop很像,只是用suspend/resume代替stop/start.

  3.snapshot
  这一备份模式使用LVM2快照,不需要离线时间,但是需要LVM2并且要备份的卷所在的卷组中有足够的空闲空间做快照。
  
  4.Simply dump
  如果不使用stop/suspend/snapshot中任何一个模式,虽然也不需要离线时间,但不能保证数据的一致性,所以一般不使用。警告提示如下:
  WARN: online backup without stop/suspend/snapshot
  WARN: this can lead to inconsistent data

三、lvm snapshot

与LVM的突出有点对应,它也是配置起来最麻烦的:
使用LVM2和vzdump创建快照,源卷所在卷组需要有至少512M空闲空间,因为快照卷与源卷都是可写的,快照存在的时间内,他俩之间的差异要全部保存于快照卷的空间中,一旦快照卷空间用尽,快照将会立即变为不可用状态。所以,如果磁盘空间不是问题,那么请分配足够空间保证备份过程的安全。
用来存储备份的文件夹(一般为/vz/dump)应该与你备份的源文件夹(一般为/vz/private)不在同一卷组。

为什么nfs会拒绝nat连接?

mount.nfs: access denied by server while mounting 10.12.28.64:/home/nfs

并非是因为ip限制的关系,而是因为端口,查看syslog可以发现

Mar 10 15:49:44 server64 rpc.mountd[2056]: refused mount request from 10.12.28.107 for /home/nfs (/home/nfs): illegal port 52837

多方查证原来是因为client使用了大于1024的端口链接服务器。需要在exports加入insecure。
/home/nfs *(rw,insecure,sync,no_root_squash)

man里的解释:
secure This option requires that requests originate on an Internet port
less than IPPORT_RESERVED (1024). This option is on by default.
To turn it off, specify insecure.

而为什么nat端口会大于1024呢?0-1023叫做well-known ports,大多都有其专用用途,要知道在某些系统上普通用户甚至没有权限使用这些端口,而当使用NAT(Network Address Translation网络地址转换)方式上网的时候,因为要保证网关服务器可以正常对外服务,也为了避免混淆,所以才会将来自内网机器的IP和Port映射到网关服务器外网地址大于1024的端口上。

屏蔽掉网站莫名奇妙的访问

网站流量大是好事,但是如果全是无效的request则是一件很讨厌的事情。
就这个小站有好一段时间了总是收到莫名其妙的request。
比如:

111.252.4.139 - - [12/Feb/2014:11:20:37 +0800] "GET http://www.soso.com/ HTTP/1.1" 301 184 "http://www.soso.com/" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)" "-"

再比如:

172.246.113.194 - - [12/Feb/2014:11:31:37 +0800] "GET http://www.bing.com/search?q=CONTEMPLATES%20%22powered%20by%20wordpress%22&form=QBLH&filt=all HTTP/1.0" 301 184 "http://www.bing.com/" "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36" "-"

这些乱七八糟的东西之类的。
虽然我把所有没指定的域名请求都重定向到首页了,但是这一大堆垃圾的垃圾充满了我的access log,明显不是活人干的事,不知道它的目的是什么,这些流量即使重定向到首页也不会有有效的pv,很讨厌有木有?我的io可是要计数收钱的啊。
这是在攻击我吗?也不太像啊,这小vps真想攻击估计早挂了
(ps:现在知道是被当作代理服务器用了,但是request只有固定的几个,所以还是不像是活人干的)
今天烦得受不了了,决定处理一下,毕竟aws只有200w的免费io,万一哪天它发飙了我没注意就是要扣钱的啊。
因为GET http://*****这些肯定不是正常的通过浏览器发出的请求,所以也就好办了。
到处搜罗方法,开始在nginx配置文件里加入
阅读更多…

全局常量和局部常量的区别

局部const

[root@IDC-D-2270 czt]# cat clzd.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv) {
    const int a = 10;
    int *p = (int *) &a;
    cout << *p << " " << a << endl;
    cout << p << " " << &p << endl;
    *p = 20;
    cout << *p << " " << a << endl;
    cout << p << " " << &p << endl;
    return 0;
}
[root@IDC-D-2270 czt]# g++ clzd.cpp
[root@IDC-D-2270 czt]# ./a.out
10 10
0x7fff93f7736c 0x7fff93f77360
20 10
0x7fff93f7736c 0x7fff93f77360

神奇的事情发生了,const内容被通过指针改动,而且同一空间的内容竟然不同
首先,局部const虽然看上去与全局常量没有什么区别,但编译器在编译时会在栈区为其分配存储空间,所以局部const称作“只读”变量更为恰当。
其次,常量在编译时默认遇到取地址时会为其分配地址
所以这里修改的只是这个副本而本身并未改变
这是编译器优化的结果。被称作常量折叠const folding

全局const

[root@IDC-D-2270 czt]# cat clzd.cpp
#include <iostream>
using namespace std;
const int a = 10;
int main(int argc, char **argv) {
    int *p = (int *) &a;
    cout << *p << " " << a << endl;
    cout << p << " " << &p << endl;
    *p = 20;
    cout << *p << " " << a << endl;
    cout << p << " " << &p << endl;
    return 0;
}
[root@IDC-D-2270 czt]# g++ clzd.cpp
[root@IDC-D-2270 czt]# ./a.out
10 10
0x400b0c 0x7fffd7e4ae78
Segmentation fault

这里会发现,全局const在同样企图通过指针修改其值时会出现段错误,也就是说const全局常量存储空间在常量存储区段上分配,这才是纯粹的只读的常量,所以当企图通过指针修改常量存储区段上的数据时会出现段错误。当然世事无绝对,通过非常手段还是可以修改常量区段的。
阅读更多…

腾讯的codestar前端特工

早有耳闻一些大牛互联网公司会通过浏览器的调试console发布招聘信息。今天终于让我逮到一只!
不过web开发咱纯属票友,木有任何工作经验,全当娱乐。
w.qq.com是webqq的mini版。
tx_codestar_console
console里面输出的信息差点让我以为他被黑了。
其中链接有2,一个是招聘信息,一个是技术类闯关游戏。
由于人在公司,行事要低调,so,招聘页面没有看,反正前端的东西我就是个票友,就不奢望能高攀了。
但是票友也可以凑凑热闹嘛。
点开第二个链接,是封x公司给y特工的信。
tx_codestar_1
点下一章,来到“后门”,真的是个门而已。
阅读更多…

腾讯仓促上线理财通,不一会儿就挂了

余额宝这么火的东西,腾讯这个山寨大王肯定不会错过啊,不过经过灰度发布和几次(几次?)低调的测试,现在依然还是个瘸腿儿的产品,之前就有消息说是在和小米的合作中出现问题,而在今天的理财通抢红包的活动中,不到半小时就出现问题,转入的资金迟迟不到帐,资金明细也没有记录,这在9点红包开抢之前可都是实时无延迟的啊,随后理财通即关闭了转入操作。
QQ Photo20140122100652
哈哈,不用猜,肯定是系统挂掉了,关了接口之后后台一边对账一边改bug去了。
阅读更多…

文件系统的overlay概念

一个overlay分为上下两层,就跟手机贴膜差不多,不管表面被用成什么样,换层膜就恢复如初。
比如:
微软的EWF,重启还原。
openwrt的overlayfs或mini_fo,底层用压缩的、只读的squashfs文件系统,上面用可写的jffs2,用于恢复路由器的出厂设置。
qcow2文件带有backing_file属性的增量镜像等等等。
但是linux的liveCD镜像或WinPE却不是overlay,它们只是把需要写的目录挂成ramfs或tmpfs之类的内存盘而已。
阅读更多…