Archive for July, 2014

作者:AngryFox 分类: Uncategorized July 26th, 2014 暂无评论

提高边缘节点命中率
处理增减节点/服务器的情况
处理硬件故障的情况

quorum
为每次变更选举(by key)
提议 变更 同步 广播
自治 负载均衡 扩散控制
replocation -> relation

异步化
复杂度
libco

使用GraphicsMagick进行图片处理,采用了面向小对象的缓存文件系统,前端有LVS+Haproxy将原图和其所有缩略图请求都调度到同一台Image Server。
文件定位上,内存用hash算法做索引,最多一次读盘。写盘方式则采用Append方式写,并采用了淘汰策略FIFO,主要考虑降低硬盘的写操作,没有必要进一步提高Cache命中率,因为Image Server和TFS在同一个数据中心,读盘效率还是非常高的。

作者:AngryFox 分类: Uncategorized July 26th, 2014 暂无评论
类模板的实例化和使用
#include <iostream.h>

const int SIZE=8;

template <class T>
class Smemory {
        T data[SIZE];
        int count;

public:
        Smemory()
        {
                count=0;
        }

        void mput(T x);
        T mget();
};

template <class T>
void Smemory<T>::mput(T x)
{
        if(count== SIZE)
        {
                cout << "Memory is full";
                return;
        }

        data[count]=x;
        count++;
}

template <class T>
T Smemory<T>::mget(void)
{
        if(count==0)
        {
                cout<<"memory is empty";
                return 0;
        }

        count--;
        return data[count];
}
int main(void)
{
        Smemory<int> mo1;
        int i;
        char ch='A';

        Smemory<char> mo2;
        for(i=0;i<8;i++)
        {
                mo1.mput(i);
                mo2.mput(ch);
                ch++;
        }

        cout<<"Got mo1.data =>";
        for(i=0;i<8;i++){
                cout << mo2.mget();
                cout << mo1.mget();
        }
}
作者:AngryFox 分类: Uncategorized July 23rd, 2014 暂无评论

http://subversion.apache.org/packages.html#windows

从http://subversion.tigris.org获取subversion for windows的版本,安装之后就有了svn.exe这个基于命令行的客户端工具。安装程序把svn.exe的路径加入了path环境变量。

使用yum 安装SVN包 yum install -y subversion
验证安装版本 svnserve –version
创建SVN 版本库 mkdir -p /home/svn
svnadmin create /home/svn/ofwho.com –ofwho.com为版本库名称
SVN 配置 创建版本库后,在这个目录下会生成3个配置文件
authz passwd svnserve.conf
(1)svnserve.conf: svn服务配置文件。
(2)passwd: 用户名口令文件。
(3)authz: 权限配置文件。
svnserve.conf 文件, 该文件配置项分为以下5项:
anon-access: 控制非鉴权用户访问版本库的权限。
auth-access: 控制鉴权用户访问版本库的权限。
password-db: 指定用户名口令文件名。
authz-db:指定权限配置文件名,通过该文件可以实现以路径为基础的访问控制。
realm:指定版本库的认证域,即在登录时提示的认证域名称。若两个版本库的认证域相同,建议使用相同的用户名口令数据文件

svnserve.conf 开启那四个配置
Passwd 文件增加一行 alemic=ofwho
authz 文件,里把不同用户放到不同的组里面,下面在设置目录访问权限的时候,用目录来操作就可以了
一份能用conf conf

[groups]
admin = john, kate
devteam1 = john, rachel, sally
devteam2 = kate, peter, mark
docs = bob, jane, mike
training = zak
--这里把不同用户放到不同的组里面,下面在设置目录访问权限的时候,用目录来操作就可以了。

# 为所有库指定默认访问规则
# 所有人可以读,管理员可以写,危险分子没有任何权限
[/]  --对应我测试里的:/u02/svn 目录
* = r
@admin = rw
dangerman =

# 允许开发人员可以完全访问他们的项目版本库
[proj1:/]
@devteam1 = rw
[proj2:/]
@devteam2 = rw
[bigproj:/]
@devteam1 = rw
@devteam2 = rw
trevor = rw

# 文档编写人员对所有的docs目录有写权限
[/trunk/doc]
@docs = rw

# 培训人员可以完全访问培训版本库
[TrainingRepos:/]
@training = rw

启动和停止SVN服务 svnserve -d -r /home/svn -d表示后台运行 -r 指定根目录是
ps -ef | grep svn kill -9 进程杀掉
以下是svn客户端常用命令一览:

svn add [path]
别名:无
描述:添加文件或目录到你的wc,打上新增标记。这些文件会在下一次你提交wc的时候提交到svn服务器。
在提交前,你也可以用svn revert撤销新增的文件。
访问库:否
eg: svn add file.cpp

svn blame Target[@REV]
别名:praise,annotate,ann
描述:显示某个已受控文件的每一行的最后修改版本和作者
访问库:是
eg: svn blame file.cpp
eg: svn blame –xml file.cpp ##加上xml参数可以以xml格式显示每一行的属性。

svn cat TARGET[@REV]
别名:无
描述:输出指定目标的内容,这里的目标一般是文件。
访问库:是
eg:svn cat file.cpp
eg:svn cat file.cpp -r 2 ##显示版本号为二的file.cpp内容。
eg:svn cat file.cpp –revision HEAD ##显示最新版本的file.cpp内容。

svn changelist CLNAME TARGET…
svn changelist –remove TARGET
别名:cl
描述:可以将wc中的文件从逻辑上分组.
访问库:否
eg:svn cl clName file.cpp file2.cpp file3.cpp ##将file.cpp等三个文件加入名叫clName的changelist
eg:svn commit –changelist clName -m “ci” ##将clName下的所有文件提交

svn checkout URL[@REV]… [PATH]
别名:co
描述:检出
访问库:否
eg:svn checkout file:///var/svn/repos/test file:///var/svn/repos/quiz working-copies
eg:svn checkout -r 2 file:///var/svn/repos/test mine ##check out 版本号为2的项目

svn cleanup [PATH...]
别名:无
描述:递归的清理WC中过期的锁和未完成的操作。
访问库:否
eg:svn cleanup

svn commit [PATH...]
别名:ci
描述:把你WC的更改提交到仓库
访问库:是
eg:svn commit -m “added howto section.” ##默认情况下提交必须提供log message

svn copy SRC[@REV]… DST
别名:cp
描述:copy操作可以从WC到WC;WC到URL;URL到WC;URL到URL。现在SVN只支持同一个仓库内文件的拷贝,不允许跨仓库操作。
访问库:是
eg:svn copy -r 11 file:///var/svn/repos/test/trunk \
file:///var/svn/repos/test/tags/0.6.32-prerelease \
-m “Forgot to tag at rev 11″
##copy命令是创建分支和标记的常用方式。copy到url的操作隐含了提交动作,所以需要提供log messages。

svn delete PATH…
别名:del,remove,rm
描述:删除
访问库:如果PATH是库地址时会,删除WC内的文件不会。
eg:svn del localfile.cpp ##删除WC里的文件,在下一次提交WC的时候才会真正在仓库里将对应文件删除。
eg: svn del file:///var/svn/repos/test/yourfile ##删除仓库里的文件

svn diff
别名:di
描述:用来比较并显示修改点。
访问库:
eg:svn diff ##最常用的方式,用来显示WC基于最近一次更新以后的所有的本地修改点。
eg:svn diff -r 301 bin ## 比较WC和版本301中的bin目录的修改点
eg:svn diff -r 3000:3500 file:///var/svn/repos/myProject/trunk ##比较库里主干3000版和3500版的差异。
eg:svn diff –summarize –xml http://svn.red-bean.com/repos/test@r2 http://svn.red-bean.com/repos/test ##–summarize –xml 参数将差异情况以xml文档的方式显示出来。

svn export [-r REV] URL[@PEGREV] [PATH]
svn export [-r REV] PATH1[@PEGREV] [PATH2]
别名:无
描述:导出一个干净的目录树,不包含所有的受控信息。可以选择从URL或WC中导出。
访问库:如果访问的是URL则会。
eg:svn export file:///var/svn/repos my-export ##导出到my-export目录。

svn help — Help!
别名:?,h
描述:不用解释了
访问库:否。

svn import [PATH] URL
别名:无
描述:导入本地一个目录到库中。但是导入后,本地的目录并不会处于受控状态。
访问库:是。
eg:svn import -m “New import” myproj http://svn.myProject.com/repos/trunk/misc

svn info [TARGET[@REV]…]
别名:无
描述:显示指定WC和URL信息。
访问库:仅当访问的是库路径时。
eg:svn info –xml http://svn.myProject.com/repos/test ##将信息以xml格式显示。

svn list [TARGET[@REV]…]
别名:ls
描述:显示目标下的文件和目录列表。
访问库:如果访问的是库地址就会。
eg:svn list –verbose file:///var/svn/repos ##–verbose参数表示显示详细信息。

svn lock TARGET…
别名:无
描述:对目标获得修改锁。如果目标已被其他用户锁定,则会抛出警告信息。用–force参数强制从其他用户那里获得锁。
访问库:是
eg:svn lock –force tree.jpg

svn log [PATH]
svn log URL[@REV] [PATH...]
别名:无
描述:从库中显示log消息。log消息代码 A :added D:deleted M:modified R:replaced
访问库:是
eg:svn log -v http://svn.myProject.com/repos/test/ foo.c bar.c ##详细显示指定URL的库中foo.c和bar.c所有版本的log信息。
eg:svn log -r 14:15 ##显示当前WC的14和15版本log信息。
eg:##如果版本号不连续,只能采用如下方式。
$ svn log -r 14 > mylog
$ svn log -r 19 >> mylog
$ svn log -r 27 >> mylog

svn merge sourceURL1[@N] sourceURL2[@M] [WCPATH]
svn merge sourceWCPATH1@N sourceWCPATH2@M [WCPATH]
svn merge [[-c M]… | [-r N:M]…] [SOURCE[@REV] [WCPATH]]
别名:无
描述:合并两个受控源的不同之处,存放到一个WC里。
访问库:只有当访问库地址时。
eg:svn merge –reintegrate http://svn.example.com/repos/calc/branches/my-calc-branch ##合并分支上的改变项到WC,往往用于分支合并到主干。
eg:svn merge -r 156:157 http://svn.example.com/repos/calc/branches/my-calc-branch ##将制定URL版本156到157的所有更新合并到WC。

svn mkdir PATH…
svn mkdir URL…
别名:无
描述:在WC或库路径创建目录
访问库:只有当访问库地址时。
eg:svn mkdir newdir

svn move SRC… DST
别名:mv, rename, ren
描述:等同于svn copy命令跟个svn delete命令。WC到URL的重命名是不被允许的。
访问库:只有当访问库地址时。
eg:svn move foo.c bar.c ##将foo.c改名成bar.c。

svn propdel PROPNAME [PATH...]
svn propdel PROPNAME –revprop -r REV [TARGET]
别名:pdel, pd
描述:从受控文件,目录等删除属性。第二种是删除某个指定版本上的附加属性。
访问库:只有当访问库地址时。
eg:svn propdel svn:mime-type someFile ##从someFile上移除svn:mime-type这个属性。

svn propedit PROPNAME TARGET…
svn propedit PROPNAME –revprop -r REV [TARGET]
别名:pedit, pe
描述:编辑属性
访问库:只有当访问库地址时。
eg:svn propedit svn:keywords file.c ##修改file.c上的svn:keywords属性。

svn propget PROPNAME [TARGET[@REV]…]
svn propget PROPNAME –revprop -r REV [URL]
别名:pget,pg
描述:从文件,目录或版本取得指定属性的值。
访问库:只有当访问库地址时。
eg:svn propget svn:keywords file.c ##从file.c中取得svn:keywords属性的值

svn proplist [TARGET[@REV]…]
svn proplist –revprop -r REV [TARGET]
别名:plist, pl
描述:列出文件、目录或版本上的所有附加属性
访问库:只有当访问库地址时。
eg:svn proplist –verbose file.c

svn propset PROPNAME [PROPVAL | -F VALFILE] PATH…
svn propset PROPNAME –revprop -r REV [PROPVAL | -F VALFILE] [TARGET]
别名:pset,ps
描述:给文件、目录或版本附加属性并赋值
访问库:只有当访问库地址时。
eg:svn propset svn:mime-type image/jpeg file.jpg ##给file.jpg附加属性svn:mime-type 其值为image/jpeg
eg:svn propset –revprop -r 25 svn:log “Journaled about trip to New York.”
##给版本25补上log message
eg:svn propset svn:ignore ‘.classpath’ .
##在本地忽略掉.classpath文件

svn resolve PATH…
别名:无
描述:将冲突的文件标记为已解决,并且删掉冲突产生的临时文件。注意这个命令并不是能把冲突解决,解决冲突还是得靠人工。
访问库:否
eg:svn resolve –accept mine-full foo.c ##1.5版本后,加上–accept参数,尝试自动处理冲突。

svn resolved PATH…
别名:无
描述:已过时,被resolve –accept取代。去除冲突的状态和冲突临时文件。
访问库:否

svn revert PATH…
别名:无
描述:还原WC中所有的本地更改。
访问库:否
eg:svn revert –depth=infinity . ##将整个目录所有文件还原

svn status [PATH...]
别名:stat, st
描述:输出WC中文件和目录的状态。如果WC提交,这些状态就会同步到库里。
一般状态有 ‘ ‘ 没有修改
‘A’ 新增
‘D’ 删除
‘M’ 修改
‘R’ 替代
‘C’ 冲突
‘I’ 忽略
‘?’ 未受控
‘!’ 丢失,一般是将受控文件直接删除导致
访问库:加上–show-updates参数时会
eg:svn status wc

svn switch URL[@PEGREV] [PATH]
svn switch –relocate FROM TO [PATH...]
别名:sw
描述:将WC转向一个其他的库地址同步
访问库:是
eg:svn sw http://svn.myProject.com/repos/trunk/vendors . ##将当前WC切换到另一个URL

svn unlock TARGET…
别名:无
描述:解锁
访问库:是
eg:svn unlock somefile

svn update [PATH...]
别名:up
描述:更新WC,更新反馈有如下几种分类。
A 新增
B 锁破坏
D 删除
U 更新
C 冲突
G 合并
E 存在的
访问库:是
eg:svn up -r22 ##更新到一个指定版本

ps:如何去除SVN中保存的用户授权密码
在Subversion安装目录下找到auth/svn.simple目录,将下面的文件删除即可。
如果在乌龟中,可以setting->saved data->Authentication Data 点 clear 即可。

参考资料:http://svnbook.red-bean.com/en/1.5/svn.ref.svn.c.checkout.html

作者:AngryFox 分类: Uncategorized July 23rd, 2014 暂无评论

VM SYNC->PV前端FLUSH->后端->host->cache系统->分布式存储系统
buffer write平均在212MB/s,direct write平均在68MB/s,而direct+sync则平均在257kB/s
几种写IO的模式:

buffer write,写入目标是guest OS的page cache,通过writeback刷到硬盘的缓存,然后再通过自动刷或者sync命令触发的方式刷到持久化存储介质上。这种写方案的速度很快,缺点是数据完整性无法得到严密保证(取决于回写的策略),而且回写有可能引起阻塞而影响服务质量
direct write,从应用直接写到硬件上的缓存,绕过操作系统的page cache。比如MySQL引擎自己有缓存机制,就可以使用direct write写到硬盘缓存然后再通过sync命令刷到下面的存储介质。绕过page cache的好处是避开了回写的影响,但数据仍然不是绝对可靠,sync完毕之前数据仍然是不安全的
write+sync,写入page cache的同时即调用sync/fsync直接写到存储介质,sync返回算成功。此方式的好处是数据足够安全,缺点是慢,具体等待时间随着操作系统内存使用情况的不同而不同
O_SYNC,加了此标签的写入操作会在数据写入硬盘缓存时同步刷到碟片上

HDFS
S3
Nagios
Bilty使用的实时分布式消息系统是Nsq。
Bitly使用hostpool管理一系列的主机。

组件并发:A机器和B机器同时工作,这就是如何获取横向扩展能力。很强大但是成本是需要在不同机器间协调。例如,当锁数据使机器互相等待彼此,这就不能算是并发了。
缺少全局clock:每个机器有一个不完美的clock,当有超过一台机器并且每台机器有它自己的时间定义,这就意味着发生在不同机器上的事件不能基于时间排序,对bilty而言如果事件相差1到2秒,它们就不清楚哪个先发生了。
故障独立发生:如果A发生故障了,B应该继续工作。

更好的系统间隔离。一个命令意味着必须知道谁收到了该命令,否则它没有任何意义。说某个事件发生则意味着我们并不需要关心谁消费了该消息。只需要通知X发生了,其他服务则可以做对应的增量更新,或者相应的操作。
事件通常映射为多个消费者处理的消息。当一个Bitly URL被解码为HTTP重定向,消息会发送给多个服务:一个持久化服务奖它保存到HDFS及S3;一个实时的分析服务;更长一点的离线历史分析服务;一个注解服务。解码服务只需要把这个时间发布,而不需要去了解任何下游服务。而下游服务关心的只是捕获这个服务,而不管谁给它发送。
非常容易地添加新的消费者。可以建立一个新的服务,与某个事件关联,生产者并不知道也不关心。一个服务如何处理事件的变化同样的不关心生产者。生产者和消费者是分离的,只通过指定的事件状态关联。

show engine innodb status\G和show full processlist

作者:AngryFox 分类: Uncategorized July 21st, 2014 暂无评论

link: http://www.ibm.com/developerworks/library/j-zerocopy/

许多web应用都会向用户提供大量的静态内容,这意味着有很多data从硬盘读出之后,会原封不动的通过socket传输给用户。这种操作看起来可能不会怎么消耗CPU,但是实际上它是低效的:kernal把数据从disk读出来,然后把它传输给user级的application,然后application再次把同样的内容再传回给处于kernal级的socket。这种场景下,application实际上只是作为一种低效的中间介质,用来把disk file的data传给socket。

data每次穿过user-kernel boundary,都会被copy,这会消耗cpu,并且占用RAM的带宽。幸运的是,你可以用一种叫做Zero-Copy的技术来去掉这些无谓的 copy。应用程序用zero copy来请求kernel直接把disk的data传输给socket,而不是通过应用程序传输。Zero copy大大提高了应用程序的性能,并且减少了kernel和user模式的上下文切换。

Java的libaries在linux和unix中支持zero copy,一个关键的api是java.nio.channel.FileChannel的transferTo()方法。我们可以用 transferTo()来把bytes直接从调用它的channel传输到另一个writable byte channel,中间不会使data经过应用程序。
一、典型IO调用的问题
一个典型的web服务器传送静态文件(如CSS,JS,图片等)的过程如下:

read(file, tmp_buf, len);
write(socket, tmp_buf, len);

首先调用read将文件从磁盘读取到tmp_buf,然后调用write将tmp_buf写入到socket,在这过程中会出现四次数据 copy,过程如图1所示

1。当调用read系统调用时,通过DMA(Direct Memory Access)将数据copy到内核模式
2。然后由CPU控制将内核模式数据copy到用户模式下的 buffer中
3。read调用完成后,write调用首先将用户模式下 buffer中的数据copy到内核模式下的socket buffer中
4。最后通过DMA copy将内核模式下的socket buffer中的数据copy到网卡设备中传送。
从上面的过程可以看出,数据白白从内核模式到用户模式走了一 圈,浪费了两次copy,而这两次copy都是CPU copy,即占用CPU资源。

二、Zero-Copy&Sendfile()
Linux 2.1版本内核引入了sendfile函数,用于将文件通过socket传送。
sendfile(socket, file, len);
该函数通过一次系统调用完成了文件的传送,减少了原来 read/write方式的模式切换。此外更是减少了数据的copy,sendfile的详细过程图2所示:

通过sendfile传送文件只需要一次系统调用,当调用 sendfile时:
1。首先通过DMA copy将数据从磁盘读取到kernel buffer中
2。然后通过CPU copy将数据从kernel buffer copy到sokcet buffer中
3。最终通过DMA copy将socket buffer中数据copy到网卡buffer中发送
sendfile与read/write方式相比,少了 一次模式切换一次CPU copy。但是从上述过程中也可以发现从kernel buffer中将数据copy到socket buffer是没必要的。

为此,Linux2.4内核对sendfile做了改进,如图3所示

改进后的处理过程如下:
1。DMA copy将磁盘数据copy到kernel buffer中
2。向socket buffer中追加当前要发送的数据在kernel buffer中的位置和偏移量
3。DMA gather copy根据socket buffer中的位置和偏移量直接将kernel buffer中的数据copy到网卡上。
经过上述过程,数据只经过了2次copy就从磁盘传送出去了。
(可能有人要纠结“不是说Zero-Copy么?怎么还有两次copy啊”,事实上这个Zero copy是针对内核来讲的,数据在内核模式下是Zero-copy的。话说回来,文件本身在瓷盘上要真是完全Zero-copy就能传送,那才见鬼了 呢)。
当前许多高性能http server都引入了sendfile机制,如nginx,lighttpd等。

作者:AngryFox 分类: Uncategorized July 20th, 2014 暂无评论
#include <stdio.h>

void test_size(char a[])
{
        printf("test_size: sizeof(a)=%d\n",sizeof(a));
}

int main()
{
        char a[10] = "Ilovec!";
        char *p = a;
        printf("sizeof(a)=%d,\tsizeof(p)=%d,\tsizeof(char)=%d,\tsizeof(int)=%d\n",sizeof(a),sizeof(p),sizeof(char),sizeof(int));
        printf("string_a = %s,\tstring_p=%s\n", a, p);

        test_size(a);

        return 0;
}
output:
sizeof(a)=10,   sizeof(p)=8,    sizeof(char)=1, sizeof(int)=4
string_a = Ilovec!,     string_p=Ilovec!
test_size: sizeof(a)=8

1、指针的本质是一个与地址相关的复合类型,它的值是数据存放的位置(地址);数组的本质则是一系列的变量。
2、数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。指针可以随时指向任意类型的内存块,它的特征是”可变”,所以我们常用指针来操作动态内存。
注:当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针

数组:
int array[5];
此定义中,array 就是数组名,array 代表的是该数组整块内存,sizeof(array) 值将为 (int 的字节长度 * 5), array 的值即为该内存块首地址,即array == &array[0]。array 可以看作一个常量,它是不可修改的(类似地,不可以使用array++、array +=之类的运算)
指针 :
int *p;
p = array;
p是一个指向int类型的指针,p = array,就是把数组的首地址赋给p。现在通过 p 就可以访问整个数组,但是 p 这里只是个指针变量,也就是 p 的本质没有改变,p 不能和 array 一样代表整个数组的内存, 所以 sizeof(p) == sizeof(int*) != sizeof(arr)。此处p与数组不同,它可以进行p++之类的运算操作。

作者:AngryFox 分类: Uncategorized July 19th, 2014 暂无评论
import sqlite
import console;

//创建数据库
var db = sqlite("/test-sqlite.db")

//创建表
if( not db.existsTable("film") ){
	db.exec( "create table film(title, length, year, starring);")
}  

for(i=1;9;1){
	//增 - 使用命名参数示例
	var command = db.prepare("replace into film values (@title,@length,@year, 'Angryfox.com');" )
	command.step(
		title = "Gopher" + i;
		length = 4 + i;
		year = time.now();
	)
}

//删 - 执行SQL语句示例
db.exec("DELETE FROM [%s] where length=%d;","film",999)

//改 - 执行SQL语句示例,SQL语句后面可以添加任意个格式化参数
db.exec("UPDATE film SET title = '%s',length=%d WHERE title = '%s';"
	,"新的标题",#"新的标题","标题");

//查 - 返回首行数据
var result = db.stepQuery("SELECT * FROM [film]"
	,{ title = "新的标题"} //可选使用表对象指定where条件参数
	) 

//查 - 迭代器
for rowid,title, length, year, starring in db.each("select rowid,* from film") {
	console.log( rowid,title, length, year, starring  )
}

//查 - 返回数据表
var dataTable = db.getTable("SELECT * FROM [film] "
	,{ title = "新的标题"} //可选使用表对象指定where条件参数
	)
//console.varDump( dataTable )

//删除表
db.exec("drop table film" );

console.pause();
console.close()
作者:AngryFox 分类: Uncategorized July 19th, 2014 暂无评论
/**
 *
 * uniqid
 * Gets a prefixed unique identifier based on the current time in microseconds.
 */
function build_order_no()
{
    return date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
}

用uniqid获取一个基于当前的微秒数生成的唯一不重复的字符串,删除前7位相对固定的值,取其第8到13位。去英文字母
用ord获取他的ASCII码,用str_split把这个字符串分割为数组,用array_map去操作(速度快点),再用implode弄成字符串,但是字符长度不定,取前固定的几位,然后前面加上当前的年份和日期

作者:AngryFox 分类: Uncategorized July 19th, 2014 暂无评论

缓存前移,分布化,用大量memcache。前端proxy缓存,后面是mc集群,解决超热key问题和大key(>200K)的问题。另外设置了5秒的timeout,相当于是有损服务。优化TCP协议,提高TCP初始化拥塞窗口大小(从3改到10),减少RTT,提高数据传输速度。容量模型,接口设置最大连接数,通过预知及早拒绝,防止雪崩。有一些预知能力。APC缓存,高并发时底层页静态化以降低后台请求。另外就是分区域保障,一线城市做为重点,二线城市提供有损服务。
分布式网络程序对通讯协议的灵活性、容错性、可扩展性、安全性、性能
CORBA、RMI、WCF
同时支持同步和异步的RPC调用和处理方式,同步方式简单,异步方式略复杂但是更高效。
    内嵌http server,http server的服务端口就是poppy的rpc服务端口,用户可以自由扩充自己的页面。
    web方式展现统计和状态等监控信息,方便监控服务和诊断错误。
    集成了perf-tools,可以远程动态profiling正在运行的server。
    自动连接管理,无需用户显式处理。
    支持连接多个对等的无状态同构服务器,并自动进行负载均衡。
    支持zookeeper方式的服务地址解析,并能动态响应其变化,方便动态增减服务器。
    支持可选的压缩,不需额外写任何代码。
    支持protobuf的textformat以及Json两种文本格式的访问接口,在脚本语言甚至命令行界面都能发起调用。
    Form提交: 不需要写程序,在浏览器里填个表单就能发起调用,表单是根据proto文件的描述自动生成的。
    多语言:除了C++外,还支持Java, Python, PHP三种语言的客户端。
    集成了可选的对统一认证/授权系统的支持,可以识别和控制客户端的身份,提供更高的安全性。

Reactvie之道:

1. 反应到事件react to events – 事件驱动event-driven的自然特性激活了其随后的各种特性。
2.反应到加载react to load – 通过避免金多线程对共享资源的竞争锁争夺实现可扩展性。
2.反应到失败react to failure – 弹性系统能够在任何级别满血复活。
3.反应到用户react to users – 无论负载多高,都有傲人的响应时间。

内存数据网格(IMDG)领域,他们发现了Pivotal GemFire
ffmpeg

http://blog.csdn.net/dgyanyong/article/details/12052857

Typhoon(台风)是由基础架构部开发的集分布式存储和分布式计算于一体的云计算平台。它由提供高可靠性的分布式文件系统XFS[3]、分布式半结构化存储系统XCube,分布式计算框架MapReduce,以及机群调度系统Torca等组件构成。

lsof -p pid “ can’t identify protocol ”
strace -p pid “Too many open files”
是进程打开文件句柄的个数达到了linux的限制
系统层面的在:/proc/sys/fs/file-max里设置
用户层面的限制在:/etc/security/limits.conf里设定
使用 ulimit -a 查看系统允许单个进程打开的最大文件数:

作者:AngryFox 分类: Uncategorized July 19th, 2014 暂无评论

线性扩展的数据库
分布式部署。数据必须分布到多台机器上去。
无表连接(Joinless)。至少在数据存储层次上,不能使用表连接(Join),也不要定义关联完整性约束。
去正规化。避免使用表连接,就会有很多去正规化工作。
无事务。不能按事务方式操作。
需求:实时快速的键/值检索;
非实时的复杂查询主要在运营和维护时进行;
分布式的应用,从而数据也必须分布;
高容错性;
动态重新配置;
复杂对象。

复杂值。Mnesia以自然有效的方式支持复杂值的操作(换言之,通过一次检索操作)。“以第三(甚至是第一)范式组织电信数据通常
不太可能。”列里可以存储复杂值就意味着不再需要表连接。
数据格式和地址空间。此数据库管理系统运行在应用的地址空间里。这就允许检索返回对象指针,而不需要在不同数据格式之间暗地转
换对象,或者通过连线去操作对象。论文提及到Erlang中一个应用即使崩溃也不会影响到数据库,这克服了这种方式下应用的崩溃有可
能影响数据库的常见诟病。“Erlang进程的效能有一个优势,运行在同一个地址空间但是不可能直接读取或者写入其他进程的存储空间
。”
容错。数据表可以被复制到多个计算节点中。事务上下文中的写操作会被应用到所有副本,通过恢复时更新,当时宕机的副本也能够被
更新。“这个机制使得多个地理上分开的系统联合提供一个连续运行的不停机系统设计成为可能。”
分布和位置透明。应用开发者能够透明访问数据表——无论远程的还是本地的,还是数据表副本。不过在性能关键的地方,也有办法获

知数据表的位置,并且让代码在尽量靠近事发数据的位置执行。
事务和ACID。Mnesia支持ACID(A=原子性,C=一致性,I=隔离性,D=耐久性),不过也提供仅限于内存的数据表操作能力(以牺牲耐久

性为代价)。
绕开事务管理器的能力。“脏接口(dirty interface)”的概念被作为一个轻量级加锁机制引入,从而避免使用事务管理器的额外开销
。这个能力对性能关键的操作比较有用,比如检索一条记录。“这些脏操作 是真正的实时数据库操作:无论数据库是大是小,他们都消

耗可以预测的执行时间。”
查询。查询通过被称为“列表领悟(List Comprehension)语法”的方式表达。例如,要找到子女多于X个的人,表达式可以写成:

query [P.name || P < table(person), length(P.children) > X] end.
Schema的修改。Erlang语言自身既支持不停止进程情况下修改运行中进程代码的能力。这就允许Mnesia数据库动态的修改
Schema。“Mnesia既然是为不停机应用设计的,所有系统活动比如备份、修改Schema、导出表数据到二级存储, 还有副本复制都必须在
后台进行,同时允许应用和平常一样访问和修改数据表。”

1、创建schema
在一个节点上,通过 mnesia:create_schema(NodeList), 在整个集群中,创建空的schema。NodeList指定了集群中所有的节点。
注意:
1)、schema只能创建一次
2)、实际上,每个节点都保存一份schema拷贝

2、 创建表
在一个节点上,通过 mnesia:create_table(),则创建一个分布式的表。
mnesia会自动将该表同步到节点中其它节点上。
每个节点,实际上还是维护的本地的一个表。

3、 分布式的插入、删除、修改、查询操作。
在任意一个节点上进行如上操作,都会同步反映到集群中的其它节点上。

4、 事务和脏操作。
事务是同步的操作,性能低,但能确保一致性。
脏操作不能保证一致性,但是速度极快。

5、 change_config

适合单线程的场景:单个线程的工作逻辑简单,而且速度非常快,比如从内存中读取某个值,或者从Hash表根据key获得某个value。
Redis和Node.js这类程序都是单线程,适合单个线程简单快速的场景。
适合多线程的场景:单个线程的工作逻辑复杂,等待时间较长或者需要消耗大量系统运算资源,比如需要从多个远程服务获得数据并计
算,或者图像处理。