2016年10月

mysql字符串查找

1.FIND_IN_SET(string,field)

field存储的是以","分割的子串,比如"red,black,yellow"

2.LOCATE(substr,str) 和 POSITION(substr IN str)

类似php的strpos函数, strpos($str,$substr)

3.IN()

利用shell执行mysql语句

利用shell执行mysql语句可以做很多时间, 比如自动备份数据, 检测主从数据库的同步状态, 定期拿数据库中的数据做统计等等...

5种方法,参考自网上

1.将sql语句直接嵌入shell脚本中

mysqlc -e "
tee /tmp/sql_exc.log;
sql....
notee;    
exit"

2.命令行调用单独的sql文件

mysqlc -e "source ./tmp.sql"

3.使用重定向

mysqlc < ./tmp.sql > /tmp/sql_exc.log

4.shell脚本中mysql提示符下调用sql

mysqlc <<EOF
sql...
EOF
exit;

5.sql作为shell的变量

cmd="show databases;"
cnt=$(msqlc -e "${cmd}")

批量删除redis的键

工作中用到redis来做排名统计, 每天保存一次统计的排名到redis中, 比如键名设计为rank:20161016。时间长了,以前的排名是没必要保存在redis当中,这时候手动删除估计是一个噩梦。

redis-cli提供给我们直接执行redis语句方法,再利用shell编写个简单的脚本可以定期地批量删除过期的数据。

删除指定key

echo -en key1 key2 | xargs redis-cli del
echo -en key* | redis-cli -x keys | xargs redis-cli del

mysql慢查询

查看

show variables like "%slow_query%"; // 查看是否开启慢查询
show variables like "%long_query%"; // 限制多少执行时间以上的sql被记录到慢查询日志

配置文件my.cnf中配置 ( /etc/mysql/my.cnf 或 /etc/my.cnf 或 ~/.my.cnf)

slow_query_log = 1
long_query_time = 1
slow_query_log_file = /data/mysql/mysql-slow.log

分析

mysqldumpslow --help

一些优化配置

1.nginx配置

(1).限制nginx最高连接数, 一般让worker=cpu核数,2G大概可以支持5W链接

    查看内存大小 : free -m
    查看物理cup个数 : cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
    查看每个物理cup核数 : cat /proc/cpuinfo| grep "cpu cores"| uniq
    查看逻辑cup个数 : cat /proc/cpuinfo| grep "processor"| wc -l
    cup型号 : cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

    结果 : cpu个数1,双核,内存4G
    设置 :
        worker_rlimit_nofile 50000 # 更改worker进程的最大打开文件数限制
        worker_processes  2;
        events {
            use epoll;
            worker_connections  40000; 
            # 设置 ulimit -HSn 50000;
            # max_client=worker_processes*worker_connections , 作为反向代理还要除以4
        }


(2).nginx缩短超时时间
    http {
        keepalive_timeout 5; # 客户端链接保持超时时间
        # 代理链接时间限制
        proxy_connect_timeout 5;
        proxy_read_timeout 5;
        proxy_send_timeout 5;
        # fastcgi链接时间限制
        fastcgi_connect_timeout 5;
        fastcgi_read_timeout 5;
        # request_terminate_timeout设置为永不超时的情况下,nginx中fastcgi_read_timeout 的设置时间将影响到最终的超时时间
        fastcgi_send_timeout 5;
    }

(3).php-fpm限制超时时间,开启慢日志

    a.request_terminate_timeout = 5

    b.slowlog = log/$pool.log.slow
      request_slowlog_timeout = 10

(4).请求频率控制|并发连接数控制

http {
    limit_zone   myzone_bbs  $binary_remote_addr  10m;
    limit_req_zone $binary_remote_addr zone=bbs:10m rate=1r/s;
    error_page 503 提示用户刷新频繁的页面路径
    …
    server {
         …
        location ~ ^/bbs/(index|forumdisplay|viewthread).php$ {
            limit_conn   myzone_bbs  3; # 同个ip只能建立3个链接
            limit_req zone=bbs burst=2 nodelay; # 限制每秒1个请求,2个每秒的突发请求速率
            ...
        }
     }
}

2.重启php-fpm

kill -USR2 进程
killall : 杀死所有进程, /path/to/php-fpm 回车重启

3.php优化

ab测试
opacache优化
xhporf

4.mysql优化

索引
慢查询
explain
主从数据库
参数优化

5.接口请求失败的问题排查

(1).把有问题的接口通过nginx代理出去
(2).增大php-fpm子进程数量
(3).开启php-fpm慢查询
(4).mysql设置最大连接数 set CLOBAL max_connections=1500
(5).更改nginx主进程数,并发连接数
(6).查看access_log, tcpdump抓包, 修改 /etc/sysctl.conf 配置
(7).tcp链接数超了? netstat -an | grep 'ESTABLISHED' | grep 'tcp' | wc -l, ulimit -SHn 65535

6.php-fpm配置优化

(1).查看php-fpm状态
    打开php-fpm.conf中的pm.status_path = /status 选项
    配置nginx.conf
    server {
        listen 80;
        server_name 127.0.0.1;
        location /phpfpm_status {
            fastcgi_pass  127.0.0.1:9000;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
        }
    }
(2).打开慢查询
    slowlog = log/$pool.log.slow (实际位置:/server/php-5.6.22-1/log/www.log.slow)
    request_slowlog_timeout = 1

7.zabbix监控