Mysql error
##########custom
max_connections = 1000
wait_timeout = 5
skip-bdb
skip-innodb
tmpdir = /disk2/tmp/
如果不指定mysql的tmpdir,且默认的/var/tmp目录空间不足,那么一旦自动脚本出现问题,就会把mysql卡住,继而出现更多错误。我完全有理由相信Oracle有同样的问题,特别是在reset重启之后,而他们几乎从来没有修复过。
##########custom
max_connections = 1000
wait_timeout = 5
skip-bdb
skip-innodb
tmpdir = /disk2/tmp/
如果不指定mysql的tmpdir,且默认的/var/tmp目录空间不足,那么一旦自动脚本出现问题,就会把mysql卡住,继而出现更多错误。我完全有理由相信Oracle有同样的问题,特别是在reset重启之后,而他们几乎从来没有修复过。
为了对得起早上那个BSD fans的热情,把我上次给公司做的负载均衡集群方案给大家参考参考,有的人就很不愿意把自己做的东西写出来,因为知道的人越多,含金量就越少了,我倒是觉得,知道的人越多,才能萌生出更多的ideas,说老实话我不喜欢做SA,我讨厌机房的灰尘和风扇的呜呜声,我只是很喜欢FreeBSD这个纯洁的操作系统,就像一个裸体一样(这话不是我说的)。
G时代网站 www.gtime.cn 负载均衡集群方案
应用背景
伴随着全球企业日益重视竞争和协作的统一,企业开始对系统的高可用性应用提出了越来越高的要求。类unix操作系统以其低廉的价格,稳定的性能以及强大的服务器集群功能在市场中占有越来越大的比例.
方案介绍
服务器集群就是将一组独立的服务器作为单一系统进行管理,以此来实现更高的可靠性。整个系统中每一台服务器都处于相互的监视状态当中,一旦出现某一服务器宕机,或者其他不能正常工作的现象,另外的服务器就可以立即接管其所有服务,使所有用户能够正常工作。服务器集群基本架构如下图所示: (图略)
TOMCAT 服务器使用IP多点传送在集群中的服务器例程间进行一对多的通讯,IP多点传送是一种能够让多服务器向指定IP地址和端口号进行订阅并且监听消息的广播技术(多点传送IP地址范围从224.0.0.0 到239.255.255.255)。在集群中的每个服务器都使用多点传送广播特定的 heartbeat消息,通过监视这些 heartbeat消息,在集群中的服务器例程判断什么时候服务器例程失效。在服务器通讯中使用IP多点传送的一个缺点是他不能保证这些消息被确实接收到了。
上面的图例已经表明了网站的基本架构,前台使用Apache作为负载均衡和缓存,后台使用三台tomcat进行集群,在当前的tomcat版本中,只有all to all的会话复制,所以官方文档只建议做2到4台的集群,下一个发行版本中tomcat会推出适用于大型集群系统的session复制体系。
服务器环境以及软件平台
FreeBSD5.4(http://www.freebsd.org) ,
j2sdk1.4.2(http://www.sun.com)
Apache2.2.0(http://httpd.apache.org)
Tomcat5.0.30(http://tomcat.apache.org)
一共四台服务器,221.5.234.140(192.168.0.1)作为www前台代理用于负载均衡和内部网关用于集群,192.168.0.2,192.168.0.3,192.168.0.4,分别命名为2号服务器,3号服务器,4号服务器,三台主机各启动一个tomcat例程。
首先安装各种软件,均使用默认安装,这里不做赘述,安装完成后的路径为
JAVA JDK:/usr/local/jdk1.4.2
Tomcat:/usr/local/jakarta-tomcat5.0/
Apache:/usr/local/httpd
全部方案分为四个部分:集群,负载均衡,输出压缩,存储服务器
附:网关设置,web访问统计,内网服务器状态监视,服务器代码管理,服务器操作系统管理。
配置过程:
集群部分:
Tomcat:
1.本方案中,原计划使用3个独立IP做集群以便于管理,但是因为分配的IP不在一个子网当中,无法使用多播,所以改用私有IP做内部集群,因为后台的三个tomcat也不对互联网开放服务,前台服务器一共有两张网卡,其中一张使用一个公网IP221.5.234.140,另外一张使用私有IP192.168.0.1,同时开启网关(附后)
2.使用tomcat自带的session复制体系,取消server.xml当中“<Cluster className=”部分的注释,对于集群使用相同的多播地址224.0.0.4。
3.在每个WWW网站应用中的web.xml文件,添加<distributable/>元素。
关闭tomcat的http connector端口,打开tomcat ajp13端口供Apache调用,同时对ajp13端口进行一些细微调节。
4.前台服务器上的apache和后台三台PC机上的tomcat相应端口如下表所示。(表略)
5.在tomcat启动文件startup.sh中设置JAVA_HOME=/usr/local/jdk1.4.2环境变量;启动tomcat
Tomcat范例配置文件如下:(配置文件略)
负载均衡部分:
安装Apache2.2.0,编译时加入ajp代理以及反向代理参数以及负载均衡参数:
./configure –enable-proxy –enable-proxy-ajp –enable-proxy-balancer
本方案中,221.5.234.140上的Apache代理后台的三个tomcat(TC02,TC03,TC04)。
在221.5.234.140上的Apache的配置文件中写入
<Proxy balancer://gtCluster> #定义均衡服务器集群名,下同
BalancerMember ajp://192.168.0.2:8009
BalancerMember ajp://192.168.0.3:8009
BalancerMember ajp://192.168.0.4:8009
</Proxy>
<Location />
ProxyPass balancer://gtCluster/ #代理通过该集群名,下同
</Location>
表示221.5.234.140这台主机的Apache使用ajp13模块代理192.168.0.2,192.168.0.3,192.168.0.4上的三个Tomcat,存储服务器和www前台代理放置于同一主机,所以需要设置虚拟主机。
虚拟主机设置如下:
修改/usr/local/httpd/conf/extra/httpd-vhosts.conf,创建基于域名的虚拟主机
NameVirtualHost *:80 #定义主机类型,主机端口
<VirtualHost *:80>
Servername storage.gtime.cn #定义存储服务器域名
CustomLog logs/storage.gtime.cn_access_log combined
<Directory “/files”> #定义存储服务器根路径
AllowOverride None
Options None
</Directory>
DocumentRoot /files
Alias /awstatsclasses “/usr/local/httpd/cgi-bin/wwwroot/classes/” #web日志统计分析软件用
Alias /awstatscss “/usr/local/httpd/cgi-bin/wwwroot/css/” #web日志统计分析软件用
Alias /awstatsicons “/usr/local/httpd/cgi-bin/wwwroot/icon/” #web日志统计分析软件用
ScriptAlias /awstats/ “/usr/local/httpd/cgi-bin/wwwroot/cgi-bin/” #web日志统计分析软件用
</VirtualHost>
<VirtualHost *:80>
Servername www.gtime.cn #定义WWW前台代理域名
CustomLog logs/www.gtime.cn_access_log combined
<Proxy balancer://gtCluster>
BalancerMember ajp://192.168.0.2:8009
BalancerMember ajp://192.168.0.3:8009
BalancerMember ajp://192.168.0.4:8009
</Proxy>
<Location />
ProxyPass balancer://gtCluster/
</Location>
</VirtualHost>
页面输出压缩部分:
使用Apache的deflate模块进行页面压缩,在编译Apache的时候,加入选项:
–enable-deflate
编译完成之后,在httpd.conf中中加入下列语句:
###############gzip output##################
<IfModule mod_deflate.c>
#如果编译了mod_deflate则调用之
DeflateCompressionLevel 9
#gzip压缩比率,可调整为1到9,数字越大压缩比率越大,服务器负荷越高,客户端PC要求越大。
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-jsp
#只压缩html,txt,xml.jsp文件
</IfModule>
##########################################
压缩效果是很明显的,未压缩之前的www首页是75.96KB,压缩之后只有11.36KB。
存储服务器部分:
目前将存储服务器和www代理服务器放置于同一硬件设备上,存储服务器域名为storage.gtime.cn,后台更新程序亦放置于该服务器,所以存储服务器上运行有一个Tomcat,导致必须使用虚拟主机来区分对www.gtime.cn:80和storage.gtime.cn:80的访问,虚拟主机设置如前文所述。
附:
网关设置
网关NAT选用Freebsd自带的IPFILTER,重新编译操作系统内核,在编译系统内核时加入如下选项:
options IPFILTER #编译加入IPFILTER
options IPFILTER_LOG
options BRIDGE
编译内核并且安装完之后,在系统配置文件中加入如下选项
####rc.conf
gateway_enable=”YES” #启用网关
ipfilter_enable=”YES” #启用ipfilter
ipfilter_flags=””
ipmon_enable=”YES”
ipmon_flags=”-Dsvn”
ipnat_enable=”YES” #启用IPNAT,以便将内网服务映射到外网
设置IPNAT:
建立IPNAT启动文件:
vi /usr/local/etc/rc.d/ipnat.sh
#!/bin/sh
[ -x /sbin/ipnat ] && /sbin/ipnat -CF -f /etc/ipnat.rules && ipf=-y && echo -n ‘ipnat’
建立IPNAT规则:注:fxp0和em0各代表一张网卡
map fxp0 192.168.0.0/24 -> 221.5.234.140/32 #建立192.168.0.0子网
map em0 192.168.0.0/24 -> 221.5.234.140/32
######ftp######将192.168.0.2服务器的21端口映射到221.5.234.140的xxxx端口,以下类似######
rdr fxp0 221.5.234.140/32 port xxxx -> 192.168.0.2 port 21 tcp
rdr em0 221.5.234.140/32 port xxxx -> 192.168.0.2 port 21 tcp
rdr fxp0 221.5.234.140/32 port xxxx -> 192.168.0.3 port 21 tcp
rdr em0 221.5.234.140/32 port xxxx -> 192.168.0.3 port 21 tcp
rdr fxp0 221.5.234.140/32 port xxxx -> 192.168.0.4 port 21 tcp
rdr em0 221.5.234.140/32 port xxxx -> 192.168.0.4 port 21 tcp
######ssh#######将192.168.0.2服务器的22端口映射到221.5.234.140的xxxx端口,以下类似##
rdr fxp0 221.5.234.140/32 port xxxx -> 192.168.0.2 port 22 tcp
rdr em0 221.5.234.140/32 port xxxx -> 192.168.0.2 port 22 tcp
rdr fxp0 221.5.234.140/32 port xxxx -> 192.168.0.3 port 22 tcp
rdr em0 221.5.234.140/32 port xxxx -> 192.168.0.3 port 22 tcp
rdr fxp0 221.5.234.140/32 port xxxx -> 192.168.0.4 port 22 tcp
rdr em0 221.5.234.140/32 port xxxx -> 192.168.0.4 port 22 tcp
#######apache######将192.168.0.2服务器的80端口映射到221.5.234.140的xxxx端口,以下类似##
rdr fxp0 221.5.234.140/32 port xxxx -> 192.168.0.2 port 80 tcp
rdr em0 221.5.234.140/32 port xxxx -> 192.168.0.2 port 80 tcp
rdr fxp0 221.5.234.140/32 port xxxx -> 192.168.0.3 port 80 tcp
rdr em0 221.5.234.140/32 port xxxx -> 192.168.0.3 port 80 tcp
rdr fxp0 221.5.234.140/32 port xxxx -> 192.168.0.4 port 80 tcp
rdr em0 221.5.234.140/32 port xxxx -> 192.168.0.4 port 80 tcp
偶也来赶赶时髦!Sqlite【注1】越来 越有流行的趋势,其实三年前我就知道它了,但是觉得它是个鸡肋,直到我正式的体会到了小型应用中,没必要使用mysql的时候,它,出现了……. 在小型的CMS和Blog中,使用大型的关系数据库是不明智的,管理复杂,不便迁移,sqlite是这样一个东西:
1.它易于使用,不需要配置,不需要安装,也不需要管理员帐户;
2.支持大部分SQL92命令;
3.一个完整的数据库保存为磁盘上的一个文件,同一个数据库文件可以在不同机器上使用;
4.最大支持数据库到2TB;
5.整个系统少于3万行代码,少于250KB的内存占用(gcc);
6.大部分应用比目前常见的 客户端/服务端 的数据库快;
7.没有其它任何环境依赖,源代码开放;
8.实属居家旅行,杀人越货之必备软件,建议人手一份。
在 我看来最重要的是小巧,快速,支持大部分SQL92命令,这么精美的一个东西,让我萌发了把以前那个mysql计数器转过来的想法,这个计数器代码很简 单,网上到处都是,我要做的呢,就是把里面的mysql部分修改为sqlite的,废话少说,先建个表了来,sqlite是独立启动的,还是使用和 mysql相同的数据库名,visit_log,不过,sqlite的后缀可以随便改,我们就用visit_log.db吧,建个 visit_counter表,添加一个integer叫做amount,插入一个数据52419,娃哈哈哈…….最后select 一下看对不对,额,下面这个输出应该是对的……
数据库搞定了,下面我们来改程序,这些代码大部分是现成的,sqlite部分的代码是我改的,我不是程序员,所以里面很可能还有冗余的东西……..首先是进行写数据库的程序页面,sqlite_count.php
———————————
<?php
$db=sqlite_open(“visit_log.db”); //打开数据库。
$result=sqlite_query($db,”select * from visit_counter LIMIT 0,3″); //取得表的所有内容
$record=sqlite_fetch_array($result);
if(empty($visited)){
$counter=$record[“amount”]+1;//提出数据并加1
$sqlite=”update visit_counter set amount=$counter”;//更新数据库
$result=sqlite_query($db,$sqlite);
}
switch(strlen($counter)){ //将counter变量格式化
case 1:
$counter=”00000″.$counter;
break;
case 2:
$counter=”0000″.$counter;
break;
case 3:
$counter=”000″.$counter;
break;
case 4:
$counter=”00″.$counter;
break;
case 5:
$counter=”0″.$counter;
break;
sqlite_close($db);//关闭数据库的连接
}?>
——————————-
然后呢是读数据库并且生成图形计数器的页面sqlite_count_show.php
——————————-
<?php
$db=sqlite_open(“visit_log.db”); //打开数据库。
$result=sqlite_query($db,”select * from visit_counter LIMIT 0,3″); //取得表的所有内容
$record=sqlite_fetch_array($result);
$Countershow=$record[“amount”];
switch(strlen($Countershow)){ //将counter变量格式化
case 1:
$Countershow=”00000″.$Countershow;
break;
case 2:
$Countershow=”0000″.$Countershow;
break;
case 3:
$Countershow=”000″.$Countershow;
break;
case 4:
$Countershow=”00″.$Countershow;
break;
case 5:
$Countershow=”0″.$Countershow;
break;
}
Header(“Content-type: image/png”);
$pic=imagecreate(43,16); //创建图像
$bkcolor=ImageColorAllocate($pic,255,255,255); //定义背景色
$fcolor=ImageColorAllocate($pic,0,0,255); //定义字体颜色
imageline($pic,0,0,50,17,$bkcolor);
imagestring($pic,3,1,1,$Countershow,$fcolor);
Imagepng($pic);
ImageDestroy($pic);
sqlite_close($db);//关闭数据库的连接
?>
———————————
把 这两个文件和visit_log.db放在一个目录就可以了,至于效果嘛,大家可以看看偶Blog的右下角,额,php5里面已经包含了sqlite,不 用另外安装,但是,php4需要另外安装,不要去看网上那些安装方法,完全是胡说八道睁着眼睛说瞎话,你抄我的我抄你的,windows下面的不说了,太 简单,unix下面,首先要执行pear install sqlite,然后还没完,需要修改php.ini里面的ext目录,指向正确的位置(如果你之前没安装过任何php ext的话就必然有这一步),否则你的phpinfo里面是不可能出现sqlite的,
当然了,大部分人用它,是用来开发,而中国程序员的开发环境大多在windows下面,不用考虑这个问题,真正的web或者嵌入应用,现在似乎还没流行起 来(很多嵌入应用我们是不知道d~),我觉得,快了……..记得用sqlite2哈~php好像还没支持sqlite3……这个计数器只 是很简单的应用,sqlite当然可以支撑更多复杂的应用,但是我看好的是它在手持终端里面的应用,比如手机的通讯录,我这个moto a760就是用的 Berkeley DB XML,上次通讯录坏了,我找了半天愣是没找到修复数据库的方法……如果是sqlite就好了……
我在wap.kenbaby.org上面也加了一个计数器,大家可以用手机访问看看。
【注1】:About SQLite
———————
SQLite is a small C library that implements a self-contained, embeddable, zero-configuration SQL database engine. Features include:
* Transactions are atomic, consistent, isolated, and durable (ACID) even after system crashes and power failures.
* Zero-configuration – no setup or administration needed.
* Implements most of SQL92. (Features not supported)
* A complete database is stored in a single disk file.
* Database files can be freely shared between machines with different byte orders.
* Supports databases up to 2 terabytes (241 bytes) in size.
* Sizes of strings and BLOBs limited only by available memory.
* Small code footprint: less than 250KiB fully configured or less than 150KiB with optional features omitted.
* Faster than popular client/server database engines for most common operations.
* Simple, easy to use API.
* TCL bindings included. Bindings for many other languages available separately.
* Well-commented source code with over 95% test coverage.
* Self-contained: no external dependencies.
* Sources are in the public domain. Use for any purpose.
The SQLite distribution comes with a standalone command-line access program (sqlite) that can be used to administer an SQLite database and which serves as an example of how to use the SQLite library.
花费了我6个小时,大部分时间浪费在准备工作上,因为我不想刻光盘安装,却没想到从网络安装,最后在0.67上面设置了一个NFS-SERVER,从网络直接读取ISO文件进行安装,
#mdconfig -a -t vnode -f 6.0-RELEASE-i386-disc1.iso
#mdconfig -a -t vnode -f 6.0-RELEASE-i386-disc2.iso
#mount -t cd9660 /dev/md0 /pub
#mount -t cd9660 /dev/md1 /pub2
Edit /etc/exports
/pub -alldirs 202.202.*.*
/pub2 -alldirs 202.202.*.*
然 后浪费掉两个小时在磁盘空间划分上,因为我没想到图形界面居然需要2个G以上的空间,以前从来不用图形界面,最多1G就足够了,应该未雨绸缪,何况我的磁 盘空间不多了,用Pqmagic划空间的时候总是很小心,以前就划坏过,这次好像还不错,什么问题都没有,有时间了装一下其它的各种linux发行版,想 来应该不错,Windows的页面文件简直就是垃圾,什么作用也起不了,除了内存满时硬盘的一阵狂响,文件系统的优越性和内存管理的优越性,我想这才是为 什么有这么多nix服务器的原因,不错,用windows可以提供稳定的服务,不过你要为此付出10倍于nix系统的代价,即使你用的是盗版,我曾经总结 了一下,windows是这样一种系统,你需要1小时装好它,1小时调整它,1000个小时来维护它,nix是这样一种系统,你需要15分钟装好它,10 个小时调整它,以后所有维护时间的总和不会超过100小时,排除停电,机房进水,火灾地震等不可抗拒的因素……不过这液晶的固定分辨率让CLI显 得不太正常,字体好难看啊,GUI倒是能自动设置,刷新率,嗯不对液晶没有刷新率,所以我不知道它是不是自己调整了…..
注:
NFS:NFS就是Servers上的档案能被其他的机器mount,而达到资源共享,享用这些档案的机器就可称为 Client,一个client可以从server上mount一个或是一个层次的目录(file hierarchies).事实上任何一台机器都可以 做server or client,甚至同时为server and client。
CLI:Command line interface,命令行用户界面
GUI:Graphics user interface,图形化用户界面
这两天一直在搞tomcat的集群,网络上很多资料都是过时的,还有很多是错误的,不过没关系,我一般不看中文资料,一是翻译不到位,二是那些SB根本不 知道怎么去翻译一些专有名词,就像洋人始终理解不到成语的意思一样,tomcat的documents里面有一个简单的clustering,先用上,因 为javagroups使用的也是多播,和tomcat自带的这个是一个原理,在网络良好的状态下,这种方式应该没什么问题,虽然是执行的会话all to all copy,tomcat也说了,下一个发行版本会推出适用于大型集群的session复制体系,5.5是beta的,我想是不是要等到6.0哦。
———————————————–
In this release of session replication, Tomcat performs an all-to-all replication of session state. This is an algorithm that is only efficient when the clusters are small. For large clusters, the next release will support a primary-secondary session replication where the session will only be stored at one or maybe two backup servers. In order to keep the network traffic down in an all-to-all environment
———————————————-
总而言之呢,昨天和今天测试的集群看起来就像下面这样,不过呢,我不确定是不是每一个程序都能在上面正常的运行,而且分别是在redhat9和freebsd上面。
Oracle还是有问题,我想可能是我使用了额外的JDK1.1.8导致了错误,虽然表面上看起来一切都是正常的……找不出来问题所在就是最大的问题,下午开会的时候33打电话来了,没接,不知道她找我干嘛呢。