灌溉梦想,记录脚步

memcached

memcached是一套分散式的快取系统,当初是Danga Interactive为了LiveJournal所发展的,但目前被许多软体(如MediaWiki)所使用。这是一套开放原始码软体,以BSD license授权释出。

memcached缺乏认证以及安全管制,这代表应该将memcached伺服器放置在防火墙后。

memcached的API使用三十二位元的循环冗余校验(CRC-32)计算键值后,将资料分散在不同的机器上。当表格满了以后,接下来新增的资料会以LRU机制替换掉。由于memcached通常只是当作快取系统使用,所以使用memcached的应用程式在写回较慢的系统时(像是后端的资料库)需要额外的程式码更新memcached内的资料。

使用单位

Digg
Facebook(同时也回馈了许多程式码)
Meetup.com(提供memcached对Java的连线函式库)
Slashdot
Wikipedia

范例

将纯粹使用资料库查询的程式码加上memcached支援是很简单的,假设这是原来的程式码:

function get_foo (int userid) {
result = db_select(“Select * FROM users Where userid = ?”, userid);
return result;
}

加上memcached的快取机制后:

function get_foo (int userid) {
result = memcached_fetch(“userrow:” + userid);
if (!result) {
result = db_select(“Select * FROM users Where userid = ?”, userid);
memcached_add(“userrow:” + userid, result);
}
return result;
}

上述的程式会先到memcached检查是否有userrow:userid的资料,如果有则直接传回结果,如果不存在时再去资料库查询,并将结果放到memcached内。

在memcached内已经有快取资讯时将资料库的资料更新后,上述的程式会抓到旧的资料,这是属于Cache coherency的问题。其中一种解决的方法是在更新资料库时,同时更新memcached内的资讯:


function update_foo(int userid, string dbUpdateString) {
result = db_execute(dbUpdateString);
if (result) {
data = createUserDataFromDBString(dbUpdateString);
memcached_set(“userrow:”+userid, data);
}
}

关闭访问https站点时烦人的信息安全提示

忘了从什么时候开始,用ie打开或刷新https站点时,比如google docs,总会弹出一个“安全警告”的提示框:

是否只查看安全传送的网页内容?
此网页包含的内容将不使用安全的HTTPS连接传送,可能危及到整个网页的安全。

一开始习惯性的选择了“是”,但是发现IE左下角那里马上会提示“网页上有错误”,只能选择“否”才可以正常Google Docs的功能,比如右键菜单,虽然使用没有问题了,但是每次都弹出这个“安全警告”,而且还要点击确认,实在很烦,试了一下,发现自定义一下IE安全设置可以屏蔽掉这个烦人的提示:

工具 > Internet选项 > 安全 > Internet > 自定义级别 > 其它 > 显示混合内容 = 启用

当然了,不知道这样做有没有什么安全隐患,不过不管了,总比每次都要点击确认好很多!

Linux的启动过程

  1. 系统启动时,首先由固化在硬件中的 BIOS 对硬件进行初始化,然后读取硬盘的 MBR 上的引导程序。
    BIOS: Basic Input/Ouput System,基本输入输出系统,固化在系统中的代码,用于完成最底层的硬件操作。
    MBR: Master Boot Record,主引导记录,位于第一块硬盘的第一个扇区,大小为512字节。其中前 446 字节为引导程序,之后的 64 字节为分区表,最后的两字节为结束标记。
  2. MBR 中的 stage1 执行,并跳转到硬盘上保存的引导程序的剩余部分(即stage2)。
    stage1stage2: MBR 中保存的为 Linux 引导程序( Linux Boot Loader) 的第一部分(即stage1)。由于一般的引导程序都很大,无法放到 MBR 的 446 字节中,因此只将一部分放到 MBR 中,这一部分称为 stage1,用于将引导程序的剩余部分(即stage2)读入并执行。
  3. stage2 执行,并读取 Linux 内核。
  4. 内核执行,对各种硬件进行检测和初始化。
  5. 内核启动 init 进程。
    init进程: 为 Linux 系统中启动的第一个进程,PID 为 1,其它所有的进程都为该进程的子进程。
  6. init 进程按照 /etc/inittab 的指示进行系统初始化工作。一般包括启动各种服务,并启动数个虚拟终端供用户登录。

init配置文件说明

Linux 内核启动之后,启动的第一个进程就是 init 进程。该进程从 /etc/inittab 文件中读取配置,对系统进行一系列的初始化工作。下面我们来分析一下 /etc/inittab 文件的结构。

inittab 文件的每一行的基本格式如下所示:

l3:3:wait:/etc/rc.d/rc 3

可以看到,该行使用冒号分成了四段。各段的意思如下。

  1. ID
    用于标识该配置项的 id,长度为 1~4 个字符。
  2. 运行级
    列出在哪些运行级时执行该配置项的命令。本例表明使用运行级 3 启动系统时执行该条指令。
  3. 动作
    指示该条命令应该如何执行。本例中动作为 wait,表示在这条命令未执行完之前不要去执行下一条命令。
  4. 进程
    执行该项时需要启动的可执行文件名及其参数。

常见的动作如下所示。

  • initdefault: 该配置项指定系统的默认运行级。
  • respawn: 该配置项所指定的进程如果被结束,则重新启动该进程。
  • wait: 该配置项指定的进程在运行结束之前不要执行下一条配置项。
  • once: 切换到对应的运行级之后,仅执行指定的进程一次。
  • sysinit: 无论以什么运行级启动,系统启动时都要执行该配置项指定的进程。
  • boot: 仅在系统启动时执行一次。
  • bootwait: 仅在系统启动时执行一次,在执行结束之前不执行下一条配置项
  • powerfail: 当接收到UPS的断电通知时执行该项指定的进程。
  • powerwait: 与powerfail相同,但init会等待进程执行结束。
  • powerokwait: 接收到UPS的供电通知时执行。
  • ctrlaltdel: 当用户同时按下 Ctrl+Alt+Del 时执行该项指定的进程。

下面我们看看实际的例子。这是 Fedore Core 3 的 /etc/inittab 文件。删掉了其中的一些注释,并适当地对每一行增加了解释。

# 下面用 initdefault 动作设置默认的运行级。注意该项没有指定进程,
# 但是最后的分号不要漏掉
#   0 - 关机 (不要将此运行级设为默认)
#   1 - 单用户模式
#   2 - 多用户,不支持 NFS。若无网络则与 3 相同
#   3 - 完整的多用户模式
#   4 - 未使用
#   5 - X11图形界面
#   6 - 重新启动 (不要将此运行级设为默认)
#
id:5:initdefault:

# 系统初始化,包括主机名设置、激活交换分区、检查根分区、
# 以读写方式加载根分区、加载 /etc/fstab 中的分区、
# 激活磁盘配额、加载内核模块等功能
si::sysinit:/etc/rc.d/rc.sysinit

# 执行 rc 脚本,启动各种系统服务
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# 接管 CTRL-ALT-Delete,按下时重新启动系统
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# 当 UPS 发来断电通知时,准备在 2 分钟之后关闭系统
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# 如果在关闭系统之前 UPS 恢复供电,则取消关闭系统
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"


# 在标准运行级时启动虚拟终端。这里准备了六个虚拟终端,
# 要想改变虚拟终端的数目,只需要增删这里的配置项即可
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

# 运行级 5 的时候启动 X 的登录管理器
x:5:respawn:/etc/X11/prefdm -nodaemon

压力测试初探之工具选用和数据分析

★工具:

—> 采用的压力工具是loadrunner

loadrunner 的用法顺便提俩句:

大体分为俩步:1.生成脚本,2.用脚本测试;

web测试脚本可以直接用这个

web_url(“www.xxxx.com“,
“URL=www.xxxx.com”,
“Resource=0”,
“RecContentType=text/html”,
“Referer=”,
“Snapshot=t1.inf”,
“Mode=HTML”,
LAST);

—> 分用户组进行测试

你可以将100人分为3组,第一组测试首页,第二组测试列表页,第三组测试详情页;

操作: controler 里增加分组,分别设置测试脚本

★数据分析:

现在说下在linux下怎么察看数据

1.用top察看系统运行信息:

察看此选项:

load average: 8.83, 7.90, 7.69

这个就是服务器的负载均值,单颗cpu的正常数值为2,则俩颗的话就是4所以就可以得出(cpu数量可以在top命令下按1)

你得程序代码是需要优化还是优异;

2.用ps -afx | grep httpd 找到你所要找的web服务器安装信息;

在http.conf 里找到access日志的所在位置

用 tail -f /filepath 去查看前端程序的header信息.

3.有mysql日志的可以去查看mysql 日志如果没有建立mysql日志的话,就可以用

mysql > show full processlist;

获得所有的sql运行信息,如果某条sql运行时间过长,如1s,则会显示,说明你的这条sql该优化 了

大体过程就是 压力测试->发现压力负载->分析数据->优化代码->压力测试

Mysql 导入数据库乱码解决方法

在转移主机的时候经常公遇到mysql导入数据库乱码的问题

为了避免字符编码的问题,文件,数据库都是用UTF8来搞定。 在数据量小的时候phpmyadmin导入数据还是比较稳定的,数据量大了,就不行了。 于是用mysql 的source来搞定。

但是出现了一点小问题,导入的数据全是乱码。 查看了数据库和数据表的字符集设定,都是utf8,没有问题。看来是在命令行导入时对字符集的辨认出现了问题。

解决方法很简单:在执行source …. (导入)之前先执行 set names utf8; 即可。

例:

mysql> set names utf8;

mysql> d:/localhost.sql

Apache做负载均衡

一般来说,负载均衡就是将客户端的请求分流给后端的各个真实服务器,达到负载均衡的目的。还有一种方式是用两台服务器,一台作为主服务器(Master),另一台作为热备份(Hot Standby),请求全部分给主服务器,在主服务器当机时,立即切换到备份服务器,以提高系统的整体可靠性。

负载均衡的设置

Apache可以应对上面这两种需求。先来讨论一下如何做负载均衡。首先需要启用Apache的几个模块:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so

mod_proxy提供代理服务器功能,mod_proxy_balancer提供负载均衡功能, mod_proxy_http让代理服务器能支持HTTP协议。如果把mod_proxy_http换成其他协议模块(如mod_proxy_ftp),或许能支持其他协议的负载均衡,有兴趣的朋友可以自己尝试一下。

然后要添加以下配置:

ProxyRequests Off
<Proxy balancer://mycluster>
    BalancerMember http://node-a.myserver.com:8080
    BalancerMember http://node-b.myserver.com:8080
</Proxy>
ProxyPass / balancer://mycluster

# 警告:以下这段配置仅用于调试,绝不要添加到生产环境中!!!
<Location /balancer-manager>
    SetHandler balancer-manager
    order Deny,Allow
    Deny from all
    Allow from localhost
</Location>

从上面的 ProxyRequests Off 这条可以看出,实际上负载均衡器就是一个反向代理,只不过它的代理转发地址不是某台具体的服务器,而是一个 balancer:// 协议:

ProxyPass / balancer://mycluster

协议地址可以随便定义。然后,在<Proxy>段中设置该balancer协议的内容即可。 BalancerMember指令可以添加负载均衡组中的真实服务器地址。

下面那段<Location /balancer-manager>是用来监视负载均衡的工作情况的,调试时可以加上(生产环境中禁止使用!),然后访问 http://localhost/balancer-manager/ 即可看到负载均衡的工作状况。

OK,改完之后重启服务器,访问你的Apache所在服务器的地址,即可看到负载均衡的效果了。打开 balancer-manager 的界面,可以看到请求是平均分配的。

如果不想平均分配怎么办?给 BalancerMember 加上 loadfactor 参数即可,取值范围为1-100。比如你有三台服务器,负载分配比例为 7:2:1,只需这样设置:

ProxyRequests Off
<Proxy balancer://mycluster>
    BalancerMember http://node-a.myserver.com:8080 loadfactor=7
    BalancerMember http://node-b.myserver.com:8080 loadfactor=2
    BalancerMember http://node-c.myserver.com:8080 loadfactor=1
</Proxy>
ProxyPass / balancer://mycluster

默认情况下,负载均衡会尽量让各个服务器接受的请求次数满足预设的比例。如果要改变算法,可以使用 lbmethod 属性。如:

ProxyRequests Off
<Proxy balancer://mycluster>
    BalancerMember http://node-a.myserver.com:8080 loadfactor=7
    BalancerMember http://node-b.myserver.com:8080 loadfactor=2
    BalancerMember http://node-c.myserver.com:8080 loadfactor=1
</Proxy>
ProxyPass / balancer://mycluster
ProxySet lbmethod=bytraffic

lbmethod可能的取值有:

lbmethod=byrequests 按照请求次数均衡(默认)
lbmethod=bytraffic 按照流量均衡
lbmethod=bybusyness 按照繁忙程度均衡(总是分配给活跃请求数最少的服务器)

各种算法的原理请参见Apache的文档

热备份(Hot Standby)

热备份的实现很简单,只需添加 status=+H 属性,就可以把某台服务器指定为备份服务器:

ProxyRequests Off
<Proxy balancer://mycluster>
    BalancerMember http://node-a.myserver.com:8080
    BalancerMember http://node-b.myserver.com:8080 status=+H
</Proxy>
ProxyPass / balancer://mycluster

从 balancer-manager 界面中可以看到,请求总是流向 node-a ,一旦node-a挂掉, Apache会检测到错误并把请求分流给 node-b。Apache会每隔几分钟检测一下 node-a 的状况,如果node-a恢复,就继续使用node-a。