Archive for 虚拟服务器技术

安装Directadmin遇到错误

安装Directadmin遇到

*** Cannot find /usr/include/et/com_err.h. (yum install libcom_err-devel) ***
Installation didn’t pass, halting install.
Once requirements are met, run the following to continue the install:
cd /usr/local/directadmin/scripts
./install.sh
Common pre-install commands:

http://help.directadmin.com/item.php?id=354

==================
yum install libcom_err-devel
==================
Total 972 kB/s | 116 MB 02:02
Running rpm_check_debug
ERROR with rpm_check_debug vs depsolve:
keyutils-libs-devel is needed by krb5-devel-1.10.3-10.el6_4.1.i686
libselinux-devel is needed by krb5-devel-1.10.3-10.el6_4.1.i686
zlib-devel is needed by openssl-devel-1.0.0-27.el6_4.2.i686
** Found 7 pre-existing rpmdb problem(s), ‘yum check’ output follows:
e2fsprogs-devel-1.41.12-3.el6.i686 has missing requires of e2fsprogs-libs = (’0′, ’1.41.12′, ’3.el6′)
e2fsprogs-devel-1.41.12-3.el6.i686 has missing requires of libcom_err-devel
e2fsprogs-devel-1.41.12-3.el6.i686 has missing requires of pkgconfig(com_err)
krb5-devel-1.8.2-3.el6.i686 has missing requires of keyutils-libs-devel
krb5-devel-1.8.2-3.el6.i686 has missing requires of libcom_err-devel
krb5-devel-1.8.2-3.el6.i686 has missing requires of libselinux-devel
openssl-devel-1.0.0-4.el6.i686 has missing requires of zlib-devel

执行

yum -y install zlib-devel
yum -y install e2fsprogs*

即可解决

评论

Linux建立Swap分区文件并自动mount

目的:建立一个2G大小的swap分区,并在系统启动时自动mount。
系统环境:RedHat53

1. dd if=/dev/zero of=/swapfile bs=1k count=2048000
2. mkswap /swapfile
3. swapon /swapfile
4. 修改/etc/fstab使其启动时自动mount:
在/etc/fstab中增加如下语句:
/swapfile                             swap                                        swap        defaults                0 0
5. 搞定!

评论

ifto[ 安装教程

 

直接省略上面的步骤

CentOS系统:

yum install flex byacc  libpcap ncurses ncurses-devel

wget ftp://fr2.rpmfind.net/linux/dag/redhat/el5/en/i386/dag/RPMS/iftop-0.17-1.el5.rf.i386.rpm

rpm -ivh iftop-0.17-1.el5.rf.i386.rpm

评论

三款免费的PHP加速器:APC、eAccelerator、XCache比较

一直想找一些关于PHP加速的文章,偶然看到杀客的这篇文章,感觉不错,分享给大家,再此感谢杀客。

一、PHP加速器介绍

PHP加速器是一个为了提高PHP执行效率,从而缓存起PHP的操作码,这样PHP后面执行就不用解析转换了,可以直接调用PHP操作码,这样速度上就提高了不少。

Apache中使用mod_php的请求、响应执行流程:

1、Apache接收请求。
2、Apache传递请求给mod_php。
3、mod_php定位磁盘文件,并加载到内存中。
4、mod_php编译源代码成为opcode树。
5、mod_php执行opcode树。

PHP加速器相应的就是第四步,它的目的就是防止PHP每次请求都重复编译PHP代码,因为在高访问量的网站上,大量的编译往往没有执行速度快呢?所以这里面有个瓶颈就是PHP的重复编译既影响了速度又加载了服务器负载,为了解决此问题,PHP加速器就这样诞生了。

二、PHP加速器安装与配置

1、安装配置APC

APC全称是Alternative PHP Cache,官方翻译叫”可选PHP缓存”,它是PHP PECL中的一个扩展,好像是facebook在使用它,下面开始安装(ubuntu环境):
$wget http://pecl.php.net/get/APC-3.0.19.tgz
$tar xvzf APC-3.0.19.tgz
$cd APC-3.0.19/APC-3.0.19
$/usr/local/php/bin/phpize
$./configure –enable-apc –enable-apc-mmap –with-php-config=/usr/local/php/bin/php-config
$make
$sudo make install

下面我们再配置APC,因为我的PECL扩展路径改变了,所以我得移动下编译好的文件:
$sudo mv /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/apc.so /usr/local/php/lib/php/extensions/PECL

然后我们再编辑php.ini文件进行配置,请把下面的代码加入到php.ini中即可:
extension_dir = “/usr/local/php/lib/php/extensions/PECL”
extension = apc.so
; APC
apc.enabled = 1
apc.shm_segments = 1
apc.shm_size = 64
apc.optimization = 1
apc.num_files_hint = 0
apc.ttl = 0
apc.gc_ttl = 3600
apc.cache_by_default = on

这样重启apache就会在phpinfo()信息中显示。

       2、安装配置eAccelerator

eAccelerator的前身其实是truck-mmcache,因为开发truk-mmcache的人被Zend给招安了,所以开发eAccelerator的人继承了truk-mmcache的一些特性,设计出eAccelerator加速器。安装如下:
$wget http://jaist.dl.sourceforge.net/sourceforge/eaccelerator/eaccelerator-0.9.5.tar.bz2
$tar -jxf eaccelerator-0.9.5.tar.bz2
$cd eaccelerator-0.9.5
$/usr/local/php/bin/phpize
$./configure –enable-eaccelerator=shared –with-php-config=/usr/local/php/bin/php-config
$make
$sudo make install
$sudo mv /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so /usr/local/php/lib/php/extensions/PECL

将下面代码加入php.ini文件中
extension = eaccelerator.so
; eAccelerator
eaccelerator.shm_size = “16”
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.prune_period = “0”
eaccelerator.shm_only = “0”
eaccelerator.compress = “1”
eaccelerator.compress_level = “9”

创建缓存目录,重启apache

$sudo mkdir /tmp/eaccelerator
$sudo chmod 777 /tmp/eaccelerator
$sudo /usr/local/apache/apachectl restart

在phpinfo()检查是否安装成功.

3、安装配置XCache

XCache作为国人自己开发的东西,做小菜鸟的我也感到骄傲,而且XCache无论在速度还是性能上都做的不错。下面就赶紧让我们品尝它吧!

$wget http://xcache.lighttpd.net/pub/Releases/1.2.2/xcache-1.2.2.tar.gz
$tar xvzf xcache-1.2.2.tar.gz
$cd xcache-1.2.2
$/usr/local/php/bin/phpize
$./configure –enable-xcache –enable-xcache-coverager –with-php-config=/usr/local/php/php-config
$make
$sudo make install
$sudo mv /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/xcache.so /usr/local/php/lib/php/extensions/PECL

在php.ini添加配置信息:

extension = xcache.so
; xcache
xcache.admin.user = “admin”
xcache.admin.pass = “(执行) echo ’(你的密码)’|md5sum(得出的密文)”
;
xcache.size = 24M
xcache.shm_scheme = “mmap”
xcache.count = 2
xcache.slots = 8k
xcache.ttl = 0
xcache.gc_interval = 0

xcache.var_size = 8M
xcache.var_count = 1
xcache.var_slots = 8k
xcache.var_ttl = 0
xcache.var_maxttl = 0
xcache.var_gc_interval = 300
xcache.test = Off
xcache.readonly_protection = On
xcache.mmap_path = “/tmp/xcache”
xcache.coredump_directory = “”
xcache.cacher = On
xcache.stat = On
xcache.optimizer = Off
;
xcache.coverager = On
xcache.coveragedump_directory = “”

创建缓存目录,重启apache

$sudo mkdir /tmp/xcache
$sudo chmod 777 /tmp/xcache
$sudo /usr/local/apache/bin/apachectl restart

去查看phpinfo()信息吧!

三、PHP加速器测试

1、测试环境

硬件: AMD Athlon 64 X2 Dual Core Processor 4400+ @ 2.2GHz CPU, 2GB 内存. 160GB SATA 硬盘

软件: Linux Ubuntu server Gutsy 7.10, Apache 2.2.4, MySQL 5.0.45 和 PHP 5.2.3

测试指令: ab -c5 -n3000 http://example.com/ (我们使用的是Apache Benchmark (ab) 工具,并发连接为5,3000次请求)

2、测试结果

无任何加速器:

Document Path: /
Document Length: 21757 bytes
Concurrency Level: 5
Time taken for tests: 288.255212 seconds
Complete requests: 3000
Failed requests: 0
Write errors: 0
Total transferred: 66777000 bytes
HTML transferred: 65271000 bytes
Requests per second: 10.41 [#/sec] (mean)
Time per request: 480.425 [ms] (mean)
Time per request: 96.085 [ms] (mean, across all concurrent requests)
Transfer rate: 226.23 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.5 0 19
Processing: 181 479 186.0 444 1822
Waiting: 166 461 184.7 427 1708
Total: 181 479 186.0 444 1822
Percentage of the requests served within a certain time (ms)
50% 444
66% 525
75% 577
80% 619
90% 732
95% 819
98% 946
99% 1012
100% 1822 (longest request)

APC加速器:

Document Path: /
Document Length: 21757 bytes
Concurrency Level: 5
Time taken for tests: 98.530068 seconds
Complete requests: 3000
Failed requests: 0
Write errors: 0
Total transferred: 66777000 bytes
HTML transferred: 65271000 bytes
Requests per second: 30.45 [#/sec] (mean)
Time per request: 164.217 [ms] (mean)
Time per request: 32.843 [ms] (mean, across all concurrent requests)
Transfer rate: 661.84 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 2
Processing: 58 163 71.2 155 2452
Waiting: 53 158 69.6 150 2329
Total: 58 163 71.2 155 2452
Percentage of the requests served within a certain time (ms)
50% 155
66% 178
75% 193
80% 204
90% 235
95% 258
98% 285
99% 302
100% 2452 (longest request)

eAccelerator加速器:

Document Path: /
Document Length: 21757 bytes
Concurrency Level: 5
Time taken for tests: 95.983986 seconds
Complete requests: 3000
Failed requests: 0
Write errors: 0
Total transferred: 66777000 bytes
HTML transferred: 65271000 bytes
Requests per second: 31.26 [#/sec] (mean)
Time per request: 159.973 [ms] (mean)
Time per request: 31.995 [ms] (mean, across all concurrent requests)
Transfer rate: 679.39 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 3
Processing: 57 159 91.3 148 3830
Waiting: 50 152 89.8 142 3704
Total: 57 159 91.3 148 3830
Percentage of the requests served within a certain time (ms)
50% 148
66% 174
75% 193
80% 205
90% 239
95% 263
98% 289
99% 309
100% 3830 (longest request)

XCache加速器:

Document Path: /
Document Length: 21757 bytes
Concurrency Level: 5
Time taken for tests: 99.76300 seconds
Complete requests: 3000
Failed requests: 0
Write errors: 0
Total transferred: 66777000 bytes
HTML transferred: 65271000 bytes
Requests per second: 30.28 [#/sec] (mean)
Time per request: 165.127 [ms] (mean)
Time per request: 33.025 [ms] (mean, across all concurrent requests)
Transfer rate: 658.19 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 2
Processing: 59 164 83.4 155 3367
Waiting: 52 156 66.4 148 1802
Total: 59 164 83.4 155 3367
Percentage of the requests served within a certain time (ms)
50% 155
66% 178
75% 196
80% 206
90% 237
95% 263
98% 287
99% 305
100% 3367 (longest request)

3、结果摘要

请求时间(秒) 单次请求时间(毫秒) 最大内存占用(MB) 最小内存占用(MB)
None 10.41 96.08 24 24
APC 30.45 32.84 21 21
eAccelerator 31.26 31.99 23 18
XCache 30.28 33.02 29 19

四、PHP加速器比较结果总结

1、通过测试得出eAccelerator在请求时间和内存占用综合方面是最好的。

2、通过测试得出使用加速器比无加速器在请求时间快了3倍左右。

3、通过各个官方观察,XCache是更新最快的,这也说明最有发展的。

以上是总结结果,你也许会问我到底用那个加速器好呢?我只能告诉你,首先,用一定比不用好,其次每个加速器还有一些可以调优的参数,所以要根据你的系统环境而定,然后,我个人觉得你可以详细研究下eAccelerator和XCache,这两款潜力还是很大的,最后我从比较专业的测试网站搞了一张结果图:

cache

评论

linux下如何实时查看mysql当前连接数??命令是啥?

mysqadmin -uroot -p processlist
可以看出连接的详细资料.

如果只是想看连接数.
直接打mysqladmin status
Threads就是连接数

评论

服务器安全计划

To ensure that my CentOS machines run as efficiently and securely as possible, I disable a number of services after each installation. The end result is a system that accepts ssh connections on TCP port 22, and on one or more service ports that are in use by the applications hosted on the platform. To get to this state, I go through and disable numerous services that come enabled by default. Here is the default list of services that are enabled after a CentOS 4.4 installation:

chkconfig –list | grep on

atd             0:off   1:off   2:off   3:on    4:on    5:on    6:off
messagebus      0:off   1:off   2:off   3:on    4:on    5:on    6:off
smartd          0:off   1:off   2:on    3:on    4:on    5:on    6:off
portmap         0:off   1:off   2:off   3:on    4:on    5:on    6:off
sendmail        0:off   1:off   2:on    3:on    4:on    5:on    6:off
netfs           0:off   1:off   2:off   3:on    4:on    5:on    6:off
cups            0:off   1:off   2:on    3:on    4:on    5:on    6:off
irqbalance      0:off   1:off   2:off   3:on    4:on    5:on    6:off
rpcgssd         0:off   1:off   2:off   3:on    4:on    5:on    6:off
xfs             0:off   1:off   2:on    3:on    4:on    5:on    6:off
isdn            0:off   1:off   2:on    3:on    4:on    5:on    6:off
autofs          0:off   1:off   2:off   3:on    4:on    5:on    6:off
gpm             0:off   1:off   2:on    3:on    4:on    5:on    6:off
apmd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
crond           0:off   1:off   2:on    3:on    4:on    5:on    6:off
acpid           0:off   1:off   2:off   3:on    4:on    5:on    6:off
microcode_ctl   0:off   1:off   2:on    3:on    4:on    5:on    6:off
pcmcia          0:off   1:off   2:on    3:on    4:on    5:on    6:off
cpuspeed        0:off   1:on    2:on    3:on    4:on    5:on    6:off
xinetd          0:off   1:off   2:off   3:on    4:on    5:on    6:off
rpcidmapd       0:off   1:off   2:off   3:on    4:on    5:on    6:off
readahead_early 0:off   1:off   2:off   3:off   4:off   5:on    6:off
readahead       0:off   1:off   2:off   3:off   4:off   5:on    6:off
sshd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
anacron         0:off   1:off   2:on    3:on    4:on    5:on    6:off
network         0:off   1:off   2:on    3:on    4:on    5:on    6:off
kudzu           0:off   1:off   2:off   3:on    4:on    5:on    6:off
syslog          0:off   1:off   2:on    3:on    4:on    5:on    6:off
nfslock         0:off   1:off   2:off   3:on    4:on    5:on    6:off
rawdevices      0:off   1:off   2:off   3:on    4:on    5:on    6:off
mdmonitor       0:off   1:off   2:on    3:on    4:on    5:on    6:off
haldaemon       0:off   1:off   2:off   3:on    4:on    5:on    6:off

Several of these services are required, but several others serve no purpose in my environment, and use CPU and memory resources that would be better allocated to my applications. Since I don’t use RPC services, autofs or NFS, those are the first to get disabled:

$ /sbin/chkconfig –level 0123456 portmap off
$ /sbin/chkconfig –level 0123456 nfslock off
$ /sbin/chkconfig –level 0123456 netfs off
$ /sbin/chkconfig –level 0123456 rpcgssd off
$ /sbin/chkconfig –level 0123456 rpcidmapd off
$ /sbin/chkconfig –level 0123456 autofs off

I also don’t allow individual hosts to receive mail from the outside world, so sendmail gets nixed next:

$ /sbin/chkconfig –level 0123456 sendmail off

On server platforms, who needs printing?:

$ /sbin/chkconfig –level 0123456 cups off

Now we get to the font server, isdn capabilities, console mouse and pcmcia support. I don’t use these services on my servers, so they get disabled as well:

$ /sbin/chkconfig –level 0123456 xfs off
$ /sbin/chkconfig –level 0123456 isdn off
$ /sbin/chkconfig –level 0123456 gpm off
$ /sbin/chkconfig –level 0123456 pcmcia off

Once these services are disabled (and optionally stopped with the service command or a reboot), my netstat output looks nice and clean:

netstat –tcp –udp –listening

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 *:ssh                       *:*                         LISTEN

This has served me well over the years, since it reduces boot time (less rc scripts to run), and frees up additional resources for my applications (while this isn’t substantial, every page of memory helps!).

评论

CentOS 5 中OpenSSL和OpenSSH升级

CentOS 5 中OpenSSL和OpenSSH升级

2010-10-24 23:44

把OpenSSL和OpenSSH升级了。CentOS 5.2所带的OpenSSL是0.9.8b,OpenSSH是4.0p1。升级方法如下:

 

openssh 最新版本(http://www.openssh.com/portable.html)

 

wget http://www.openssl.org/source/openssl-0.9.8j.tar.gz

 

tar zxvf openssl-0.9.8j.tar.gz

 

cd openssl-0.9.8j

 

./config –prefix=/usr

 

make

 

make test

 

make install

 

wget http://openbsd.noc.jgm.gov.ar/pub/OpenBSD/OpenSSH/portable/openssh-5.2p1.tar.gz

 

tar zxvf openssh-5.2p1.tar.gz

 

cd openssh-5.2p1

 

./configure –prefix=/usr –with-pam –with-zlib –sysconfdir=/etc/ssh –with-ssl-dir=/usr –with-md5-passwords

 

make

 

make install

评论

管理OpenVZ资源-CPU share篇

 

继续昨天的内容,今日描述的是OpenVZ中如何控制VE可使用的CPU资源。OpenVZ资源管理器允许通过保证VE可使用的CPU time来实现QoS。在

 

没有设定cpulimit,以及没有其他VE竞争CPU资源的情况下,VE在获得设置的最小设定保证值外,还可以超过该值,以充分利用HW的CPU资源。

 

一、可设定参数
OpenVZ使用特定的运算规则计算CPU time,而设定值的单位就是CPU time。这就能避免单CPU和多CPU负载不平均,不能充分利用资源的问题。
可设定参数有:

引用
ve0cpuunits:该参数在全局配置文件中设置,定义VPS 0可使用的最少CPU time,也就是HW可获得保证的最少资源值。建议设置为HW CPU time总值的5~10%;
cpuunits:VE可获得保证的最少CPU time资源;
cpulimit:该VE不允许超过的CPU time百分比。

正如开头提到的,cpuunits不是固定值,只要资源许可,在没有超过cpulimit百分比的情况下,VE可充分获取CPU资源。

二、设置CPU share
1、计算HW总的CPU time
第一步,当然是需要计算当前VPS 0(HW)有多少CPU time可以支配。

引用
# vzcpucheck
Current CPU utilization: 1000 #已由HW和启动的VE占用的CPU time
Power of the node: 85105 #HW的CPU time总数

2、HW可用CPU time

引用
# grep ‘VE0CPUUNITS=1000’ /etc/vz/vz.conf
VE0CPUUNITS=1000

这是默认值,也等于没启动VE前,运行vzcpucheck得到的结果。

3、设置VE的CPU time

# vzctl set 115 –cpuunits 2500 –cpulimit 5 –save

或者

引用
# vi /etc/vz/conf/115.conf
CPUUNITS=”2500″
CPULIMIT=”5″

意思就是:

引用
1)即使在HW的CPU满负荷,或者讲,the current CPU utilization等于the power of the Node的情况下,115 VE都可以得到约3%(2500/85105)的CPU time资源;
2)但在CPU空闲的情况下,115 VE并不能得到超过5%的CPU time资源;
3)也就是讲,正常情况下,115 VE可用的CPU time资源在3%~5%之间;
4)若不设置cpulimit,那么115 VE在没有其他VE竞争,而资源又允许的情况下,就可以超过3%,但只要不超过HW的负荷就可以了。

启动VE,结果:

引用
# vzctl start 115
# vzcpucheck
Current CPU utilization: 3500
Power of the node: 85105

该设置还是动态有效的:

引用
# vzctl set 115 –cpuunits 4000 –cpulimit 5 –save
Setting CPU limit: 5
Setting CPU units: 4000
Configure meminfo: 49152
Saved parameters for VE 115
# vzcpucheck
Current CPU utilization: 5000
Power of the node: 85105

4、问题
从上面的描述可以知道,OpenVZ通常用最少保证值来让VE可充分的利用系统资源,这是其设计原理之一。但由此会带来一个问题,就是:

引用
# vzctl set 112 –cpuunits 85000 –cpulimit 5 –save
# vzctl start 112
# vzcpucheck
Current CPU utilization: 105000
Power of the node: 85105
Warning: hardware node is overcommited

万一,你为所有VE设定的其最少保证可用CPU time资源总值大于HW实际的CPU time。那么,就可能会发生CPU过载的问题。当真正发生此情况的时候,115 VE就不能获得其原来保证可获得的3%的CPU time资源,由此可能会导致整个虚拟系统出错。
当然,这只会发生在112 VE完全使用CPU time,HW超负荷的情况下。而大部分情况下,VE占用CPU的高峰并非同时的,根据OpenVZ的动态分配原则,CPU time都可以获得比较充分的利用,所以,仅是Warning,而不是Error。但为了避免问题,建议还是让current CPU utilization等于power of the Node比较好。


评论

Xen server 挂接本地新硬盘

1、进入XenCenter服务器端的控制台
2、[[email protected] ~]# fdisk -l    查找新硬盘的设备号(如:/dev/sdb)
3、[[email protected] ~]# xe sr-create name-label=”新硬盘的设备名” shared=false device-config-device=/dev/sdb type=lvm  (/dev/sdb是新硬盘的设备号)

评论

HyperVM安装手记(OpenVZ篇)

首先要说一说OpenVZ的安装
cd /etc/yum.repos.d
wget http://download.openvz.org/openvz.repo
yum install ovzkernel

即可完成安装。重启后,从http://download.lxlabs.com/?software=hypervm选择下载需要的安装脚本

(master的地址为http://download.lxlabs.com/download/hypervm/production/hypervm-install-master.sh),在服务器上

运行sh ./hypervm-install-master.sh –-virtualization-type=openvz
安装过程是会自动完成的,安装完HyperVM后init 6重启,然后通过浏览器访问http://<server address>:8888就能操作虚拟机了。

评论

whmcs 恢复后 就乱码了

$mysql_charset=”utf8″;

评论

空间通过SSH导入数据库

空间支持SSH,通过SSH可以很容易的导入数据库

1. 将数据库导出为.sql格式的文件,不要压缩成.zip或者.tar.gz文件

2. 用FTP上传.sql文件到服务器上

3. 创建数据库,如果数据库不存在的话

4. 通过SSH登录服务器

5. 在SSH终端,进入.sql文件所在的目录

6. 运行如下的命令:
# mysql -u username -p database_name < file.sql 7. 然后,会提示输入数据库的密码,输入密码后就开始导入数据库的过程。 在SSH中,使用命令行的方式,只能导入.sql文件

评论

mysql 主从同步原理

Replication 线程

   Mysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysql instance(我们称之 Slave)。在 Master 与 Slave 之间的实现整个复制过程主要由三个线程来完成,其中两个线程(Sql线程和IO线程)在 Slave 端,另外一个线程(IO线程)在 Master 端。

  要实现 MySQL 的 Replication ,首先必须打开 Master 端的Binary Log(mysql-bin.xxxxxx)功能,否则无法实现。因为整个复制过程实际上就是Slave从Master端获取该日志然后再在自己身上完全 顺序的执行日志中所记录的各种操作。打开 MySQL 的 Binary Log 可以通过在启动 MySQL Server 的过程中使用 “—log-bin” 参数选项,或者在 my.cnf 配置文件中的 mysqld 参数组([mysqld]标识后的参数部分)增加 “log-bin” 参数项。

  MySQL 复制的基本过程如下:

  1. Slave 上面的IO线程连接上 Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;

   2. Master 接收到来自 Slave 的 IO 线程的请求后,通过负责复制的 IO 线程根据请求信息读取指定日志指定位置之后的日志信息,返回给 Slave 端的 IO 线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在 Master 端的 Binary Log 文件的名称以及在 Binary Log 中的位置;

  3. Slave 的 IO 线程接收到信息后,将接收到的日志内容依次写入到 Slave 端的Relay Log文件(mysql-relay-bin.xxxxxx)的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master- info文件中,以便在下一次读取的时候能够清楚的高速Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”

   4. Slave 的 SQL 线程检测到 Relay Log 中新增加了内容后,会马上解析该 Log 文件中的内容成为在 Master 端真实执行时候的那些可执行的 Query 语句,并在自身执行这些 Query。这样,实际上就是在 Master 端和 Slave 端执行了同样的 Query,所以两端的数据是完全一样的。

  实际上,在老版本中,MySQL 的复制实现在 Slave 端并不是由 SQL 线程和 IO 线程这两个线程共同协作而完成的,而是由单独的一个线程来完成所有的工作。但是 MySQL 的工程师们很快发现,这样做存在很大的风险和性能问题,主要如下:

   首先,如果通过一个单一的线程来独立实现这个工作的话,就使复制 Master 端的,Binary Log日志,以及解析这些日志,然后再在自身执行的这个过程成为一个串行的过程,性能自然会受到较大的限制,这种架构下的 Replication 的延迟自然就比较长了。

   其次,Slave 端的这个复制线程从 Master 端获取 Binary Log 过来之后,需要接着解析这些内容,还原成 Master 端所执行的原始 Query,然后在自身执行。在这个过程中,Master端很可能又已经产生了大量的变化并生成了大量的 Binary Log 信息。如果在这个阶段 Master 端的存储系统出现了无法修复的故障,那么在这个阶段所产生的所有变更都将永远的丢失,无法再找回来。这种潜在风险在Slave 端压力比较大的时候尤其突出,因为如果 Slave 压力比较大,解析日志以及应用这些日志所花费的时间自然就会更长一些,可能丢失的数据也就会更多。

   所以,在后期的改造中,新版本的 MySQL 为了尽量减小这个风险,并提高复制的性能,将 Slave 端的复制改为两个线程来完成,也就是前面所提到的 SQL 线程和 IO 线程。最早提出这个改进方案的是Yahoo!的一位工程师“Jeremy Zawodny”。通过这样的改造,这样既在很大程度上解决了性能问题,缩短了异步的延时时间,同时也减少了潜在的数据丢失量。

  当然,即使是换成了现在这样两个线程来协作处理之后,同样也还是存在 Slave 数据延时以及数据丢失的可能性的,毕竟这个复制是异步的。只要数据的更改不是在一个事务中,这些问题都是存在的。

  如果要完全避免这些问题,就只能用 MySQL 的 Cluster 来解决了。不过 MySQL的 Cluster 知道笔者写这部分内容的时候,仍然还是一个内存数 据库的解决方案,也就是需要将所有数据包括索引全部都 Load 到内存中,这样就对内存的要求就非常大的大,对于一般的大众化应用来说可实施性并不是太大。当然,在之前与 MySQL 的 CTO David 交流的时候得知,MySQL 现在正在不断改进其 Cluster 的实现,其中非常大的一个改动就是允许数据不用全部 Load 到内存中,而仅仅只是索引全部 Load 到内存中,我想信在完成该项改造之后的 MySQL Cluster 将会更加受人欢迎,可实施性也会更大。

评论

mysql 数学函数不求人

所有的数学函数在一个出错的情况下返回NULL。


单目减。改变参数的符号。
mysql> select – 2;

注意,如果这个操作符与一个BIGINT使用,返回值是一个BIGINT!这意味着你应该避免在整数上使用-,那可能有值-2^63!
ABS(X)
返回X的绝对值。
mysql> select ABS(2);
-> 2
mysql> select ABS(-32);
-> 32

该功能可安全用于BIGINT值。

SIGN(X)
返回参数的符号,为-1、0或1,取决于X是否是负数、零或正数。
mysql> select SIGN(-32);
-> -1
mysql> select SIGN(0);
-> 0
mysql> select SIGN(234);
-> 1

MOD(N,M)
 
%
模 (类似C中的%操作符)。返回N被M除的余数。
mysql> select MOD(234, 10);
-> 4
mysql> select 253 % 7;
-> 1
mysql> select MOD(29,9);
-> 2

这个函数可安全用于BIGINT值。
FLOOR(X)
返回不大于X的最大整数值。

mysql> select FLOOR(1.23);
-> 1
mysql> select FLOOR(-1.23);
-> -2

注意返回值被变换为一个BIGINT!
CEILING(X)
返回不小于X的最小整数值。
mysql> select CEILING(1.23);
-> 2
mysql> select CEILING(-1.23);
-> -1

注意返回值被变换为一个BIGINT!

ROUND(X)
返回参数X的四舍五入的一个整数。
mysql> select ROUND(-1.23);
-> -1
mysql> select ROUND(-1.58);
-> -2
mysql> select ROUND(1.58);
-> 2

注意返回值被变换为一个BIGINT!

ROUND(X,D)
返回参数X的四舍五入的有D为小数的一个数字。如果D为0,结果将没有小数点或小数部分。
mysql> select ROUND(1.298, 1);
-> 1.3
mysql> select ROUND(1.298, 0);
-> 1

注意返回值被变换为一个BIGINT!

EXP(X)
返回值e(自然对数的底)的X次方。
mysql> select EXP(2);
-> 7.389056
mysql> select EXP(-2);
-> 0.135335

LOG(X)
返回X的自然对数。
mysql> select LOG(2);
-> 0.693147
mysql> select LOG(-2);
-> NULL

如果你想要一个数字X的任意底B的对数,使用公式LOG(X)/LOG(B)。

LOG10(X)
返回X的以10为底的对数。
mysql> select LOG10(2);
-> 0.301030
mysql> select LOG10(100);
-> 2.000000
mysql> select LOG10(-100);
-> NULL

POW(X,Y)
 
POWER(X,Y)
返回值X的Y次幂。
mysql> select POW(2,2);
-> 4.000000
mysql> select POW(2,-2);
-> 0.250000
SQRT(X)
返回非负数X的平方根。
mysql> select SQRT(4);
-> 2.000000
mysql> select SQRT(20);
-> 4.472136

PI()
返回PI的值(圆周率)。
mysql> select PI();
-> 3.141593

COS(X)
返回X的余弦, 在这里X以弧度给出。
mysql> select COS(PI());
-> -1.000000

SIN(X)
返回X的正弦值,在此X以弧度给出。
mysql> select SIN(PI());
-> 0.000000

TAN(X)
返回X的正切值,在此X以弧度给出。
mysql> select TAN(PI()+1);
-> 1.557408

ACOS(X)
返回X反余弦,即其余弦值是X。如果X不在-1到1的范围,返回NULL。
mysql> select ACOS(1);
-> 0.000000
mysql> select ACOS(1.0001);
-> NULL
mysql> select ACOS(0);
-> 1.570796

ASIN(X)
返回X反正弦值,即其正弦值是X。L如果X不在-1到1的范围,返回NULL。
mysql> select ASIN(0.2);
-> 0.201358
mysql> select ASIN(‘foo’);
-> 0.000000

ATAN(X)
返回X的反正切值,即其正切值是X。
mysql> select ATAN(2);
-> 1.107149
mysql> select ATAN(-2);
-> -1.107149
ATAN2(X,Y)
返回2个变量X和Y的反正切。它类似于计算Y/X的反正切,除了两个参数的符号被用来决定结果的象限。
mysql> select ATAN(-2,2);
-> -0.785398
mysql> select ATAN(PI(),0);
-> 1.570796
COT(X)
返回X的余切。
mysql> select COT(12);
-> -1.57267341
mysql> select COT(0);
-> NULL

RAND()
 
RAND(N)
返回在范围0到1.0内的随机浮点值。如果一个整数参数N被指定,它被用作种子值。
mysql> select RAND();
-> 0.5925
mysql> select RAND(20);
-> 0.1811
mysql> select RAND(20);
-> 0.1811
mysql> select RAND();
-> 0.2079
mysql> select RAND();
-> 0.7888

你不能在一个ORDER BY子句用RAND()值使用列,因为ORDER BY将重复计算列多次。然而在MySQL3.23中,你可以做: SELECT * FROM table_name ORDER BY RAND(),这是有利于得到一个来自SELECT * FROM table1,table2 WHERE a=b AND c
LEAST(X,Y,…)
有2和2个以上的参数,返回最小(最小值)的参数。参数使用下列规则进行比较:
如果返回值被使用在一个INTEGER上下文,或所有的参数都是整数值,他们作为整数比较。
如果返回值被使用在一个REAL上下文,或所有的参数是实数值,他们作为实数比较。
如果任何参数是一个大小敏感的字符串,参数作为大小写敏感的字符串被比较。
在其他的情况下,参数作为大小写无关的字符串被比较。
mysql> select LEAST(2,0);
-> 0
mysql> select LEAST(34.0,3.0,5.0,767.0);
-> 3.0
mysql> select LEAST(“B”,”A”,”C”);
-> “A”

在MySQL 3.22.5以前的版本,你可以使用MIN()而不是LEAST。

GREATEST(X,Y,…)
返回最大(最大值)的参数。参数使用与LEAST一样的规则进行比较。
mysql> select GREATEST(2,0);
-> 2
mysql> select GREATEST(34.0,3.0,5.0,767.0);
-> 767.0
mysql> select GREATEST(“B”,”A”,”C”);
-> “C”

在MySQL在 3.22.5 以前的版本, 你能使用MAX()而不是GREATEST.
DEGREES(X)
返回参数X,从弧度变换为角度。
mysql> select DEGREES(PI());
-> 180.000000
RADIANS(X)
返回参数X,从角度变换为弧度。
mysql> select RADIANS(90);
-> 1.570796

TRUNCATE(X,D)
返回数字X,截断为D位小数。如果D为0,结果将没有小数点或小数部分。
mysql> select TRUNCATE(1.223,1);
-> 1.2
mysql> select TRUNCATE(1.999,1);
-> 1.9
mysql> select TRUNCATE(1.999,0);
-> 1

评论

CentOS 5 中OpenSSL和OpenSSH升级

把OpenSSL和OpenSSH升级了。CentOS 5.2所带的OpenSSL是0.9.8b,OpenSSH是4.0p1。升级方法如下:

openssh 最新版本(http://www.openssh.com/portable.html)

wget http://www.openssl.org/source/openssl-0.9.8j.tar.gz

tar zxvf openssl-0.9.8j.tar.gz

cd openssl-0.9.8j

./config –prefix=/usr

make

make test

make install

wget http://openbsd.noc.jgm.gov.ar/pub/OpenBSD/OpenSSH/portable/openssh-5.2p1.tar.gz

tar zxvf openssh-5.2p1.tar.gz

cd openssh-5.2p1

./configure –prefix=/usr –with-pam –with-zlib –sysconfdir=/etc/ssh –with-ssl-dir=/usr –with-md5-passwords

make

make install

评论

« Previous entries 下一页 » 下一页 »