作者归档:SK

关于SK

服务器维护 服务器配置 服务器 维护 运维 网管 系统调优 网络调优 数据库优化

内存双通道技术详解

双通道,就是在北桥芯片级里设计两个内存控制器,这两个内存控制器可相互独立工作,每个控制器控制一个内存通道。

技术简介

作用

在这两个内存通过CPU可分别寻址、读取数据,从而使内存的带宽增加一倍,数据存取速度也相应增加一倍(理论上)。流行的双通道内存构架是由两个64bit DDR内存控制器构筑而成的,其带宽可达128bit。因为双通道体系的两个内存控制器是独立的、具备互补性的智能内存控制器,因此二者能实现彼此间零等待时间,同时运作。两个内存控制器的这种互补“天性”可让有效等待时间缩减50%,从而使内存的带宽翻倍。双通道是一种主板芯片组(Athlon 64集成于CPU中)所采用新技术,与内存本身无关,任何DDR内存都可工作在支持双通道技术的主板上,所以不存在所谓“内存支持双通道”的说法。 继续阅读

“十八大”期间全国封网 预留调整时间

记者从工信部了解,为确保“十八大”期间电信网络安全,将于2012年11月7日至“十八大”会议结束之日24:00期间“封网”。封网期间各基础电信企业应停止主要通信干线和枢纽的施工、系统割接、版本升级和网管数据制作等工作。

在封网期间如因业务及网络需要调整,可在不影响网络运行安全的前提下,经集团公司批准后,在每日凌晨0:00至5:00内实施必要的业务及网络调整。

封网具体要求如下:

一、各单位要加强组织领导,深入做好电信网络运行安全、安全生产和互联互通管理工作,做到思想重视、组织保证、措施到位、要切实落实安全生产责任,各级相关负责人、联络员和信息员应确保24小时联络畅通,遇有电信网络运行重大事故,应当按照相关规定和预案妥善处理,并及时向上级主管部门报告。

二、各基础电信企业要做好国际电话网、国内长途电话网、固定本地电话网、移动通信网、互联网骨干网等重点网络、设备和线路的检测和巡查,及时排除故障隐患。加强对通信枢纽、干线等重点部位的“四防”(防爆炸、防火灾、防破坏、防盗窃)工作。要在北京做好人民大会堂、新闻中心和代表驻地等重点地区的通信保障,不得擅自中断通信线路。

三、各省、自治区、直辖市通信管理局要加强辖区内电信网络运行安全、安全生产和互联互通的监督管理,对影响网络运行安全和互联互通的各类违规事件予以从严、从重查处。

四、2012年11月7日0:00至“十八大”会议结束之日24:00,各基础电信企业应停止主要通信干线和枢纽的施工、系统割接、版本升级和网管数据制作等工作。在此期间,预留每日凌晨0:00至5:00为业务及网络调整的窗口时间,可在不影响网络运行安全的前提下,经集团公司批准后,在窗口时间内实施必要的业务及网络调整。

“封网”解释:

“封网”是电信运营商的专门说法,不是关闭网络和封闭网络、停止对外的访问接口,而是停止升级、割接、设备入网等工作,停止对网络影响较大的操作活动,以保障网络的稳定运行。当然,“封网”不代表不维护网络,如果遇到网络故障,仍然需要第一时间处理。

VPS如何选择?

VPS 选择指南

国内的做站环境一日不如一日,很多人滥觞脱离自己的祖国,将网站放到了异邦的空间大概办事器下面。有这么一大量的网站移民族曾经在他国发展的很杰出的,正如小石头自己的博客一样是放在了美国 Dreamhost 的虚拟主机上面,美国的东西就是低廉甜头实惠啊,不限制流量不限制空间不限制网站数量,仅仅只须要每年花 500 多元国民币。可还是有很多站长在持观望态度,对美国的服务器或者 VPS 的完全情景也不是出格了解,结果哪个机房的 ping 值较量低,哪个机房的流量限制比较充裕还不是十昭彰白。那么本日小石头就受累一下给人人注意的先容下美国 vps 主机的目前市场情况吧。

国内网络环境日益阴毒,众多站长将站“移民”国外。采用一款优良高速的主机十分紧要。由于虚拟主机的主机资源、帮助环境等种种的限制,很多站长选择 VPS(Visual Private Server),这篇文章,我们就来一起说说如何选择国外 VPS。 继续阅读

php安全模式做了些什么工作?

php的安全模式到底做了些什么工作,下面内容摘录自互联网:
1. 安全模式
     PHP 的安全模式是为了试图解决共享服务器(shared-server)安全问题而设立的。在结构上,试图在 PHP 层上解决这个问题是不合理的,但修改 web 服务器层和操作系统层显得非常不现实。因此许多人,特别是 ISP,目前使用安全模式。
    safe_mode是唯一PHP_INI_SYSTEM属性,必须通过php.ini或httpd.conf来设置。要启用safe_mode,只需修改php.ini: safe_mode = On 或者修改httpd.conf,定义目录:Options FollowSymLinks php_admin_value safe_mode 1,重启apache后safe_mode就生效了。
     启动safe_mode,会对许多PHP函数进行限制,特别是和系统相关的文件打开、命令执行等函数。 所有操作文件的函数将只能操作与脚本UID相同的文件。(脚本的uid并不一定是运行wen服务器用户的uid)
      虽然safe_mode不是万能的(低版本的PHP可以绕过),但还是强烈建议打 开安全模式,在一定程度上能够避免一些未知的攻击。不过启用 safe_mode会有很多限制,可能对应用带来影响,所以还需要调整代码和配置才能和谐。 继续阅读

centos介绍

Centos概述
CentOS,我们有很多人叫它社区企业操作系统,不管你怎么叫它,它都是linux的一个发行版本。CentOS并不是全新的linux发行版,倘若一说到RedHat这个大名,大家似乎都听过,在RedHat家族中有企业版的产品,它是Red Hat Enterprise Linux(以下称之为RHEL),CentOS正是这个RHEL的克隆版本,RHEL是很多企业采用的linux发行版本,需要向RedHat付费才可以使用,并能得到付过费用的服务和技术支持和版本升级。这个CentOS可以像REHL一样的构筑linux系统环境,但不需要向RedHat付任何的费用,同样也得不到任何有偿技术支持和升级服务。CentOS计划是在2003年红帽决定不再提供免费的技术支持及产品认证之后的部份”红帽重建者”(Red Hat rebuilders)之一。 继续阅读

YAHOO网页加速的14条优化法则

Web应用性能优化黄金法则:先优化前端程序(front-end)的性能,因为这是80%或以上的最终用户响应时间的花费所在。下面细细道来14条法则。

  • 法则1. 减少HTTP请求次数

80%的最终用户响应时间花在前端程序上,而其大部分时间则花在各种页面元素,如图像、样式表、脚本和Flash等的下载上。减少页面元素将会减少HTTP请求次数。这是快速显示页面的关键所在。

一种减少页面元素个数的方法是简化页面设计。但是否存在其他方式,能做到既有丰富内容,又能获得快速响应时间呢?

Image maps组合多个图片到一张图片中。总文件大小变化不大,但减少了HTTP请求次数从而加快了页面显示速度。该方式只适合图片连续的情况;但坐标的定义是烦人又容易出错的工作。

CSS Sprites是更好的方法。它可以组合页面中的图片到单个文件中,并使用CSS的background-image和background-position属性来现实所需的部分图片。

Combined files通过组合多个脚本文件到单一文件来减少HTTP请求次数。样式表也可采用类似方法处理。这个方法虽然简单,但没有得到大规模的使用。10大美国网站每页平均有7个脚本文件和2个样式表。当页面之间脚本和样式表变化很大时,该方式将遇到很大的挑战,但如果做到的话,将能加快响应时间。

减少HTTP请求次数是性能优化的起点。这对提高首次访问的效率起到很重要的作用。据Tenni Theurer的文章Browser Cache Usage – Exposed!描述,40-60%的日常访问是首次访问。因此,为首次访问者加快页面访问速度是用户体验的关键。

  • 法则2. 使用CDN(Content Delivery Network, 内容分发网络)

用户离web server的远近对响应时间也有很大影响。从用户角度看,把内容部署到多个地理位置分散的服务器上将有效提高页面装载速度。但是该从哪里开始呢? 继续阅读

nginx重写规则中某些特定正则表达式不生效的处理

nginx正则有些特殊的使用方法,在我们一台老旧的centos5测试平台上不正常。比如

([0-9]+)-([0-9]+)可以正常使用,但是换成(\d+)-(\d+)却不能使用。

一些特殊的nginx里面使用的正则表达式

. 换行符以外的所有字符

\w 匹配字母或数字或下划线或汉字

\s 匹配任意的空白符

\d 匹配数字

\b 匹配单词的开始或结束

^ 匹配字符串的开始

$ 匹配字符串的结束

* 重复零次或更多次

+ 重复一次或更多次

? 重复零次或一次

{n} 重复n次

{n,} 重复n次或更多次

{n,m} 重复n到m次

使用pcretest测试,是能支持上面的正则匹配的。但是nginx就是没生效。 继续阅读

binlog文件分析与mysqlbinlog工具的修改

问题

本文主要带着以下问题进行学习:

1、什么是binlog,有什么作用

2、binlog有哪些格式

3、分析一条典型binlog ,说明从binlog中可以得到哪些信息

4、如何修改mysqlbinlog,使得可以显示最后一条记录

这里主要考虑binlog的使用及相关格式,而不是关注binlog的写入时机。

 

一、简介

binlog又叫二进制日志文件,它会将mysql中所有修改数据库数据的Query以二进制的形式记录到日志文件中,如:create,insert,drop,update等;(对于select操作则不会被记录到binlog里,因为它并没有修改数据库的数据)。binlog一般存储在数据目录下,并且命名为:mysql-bin.***(这个可以在配置文件中修改my.cnf:log-bin=mysql-bin,就是文件名的前缀;mysqld在每个 binlog 名后面添加一个数字扩展名。每次启动服务器或刷新日志时增加文件的大小大于max_binlog_size,一个事务不会被拆分开)。

binlog主要是用于保证数据完整的,如主从备份,通过从binlog文件中读取操作来在salve机上进行同样的操作,保证主从备份,当然不可能每次都从开始的地方redo,所以每条记录都有一个时间截TIMESTAMP。

 

二、简单的使用binlog

show binary logs;    #显示binlog文件

purge binary logsto ‘mysql-bin.**’  #删除到**文件

bin/mysqlbinlog binlogfile    #解析binlog文件

 

利用binlog恢复数据:

bin/mysqlbinlog  –start-datetime=’2011-7-7 18:0:0′–stop-datetime=’2011-7-7 20:07:13′ data/mysql-bin.000008 |mysql -u root

 

三、类型

binlog的格式有三种,这也反应了mysql的复制技术:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复制(mixed-based replication, MBR)。相应地,binlog的格式也有三种:STATEMENT,ROW,MIXED。

mysql>showvariables like ‘binlog_format’    #查看binlog的格式

 

使用mysqlbinlog解析的binlog:

MIXED(STATEMENT):

# at 193(开始位置)

#110708 10:03:06(时间截) server id(产生该事件的服务id) 1  end_log_pos(日志的结束位置) 280  Query(事件类型)  thread_id=10    exec_time=0     error_code=0

SETTIMESTAMP=1310090586/*!*/;

insert into tvalues(17)

/*!*/;

 

ROW模式:

BEGIN

/*!*/;

# at 174

# at 214

#110708 10:49:22server id 1  end_log_pos 214   Table_map: `test`.`t` mapped to number 14

#110708 10:49:22server id 1  end_log_pos 248   Write_rows: table id 14 flags: STMT_END_F

 

BINLOG ‘

MnAWThMBAAAAKAAAANYAAAAAAA4AAAAAAAEABHRlc3QAAXQAAQMAAQ==

MnAWThcBAAAAIgAAAPgAAAAAAA4AAAAAAAEAAf/+MgAAAA==

‘/*!*/;

# at 248

#110708 10:49:22server id 1  end_log_pos 317   Query  thread_id=1     exec_time=0     error_code=0

SETTIMESTAMP=1310093362/*!*/;

COMMIT

 

STATEMENT是基于sql语句级别的binlog,每一条修改数据的sql都会被保存到binlog里;ROW是基于行级别的,他会记录每一行记录的变化,就是将每一行的修改都记录到binlog里面,记录的非常详细,但sql语句并没有在binlog里,在replication里面也不会因为存储过程触发器等造成Master-Slave数据不一致的问题,但是有个致命的缺点日志量比较大.由于要记录每一行的数据变化,当执行update语句后面不加where条件的时候或alter table的时候,产生的日志量是相当的大。MIXED:在默认情况下是statement,但是在某些情况下会切换到row状态,如当一个DML更新一个ndb引擎表,或者是与时间用户相关的函数等。在主从的情况下,在主机上如果是STATEMENT模式,那么binlog就是直接写now(),然而如果这样的话,那么从机进行操作的时间,也执行now(),但明显这两个时间不会是一样的,所以对于这种情况就必须把STATEMENT模式更改为ROW模式,因为ROW模式会直接写值而不是写语句(该案例是错误的,即使是STATEMENT模式也可以使用now()函数,具体原因以后再分析)。同样ROW模式还可以减少从机的相关计算,如在主机中存在统计写入等操作时,从机就可以免掉该计算把值直接写入从机。

 

四、binlog记录

每个binlog的开始都是由4个字节:fe 62 69 6e,组成的魔数(后面三个字节就是bin)。

然后接下来的就是一条记录的内容它包括:Common-Header,这部分不同版本的大小不一样,4.0以上的都是19个字节。在这个之后就是BODY。

Common-Header格式:(单位:字节)

 

Timestamp(4) Type(1) Server_id(4) Total_size(4) End_log_pos(4) Flag(2)

Timestamp:从1970开始

Type:此log event type如FORMAT_DESCRIPTION_EVENT、QUERY、LOAD_EVENT等,其中每个binlog的第一条记录的类型都是FORMAT_DESCRIPTION_EVENT,它记录了该binlog的相关信息,如版本,这些信息对于后序分析binlog记录是有用的,所以对于任务要读取binlog的内容的工具都必须先读取第一条记录。QUERY包括我们经常操作的如:create,drop,update,insert等。

Server_id:创建这个事件的server id。防止循环主从导致的主机被从写。The master’s server id (is preserved in therelay log; used to prevent from infinite loops in circular replication).

Total_size:该记录的大小,包括common_header及body。

End_log_pos:此下一条记录的开始位置。也是此条记录结束位置的上一个字节。

Flag:标志位。

 

QUERY类型的记录:

QUERY类型的记录除了开始的common-header之外,在body的开头是一个Post-header,然后之后才是真正的body内容。

Query Post-Header:(单位字节)

 

Thread_id(4) Exec_time(4) Db_len(1) Error_code(2) Status_var_len(2)

Thread_id:is used to distinguish temporary tables that belong to differentclients.

Exec_time:The time from whenthe query started to when it was logged in the binlog, in seconds.QUERY到达到这个binlog事件生成的时间间隔。

Db_len:当前数据库的名称长度。

Error_code:执行出错的错误号。

 

五、使用mysqlbinlog显示最后一条log

1. 使用脚本实现:(该脚本可以显示最后n条)

 

#!/bin/sh

#Access to the binlog’s last n records

#if don’t set -n, show the last record.

 

NUM=”1″

 

function last_logs()

{

#get the total records

local rec_acc=`./bin/mysqlbinlog $1 | grep -c ‘^# at [0-9][0-9]*$’`

rec_acc=`expr $rec_acc – $NUM`

#Skip the first N entries.

./bin/mysqlbinlog -o $rec_acc $1

}

 

if [ $# -lt 1 ] || [ $# -gt 3 ]

then

echo “Usage: mysqlbinlog [-n0-9] filename”

exit

elif [ $# -eq 2 ]

then

if echo $1|grep -q ‘^-n[0-9][0-9]*$’

then

NUM=`echo $1 | cut -d “n” -f 2`

last_logs $2

else

echo “Usage:mysqlbinlog [-n0-9] filename”

fi

else

last_logs $1

fi

此本质是首先利用mysqlbinlog binlogfile打印出所有的记录,然后通过正则表达式(^# at [0-9][0-9]*$)判断记录个数M。最后在使用mysqlbinlog –o M-N binlogfile,来显示最后N条。

脚本的使用方法:./last_logs –n3 binlogfile #显示最后三条,不包括第一条FORMAT_DESCRIPTION_EVENT。

 

2.直接修改mysqlbinlog.cc

上面的脚本必须两次扫描binlog文件,这对于大的文件来说消耗可能比较大。修改后的工具,主要利用的是:最后一条记录的end_log_pos刚好为文件的大小。利用这个条件来判断是否需要解析打印。下面为主要的代码:

 

/*begin:xiangzhong.wxd at:2011-7-9 16:30*/

int is_last_flag(int &argc, char **argv)

{

if (argc == 3 && (!strcmp(argv[1],”-L”) || !strcmp(argv[2],”-L”)))

{

last_flag = 1;

if (!strcmp(argv[1],”-L”))

{

char * temp = argv[1];

argv[1] = argv[2];

argv[2] = temp;

}

//free(argv[2]);

//argv[2] = ‘\0′;

argc–;

return 0;

}

return -1;

}

/*end:xiangzhong.wxd at:2011-7-9 16:30*/

 

/*begin:xiangzhong.wxd at:2011-7-9 */

struct stat file_buf;

stat(logname, &file_buf);

unsigned long file_size = (unsigned long)file_buf.st_size;

if((ev_type != FORMAT_DESCRIPTION_EVENT) && last_flag && (ev->log_pos != file_size))

goto end;

/*end:xiangzhong.wxd at:2011-7-9 */

其中int is_last_flag函数是判断是否要使用该新功能,如果使用就是在命令行里加个-L,并且只能再使用一个binlogfile作为参数,即与其它的参数如start-position一起使用无效。

使用方法:./bin/mysqlbinlog –L binlogfile

注意:不管是使用上面两种的任意一种,都会打印出#at 4,即第一条记录,所以实质上我们是总共打印了两条记录。(原因见上面的FORMAT_DESCRIPTION_EVENT解释)。

主要涉及的源文件:mysqlbinlog.cc、log_event.cc、log_event.h.

综上可以知道,其实binlog文件就像一个流文件,它每一条记录没有明显的开始及结束标志,它是通过长度来判断一条记录的结束位置,所以在分析binlog文件的时候总是必须从头开始,然后依次一条一条的读取。

mysqlbinlog工具使用

1、使用mysqlbinlog工具来恢复

Mysqlbinlog日志如何开启?

在my.cnf这个文件中加一行。

#vi /etc/my.cnf
[mysqld]
log-bin=mysqlbin-log #添加这一行就可以了,=号后面自己定义日志文件名,默认该文件是存储在datadir中。

mysqlbinlog用法详细说明

服务器生成的二进制日志文件写成二进制格式。要想检查这些文本格式的文件,应使用mysqlbinlog实用工具。

#mysqlbinlog [options] log-files…

例如,要想显示二进制日志mysql-bin.407的内容,使用下面的命令:

#mysqlbinlog mysql-bin.407

输出包括在mysql-bin.407中包含的所有语句,以及其它信息例如每个语句花费的时间、客户发出的线程ID、发出线程时的时间戳等等。

参数说明(mysql5以上版本参数添加了很多):
mysqlbinlog支持下面的选项:

—help,-? 显示帮助消息并退出。
—database=db_name,-d db_name 只列出该数据库的条目(只用本地日志)。
–force-read,-f 使用该选项,如果mysqlbinlog读它不能识别的二进制日志事件,它会打印警告,忽略该事件并继续。没有该选项,如果mysqlbinlog读到此类事件则停止。
–hexdump,-H 在注释中显示日志的十六进制转储。该输出可以帮助复制过程中的调试。在MySQL 5.1.2中添加了该选项。
–host=host_name,-h host_name 获取给定主机上的MySQL服务器的二进制日志。
–local-load=path,-l pat 为指定目录中的LOAD DATA INFILE预处理本地临时文件。
–offset=N,-o N 跳过前N个条目。
–password[=password],-p[password] 当连接服务器时使用的密码。如果使用短选项形式(-p),选项和 密码之间不能有空格。如果在命令行中–password或-p选项后面没有 密码值,则提示输入一个密码。
–port=port_num,-P port_num 用于连接远程服务器的TCP/IP端口号。
–position=N,-j N 不赞成使用,应使用–start-position。
–protocol={TCP | SOCKET | PIPE | -position 使用的连接协议。
–read-from-remote-server,-R 从MySQL服务器读二进制日志。如果未给出该选项,任何连接参数选项将被忽略。这些选项是–host、–password、–port、–protocol、–socket和–user。
–result-file=name, -r name 将输出指向给定的文件。
–short-form,-s 只显示日志中包含的语句,不显示其它信息。
–socket=path,-S path 用于连接的套接字文件。
–start-datetime=datetime 从二进制日志中第1个日期时间等于或晚于datetime参量的事件开始读取。datetime值相对于运行mysqlbinlog的机器上的本地时区。该值格式应符合DATETIME或TIMESTAMP数据类型。
–stop-datetime=datetime 从二进制日志中第1个日期时间等于或晚于datetime参量的事件起停止读。关于datetime值的描述参见–start-datetime选项。该选项可以帮助及时恢复。
–start-position=N 从二进制日志中第1个位置等于N参量时的事件开始读。
–stop-position=N 从二进制日志中第1个位置等于和大于N参量时的事件起停止读。
–to-last-logs,-t 在MySQL服务器中请求的二进制日志的结尾处不停止,而是继续打印直到最后一个二进制日志的结尾。如果将输出发送给同一台MySQL服务器,会导致无限循环。该选项要求–read-from-remote-server。
–disable-logs-bin,-D 禁用二进制日志。如果使用–to-last-logs选项将输出发送给同一台MySQL服务器,可以避免无限循环。该选项在崩溃恢复时也很有用,可以避免复制已经记录的语句。注释:该选项要求有SUPER权限。
–user=user_name,-u user_name 连接远程服务器时使用的MySQL用户名。
–version,-V 显示版本信息并退出。

还可以使用–var_name=value选项设置下面的变量:
Variables (–variable-name=value)
and boolean options {FALSE|TRUE} Value (after reading options)
——————————— —————————–
base64-output (No default value)
character-sets-dir (No default value)
database (No default value)
debug-check FALSE
debug-info FALSE
disable-log-bin FALSE
force-if-open TRUE
force-read FALSE
hexdump FALSE
host (No default value)
local-load (No default value)
offset 0
port 3306
position 4
read-from-remote-server FALSE
server-id 0
set-charset (No default value)
short-form FALSE
socket /tmp/mysql.sock
start-datetime (No default value)
start-position 4
stop-datetime (No default value)
stop-position 18446744073709551615
to-last-log FALSE
user (No default value)
open_files_limit 64
例子:
查看日志

#mysqlbinlog mysql-bin.407

根据position从20-2000查找resource库相关记录,并输出到指定文件:

#mysqlbinlog –start-position=”20″ –stop-position=”2000″ –database=resource mysql-bin.407 –result-file=result.sql

查找并导入数据库:

#mysqlbinlog –start-position=”20″ –stop-position=”2000″ –database=resource mysql-bin.407 | mysql -u root

还可以根据时间来查找记录:

#mysqlbinlog –start-datetime=”2012-09-20 8:10:00″ –stop-datetim=”2012-09-25 07:30:00″ mysql-bin.407 –result-file=result.sql
2、Mysqlbinlog导出并转换编码导入

原中文编码为gb2312,转换utf8编码,并插入
(1)从position=387426452开始导出resource数据库信息
#/usr/local/mysql/bin/mysqlbinlog –position=387426452 –set-charset=utf8 –database=resource mysql-bin.407 –result-file=result_resource.sql

(2)转换编码为utf8
#iconv -t utf-8 -f gb2312 -c result_resource.sql > new_result_resource.sql_utf8.sql

(3)导入数据库
在mysql会话中需要set names utf8;

mysql> set names utf8;

mysql> source /tmp/new_result_resource.sql_utf8.sql

HDFS写入和读取流程

Hadoop Distributed File System,简称HDFS,是一个分布式文件系统。HDFS有着高容错性(fault-tolerent)的特点,并且设计用来部署在低廉的(low-cost)硬件上。而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求(requirements)这样可以实现流的形式访问(streaming access)文件系统中的数据。HDFS开始是为开源的apache项目nutch的基础结构而创建,HDFS是hadoop项目的一部分,而hadoop又是lucene的一部分。 继续阅读