PostgreSQL中国用户会DBA2000培训计划北京第二课笔记

18 Mar 2012 Posted in  database

运行维护

vacuum命令

pgsql是multi-version concurrency control的,update和delete的操作并不会真正的修改原版本的内容,而只是做一个标记,最后需要用vacuum命令回收失效版本的位置。
vacuum的主要作用:
1. 恢复或重用失效的空间;
2. 更新pgsql规划器的数据统计;
3. 避免事务ID的重复。
事务ID只有32位,差不多40亿左右。建议在达到10亿左右的时候就需要vacuum一次。
在version8.*之后,默认就是用auto vacuum。注意auto vacuum不是定时启动,而是触发式的。 继续阅读……


PostgreSQL中国用户会DBA2000培训计划北京第一课笔记

17 Mar 2012 Posted in  database

PostgreSQL及中国用户会简介

主讲人 李元佳 galy 继续阅读……


加强了解nginx的几个问题

10 Mar 2012 Posted in  nginx

被问到一些关于nginx或者说nginx运维相关的问题,记录下来几个值得思考的。这里面有些是自己曾经想到过但是浅浅的了解下就不放在心上的,有些是根本没想过这会成为一个”有意思”的问题的…… 继续阅读……


perl函数返回值引起的误会

04 Mar 2012 Posted in  perl

在微博上偶然看到有位@南唐古韵童鞋发了一条关于perl的: 继续阅读……


ZenLoadBalancer试用(一)

29 Feb 2012 Posted in 

在微博上看到一款叫做Zen LoadBalancer的负载均衡软件更新新闻。于是决定下载来看看,其官网地址是:http://www.zenloadbalancer.com/web/。具体的说,是基于Debian构建的TCP/UDP负载均衡,通过perl的CGI页面完成对负载均衡的管理和监控,包括cluster功能(类似keepalived双机)。对后端real server的监控通过的是nagios-plugins里提供的check_http/check_smtp/check_ftp等一系列脚本完成的。监控通过SNMP完成,展示图像是rrd和GD::Graph。唯一没法知道的就是做负载均衡核心功能的pen这个东东,因为提供的是iso镜像,安装完后就直接有二进制文件在了,不知道这个pen到底是怎么做的…… 继续阅读……


从wordpress博客迁移到github记录

14 Feb 2012 Posted in  perl

因为原先托管wordpress博客的阿里云主机被通管局要求备案,加上通管局早令夕改的浪费我来回的快递费,于是决定搬迁到国外,github page的免费托管就此进入我的视界。 继续阅读……


dotcloud试用

13 Feb 2012 Posted in  cloud

dotcloud是日本的一个PAAS厂商。一年多前因为plack作者的加入推出了对perl的支持。我这几个月没事做,今天想起来试试看。用起来确实蛮舒服的。(注:大部分内容是网上已经有了的,我这只是记录一下自己的步骤)
## 第一步,申请账号 继续阅读……


OMD系列(四)mod_gearman配置与运行

27 Dec 2011 Posted in  monitor

上一篇提到了shinken,这是一个完全重写过的nagios-like系统,如果想尽可能的在原有nagios知识基础上进行高性能的分布式扩展,那么可以使用mod_gearman模块。这个模块可以从github.com上直接获取使用,地址是:
https://github.com/sni/mod_gearman
当然,我们这里依然是直接采用了OMD分发的方式,事实上github上也是建议直接采用omd部署,包括升级也可以直接omd update~~(因为从源代码编译的话,在nagios3.2.2版本之前还需要打个patch才能支持eventhandler,既然都得重编译,直接搞新的得了)
在github的“How it works”和“Common Scenarios”两章节里,详细的用图例说明了mod_gearman的工作原理和各种配置情形。我这里就不重复贴了。大概的说,就是可以把nagios配置检测项中的hosts/services/eventhandlers/hostgroups/servicegroups都单独成队列,然后启动多个worker有针对性的完成队列里的任务,最后也是用单独的result队列回收检测结果。
嗯,从原理上来讲,hosts/services/eventhandlers的队列,属于load balance范围,而hostgroups/servicegroups的队列,属于distribute范围。
(mod_gearman还有send_gearman程序用来load balance接收NSCA分布式监控程序的数据,这里就不说了) 继续阅读……


OMD系列(三)shinken的discovery配置与运行

20 Dec 2011 Posted in  monitor

上篇说到OMD的可以通过omd config选择core,有nagios和shinken两个选项。shinken是一个完全重写的监控系统,但是在外部接口上,又是nagios-like的,甚至可以单纯的只用shinken的WebUI给nagios使。所以OMD作为nagios周边的项目,也就把shinken加入到core选项里了。
不过经过试验发现,虽然omd的rpm是针对centos5.5的,代码中调用的有些命令版本却比较高,比如nmap命令使用了–traceroute选项,查ChangeLog发现是4.76版才加上的,而centos5上面的还是4.11版,所以要重新安装: 继续阅读……


OMD系列(二)基础配置和目录介绍

20 Dec 2011 Posted in  monitor

话接上篇,在su和omd start之后,可以看到挂载的一个目录。其/omd是/opt/omd的软连接。目录结构如下: 继续阅读……


OMD系列(一)简介与安装

19 Dec 2011 Posted in  monitor

OMD,全称Open Monitoring Distribution,是一个围绕Nagios core构建的分布式开源监控集。在nagios基础上融合了NRPE、NSCA、check_mk、mod_gearman、pnp4nagios、nagvis、rrdcached等插件,以完成高性能的、可视化的,分权限管理的监控系统。
(我是在看mod_gearman的安装介绍时看到的,感觉这种一体式的安装很爽)
项目主页是http://omdistro.org,提供了rh、debian、suse和src各种安装模式。
比如在centos5上面,只需要简单的操作即可: 继续阅读……


Chart::OFC试用

19 Dec 2011 Posted in  perl

这几天ppt看的比较多,一样一样来玩。今天先说OFC,之前有试过amcharts和fusioncharts。amcharts最全最漂亮(尤其是有scroll和map),可惜图上都自动标上了amcharts.com的字样;fusioncharts的free版本,也蛮好用的,虽然scroll怪怪的居然靠的是点击控制。比较相同的一点就是,这两都只提供了php、python等的模块,如果是perl写的网页,那只能通过提供xml/json数据给js控制的办法。稍微一点点遗憾……
这次在cpan上终于看到一个chart控制的模块,叫Chart::OFC。这个OFC的项目地址如下:
http://teethgrinder.co.uk/open-flash-chart/
其实用法上没什么特殊,无非是省略一点点xml代码,通过OO的方式自动生成而已。让我觉得蛮好玩的是官网上作者的声明。因为他曾经在维护公司一个付费的flash chart项目时,给甲方发信要求修改bug,等了一个月没反应。于是自己现学as语言开始自己搞= =!然后念念不忘的提示说:要重视客户的反馈。。。。。。哈哈
这个项目目前用as3改写,所以新版本叫OFC2了,不过作者自己也说不太稳定,建议继续用OFC1.9.7,所以先不说Chart::OFC2,继续用Chart::OFC好了: 继续阅读……


Dancer::Plugin::SimpleCRUD模块学习

15 Dec 2011 Posted in  dancer

Dancer圣临历中介绍了一个新插件Dancer::Plugin::SimpleCRUD。可以很快的生成对数据库表的create/read/update/delete。大概阅读了一下代码。主要就是使用HTML::FromDatabase模块生成read的页面,用CGI::FormBuilder模块生成create/update/delete的页面,用Dancer::Plugin::Database::Handle模块操作数据库。因为是Simple,所以html代码都是固定的,不甚美观。但是思路可以学习,通过这两个模块,可以自己结合Dancer的template系统做CRUD了。
先来说HTML::FromDatabase模块,这个只涉及select,所以特别简单:
perl any ['get', 'post'] => '/add/:element' => sub { my $element = params->{'element'}; if ( request->method eq 'GET' ) { my $sth = database->prepare("select * from $element"); $sth->execute(); my $table = HTML::Table::FromDatabase->new( -sth => $sth )->getTable; template 'info', { table => $table }; }; ... }; 继续阅读……


nginx_perl试用

12 Dec 2011 Posted in  nginx

因为空闲时间比较多,所以在CPAN上乱翻,看到了nginx_perl这个项目(原名Nginx::Engine),现在托管在github.com上。地址见:
https://github.com/zzzcpan/nginx-perl 继续阅读……


websocket体验

04 Nov 2011 Posted in  dancer

因为看到mojo在宣传其内置websocket支持,去CPAN上search了一下,发现Dancer也有plugin做websocket用。稍微看了一下,很显然没看mojo的内嵌代码,而dancer的plugin代码倒是相当简单。
简单的说,就是通过AnyMQ、Plack和Web::Hippie的组合完成。注意的是,因为Web::Hippie使用了AnyEvent::Handle管理websocket的fh,AnyMQ也使用AnyEvent管理message queue,所以在启动plackup的时候,必须使用AnyEvent核心的Twiggy服务器。
Plugin里硬编码很多。比较重要的地方就是”set plack_middlewares_map”,plack_middlewares_map是dancer新加的功能,这里用URLMap来mount ‘/_hippie’到Web::Hippie::Pipe和AnyMQ上。也就是说,使用websocket的访问路径,必须固定为’^/_hippie/.*‘这样。
然后像两个get方法,’/new_listener’和’/message’,这两个访问路径是Web::Hippie里写死的,不能改。好在一般应用也不会直接访问这个。
最后有三个register到Dancer的方法,’ws_on_message’、’ws_on_new_listener’和’ws_send’,前两个用来覆盖上面提到的get的两个route的具体信息,一般不用前面两个,因为这样就意味着页面的js里无法控制websocket了(个人理解,不知道对否?)后面那个类似把websocket改成普通的params方式请求响应(用curl/wget可以请求的那种)。 继续阅读……


用perl调用新浪微博API小实验

04 Nov 2011 Posted in  dancer

新浪微博API是通过OAuth方式的。perl上有现成的模块,只需要稍微调一下参数就行了。下午比较闲,试试看。。。
一般网上说的,都还是Net::OAuth模块,这个是1.0a版本的,一看perldoc那个长篇就头疼。这里我用Net::OAuth2模块,简单方便,而且正好配合dancer框架,方便做外部网站应用。
首先是安装模块:
perlcpanm --mirror-only --mirror http://mirrors.163.com/cpan LWP::Protocol::https Net::OAuth2::Client
因为新浪微博的api用的是https协议,所以要加上LWP::Protocol::https模块,这样才能发起443请求。
然后在web/lib/weibo.pm里里添加如下语句:
```perluse Net::OAuth2::Client;
use JSON qw(decode_json); #只需要decode_json,因为dancer自己有from_json和to_json,不要覆盖了 继续阅读……


一个perl扩展正则表达式

26 Oct 2011 Posted in  perl

今天傍晚,莫言在Q群里贴了一个他写的正则表达式,回来翻了翻perlre文档,基本算是看懂,赶紧记录下来:
perlmy $ip = "192.168.0.1|192.168.0.2|192.168.0.1"; if ( $ip =~ / ^ (?: ((?:\d{1,3}\.){3}\d{1,3}) (?= (?: \|(?!\1)(?1) )* \z ) \| )* (?1) $ /x ) { print "match\n"; }
根据perlre文档的说明,一点一点解释。 继续阅读……


用Template::Tookit给squid.conf写模板

25 Oct 2011 Posted in  perl

本文纯属练习Template模块使用,是否可以运用到生产,是否有必要运用到生产,都是未知数……
包括如下文件:
```bash[raocl@localhost tt2-test]$ tree
.
|– config-cdcgame.net.yml
|– config-china.com.yml
|– config.tt
|– hostconfig.yml
|– squid.layout.tt
`– tt4squid.pl 继续阅读……


blog备份脚本

24 Oct 2011 Posted in  perl

之前总不重视自己的博客,上回一丢才心疼,现在重视起来,决定定期备份sql。写个小脚本如下:
perl#!/usr/bin/perl use warnings; use strict; use MySQL::Backup; use Mail::Sender; open my $tmp_sql, '>', "backup.sql"; my $mb = new MySQL::Backup('dbname', 'localhost', 'dbuser', 'dbpasswd', {'USE_REPLACE' => 1, 'SHOW_TABLE_NAMES' => 1}); print $tmp_sql $mb->create_structure(); print $tmp_sql $mb->data_backup(); close $tmp_sql; my $sender = new Mail::Sender { smtp => 'smtp.163.com', from => 'mailuser@163.com', # debug => 'backup_debug.log', auth => 'LOGIN', authid => 'mailuser', authpwd => 'mailpasswd', }; $sender->MailFile({ to => 'mailuser@gmail.com', subject => 'Backup Blog SQL_'.time(), msg => '3Q', file => 'backup.sql',});
没有直接用mysqldump,而是找了这个MySQL::Backup模块,试着看了导出的sql,和mysqldump的结果是有些不同的。
mysqldump导出的sql一般结构是这样子:
mysqlDROP TABLE IF EXISTS `tablename`; CREATE TABLE `tablename`(ID INT NOT NULL ...); LOCK TABLES `tablename` WARITE; INSERT INTO `tablename` VALUES(...),(...),(...); UNLOCK TABLES;
而MySQL::Backup导出的sql结构是这样子的:
mysqlCREATE TABLE `tablename`(ID INT NOT NULL ...); REPLACE INTO `tablename`(ID,...)VALUES(1,...); REPLACE INTO `tablename`(ID,...)VALUES(2,...);
其实我不太清楚replace比insert好在那,不过pod上的example用了USE_REPLACE=>’1’,就照抄了,如果习惯insert的,在new构建对象时,不用这个param就行了。
另外这个Mail::Sender模块,是在微博上某次评论时,发现很多朋友在用的,我也就放弃一次Net::SMTP_auth,用一次试试,感觉还不错~~ 继续阅读……


博客恢复了,截图纪念一下

20 Oct 2011 Posted in 

这两天折腾博客宕机问题啊~原本对阿里云的看好大幅下降……几次挂掉,甚至电话告知说数据恢复不了请自行重置……崩溃原因居然解释说“因为你没有修改grub再重启”这种解释,拜托,我要重启还不是因为突然ssh报密码错误而你们“重置密码必须重启”?死循环啊!
对了,我人格保证,作为一个用xen当工作环境一年多的运维,绝对没有犯自行升级内核导致重启失败这种错误的可能。阿里云客服能不能不要把一个客户的缘由安到别的客户头上……
不管如何,结局还是好的。截个监控宝的告警图纪念一下:
继续阅读……


ProBIND体验笔记

17 Oct 2011 Posted in  DNS

闲的无聊,继续研究DNS周边产品,这次盯上了Probind。这是搜索结果中比较常见的bind的web管理工具。其实我是比较希望有个中文的东东方便我偷懒,可惜看sina之前的xbayDNS一直停留在了只支持FreeBSD/MAC的阶段没有更新,汗,不支持linux的项目偶见过的还真不多……
probind最近一次更新也是2003/05/24的事情了。所以也没期待它能多么适应现在的bind体系,不过作为代码看看还是可以的。
创建mysql用户和库,然后把程序解压到webroot目录,然后执行mysql -u named -p named < etc/mktables.sql,这就是install的步骤。但是这个时候访问首页是有一堆报错的,提示你dns服务器的默认配置(外部检测用dns,管理员邮箱等等)没配置。这个需要通过./tools/settings.php去添加——但是首页上没有链接点击,得自己手敲url,汗……
然后,probind更新的时候,估计php还是以version4为主,所以里头用的还是$HTTP_GET_VARS和$HTTP_POST_VARS等全局变量。奇怪的是我把php.ini里的register_global改成On后重启httpd了,页面依然没变,不得已在./inc/lib.inc文件的开头加上了两句
php$HTTP_GET_VARS = &$_GET; $HTTP_POST_VARS = &$_POST;才好。
OK,现在正式看到probind的页面了。demo地址:点这里
主要就是一个zone的管理,有add、delete、browse三个页面,前两个就是标准的表单,倒是browse里有个test,蛮好玩的,调用bin/testns脚本,使用perl的Net::DNS模块测试zone内的正/反向解析是否正常。
然后就是record的管理,在browse zones里点进zone就可以编辑record了,主要就是主机名、解析ip。
最后是server的管理,这里管理的是真实的DNS的ip和type(master|slave)——probind在易用和性能之间取了一个平衡,他不是像mysqlbind或者mysql-dlz那样直接从db里取数据做响应,而是每次更新(这里区分开了步骤,update的时候只是更新了db,然后再去bulk update的时候才是真正update dns配置)的时候,从数据库生成文件(bin/mkzonefile),再同步到DNS服务器上(sbin/push.local|remote)并执行rndc reconfig命令。 继续阅读……


一个ddns的demo

30 Sep 2011 Posted in  perl

上回分析lbnamed的时候,开玩笑说自己也可以试试在模块基础上加点啥功能。国庆节前最后一天,没啥事情做,就写个小demo续貂。代码如下:
```perl
#!/usr/bin/perl
use warnings;
use strict;
use autodie;
use Sys::Hostname;
use YAML::Syck;
use Net::IP::Match::Regexp qw( create_iprange_regexp match_ip );
use Stanford::DNS;
use Stanford::DNSserver;
$SIG{‘HUP’} = ‘catch_hup’;
my $need_reload;
my $hostmaster = ‘domain.chenlinux.com’;
my $soa = rr_SOA(hostname(), $hostmaster, time(), 3600, 1800, 86400, 0);
my $ns = Stanford::DNSserver->new( listen_on => [ hostname() ],
# debug => 1,
loopfunc => \&conf_reload,
# daemon => ‘no’,
);
my $regexp;
my @domains;
my $arealist;
my $templist;
my $config_path = ‘/data/chenlinux.com/perl/’;
my $ns_domain = ‘test.domain.chenlinux.com’;
$ns->add_dynamic(“$domain” => \&dyn_lb ) foreach my $domain ( @domains );
$ns->add_static( “$ns_domain”, T_SOA, $soa);
$ns->add_static( “$ns_domain”, T_NS, rr_NS($hostmaster)); 继续阅读……


写个同步分发系统(三)

29 Sep 2011 Posted in  dancer

上篇写的页面上,留下一个超链接,查看每条任务的具体情况。现在完成这部分。
首先修改数据库结构,上篇已经建了websync.websync_peer表,现在继续:
```mysql
create table websync_customer (
uid int not null auto_increment primary key,
user varchar(20) not null,
passwd char(32) not null,
custom_info varchar(128),
node varchar(128) not null
) engine=innodb; 继续阅读……


写个同步分发系统(二)

26 Sep 2011 Posted in  dancer

接上篇,加上分发过程查看的页面。这应该是一个很典型的翻页处理。
首先创建一个数据库表如下:
mysqlcreate table websync_peer ( id int not null auto_increment primary key, begin_time timestamp not null default 0, end_time timestamp on update current_timestamp, url varchar(128) not null, customer varchar(20) not null, md5_hex char(32) default null ) engine=innodb;
然后把之前的peer_query()函数修改如下:
perlsub peer_query { my $url = shift; #这里的database和session都需要其他plugin的配合,见之前博客,不贴重复代码了 my $sth = database->prepare('insert into websync_peer (begin_time, url, customer) value (now(), ?, ?)'); $sth->execute($url, session->{login}); };
然后把gearman::client的功能改到mysql的UDFs内完成,做法见
然后写翻页函数了~
perlget '/check' => sub { my $from = params->{page} || 1; my $user = session->{login}; my @urls; my $count_sql = 'select count(id) count from websync_peer where customer = ?'; my $count_sth = database->prepare($sql); $count_sth->execute( $user ); my $count = $count_sth->fetchrow_hashref->{count}; my $total_pages = int( $count / 20 + 1 ); return 'No url has been posted to purge.' unless $count; return 'Selected page number out of range.' if $from > $total_pages; my $url_sql = 'select id,url,begin_time from websync_peer where customer = ? order by id desc limit ?, 20'; my $url_sth = database->prepare($sql); $url_sth->execute( $user, ($from - 1) * 20 ); while ( my $ref = $sth->fetchrow_hashref ) { push @urls, $ref; }; template 'check', { 'urls' => \@urls, 'prev' => $from > 1 ? $from - 1 : 1, 'next' => $from < $total_pages ? $from + 1 : $total_pages, 'last' => $total_pages, }; };
对应的check.tt如下:
```html<html><head> 继续阅读……


linux上获取本机ip的各种perl写法

20 Sep 2011 Posted in  linux

大家讨论使用 Gearman 做分布式处理时,各机需要注册一个独立的 job 作为信息反馈,但是为了方便,Gearman::Worker 脚本 register_function 代码又要通用,于是想到了使用各自的 ip 地址作为 job 命名~ 继续阅读……