Archive for July, 2013

作者:AngryFox 分类: Uncategorized July 31st, 2013 暂无评论

ethtool eth1
要关闭binlog日志,只需要注释掉my.cnf中[mysqld]的
log-bin = /data0/mysql/3306/binlog/binlog
此行,然后重启mysql即可 mysql5.5.3m测试过这样操作没有问题。
log指示日志文件存放目录;
log_slow_queries指示记录执行时间长的sql日志目录;
long_query_time指示多长时间算是执行时间长,单位s。

注意事项:
A 日志存放目录必须提前存在,否则不能记录日志。这里也局势C:/temp目录必须已经存在
B 日志文件是linux格式的文本,建议用ultraEdit打开,转换为dos格式查看(否则没有换行,看不懂的)
C 服务在启动状态下不能删除日志文件,否则就无法记录sql语句了。
D 不能用ultraEdit直接清除文件内容后保存,否则也记录不下来了。需要重启服务,如果ultraEdit保存了.bak,后记录到此文件中。
E 可以用notepad清除文本后保存,可以继续记录日志。

1.sql命令:RESET MASTER
可以删除列于索引文件中的所有二进制日志,把二进制日志索引文件重新设置为空,并创建一个新的二进制日志文件
2.sql命令:PURGE MASTER LOGS
语法
PURGE {MASTER | BINARY} LOGS TO ‘log_name’
PURGE {MASTER | BINARY} LOGS BEFORE ‘date’
用于删除列于在指定的日志或日期之前的日志索引中的所有二进制日志。这些日志也会从记录在日志索引文件中的清单中被删除,这样被给定的日志成为第一个。
例如:
PURGE MASTER LOGS TO ‘mysql-bin.010′;
PURGE MASTER LOGS BEFORE ’2003-04-02 22:46:26′;
BEFORE变量的date自变量可以为’YYYY-MM-DD hh:mm:ss’格式。MASTER和BINARY是同义词。
如果您有一个活性的从属服务器,该服务器当前正在读取您正在试图删除的日志之一,则本语句不会起作用,而是会失败,并伴随一个错误。不过,如果从属服务器是休止的,并且您碰巧清理了其想要读取的日志之一,则从属服务器启动后不能复制。当从属服务器正在复制时,本语句可以安全运行。您不需要停止它们。
要清理日志,需按照以下步骤:
1.在每个从属服务器上,使用SHOW SLAVE STATUS来检查它正在读取哪个日志。
2.使用SHOW MASTER LOGS获得主服务器上的一系列日志。
3.在所有的从属服务器中判定最早的日志。这个是目标日志。如果所有的从属服务器是更新的,这是清单上的最后一个日志。
4.制作您将要删除的所有日志的备份。(这个步骤是自选的,但是建议采用。)
5.清理所有的日志,但是不包括目标日志。
3. expire_logs_days参数二进制日志自动删除的天数。默认值为0,表示“没有自动删除”。启动时和二进制日志循环时可能删除expire_logs_days numeric GLOBAL
在my.cnf配置文件【mysqld】段中加入,重启MySQL服务,例:
expire_logs_days=3
删除3天以前的日志
注:当然需要考虑有slave情况下的影响

–binlog 以一种更有效的格式,并且是事务安全的方式包含更新日志中可用的所有信息。
–binlog 包含了所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE)的所有语句。语句以“事件”的形式保存,它描述数据更改。
–binlog 还包含关于每个更新数据库的语句的执行时间信息。它不包含没有修改任何数据的语句。如果你想要记录所有语句(例如,为了识别有问题的查询),你应使用一般查询日志。
–binlog 的主要目的是在恢复使能够最大可能地更新数据库,因为 binlog 包含备份后进行的所有更新。
–binlog 还用于在主复制服务器上记录所有将发送给从服务器的语句。
–运行服务器时若启用 binlog 则性能大约慢1%。但是, binlog 的好处,即用于恢复并允许设置复制超过了这个小小的性能损失。
–当–log-bin[=file_name]选项启动时,mysqld写入包含所有更新数据的SQL命令的日志文件。如果未给出file_name值, 默认名为-bin后面所跟的主机名。如果给出了文件名,但没有包含路径,则文件被写入数据目录。建议指定一个文件名。如果你在日志名中提供了扩展名(例如,–log-bin=file_name.extension),则扩展名被悄悄除掉并忽略。
–mysqld在每个 binlog 名后面添加一个数字扩展名。每次你启动服务器或刷新日志时该数字则增加。如果当前的日志大小达到max_binlog_size,还会自动创建新的 binlog 。如果你正使用大的事务, binlog 还会超过max_binlog_size:事务全写入一个 binlog 中,绝对不要写入不同的 binlog 中。
–为了能够知道还使用了哪个不同的 binlog 文件,mysqld还创建一个 binlog 索引文件,包含所有使用的 binlog 文件的文件名。默认情况下与 binlog 文件的文件名相同,扩展名为’.index’。你可以用–log-bin-index[=file_name]选项更改 binlog 索引文件的文件名。当mysqld在运行时,不应手动编辑该文件;如果这样做将会使mysqld变得混乱。
–binlog 格式有一些已知限制,会影响从备份恢复。
–默认情况下,并不是每次写入时都将 binlog 与硬盘同步。因此如果操作系统或机器(不仅仅是MySQL服务器)崩溃,有可能 binlog 中最后的语句丢失了。要想防止这种情况,你可以使用sync_binlog全局变量(1是最安全的值,但也是最慢的),使 binlog 在每N次 binlog 写入后与硬盘同步。

************************************************
* 如何管理 MySQL 的 binlog *
************************************************
1、在 my.ini 中增加下述参数,指定保存更新到 binlog 的数据库:db_name,未在此指定的数据库将不记录 binlog
–binlog-do-db=db_name

2、在 my.ini 中增加下述参数,指定不保存更新到 binlog 的数据库:db_name
–binlog-ignore-db=db_name

3、如果 binlog 已经产生,可以通过 SQL 命令行清除:

/*
* 要清理日志,需按照以下步骤:
* 1 在每个从属服务器上,使用SHOW SLAVE STATUS来检查它正在读取哪个日志。
* 2 使用SHOW MASTER LOGS获得主服务器上的一系列日志。
* 3 在所有的从属服务器中判定最早的日志。这个是目标日志。如果所有的从属服务器是更新的,这是清单上的最后一个日志。
* 4 制作您将要删除的所有日志的备份。(这个步骤是自选的,但是建议采用。)
* 5 清理所有的日志,但是不包括目标日志。
*
*/

作者:AngryFox 分类: Uncategorized July 29th, 2013 暂无评论
[root@ZhaoWe ~]# /usr/local/mysql/support-files/mysql.server restart
MySQL server process #19176 is not running![FAILED]
Starting MySQL..The server quit without updating PID file (/data1/mysql/3306/mysql.pid).[FAILED]

解决方法:

删空binlog
删除ibdata
重启
其他:
发现mysql的data目录用户及用户组权限不够
chown -R mysql:mysql /data/mysql/3306/

/usr/local/mysql/bin/mysqld_safe&

ERROR 1449 (HY000): The user specified as a definer (‘outtransql’@’183.62.45.18′) does not exist
解决方案:

发现数据看 mysql user 表中 没有 outtransql该用户,去查询试图或者触发器,发现dba管理员在创建 触发器的时候用了该用户,故导致该问题,
解决办法,

1 删除 该触发器,
2 把涉及到 该用户的改成 root,
3 重新运行脚本 创建触发器

作者:AngryFox 分类: Uncategorized July 27th, 2013 暂无评论

netstat -ant | grep $io:80 | grep ESTABLISHED | wc -l
在my.conf配置中的参数的意思
connect_timeout:
在获取链接时,等待握手的超时时间,只在登录时有效,登录成功这个参数就不管事了。主要是为了防止网络不佳时应用重连导致连接数涨太快,一般默认即可。
interactive_timeout:
一个持续SLEEP状态的线程多久被关闭。线程每次被使用都会被唤醒为acrivity状态,执行完Query后成为interactive状态,重新开始计时。wait_timeout不同在于只作用于TCP/IP和Socket链接的线程,意义是一样的。
MySQL可以配置连接的超时时间,这个时间如果做得太长,甚至到了10min,那么很可能发生这种情况,3000个链接都被占满而且sleep在哪,新链接进不来,导致无法正常服务。因此这个配置尽量配置一个符合逻辑的值,60s或者120s等等。
命令行下面敲一个命令后,直至下一个命令到来之前的时间间隔为interactive_time,如果这个时间间隔超过了interactive_timeout,则连接会被自动断开,下一个命令失败。不过一般的mysql客户端都有自动重连机制,下一个命令会在重连后执行。

set interactive_timeout = 1;
show session variables like ‘%timeout%’;
net_read_timeout / net_write_timeout
130727 21:45:50 InnoDB: Warning: innodb_file_io_threads is deprecated. Please use innodb_read_io_threads and innodb_write_io_threads instead
这个参数只对TCP/IP链接有效,分别是数据库等待接收客户端发送网络包和发送网络包给客户端的超时时间,这是在Activity状态下的线程才有效的参数
set global interactive_timeout=28800
注意,如果你运行mysqldump没有–quick或–opt选项,mysqldump将在导出结果前装载整个结果集到内存中,如果你正在导出一个大的数据库,这将可能是一个问题。

配置方面对于IO优化的原则:尽可能能缓存,减少读对数据库的随机IO的请求;同时减少写的随机IO的随时发生,利用各种buffer去缓存。下面来看一下这块的参数:
innodb_buffer_pool_size : 这是Innodb最重要的一个配置参数,这个参数控制Innodb本身的缓大小,也影响到,多少数据能在缓存中。建议该参数的配置在物理内存的70%-80%之间。
innodb_flush_method: 这个控制Innodb的IO形为,什么:fsync, O_DSYNC之类的,这里不做过多介绍, 建议使用: O_DIRECT, 这样减少操作系统级别VFS的缓存使用内存过多和Innodb本身的buffer的缓存冲突,同时也算是给操作系统减少点压力。
innodb_io_capacity: 这个参数据控制Innodb checkpoint时的IO能力,一般可以按一块SAS 15000转的磁盘200个计算,6块盘的SAS做的Raid10这个值可以配到600即可。如果是普通的SATA一块盘只能按100算。(innodb-plugin, Percona有这个参数)
innodb_max_dirty_pages_pct : 这个参数据控制脏页的比例如果是innodb_plugin或是MySQL5.5以上的版本,建议这个参数可以设制到75%-90%都行。如果是大量写入,而且写入的数据不是太活跃,可以考虑把这个值设的低一点。 如果写入或是更新的数据也就是热数据就可以考虑把这个值设为:95%
innodb_log_file_size : 这个可以配置256M以上,建议有两个以前的日志文件(innodb_log_files_in_group). 如果对系统非常大写的情况下,也可以考虑用这个参数提高一下性能,把文件设的大一点,减少checkpiont的发生。 最大可以设制成:innodb_log_files_in_group * innodb_log_file_size < 512G(percona, MySQL 5.6) 建议设制成: 256M -> innodb_buffer_pool_size/innodb_log_file_in_group 即可。
innodb_log_buffer_size : 如果没在大事务,控制在8M-16M即可。
其它对IO有影响的参数(以5.6为准)

innodb_adaptive_flushing 默认即可
innodb_change_buffer_max_size 如果是日值类服务,可以考虑把这个增值调到 50
innodb_change_buffering 默认即可
innodb_flush_neighors 默认是开的, 这个一定要开着,充分利用顺序IO去写数据。
innodb_lru_scan_depth: 默认即可 这个参数比较专业。
innodb_max_purge_lag 默认没启用,如果写入和读取都量大,可以保证读取优先,可以考虑使用这个功能。
innodb_random_read_ahead 默认没开启,属于一个比较活跃的参数,如果要用一定要多测试一下。 对用passport类应用可以考虑使用
innodb_read_ahead_threshold 默认开启:56 预读机制可以根据业务处理,如果是passprot可以考虑关闭。如果使用innodb_random_read_ahead,建议关闭这个功能
innodb_read_io_threads 默认为:4 可以考虑8
innodb_write_io_threads 默认为:4 可以考虑8
sync_binlog 默认即可: 0
innodb_rollback_segments 默认即可: 128
3. 一般出现这种情况不是所有例句而是单个表,请你先修复表一般都能解决这类问题
*****备份不要在数据库压力较大的时候进行,每天凌晨备份是比较合适的
*****如果是事务型引擎(InnoDB),建议使用–single-transaction参数,这样可以让锁表时间变得很短

1.Lost connection to MySQL server during query 错误
造成这样的错误原因很多
先试一试在my.ini配置文件中的[client]下增加这两个参数:
bind-address = 127.0.0.1
#skip-name-resolve

作者:AngryFox 分类: Uncategorized July 25th, 2013 暂无评论
 /usr/local/mysql/bin/mysql -h '10.1.1.20' -u logsuser -p'^>PuwHME' -e "SELECT COUNT(*) AS total,fn FROM play_hash_1.1f WHERE fn !='' AND stream =3 AND server_time > '2013-07-13 00:00:00' AND server_time < '2013-07-14 00:00:00' GROUP BY fn  into outfile '/data1/dbback/play_hash_1.1f.txt' fields terminated by '^A' lines terminated by '\r\n'"
ERROR 1 (HY000) at line 1: Can't create/write to file '/data1/dbback/play_hash_1.1f.txt' (Errcode: 13)

这段代码生成数据到数据库服务器相应文件夹的
需要对相应文件夹赋权限
chown -R mysql:mysql 文件夹

1.order by时可能会出现Using filesort。
2.order by b,如果b列不在索引中,不管b值是否相同,总会出现Using filesort。
3.并不是说所有的索引都可以避免Using filesort,hash索引是不按顺序来保存数据的。

3. 优化Filesort

当无法避免排序操作时,又该如何来优化呢?很显然,应该尽可能让 MySQL 选择使用第二种单路算法来进行排序。这样可以减少大量的随机IO操作,很大幅度地提高排序工作的效率。

1. 加大 max_length_for_sort_data 参数的设置
在 MySQL 中,决定使用老式排序算法还是改进版排序算法是通过参数 max_length_for_ sort_data 来决定的。当所有返回字段的最大长度小于这个参数值时,MySQL 就会选择改进后的排序算法,反之,则选择老式的算法。所以,如果有充足的内存让MySQL 存放须要返回的非排序字段,就可以加大这个参数的值来让 MySQL 选择使用改进版的排序算法。
2. 去掉不必要的返回字段
当内存不是很充裕时,不能简单地通过强行加大上面的参数来强迫 MySQL 去使用改进版的排序算法,否则可能会造成 MySQL 不得不将数据分成很多段,然后进行排序,这样可能会得不偿失。此时就须要去掉不必要的返回字段,让返回结果长度适应 max_length_for_sort_data 参数的限制。
3. 增大 sort_buffer_size 参数设置
增大 sort_buffer_size 并不是为了让 MySQL选择改进版的排序算法,而是为了让MySQL尽量减少在排序过程中对须要排序的数据进行分段,因为分段会造成 MySQL 不得不使用临时表来进行交换排序。
注:
key:显示Mysql实际决定使用的索引
Using index:只从索引中检索数据,不回表
key_len:显示Mysql决定使用的键长度
rows:显示Mysql认为它执行查询时必须检查的行数
ref:使用哪个列或常数与key一起从表中选择行
possible_keys:指出Mysql可以使用哪个索引在该表中找到行

作者:AngryFox 分类: Uncategorized July 22nd, 2013 暂无评论

Linux的设计几乎囊括了好的架构设计的方方面面。
糟糕的架构会把项目推到万劫不复+举步维艰的境地;好的架构是成功的一半;
1,KISS
kiss 是linux的核心思想,同样,对于架构也一样;简单的才会优美,如果一开始就复杂,到后面基本上会失控;
简单才是美,简单才稳定,简单才长久;拒绝不必要的复杂…

2,解耦
i) 单个程序内的代码架构需要做到各个类或者各个模块一定解耦,要形成合理的金字塔似得调用关系,绝对拒绝
网状的调用关系;
注:函数回调对于这种模块解耦非常关键,非常关键!
ii) 分布式系统内各子系统间也要形成金字塔似的关系;绝对避免上下层级模糊或者不分的情况
注:类似rpc似得回调对于这种解耦非常关键!

3,主干+插件
大型或者长久的系统一定要形成主干+插件的格局,这样才能避免随着业务需求的增删改造成系统腐化到不可收拾
的地步;主干+插件的格局能保证主干集中于主流程上,保证主干永远精简稳定可维护;非主干需求采用插件形式
注入到主干里面,这样保证插件的灵活,简单,各插件之间完全透明,主干对插件透明;
注:完善的监听广播机制 是形成这种主干+插件格局的彻底解决办法;

4,容忍异常,关注边界
对于分布式系统,异常/失败都是常见且必现的,有效简洁的处理异常,处理一些边界情况是系统能否稳定,能否
正常运行,能否成功的关键;更是一个系统能否达到工业级别的最关键的检验方式!
注:设计系统,做架构,除了主流程之外,最需要的就是把一些可能出现的特殊情况,边界情况,异常情况都列
出来,然后针对每种情况都要做出简洁的有效的方案;但用最简洁的方式处理即可,毕竟他们出现的概率不大!

5,透明
监控监控再监控,统计统计再统计!!

作者:AngryFox 分类: Uncategorized July 21st, 2013 暂无评论

6.MongoDB 使用了mmap,在32位系统下数据文件只能达到2G,所以32位系统下的MongoDB玩玩就够了。
至于NUMA的含义,简单点说,在有多个物理CPU的架构下,NUMA把内存分为本地和远程,每个物理CPU都有属于自己的本地内存,访问本地内存速度快于访问远程内存,缺省情况下,每个物理CPU只能访问属于自己的本地内存。对于MongoDB
这种需要大内存的服务来说就可能造成内存不足,

http://blog.douban.com/douban/category/%E5%B7%A5%E7%A8%8B%E5%B8%88%E6%96%87%E5%8C%96/

10亿级数据,数亿PV(几年前)
核心存储迁移到MySQL
SSD +
大内存 + 垂直分表
schema-free
protobuffer
多维度拆分
网络日志
四架马车
代码review
落实到基础库落实到工具
自动化检查
通⽤用化,集群化
• 前后端LAMP化
• 服务化:系统划分,API
高层cache nginx cache:
• 减少php消耗。节省~50%+机器
• 2ms ->10ms -> 2ms
2. 并⾏行化:后端请求并⾏行化
发送到 Sentry 这种错误日志系统里。因为原始日志不支持
backtrace、请求 url、UA、referer 等内容,所以强烈建议
使用 Xlog 这个扩展。15、降低未来的维护成本,编码规范
与代码规范,要严格执行,前者可以用 PHP_CodeSniffer 在
提交到代码仓库时检查;
16、服务分层,图像处理等耗时操
作,不要和 web 服务混在一起。
一个小技巧,一些无须用户关心的操作,比如记录用户信息,可以集中放到程序
最后使用 fastcgi_finish_request() 方法在断开用户连接
后执行。17、MySQL 数据库的运行状态可用 mysqltuner.pl
和 tuning-primer.sh 来检查;
Swift(Simplified Konaha) 
BigPipe
PL服务化 – Yar 
框架优化 – Yaf
解耦的基础 
Pagelet 
 Bigpipe 
 Pagelet服务化 
SOA(Service-Oriented Architecture)的实践
Messagepack
Curl + PHP Stream
Yar – 并行化的RPC 
 Curl Multi + Select(epoll) 
 Bigpipe + Yar = Concurrent Bigpipe 
 Pagelets并发渲染 
 Fastest Pagelet Renderred first 

建立连接时间 + 第一个包处理时间 + 接收时间 + 渲染时间
使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器
Nginx 架构中一个很酷的设计就是有很多请求是由Memcached处理的,因此请求从缓存中获取内容而不需要直接访问PHP机
器。比如,用户信息页(user profile)是网站需要密集处理
的内容,如果把用户信息页全部缓存到Memcached上,那么请
求直接从Memcached上获取内容。 Poppen.de的Memcached每分钟可以处理8000次请求。nginx具有web缓存服务,proxy_cache,但是有一个问题就是
,proxy_cache不能清除指定的URL缓存,只能设置URL过期时间,但是有问题,有人就会很快解决问题,nginx第三方模块ngx_cache_purge能清除指定URL。
CouchDB
日志存储CouchDB运行在一台机器上。在这台机器上可以根据
模块/行为进行日志查询 /分组,或者根据错误类型等等。这
对定位问题非常有用。在使用日志聚合服务CouchDB之前,不
得不逐台登录到PHP服务器上设法日志分析定位问题,这 是
非常麻烦的。而现在把所有的日志集中到队列中保存到
CouchDB中,可以集中进行问题检查和分析。
Graphite
网站使用Graphite采集网站实时信息并统计。从请求每个模
块/行为到Memcached的命中和未命中、RabbitMQ状态监控以
及 Unix负载等等。Graphite服务平均每分钟有4800次更新操
作。实践已经证实要监测网站发发生什么是非常有用的,它
的简单文本协议和绘图功能可 以方便地即插即 用的方式用
于任何需要监控的系统上。
如果一个设计不好的多对多关系,在前期是没有任何问题的
,但是随着用户的增长,数据量会是几何级的增长的。在这
个时候我们对于一个表的select和update的时候(还不说多表
联合查询)的成本的非常高的。就是数据库的死锁问题,也许
平时我们感觉不到,死锁在高并发的情况下的出现的概率是
非常高的,磁盘缓存就是一个大问题。

MySQL的query cache是集中式的,连接到该query cache的
MySQL服务器都会受益。* 当您修改表时,MySQL的query cache会立刻被刷新(flush
)。存储一个memcached item只需要很少的时间,但是当写操作很频繁时,MySQL的query cache会经常让所有缓存数据都失效。
* 在多核CPU上,MySQL的query cache会遇到扩展问题(scalability issues)。在多核CPU上,query cache会增
加一个全局锁(global lock), 由于需要刷新更多的缓存数据,速度会变得更慢。* 在MySQL的query cache中,我们是不能存储任意的数据的
(只能是SQL查询结果)。而利用memcached,我们可以搭建出各种高效的缓存。比如,可以执行多个独立 的查询,构建出一个用户对象(user object),然后将用户对象缓存到memcached中。而query cache是SQL语句级别的,不可能做到这一点。在小的网站中,query cache会有所帮助,但随着网站规模的增加,query cache的弊将大于利。* query cache能够利用的内存容量受到MySQL服务器空闲内存空间的限制。给数据库服务器增加更多的内存来缓存数据,固然是很好的。但是,有了 memcached,只要您有空闲的内存,都可以用来增加memcached集群的规模,然后您就可以缓存更多的数据。

memcached和服务器的local cache(比如PHP的APC、mmap文件等)相比,有什么优缺点?首先,local cache有许多与上面(query cache)相同的问题
。local cache能够利用的内存容量受到(单台)服务器空闲内存空间的限制。不过,local cache有一点比memcached和query cache都要好,那就是它不但可以存储任意的数据,而且没有网络存取的延迟。
* local cache的数据查询更快。考虑把highly common的数据放在local cache中吧。如果每个页面都需要加载一些数量较少的数据,考虑把它们放在local cached吧。
* local cache缺少集体失效(group invalidation)的特性。在memcached集群中,删除或更新一个key会让所有的观察者觉察到。但是在local cache中, 我们只能通知所有的服务器刷新cache(很慢,不具扩展性),或者仅仅依赖缓存超时失效机制。
* local cache面临着严重的内存限制,这一点上面已经提到
memcached的cache机制是怎样的?
Memcached主要的cache机制是LRU(最近最少用)算法+超时
失效。当您存数据到memcached中,可以指定该数据在缓存中
可以呆 多久Which is forever, or some time in the
future。如果memcached的内存不够用了,过期的slabs会优
先被替换,接着就轮到最老的未被使用的slabs。
memcached如何实现冗余机制?
不实现!我们对这个问题感到很惊讶。Memcached应该是应用
的缓存层。它的设计本身就不带有任何冗余机制。如果一个
memcached节点失去了所 有数据,您应该可以从数据源(比
如数据库)再次获取到数据。您应该特别注意,您的应用应
该可以容忍节点的失效。不要写一些糟糕的查询代码,寄希
望于 memcached来保证一切!如果您担心节点失效会大大加
重数据库的负担,那么您可以采取一些办法。比如您可以增
加更多的节点(来减少丢失一个节点的影 响),热备节点(
在其他节点down了的时候接管IP),等等。
memcached如何处理容错的?
不处理!:) 在memcached节点失效的情况下,集群没有必要
做任何容错处理。如果发生了节点失效,应对的措施完全取
决于用户。节点失效时,下面列出几种方案供您选择:
* 忽略它! 在失效节点被恢复或替换之前,还有很多其他节
点可以应对节点失效带来的影响。
* 把失效的节点从节点列表中移除。做这个操作千万要小心
!在默认情况下(余数式哈希算法),客户端添加或移除节
点,会导致所有的缓存数据不可用!因为哈希参照的节点列
表变化了,大部分key会因为哈希值的改变而被映射到(与原
来)不同的节点上。
* 启动热备节点,接管失效节点所占用的IP。这样可以防止
哈希紊乱(hashing chaos)。
* 如果希望添加和移除节点,而不影响原先的哈希结果,可
以使用一致性哈希算法(consistent hashing)。您可以百
度一下一致性哈希算法。支持一致性哈希的客户端已经很成
熟,而且被广泛使用。去尝试一下吧!
* 两次哈希(reshing)。当客户端存取数据时,如果发现一
个节点down了,就再做一次哈希(哈希算法与前一次不同)
,重新选择另一个节点(需要注意 的时,客户端并没有把
down的节点从节点列表中移除,下次还是有可能先哈希到它
)。如果某个节点时好时坏,两次哈希的方法就有风险了,
好的节点和坏的节 点上都可能存在脏数据(stale data)。
如何将memcached中item批量导入导出?
您不应该这样做!Memcached是一个非阻塞的服务器。任何可
能导致memcached暂停或瞬时拒绝服务的操作都应该值得深思
熟虑。向 memcached中批量导入数据往往不是您真正想要的
!想象看,如果缓存数据在导出导入之间发生了变化,您就
需要处理脏数据了;如果缓存数据在导出导入 之间过期了,
您又怎么处理这些数据呢?
因此,批量导出导入数据并不像您想象中的那么有用。不过
在一个场景倒是很有用。如果您有大量的从不变化 的数据,
并且希望缓存很快热(warm)起来,批量导入缓存数据是很
有帮助的。虽然这个场景并不典型,但却经常发生,因此我
们会考虑在将来实现批量导出导入的功能。

http://stblog.baidu-tech.com/?p=1324

数据挖掘是怎么和前端结合起来的,让用户 看见的。每天用户在豆瓣上的操作都会产生很多数据,在豆瓣上面看到的东西,收藏的东西,都会存在数据库或是访问日志。每天这些信息都会传到算法团队的机器 上,然后会从这个数据中建立一个稀疏矩阵,你看过什么,干过什么。他们维护了一个很高效的稀疏矩阵运算库,然后用它来做各种各样的尝试,去看是否能得到好 的结果,一旦发现这个结果很好,就会把它写到数据库里面。然后用户在访问的时候,前端从数据库中取出推荐给你的数据,然后把这些数据做一些过滤(比如你读 过的东西就不再给你展现了)、调整,最后展现给用户。

作者:AngryFox 分类: Uncategorized July 20th, 2013 暂无评论
function hexdump ($data, $htmloutput = true, $uppercase = false, $return = false)
{
    $hexi   = '';
    $ascii  = '';
    $dump   = ($htmloutput === true) ? '<pre>' : '';
    $offset = 0;
    $len    = strlen($data);

    $x = ($uppercase === false) ? 'x' : 'X';

    for ($i = $j = 0; $i < $len; $i++)
    {
        $hexi .= sprintf("%02$x ", ord($data[$i]));
                if (ord($data[$i]) >= 32)
                {
            $ascii .= ($htmloutput === true) ? htmlentities($data[$i]) : $data[$i];
                } else
                {
            $ascii .= '.';
        }

                if ($j === 7)
                {
            $hexi  .= ' ';
            $ascii .= ' ';
        }

                if (++$j === 16 || $i === $len - 1)
                {
            $dump .= sprintf("%04$x  %-49s  %s", $offset, $hexi, $ascii);

            $hexi   = $ascii = '';
            $offset += 16;
            $j      = 0;

                        if ($i !== $len - 1)
                        {
                $dump .= "\n";
            }
        }
    }

    $dump .= $htmloutput === true ?
                '</pre>' :
                '';
    $dump .= "\n";

        if ($return === false)
        {
        echo $dump;
        }else
        {
        return $dump;
    }
}
$str = file_get_contents("http://www.baidu.com");
echo hexdump($str);
作者:AngryFox 分类: Uncategorized July 20th, 2013 暂无评论

选择什么样的协议跟我们的应用场景有很大的关系。我们需要考虑我们开发是否方便、接口是否容易发布、是否需要考虑带宽占用成本、序列化和反序列化的性能、接口协议的扩展性等等。

http://msgpack.org/

协议 实现 跨语言 性能 传输量 RPC
xml 广泛 几乎所有 很大 N(可实现)
json 广泛 大量 一般 一般 N(可实现)
php serialize PHPRPC 大量 一般 一般 Y
hessian hessian 大量 一般 Y
thrift thrift 大量 Y
protobuf protobuf 大量 N(可实现)
ice ice 大量 Y
avro Apache Avro 少量 Y
messagepack messagepack 大量 Y

上面表格列出了一些常用数据交换协议的一些特性的比较。这里并没有比较好坏,只是想说明不同数据交换协议是有区别的,所以我们需要在我们的应用场景中进行选择。

什么是数据交换?在很多地方都有“数据交换”这个概念,本文所说的“数据交换” 是指在计算机网络中,一个系统把数据传递给另外一个系统。这非常类似于一个人要告诉另外一个人一件事情。

什么是messagepack? 可用于服务器之间的数据交换;
1.MessagePack是一个基于二进制高效的对象序列化Library用于跨语言通信。2.它可以像JSON那样,在许多种语言之间交换结构对象;但是它比JSON更快速也更轻巧。3.支持Python、Ruby、Java、C/C++、Javascript 等众多语言。4.比Google Protocol Buffers还要快4倍igbinary
messagepack用途一是节省空间类型的mamcache应用;另一个是用于RPC传输与JSON的比较优势:1.序列化和反序列化所需要的时间少。通过30000条的记录来测试,msgpack序列化的时间比使用jason来序列化JSON的时间要少三分之一;而反序列化的时间则要少一半。2.生成的文件体积小。同样也是基于30000条记录来测试,msgpack序列化后生成的二进制文件比用jason序列化出来的时间要少一半。 劣势:1.msgpack对复杂的数据类型(List、Map)支持的不够,序列化没有问题,但是反序列化回来就很麻烦,尤其是对于java开发人员。2.在上面也提到过,msgpack是通过value的顺序来定位属性的,那么需要在不同的语言中都要维护同样的模型以及模型中属性的顺序。这个会让开发人员很困扰。3.msgpack无法支持在模型中包含和嵌套其他自定义的模型(如weibo模型中包含comment的列表)。
messagepack protocal buffers json xml是一种跨语言的基于二进制的数据格式。从官方的介绍来看,它能够比google protocol buffers快4倍,比json快10倍多。发现MessagePack仅是压缩后的数据比json少10%左右,而压缩和解压时间则和json的解析器比起来要费时很多。messagePack做服务器的优化,降低服务器的数据量,更加合理的利用带宽。BSon是Json的二进制形式,但是与JSon有语法不兼容的地方。但是MessagePack保证语义上能够做到一致。二进制协议无法以JavaScript处理,也就意味着无法在浏览器端使用。

作者:AngryFox 分类: Uncategorized July 19th, 2013 暂无评论

对于高并发处理,简单来说呢,就是如何通过集群方式去并发处理用户的请求,那说复杂它是一个比较完整的体系.比如说我们可以在十毫秒、二十个毫秒,就保证我们两个数据机群之间的数据就同步了.第一个层面应用就是你有时候数据可以同时写两份,或者通过消息去做异步的一个复制,或者甚至去做数据库本身日志的一个分析,因为我们对文本分析的成本和代价是最小的,而且准确率是最高的,当这个数据库它把它的日志存储下来以后,我们对它其分析发现那些数据发生变更了,就同步到另外一个机群里面去,这些手段都是可以去用的,那具体用那一个手段,要看你当时的整个应用的场景。比如说我们可以把每个系统独立开来,对他进行做
性能测试,然后我们可以对整个核心系统去做分析。做分析什么?找到短板,然后对它的短板进行压测,然后通过这一系列的压测的结果来分析你整个系统的支撑量是多少,这其实就是由那个短板决定的。我们在线上做了一件事情,就是在交易非高峰期引流量,就是把几台机器的流量引到一台机器上,对这台机器进行大规模的压测,就是用线上真实的一个应用场景对他进行压测,这个也是可以做得,但是你一定要清楚它的风险在那里。因为你这样做如果出现问题的话,会导致部分用户的访问受损。
redis-cli info | grep connected_clients | awk -F:
‘{print $NF}’ | sed ‘s/.$//’
top -p $(pidof nginx | tr ‘ ‘ ‘,’)
top -p $(pgrep -d, nginx)
关闭keep-alive提高服务器性能
为了规避内存碎片问题,Memcached采用了名为SlabAllocator的内存分配机制。内存以Page为单位来分配,每个Page分给一个特定长度的Slab来使用,每个Slab包含若干个特定长度的Chunk。实际保存数据时,会根据数据的大小选择一个最贴切的Slab,并把数据保存在对应的Chunk中。如果某个Slab没有剩余的Chunk了,系统便会给这个Slab分配一个新的Page以供使用,如果没有Page可用,系统就会触发LRU机制,通过删除冷数据来为新数据腾出空间,这里有一点需要注意的是:LRU不是全局的,而是针对Slab而言的。
内存比如要推送一条全局消息,如果真的给所有用户都推送一遍的话,那么会占用很大的内存,实际上不管粘性有多高的产品,活跃用户同全部用户比起来,都会小很多,所以如果只处理登录用户的话,那么至少在内存消耗上是相当划算的,至于未登录用户,可以推迟到用户下次登录时再处理,如果用户一直不登录,就一了百了了。
在Linux里(别的系统也差不多),内存有物理内存和虚拟内存之说,物理内存是什么自然无需解释,虚拟内存实际是物理内存的抽象,多数情况下,出于方便性的考虑,程序访问的都是虚拟内存地址,然后操作系统会通过Page Table机制把它翻译成物理内存地址,详细说明可以参考Understanding Memory和Understanding Virtual Memory,至于程序是如何使用虚拟内存的,可以参考Playing with Virtual Memory,这里就不多费口舌了。
很多人会把虚拟内存和Swap混为一谈,实际上Swap只是虚拟内存引申出的一种技术而已:操作系统一旦物理内存不足,为了腾出内存空间存放新内容,就会把当前物理内存中的内容放到交换分区里,稍后用到的时候再取回来,需要注意的是,Swap的使用可能会带来性能问题,偶尔为之无需紧张,糟糕的是物理内存和交换分区频繁的发生数据交换,这被称之为Swap颠簸,一旦发生这种情况,先要明确是什么原因造成的,如果是内存不足就好办了,加内存就可以解决,不过有的时候即使内存充足也可能会出现这种问题,比如MySQL就有可能出现这样的情况,一个可选的解决方法是限制使用Swap:
MongoDB使用的是内存映射存储引擎,它会把数据文件映射到内存中,如果是读操作,内存中的数据起到缓存的作用,如果是写操作,内存还可以把随机的写操作转换成顺序的写操作,总之可以大幅度提升性能。MongoDB并不干涉内存管理工作,而是把这些工作留给操作系统的虚拟内存管理器去处理,这样做的好处是简化了MongoDB的工作,但坏处是你没有方法很方便的控制MongoDB占多大内存,幸运的是虚拟内存管理器的存在让我们多数时候并不需要关心这个问题。
MongoDB的内存使用机制让它在缓存重建方面更有优势,简而言之:如果重启进程,那么缓存依然有效,如果重启系统,那么可以通过拷贝数据文件到/dev/null的方式来重建缓存,更详细的描述请参考:Cache Reheating – Not to be Ignored。
ulimit -a | grep memory
如此一来内存大小就明确了:内存 > 索引 + 热数据

作者:AngryFox 分类: Uncategorized July 19th, 2013 暂无评论

1.删除0字节文件
find -type f -size 0 -exec rm -rf {} \;

2.查看进程
按内存从大到小排列
ps -e -o “%C : %p : %z : %a”|sort -k5 -nr

3.按cpu利用率从大到小排列
ps -e -o “%C : %p : %z : %a”|sort -nr

4.打印说cache里的URL
grep -r -a jpg /data/cache/* | strings | grep “http:” | awk -F’http:’ ‘{print “http:”$2;}’

5.查看http的并发请求数及其TCP连接状态:
netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’

6. sed -i ‘/Root/s/no/yes/’ /etc/ssh/sshd_config sed在这个文里Root的一行,匹配Root一行,将no替换成yes.

7.1.如何杀掉mysql进程:
ps aux |grep mysql |grep -v grep |awk ‘{print $2}’ |xargs kill -9 (从中了解到awk的用途)

killall -TERM mysqld

kill -9 `cat /usr/local/apache2/logs/httpd.pid` 试试查杀进程PID

8.显示运行3级别开启的服务:
ls /etc/rc3.d/S* |cut -c 15- (从中了解到cut的用途,截取数据)

9.如何在编写SHELL显示多个信息,用EOF
cat << EOF
+--------------------------------------------------------------+
| === Welcome to Tunoff services === |
+--------------------------------------------------------------+
EOF

10. for 的巧用(如给mysql建软链接)
cd /usr/local/mysql/bin
for i in *
do ln /usr/local/mysql/bin/$i /usr/bin/$i
done

11. 取IP地址:
ifconfig eth0 |grep "inet addr:" |awk '{print $2}'|cut -c 6- 或者

ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}'

12.内存的大小:
free -m |grep "Mem" | awk '{print $2}'

13.
netstat -an -t | grep ":80" | grep ESTABLISHED | awk '{printf "%s %s\n",$5,$6}' | sort

14.查看Apache的并发请求数及其TCP连接状态:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

15.因为同事要统计一下服务器下面所有的jpg的文件的大小,写了个shell给他来统计.原来用xargs实现,但他一次处理一部分,搞的有多个总和....,下面的命令就能解决啦.
find / -name *.jpg -exec wc -c {} \;|awk '{print $1}'|awk '{a+=$1}END{print a}'

CPU的数量(多核算多个CPU,cat /proc/cpuinfo |grep -c processor)越多,系统负载越低,每秒能处理的请求数也越多。

---------------------------------------------------------------------------------------
16 CPU负载 # cat /proc/loadavg
检查前三个输出值是否超过了系统逻辑CPU的4倍。

18 CPU负载 #mpstat 1 1
检查%idle是否过低(比如小于5%)

19 内存空间 # free
检查free值是否过低 也可以用 # cat /proc/meminfo

20 swap空间 # free
检查swap used值是否过高 如果swap used值过高,进一步检查swap动作是否频繁:
# vmstat 1 5
观察si和so值是否较大

21 磁盘空间 # df -h
检查是否有分区使用率(Use%)过高(比如超过90%) 如发现某个分区空间接近用尽,可以进入该分区的挂载点,用以下命令找出占用空间最多的文件或目录:
# du -cks * | sort -rn | head -n 10

22 磁盘I/O负载 # iostat -x 1 2
检查I/O使用率(%util)是否超过100%

23 网络负载 # sar -n DEV
检查网络流量(rxbyt/s, txbyt/s)是否过高

24 网络错误 # netstat -i
检查是否有网络错误(drop fifo colls carrier) 也可以用命令:# cat /proc/net/dev

25 网络连接数目 # netstat -an | grep -E “^(tcp)” | cut -c 68- | sort | uniq -c | sort -n

26 进程总数 # ps aux | wc -l
检查进程个数是否正常 (比如超过250)

27 可运行进程数目 # vmwtat 1 5
列给出的是可运行进程的数目,检查其是否超过系统逻辑CPU的4倍

28 进程 # top -id 1
观察是否有异常进程出现

29 网络状态 检查DNS, 网关等是否可以正常连通

30 用户 # who | wc -l
检查登录用户是否过多 (比如超过50个) 也可以用命令:# uptime

31 系统日志 # cat /var/log/rflogview/*errors
检查是否有异常错误记录 也可以搜寻一些异常关键字,例如:
# grep -i error /var/log/messages
# grep -i fail /var/log/messages

32 核心日志 # dmesg
检查是否有异常错误记录

33 系统时间 # date
检查系统时间是否正确

34 打开文件数目 # lsof | wc -l
检查打开文件总数是否过多

35 日志 # logwatch –print 配置/etc/log.d/logwatch.conf,将 Mailto 设置为自己的email 地址,启动mail服务 (sendmail或者postfix),这样就可以每天收到日志报告了。
缺省logwatch只报告昨天的日志,可以用# logwatch –print –range all 获得所有的日志分析结果。
可以用# logwatch –print –detail high 获得更具体的日志分析结果(而不仅仅是出错日志)。

36.杀掉80端口相关的进程
lsof -i :80|grep -v "PID"|awk '{print "kill -9",$2}'|sh

37.清除僵死进程。
ps -eal | awk '{ if ($2 == "Z") {print $4}}' | kill -9

38.tcpdump 抓包 ,用来防止80端口被人攻击时可以分析数据
# tcpdump -c 10000 -i eth0 -n dst port 80 > /root/pkts

39.然后检查IP的重复数 并从小到大排序 注意 “-t\ +0″ 中间是两个空格
# less pkts | awk {‘printf $3″\n”‘} | cut -d. -f 1-4 | sort | uniq -c | awk {‘printf $1″ “$2″\n”‘} | sort -n -t\ +0

40.查看有多少个活动的php-cgi进程
netstat -anp | grep php-cgi | grep ^tcp | wc -l
chkconfig –list | awk ‘{if ($5==”3:on”) print $1}’
41.kudzu查看网卡型号
kudzu –probe –class=network
匹配中文字符的正则表达式: [\u4e00-\u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行
匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^\s*|\s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配中国邮政编码:[1-9]\d{5}(?!\d)
评注:中国邮政编码为6位数字
匹配身份证:\d{15}|\d{18}
评注:中国的身份证为15位或18位
匹配ip地址:\d+\.\d+\.\d+\.\d+
评注:提取ip地址时有用
匹配特定数字:
^[1-9]\d*$    //匹配正整数
^-[1-9]\d*$   //匹配负整数
^-?[1-9]\d*$   //匹配整数
^[1-9]\d*|0$  //匹配非负整数(正整数 + 0)
^-[1-9]\d*|0$   //匹配非正整数(负整数 + 0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$   //匹配正浮点数
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$  //匹配负浮点数
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$  //匹配浮点数
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$   //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$  //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正
匹配特定字符串:
^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
^\w+$  //匹配由数字、26个英文字母或者下划线组成的字符串
评注:最基本也是最常用的一些表达式