Professional Documents
Culture Documents
4
PHP & memcached .....................................................................................................................7
一、memcached 简介.........................................................................................................7
二、memcached 安装.........................................................................................................7
三、运行 memcached 守护程序.......................................................................................8
四、memcached 的工作原理.............................................................................................8
五、PHP 如何作为 memcached 客户端 .........................................................................9
六、PHP memcached 应用示例 .......................................................................................9
七、相关资源.........................................................................................................................11
使用 memcached 实现对象的自动缓存.................................................................................12
0. 前言...................................................................................................................................12
1. memcached ...................................................................................................................12
2. __destruct() ..................................................................................................................13
3. 示范...................................................................................................................................13
4. 缓存对象与使用 session 的区别 ................................................................................16
5. 总结...................................................................................................................................16
6. 示例代码...........................................................................................................................17
XCache:加速你的PHP ..............................................................................................................19
什么是XCache......................................................................................................................19
安装 XCache 扩展模块......................................................................................................19
使用操作系统包管理器安装.........................................................................................19
手工编译源代码安装(*nix).........................................................................................19
配置 ini 启用........................................................................................................................20
安装监控器.............................................................................................................................20
加速原理.................................................................................................................................20
性能.........................................................................................................................................21
特色.........................................................................................................................................21
运用 XCache 的缓冲 API .........................................................................................22
运用 XCache 的缓冲 API 之二:简单计数器 .......................................................23
编写 XCache 的心得..........................................................................................................24
引用与参考.............................................................................................................................24
扩展PHP.........................................................................................................................................26
为什么要扩展.........................................................................................................................26
写扩展的基础.........................................................................................................................26
什么是扩展.............................................................................................................................27
开发环境的搭建.....................................................................................................................27
编码实现.................................................................................................................................32
Mysql 集群技术简介 ...................................................................................................................37
一、MySQL Cluster概述 ...................................................................................................37
二、MySQL Cluster 基本概念 .........................................................................................38
三、开始准备.........................................................................................................................39
1、准备服务器 ..............................................................................................................39
2、注意事项及其他 ......................................................................................................40
1/65
四、开始安装.........................................................................................................................40
1、假定条件 ..................................................................................................................40
2、SQL节点和存储节点(NDB节点)安装(即 4 个机器重复执行以下步骤) ..........40
3、配置SQL节点 ..........................................................................................................40
4、配置存储节点(NDB节点)......................................................................................41
5、安装管理节点 ..........................................................................................................41
6、配置管理节点 ..........................................................................................................41
五、启动MySQL Cluster ...................................................................................................42
六、创建数据库表.................................................................................................................44
七、安全关闭.........................................................................................................................44
八、其他.................................................................................................................................45
LAMP系统优化实例分析 ..............................................................................................................46
一,php本身的优化 .............................................................................................................46
二, web服务器优化..............................................................................................................47
a,关闭apache的访问日志. .........................................................................................47
b, Timeout 和 KeepAlive参数................................................................................48
c,MPM参数设置 ............................................................................................................48
d, 压缩输出页面,提高系统吞吐量 ...........................................................................48
e,删除不必要的Alias和Directory参数 .....................................................................49
f,其他参数调整 ..............................................................................................................50
三,Linux服务器调整 ............................................................................................................50
a,使用tmpfs .................................................................................................................50
b,tcp优化.......................................................................................................................51
c,定时监控web服务器状态,负载过大时自动重启web服务器................................51
四,light httpd + fastcgi + php ...................................................................................52
a,编译fastcgi的php ....................................................................................................52
b,编译安装lighthttpd .................................................................................................53
c,配置light http...........................................................................................................53
d,启动和关闭light httpd ............................................................................................54
e,注意事项: ...................................................................................................................54
Subversion PHP Binding.........................................................................................................57
什么是Subversion? ..........................................................................................................57
谁在使用Subversion? ......................................................................................................57
为什么将Subversion和PHP Binding(捆绑)起来? ..................................................58
3.1 Subversion采用C/S架构的缺点 .......................................................................58
3.2 Subversion采用B/S架构的优点 .......................................................................59
如何使用Subversion PHP Binding? .............................................................................61
4.1 如何配置php-svn for Windows?..................................................................61
4.2 如何使用Subversion PHP Binding? ............................................................62
Subversion PHP Binding的函数API ..............................................................................64
a) 以svn_auth_set_parameter认证举例: ........................................................64
b) 以svn_diff版本差异举例:...................................................................................64
总结.........................................................................................................................................64
2/65
PHP&MORE Vol7
编辑:
Avenger Binzy Easy Freeman Haohappy KnightE Nio RainX Shenkong Vicki
出品:
鸣谢:
卷首语
PHPMORE 编辑部
2006-12-5
3/65
PHP 前沿 Top10
Easy,Haohappy/文
4/65
ZF 最近发布了 0.2.0 预览版,大量与 WEB2.0 和 WEB Services 相关的
类库已经推出或正在开发当中,让人感觉 PHP 紧随互联网的发展而发展,真
正做到了与时俱进(哈,真像口号,下一步应该是构建 PHP 和谐社区
--Haohappy)。
Zend Framework 手册目前已经被翻译成 10 个国家的语言版本,简体中文
版由《PHP&More》编辑 Haohappy 组织翻译,目前已经有十一位 PHP 程序
员参与并完成了首轮翻译。但是 ZF 的发展速度实在太快,现在还有不少新
增的内容无人认领,欢迎大家踊跃参加。
Symfony 堪称现在最成熟的 PHP5 开发框架之一,其中涵盖很多独特的设计
思想和组件。Symfony 开发团队认为该框架已经完全可以用于企业级开发
(enterprise ready),包括 Yahoo! Bookmarks 在内的很多程序都使用了
Symfony 框架。Symfony 其实也才诞生一年出头,最近终于发布了 1.0.0
版本,虽然暂时只是 Beta 版本,但其团队声称不久之后将会发布 1.0
Stable,到时 Symfony 会更加成熟和稳定。
Hardened PHP(http://www.hardened-php.net)是一个研究 PHP
安全的专业团队,一直致力于发现和修正各种 PHP 安全漏洞,在业界相当有
名。他们最近发布了 Suhosin,一个用于保护 PHP 和 PHP 程序的强大的工
具包。
5/65
专题导读
Easy/文
就像巴士大叔陈乙东说的,“我有压力,你有压力”,这个世界充满了压力。在这个一不小心就出名的 web2.0
时代,如何使你的系统能轻松运转,从容应对突如其来的访问压力呢?这就是我们本期讨论的专题,高压
力下的 LAMP 系统优化。
6/65
PHP & memcached
Nio/文
一、memcached 简介
二、memcached 安装
7/65
三、运行 memcached 守护程序
运行 memcached 守护程序很简单,只需一个命令行即可,不需要修改任何配置文件(也没有配置文件给
你修改 ):
参数解释:
<? Text ?> - PHPMORE
-d 以守护程序(daemon)方式运行 memcached;
-m 设置 memcached 可以使用的内存大小,单位为 M;
-l 设置监听的 IP 地址,如果是本机的话,通常可以不设置此参数;
-p 设置监听的端口,默认为 11211,所以也可以不设置此参数;
-u 指定用户,如果当前为 root 的话,需要使用此参数指定用户。
四、memcached 的工作原理
首先 memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可
以由各种语言编写,目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。PHP 等
客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个
唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中
的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。注意,这些
对象并不是持久的,服务停止之后,里边的数据就会丢失。
8/65
五、PHP 如何作为 memcached 客户端
9/65
‘compress_threshold’ => 10240, //超过多少字节的数据时进行压缩
‘persistant’ => false //是否使用持久连接
);
// 创建 memcached 对象实例
$mc = new memcached($options);
// 设置此脚本使用的唯一标识符
$key = ‘mykey’;
// 往 memcached 中写入对象
$mc->add($key, ’some random strings’);
$val = $mc->get($key);
echo “n”.str_pad(‘$mc->add() ’, 60, ‘_’).“n”;
var_dump($val);
// 替换已写入的对象数据值
$mc->replace($key, array(’some’=>‘haha’, ‘array’=>‘xxx’));
$val = $mc->get($key);
echo “n”.str_pad(‘$mc->replace() ’, 60, ‘_’).“n”;
var_dump($val);
// 删除 memcached 中的对象
$mc->delete($key);
$val = $mc->get($key);
echo “n”.str_pad(‘$mc->delete() ’, 60, ‘_’).“n”;
var_dump($val);
10/65
} else {
echo “n”.str_pad(‘Read datas from memcached.’, 60, ‘_’).“n”;
}
var_dump($datas);
七、相关资源
memcached 官方网站
PHP memcached client
下载 memcached-client.php
11/65
使用 memcached 实现对象的自动缓存
cid73/文
0. 前言
范例环境要求:
<? Text ?> - PHPMORE
memcached
PHP5
PHP5 的 memcache 扩展
1. memcached
当 我 们 要 缓 存 一 个 对 象 时 , 不 可 避 免 地 必 须 先 将 对 象 序 列 化 , memcached 也 不 例 外 . 当 我 们 用
Memcache::set() 储存对象时实际上对象被序列化为字符串存入 memcached 服务的"哈希表"中;
当我们用 Memcache::get() 获取一个对象时, memcache 扩展将在 memcached 服务的"哈希表"中
读取出来的数据进行反序列化后返回.
12/65
而 memcached 储存在内存中.
这样的目的可以达到吗?
2. __destruct()
答案是当脚本结束的时候.
3. 示范
"我知道你的名字"的核心逻辑非常简单:
13/65
public function setName($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
获取对象的方法和普通的单体类获取方法有些不同:
现在来看析构函数
14/65
public function __destruct() {
self::$cacheServer->set(self::$instanceId, self::$instance, 0, 60);
}
这里就是实现自动缓存的关键, 当脚本结束时对象会被缓存到内存中, 时效 60 秒.
客户代码如下
if ( !empty($_POST['name']) ) {
$iGotYourName->setName($_POST['name']);
header('Location: ' . $_SERVER['PHP_SELF']);
}
看一下效果, 我们终于得偿所愿.(全部代码附在篇末)
15/65
4. 缓存对象与使用 session 的区别
5. 总结
memcached 是一个巨大的哈希表
使用 __destruct() 析构函数自动缓存对象
需要被缓存的对象不能直接用 new 实例化, 需要通过第三方机制去获取
被缓存的对象需要一个独立的标识符
独立出容器服务和缓存服务, 缓存服务通常只需要一个, 容器服务会有多种类型
缓存对象和 session 是两回事, 可以使用前者来代替后者, 从而使程序更加结构化
16/65
6. 示例代码
function generateSessionId() {
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
$sessionId = '';
for ( $i = 0; $i < 32; $i++ ) {
$sessionId .= $chars{mt_rand(0, 61)};
}
return $sessionId;
}
class IGotYourName {
private static $instance;
private static $instanceId;
private static $cacheServer;
public static function getInstance($sessionId) {
self::$instanceId = __CLASS__ . '_' . $sessionId;
if ( empty(self::$cacheServer) ) {
self::$cacheServer = new Memcache;
self::$cacheServer->connect('localhost', 11211);
}
if ( empty(self::$instance) ) {
$cachedInstance = self::$cacheServer->get(self::$instanceId);
if ( !empty($cachedInstance) ) {
self::$instance = $cachedInstance;
}
else {
self::$instance = new IGotYourName;
}
}
return self::$instance;
}
private $name;
private function __construct() {}
public function setName($name) {
$this->name = $name;
17/65
}
public function getName() {
return $this->name;
}
public function __destruct() {
self::$cacheServer->set(self::$instanceId, self::$instance, 0, 60);
}
}
if ( !empty($_COOKIE['IGotYourName_id']) ) {
$sessionId = $_COOKIE['IGotYourName_id'];
setcookie('IGotYourName_id', $_COOKIE['IGotYourName_id']);
}
else {
$sessionId = generateSessionId();
setcookie('IGotYourName_id', $sessionId);
}
$iGotYourName = IGotYourName::getInstance($sessionId);
if ( !empty($_POST['name']) ) {
$iGotYourName->setName($_POST['name']);
header('Location: ' . $_SERVER['PHP_SELF']);
}
if ( $yourName = $iGotYourName->getName() ):
Hello, echo $yourName , I got your name ;-)
else:
What's Your name, please?
endif;
<br />
<form method="POST" action=" echo $_SERVER['PHP_SELF'] ">
<input type="text" name="name" size="15" /><br />
<input type="submit" value="Send" />
</form>
18/65
XCache:加速你的 PHP
Static/文
作者按:由于工作的关系,截稿前几天才下笔开始写,时间仓卒了点儿,因而本文尽量采用简单容易理解
而又简短的文字向读者介绍 XCache 以及本人开发 XCache 的心得。也希望借此能够激起大家对 PHP 缓
冲器、PHP 扩展模块的兴趣,起到抛砖引玉的作用。有兴趣的朋友可以浏览一下 XCache 的网站[6]以
及在论坛[7]中一起讨论(如果 E-mail 的话别人就看不到了)。
什么是 XCache
安装 XCache 扩展模块
使用操作系统包管理器安装
手工编译源代码安装(*nix)
19/65
~/src/xcache # $EDITOR /etc/php.ini
配置 ini 启用
安装监控器
运行 php md5pass.php
或者直接使用 shell 下的工具(不过需要注意清理 ~/.bash_history):
修改 ini 文件:
xcache.admin.user = "mOo"
xcache.admin.pass = "098f6bcd4621d373cade4e832627b4f6"
加速原理
<?php
20/65
}
?>
性能
特色
21/65
的 PHP 兼容性。这些机制主要在开发 XCache 的时候发回重要的作用,它曾经发现过一些问题。这个机
制同时也协助作者最快地发现与新版本 PHP 的兼容问题并开发对其进行支持。这些也是为什么 XCache
轻松支持正在开发中的 PHP6 unicode 的原因。
采用 DisableOnFailure 机制。一旦发现缓冲区内存被损坏等情况导致 crash,则自动禁止
XCache 自己,这个 FailSafe 方式比不断的 dump core 文件要好得多。
采用 svn 对进行代码维护,实现多分支并行开发。稳定版本更成熟,发布极其谨慎,只修复严重问
题并避免进行大的手术;而开发版本的功能不断丰富,发布迅速。
SplitedCache 机制将缓存区切分开,在不增加额外内存需求的情况下,允许同一时间分别存取不
同的缓存区,这在 SMP 下性能进一步提高性能 [2]。
从最初就考虑对多线程、Windows 环境的支持,这种支持根基很重要,比起半路起家只能不断修复
这类 Bug 的软件,效果要好很多。如果缺乏这种根基,并不直接引发一个或者多个某个明显问题的出现,
而是导致在一些高压环境下出现稳定性问题而可能开发人员迟迟无法知道问题所在。
XCache 还提供了一些缓冲 API 给 PHP 程序使用,下面我们看看如何运用这些 API。
示范代码:
<?php
?>
使用方法:
<?php
22/65
function my_load_blog_titles()
{
$db = new DB();
$db->query(...);
....
return $rows;
}
?>
这 个 示 范 代 码 利 用 XCache 的 API 实 现 了 简 单 而 方 便 的 缓 存 机 制 。 不 过 在 并 发 情 况 下 ,
call_cached_func_array 的实现机制会导致 my_load_blog_titles 在 reload 的时候出现性能
瓶颈。由于内容的关系,笔者日后将在另一篇文章内单独阐述。
btw: 有人反映,使用 XCache 来缓存数据要比 memcache 的快一些。不过如果要分布式缓存的话
就没戏了 ☺
示范代码:
<?php
if (!xcache_inc("blogvisits")) {
// 从数据库载入 $count
xcache_set("blogvisits", $count);
}
$count = xcache_inc("blogvisits");
echo $count;
if (mt_rand(0, 100) == 0) {
// 将 $count 保存到数据库
}
?>
这里示范的代码相当简单,不过您还可以对其进行加强,实现存入数据库以及从数据库中恢复的代码
以避免计数因为重启 PHP 而丢失。
23/65
编写 XCache 的心得
代码生成器也需要维护:代码生成器的确大大地降低了开发成本、出问题的几率,但是维护代码生成
器本身也是需要代价的。捡起一段时间未动过的核心代码发现有些难读,不过幸运的是修改、调试完这些
核心代码其他所有利用这个核心机制的地方均随之升华了。
缓存原理、机制并不难:其中运用的原理、机制在其他地方应用都比较广泛,实现数据深层、浅层拷
贝,实现共享内存、锁。但是需要做好的地方也很多。1,自己用已经非常稳定,但是发布出来就水土不服,
比如 ini 配置别人改改也许就出 core 了,用户可能不小心写了 64 而不是 64M;2,移植性,除非特
大工程否则程序员往往没有测试资源去测各种硬件体系下的问题,幸好在 XCache 进入 debian 之后能
自动在各种 arch 上编译、发现编译等问题;3,写完一个东西不难,但是不断维护、修改、壮大代码的
情况下还要保持代码的整洁性、可控性非常难;4,hrm…挺多的。
引用与参考
24/65
http://itst.net/wp-content/uploads/2006/10/PHP%20Bytecode%20Cacher%20Review.
pdf
[2] SMP 下性能爆增: http://www.vbulletin.com/forum/showthread.php?t=201257
[3] 支持 XCache 的系统发行版本:
http://trac.lighttpd.net/xcache/wiki/XcacheRedist
[4] Gentoo Portage Overlay 的配置:
http://gentoo-wiki.com/HOWTO_Installing_3rd_Party_Ebuilds
[5] XCache 的第三方 Ebuild: http://dev.hoffie.info/gentoo/dev-php5/xcache/
[6] 网站: http://xcache.lighttpd.net 在这里你能找到各种资料,不过目前由于 trac 不支持
多国语言轻松并存所以只写了英文版本的各种说明。
[7] 论坛: http://club.phpe.net/ http://forum.lighttpd.net/forum/4/
[8] m4 是一个宏语言。其实 c/c++ 所支持的宏功能也是由 cpp 宏语言来实现,这跟 m4 是同行,不
过 m4 的宏功能更强大。autoconf/libtool (用于 phpize 生成 configure 那个工
具)/sendmail 等工具都使用到 m4。我在编写 lighttpd 配置文件也采用 m4 宏。
25/65
扩展 PHP
Ben/文
为什么要扩展
写扩展的基础
既然扩展是如此的“无所不能”,那么编写一个扩展是否需要一个很高的门槛呢?
No!编写一个扩展是很容易的,只要具有一定的 C 语言基础就行。当然,若用其他语言进行开发也可以,
但由于 PHP 自身就是利用 C 编写的,因此无论是在代码兼容性还是可学习性(PHP 源码包中自带了很多
扩展的源代码,很有参考价值)上,C 语言都具有很大的优势。C++ 由于兼容 C,也可以作为一种选择,
但需要对代码的编译部分和其他一些地方做些技巧性的处理。
26/65
什么是扩展
开发环境的搭建
27/65
体使用方法可参见源码包根目录(即 $PHP)下的README.EXT_SKEL 文件。ext_skel_win32.php 顾
名 思 义 是 用 来 创 建 Win32 环 境 下 扩 展 框 架 的 的 脚 本 。 这 个 脚 本 需 要 Cygwin
(http://www.cygwin.com/) 的支持。使用方法和ext_skel 大同小异。本文所采用的是第三种方法:
使用 VC 的向导手动创建一个项目文件。这种方法好处就是不需要 Cygwin 的支持,但在编译该扩展的
xNix 版本时仍然需要通过ext_skel 来创建一个相应的框架。
28/65
点击【完成(Finish)】就创建了该扩展的项目文件。此时你应该会在 $PHP\ext\phpmore 目录下找
到该扩展的“解决方案(solution)”文件。在$PHP\ext\phpmore\ phpmore 目录下找到扩展的“项目
(Project)”文件。
29/65
<? 提示 ?> - PHPMORE
在 VC++ 2005 中添加源代码文件时默认的后缀名为 .cpp,此时需要主动为文
件添加上 .c 的扩展名。否则 VC 的编译器会将其默认为 C++ 代码而进行编译
(当然这种设置也是可以改变的),这样就可能会产生一些编译错误。
30/65
先 转 到 【 C++ 】 属 性 的 【 General 】 页 填 入 “Additional Include Directories” :
$PHP;$PHP\main;$PHP\win32;$PHP\TSRM;$PHP\Zend。我们这里输入的绝对路径,但实际开发过
程中最好填入相对路径。
此外还需要在【连接器(Linker)】属性的【Input】页添加一个“Additional Dependencies”:
php5ts.lib 。你可以把 php5ts.lib 放到一个 VC++ 能找到的地方,比如项目文件的目录。当然你
若采用的是 PHP 4 的源码包,请相应地把 php5ts.lib 替换为 php4ts.lib 。
31/65
<? 提示 ?> - PHPMORE
如果需要扩展在多种 PHP 版本中都可布署,那可以先设置一个基本配置(就像上
例不设置 php5ts.lib),然后再创建一个继承自基本配置的新的配置-比如
Release_PHP5-在这个 Release_PHP5 中额外设置一下 php5ts.lib 就可以
了。有的扩展还不事先预定义 ZTS,而是额外再创建一个 Release_TS 的配置,
道理是一样的。
OK,现在万事俱备,只欠编码了,让我们这就开始吧!
编码实现
为了简单叙述起见,我先列出本文例子的代码:
phpmore.h :
<? Code ?> - PHPMORE
#ifndef PHPMORE_H
#define PHPMORE_H
#endif
phpmore.c :
<? Code ?> - PHPMORE
#define _USE_32BIT_TIME_T 1
#include "php.h"
#include "phpmore.h"
zend_function_entry phpmore_functions[] =
32/65
{
ZEND_FE(welcome_to_phpmore, NULL)
{NULL, NULL, NULL}
};
zend_module_entry phpmore_module_entry =
{
STANDARD_MODULE_HEADER,
"PHP&More",
phpmore_functions,
NULL,
NULL,
NULL,
NULL,
PHP_MINFO(phpmore),
PHPMORE_VERSION,
STANDARD_MODULE_PROPERTIES
};
#if COMPILE_DL_PHPMORE
ZEND_GET_MODULE(phpmore)
#endif
PHP_MINFO_FUNCTION(phpmore)
{
php_info_print_table_start();
php_info_print_table_header(2, "PHP&More", "enabled");
php_info_print_table_end();
}
ZEND_FUNCTION(welcome_to_phpmore)
{
zend_printf("Welcome to PHP&More!");
}
33/65
zend_function_entry 结构的 Zend 函数数组。该数组用来声明本扩展一共对外(即PHP 脚本)提供
了多少可用的(导出)函数。由于没有其他地方可以主动提供(导出)函数的个数,因此数组的最后一个
元素必须为 {NULL, NULL, NULL},以便 Zend Engine 可以获知函数数组的元素列表是否结束。
PHP 解释器载入扩展,
扩展调用模块起始函数(MINIT)
然后开始等待每个 WEB 请求
所有 WEB 请求处理完毕
扩展调用模块关闭函数(MSHUTDOWN)
PHP 解释器卸载扩展
图五 PHP 扩展的生存期
34/65
模块声明后面就是 get_module() 函数的实现。这个函数的声明没有手动写出,而是使用了一个宏
ZEND_GET_MODULE(phpmore) 来声明。这也是在扩展开发中常用的一种手段,我们应该尽力地去使用
宏。get_module() 函数用于向 Zend Engine 报告这是个外部扩展,这也可以使得我们能够通过 dl()
函数来手动加载它。
剩下的两段代码便是我们前面声明函数的具体实现。一个是模块信息函数,一个是对外导出的
welcome_to_phpmore 函数。模块信息函数对外输出了本扩展的启用状态和版本号,而
welcome_to_phpmore 函数则在 PHP 脚本调用 welcome_to_phpmore() 时对外输出字符串
“Welcome to PHP&More!”。
35/65
<? Author ?> - PHPMORE
Ben
联系方式:ben.yan@msn.com
个人网站:http://www.yAnbiN.org
自由的程序员,喜好并在使用 PHP、Delphi 进行日常开发,同时也在学习
dotNET。侧重于 PHP 的性能与安全方面的研究,欢迎就本文或者其他相关问题
联系和交流。
36/65
Mysql 集群技术简介
叶金荣/文
一、MySQL Cluster 概述
37/65
所有的这些节点构成一个完成的 MySQL 集群体系。数据保存在“NDB 存储服务器”的存储引擎中,表(结
构)则保存在“MySQL 服务器”中。应用程序通过“MySQL 服务器”访问这些数据表,集群管理服务器通过
管理工具(ndb_mgmd)来管理“NDB 存储服务器”。
通过将 MySQL Cluster 引入开放源码世界,MySQL 为所有需要它的人员提供了具有高可用性、高性能
和可缩放性的 Cluster 数据管理。
“NDB” 是一种“内存中”的存储引擎,它具有可用性高和数据一致性好的特点。
MySQL Cluster 能够使用多种故障切换和负载平衡选项配置 NDB 存储引擎,但在 Cluster 级别上的
存储引擎上做这个最简单。MySQL Cluster 的 NDB 存储引擎包含完整的数据集,仅取决于 Cluster 本
38/65
身内的其他数据。
目前,MySQL Cluster 的 Cluster 部分可独立于 MySQL 服务器进行配置。在 MySQL Cluster 中,
Cluster 的每个部分被视为 1 个节点。
三、开始准备
1、准备服务器
节点(用途) IP 地址(主机名)
管理节点(MGM) 192.168.0.1(db1)
SQL 节点 1(SQL1) 192.168.0.2(db2)
SQL 节点 2(SQL2) 192.168.0.3(db3)
数据节点 1(NDBD1) 192.168.0.4(db4)
数据节点 2(NDBD2) 192.168.0.4(db5)
39/65
2、注意事项及其他
四、开始安装
1、假定条件
root# cd /tmp/
root# tar zxf mysql-max-5.0.24-linux-i686.tar.gz
root# mv mysql-max-5.0.24-linux-i686 /usr/local/mysql/
root# cd /usr/local/mysql/
root# ./configure --prefix=/usr/local/mysql
root# ./scripts/mysql_install_db
root# chown -R nobody:nobody /usr/local/mysql/
3、配置 SQL 节点
root# vi /usr/local/mysql/my.cnf
然后输入如下内容:
40/65
[mysqld]
basedir = /usr/local/mysql/
datadir = /usr/local/mysql/data
user = nobody
port = 3306
socket = /tmp/mysql.sock
ndbcluster
ndb-connectstring=db1
[MYSQL_CLUSTER]
ndb-connectstring=db1
4、配置存储节点(NDB 节点)
root# vi /usr/local/mysql/my.cnf
然后输入如下内容:
[mysqld]
ndbcluster
ndb-connectstring=db1
[MYSQL_CLUSTER]
ndb-connectstring=db1
5、安装管理节点
root# cd /tmp/
root# tar zxf mysql-max-5.0.24-linux-i686.tar.gz
root# mkdir /usr/local/mysql/
root# mkdir /usr/local/mysql/data/
root# cd mysql-max-5.0.24-linux-i686/bin/
root# cp ndb_mgm* /usr/local/mysql/
root# chown -R nobody:nobody /usr/local/mysql
6、配置管理节点
root# vi /usr/local/mysql/config.ini
然后输入如下内容:
[NDBD DEFAULT]
41/65
NoOfReplicas=1
[TCP DEFAULT]
portnumber=3306
#设置管理节点服务器
[NDB_MGMD]
hostname=db1
#MGM 上保存日志的目录
datadir=/usr/local/mysql/data/
#设置存储节点服务器(NDB 节点)
[NDBD]
hostname=db4
datadir=/usr/local/mysql/data/
#第二个 NDB 节点
[NDBD]
hostname=db5
datadir=/usr/local/mysql/data/
42/65
• 在每台存储节点服务器上,如果是第一次启动 ndbd 进程的话,必须先执行以下命令:
• root# /usr/local/mysql/bin/ndbd --initial
root# /usr/local/mysql/bin/ndbd
如果一切顺利,也就是启动过程中没有任何错误信息出现,那么就在管理节点服务器上运行如下
命令:
root# /usr/local/mysql/ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> SHOW
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @192.168.0.4 (Version: 5.0.22, Nodegroup: 0, Master)
id=3 @192.168.0.5 (Version: 5.0.22, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.0.1 (Version: 5.0.22)
[mysqld(SQL)] 1 node(s)
id=2 (Version: 5.0.22)
id=3 (Version: 5.0.22)
43/65
六、创建数据库表
下面是一个例子:
在 db2 上,创建数据表,插入数据:
在 db3 上,查询数据:
七、安全关闭
44/65
运行以下命令关闭 SQL 节点的 mysqld 服务:
八、其他
45/65
LAMP 系统优化实例分析
Dalamar /文
我们假设,php 应用已经充分缓冲了数据库查询结果,数据库不再成为瓶颈。
我们使用的试验系统是
一,php 本身的优化
安装方法很简单
46/65
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
二, web 服务器优化
47/65
b, Timeout 和 KeepAlive 参数
c,MPM 参数设置
这里用的 prefork,以下参数根据系统实际情况调整测试了。这里只是个例子
d, 压缩输出页面,提高系统吞吐量
48/65
urce application/x-httpd-php
<Location />
# Insert filter
SetOutputFilter DEFLATE
比如以下都可以删除
49/65
f,其他参数调整
三,Linux 服务器调整
a,使用 tmpfs
50/65
TMP_FILE_NUM=`find /dev/shm/eaccelerator/ -type f -name "eaccelerator*" -amin +180
| wc -l`;
find /dev/shm/eaccelerator/ -type f -name "eaccelerator*" -amin +180 -exec rm -f {} ;
echo "`date` cleared eaccelerator tmp directory at $TMP_FILE_NUM files" >> /root/clear_l
og.log;
b,tcp 优化
51/65
#get total memory used rate
total_mem_rate=`expr $mem_tmp / $total_mem`;
如果以上的优化还不能使系统稳定运行的话.
可以尝试 light httpd + fastcgi + php 的方案
configure
make
make install
然后修改 php.ini,增加
doc_root=""
cgi.force_redirect="0"
52/65
cgi.fix_pathinfo="1"
命令行下运行 /home/php4/bin/php -v
如果显示
PHP 4.4.4 (cgi-fcgi) (built: Oct 13 2006 12:20:04)
说明 fastcgi 的 php 安装正确
b,编译安装 lighthttpd
增加
<? Code ?> - PHPMORE
fastcgi.server = ( ".php" =>
(( "socket" => "/dev/shm/php-fastcgi.socket",
"bin-path" => "/home/php4/bin/php",
"min-procs" => 2,
53/65
"max-procs" => 10,
"bin-environment" => (
"PHP_FCGI_CHILDREN" => "16",
"PHP_FCGI_MAX_REQUESTS" => "1000" ),
"idle-timeout" => 20
))
)
apache 规则
e,注意事项:
54/65
大访问量的时候可能会死住。
目前 light http + fastcgi 的 php 还不是特别成熟,建议是系统在高负荷的情况下使用,负载
降下来以后切换回 apache。
55/65
56/65
Subversion PHP Binding
sirtoozee/文
什么是 Subversion?
图 1 团队协同工作
谁在使用 Subversion?
Zend Framework
Zend Framework 是 开 源 项 目 , 匿 名 用 户 可 以 直 接 从 它 的 Subversion 库 里
(http://framework.zend.com/svn/framework/)导出下载到所有的源代码(岂止此文档最后更
新,它的 trunk 版本已经提交了 1557 次!)。
LCUC
LCUC(http://www.lcuc.org)是面向中国学生的 Linux 校园联盟,采用了 DST(Drupal +
Subversion + Trac 的组合)。注册用户(基于 Apache 的 AuthMySQL 模组认证)可以参与 LCUC 的
开 源 项 目 ( 例 如 SVN Commit 、 Trac New Ticket ), 匿 名 用 户 可 以 从 它 的 Subversion 库 里
(http://svn.freesys.cn/public/svn-lcuc/)导出下载到所有的源代码、文档(岂止此文档最
后更新,它的 trunk 版本提交了 113 次)。
57/65
为什么将 Subversion 和 PHP Binding(捆绑)起来?
不统一的客户端
在 Unix/Linux、Windows 下可以使用 Subversion 的 svn 命令行模式,如图 3.1 所示:
58/65
图 3.2 TortoiseSVN 应用程式模式
不方便的服务端
Subversion 基于 Apache 的 SVNDAV 认证模式需要手工调用 htpasswd 命令编辑认证文件;
Subversion 库目录分组认证需要手工调用 svnserver 命令编辑 svnserver.conf。
统一的客户端
采用 Subversion Python Binding,Edgewall 公司开发了项目管理软体 Trac。需要在客户端通过
svn-diff 查看不同修订版本之间的差异,现在通过统一、方便的 Web 界面呈现给协同开发的项目组成员,
如图 3.2 所示:
59/65
图 3.2 Trac 的 Web 界面呈现 svn-diff
方便的服务端
借助 Subversion PHP Binding,Archermind 公司开发了统一、方便的软件外包项目管理软体 DST,
如图 3.4 所示:
60/65
图 3.4 DST 整体架构
a) 管理 Subversion 库
轻松创建项目 Subversion 库,无须登陆服务器调用 svnadmin create your-project。
b) 管理 Subversion 认证
与项目组所有注册成员帐号绑定,无须登陆服务器调用 htpasswd your-svn-users。
c) 管理 Subversion 目录访问
与项目组成员的权限绑定,无须登陆服务器调用 svnserver you-svnserver.conf。
61/65
图 4.1 Subversion PHP Binding 开启
62/65
PHP_FUNCTION(svn_repos_create);
PHP_FUNCTION(svn_repos_recover);
PHP_FUNCTION(svn_repos_hotcopy);
PHP_FUNCTION(svn_repos_open);
PHP_FUNCTION(svn_repos_fs);
PHP_FUNCTION(svn_repos_fs_begin_txn_for_commit);
PHP_FUNCTION(svn_repos_fs_commit_txn);
PHP_FUNCTION(svn_fs_revision_root);
PHP_FUNCTION(svn_fs_check_path);
PHP_FUNCTION(svn_fs_revision_prop);
PHP_FUNCTION(svn_fs_dir_entries);
PHP_FUNCTION(svn_fs_node_created_rev);
PHP_FUNCTION(svn_fs_youngest_rev);
PHP_FUNCTION(svn_fs_file_contents);
PHP_FUNCTION(svn_fs_file_length);
PHP_FUNCTION(svn_fs_txn_root);
PHP_FUNCTION(svn_fs_make_file);
PHP_FUNCTION(svn_fs_make_dir);
PHP_FUNCTION(svn_fs_apply_text);
PHP_FUNCTION(svn_fs_copy);
PHP_FUNCTION(svn_fs_delete);
PHP_FUNCTION(svn_fs_begin_txn2);
PHP_FUNCTION(svn_fs_is_dir);
PHP_FUNCTION(svn_fs_is_file);
PHP_FUNCTION(svn_fs_node_prop);
PHP_FUNCTION(svn_fs_change_node_prop);
PHP_FUNCTION(svn_fs_contents_changed);
PHP_FUNCTION(svn_fs_props_changed);
PHP_FUNCTION(svn_fs_abort_txn);
Subversion 版本管理功能:合并、分支、删除……
PHP_FUNCTION(svn_blame);
PHP_FUNCTION(svn_merge);
PHP_FUNCTION(svn_revert);
PHP_FUNCTION(svn_resolved);
PHP_FUNCTION(svn_copy);
PHP_FUNCTION(svn_move);
PHP_FUNCTION(svn_propset);
PHP_FUNCTION(svn_propget);
PHP_FUNCTION(svn_proplist);
PHP_FUNCTION(svn_export);
PHP_FUNCTION(svn_url_from_path);
PHP_FUNCTION(svn_uuid_from_url);
63/65
PHP_FUNCTION(svn_uuid_from_path);
PHP_FUNCTION(svn_switch);
PHP_FUNCTION(svn_mkdir);
PHP_FUNCTION(svn_delete);
a) 以 svn_auth_set_parameter 认证举例:
b) 以 svn_diff 版本差异举例:
通过看 svn_diff(string path1, int rev1, string path2, int rev2),在 PHP 脚本里调用
svn_diff 时,需要指明 Subversion 库的路径 string path1 和 string path2,需要指明比较的
不同版本 int rev1 和 int rev2。
总结
64/65
因此整合 Subversion 开发的 C/S、B/S 架构的商业产品、开源项目在 Google 里一搜就分 N 页。
PHP fans 如果感兴趣可以加入到 LCUC 的开源项目中来,也可以和其他的 PHP fans 协同开发一套整合
Subversion 的好东东哦 ^_^
65/65