关于吴 炳锡

数据库架构师 熟悉MySQL架构设计及数据库架构优化。 丰富的MySQL优化及高可用架构经验。

产生10个随机密码

作者:吴炳锡 来源:http://www.mysqlsupport.cn/ 联系方式: wubingxi#gmail.com 转载请注明作/译者和出处,并且不能用于商业用途,违者必究.

cat /dev/urandom | LC_ALL=C tr -dc "[:alnum:]" | fold -w 10 |head -10

Si1N9kUyuZ
ddzsRXFgxA
caDRBRT4Px
buGk6LkX4d
N5Xod1TOyr
1645cBxAjl
KRjwJR2Txu
nhQedXagL9
RraDEZgfhY
QxCurm5eZF

 

Expression Semantics
alnum Matches alpha-numeric characters
alpha Matches alphabetic characters
blank Matches spaces or tabs
cntrl Matches control characters
digit Matches numeric digits
graph Matches non-space printing characters
lower Matches lower case letters
print Matches printable characters
punct Matches punctuation symbols
space Matches spaces, tabs, returns, and newlines
upper Matches upper case letters
xdigit Matches hexadecimal digits

 

如果需要特别复杂的密码可以试一下:

cat /dev/urandom | LC_ALL=C tr -dc "[:graph:]" | fold -w 10 |head -10

y#@uDo.g-w
RP\oq.8?)e
2R~CCIsLPr
*/V4″%H9WE
!iP2Jj:vqL
zb!w}DZ|lN
2*%|/;X$?>
R7;-Bam|~L
Ps83,_`8Xz
C?mnpUzn*I

另一种方法可以利用uuid 来产生一个密码,一次只能产生一个:

cat /proc/sys/kernel/random/uuid|tr -d "-"

d9d01c59d22f4ebbac16b759103f4fc6

thread pool 介绍二

作者:吴炳锡 来源:http://www.mysqlsupport.cn/ 联系方式: wubingxi#gmail.com 转载请注明作/译者和出处,并且不能用于商业用途,违者必究.

原来写过一个MariaDB thread pool介绍: http://www.mysqlsupport.cn/mariadb-thread-pool/

最近发现线上的数据库连接又有所增长,数据库的性能有点下降,所以又进一步的关注了一下thread pool.  大概总结如下:

Thread Pool根据系统的CPU创建出thread_pool_size(该参数不建议调整),也可以把这个参数理解为Thread Pool共分了多少Group, 每个Group里同时可以运行多少个任务由:thread_pool_oversubscribe控制,默认是3. 如果把thread_pool_oversubscribe设置为1,则thread_pool_size是同时允许的活跃任务数.每个Group都是一个epoll的对象.

 

Thread_pool_size  X  Thread_pool_oversubscribe = MySQL内部同时支持运行的最大任务数. 如MySQL-5.5128个任务时运行比较好时,CPU16个核,可以把Thread_pool_oversubscribe更改为: 8或是10都可以.

(实际生产中可以通过调Thread_pool_oversubscribe来防止memcache/Redis倒后的数据库雪崩问题)

Thread_pool现在在Percona中引入了优先级队列,新的连接会根据 thread_pool_high_prio_tickets排出优先级,可可以分为两个队列(这个有点类似于Innodb的tickets)目的是把连接接分一下优先级.

thread_pool_max_threads 用于控制thread pool最大允许有多少连接默认是100000.为了防止socket创建占用太多内存,可以把这个降低一点.

thread_pool_stall_limit 用于防止thread pool里的线程死掉.Thread pool里线程如果超过thread_pool_stall_limit声明的时间没响应降会重新创建.默认是500ms

特殊场景:

Thread pool里被占用满了.管理者操作太慢怎么办?

Thread pool提供一个特殊的参数: extra_port 去监听一个和服务端口不一样的端口,用于Thread pool被占满或是被锁着的情况下用于管理使用.

extra_max_connections 用于声明extra_port最大允许的连接.

这个功能也能用于防止MySQL连接数占满不能进入MySQL进行管理的问题.

 

我大概测了 1000, 2000这样规模的连接,如果不使用thread pool 都跑不起来. 使用thread pool后,性能测试表现都非常不错.

 

测试版本: Percona-Server-5.5.35  1G innodb buffer pool , Tpcc-mysql (20 warehouse)  1.9G数据大小.

普通PC机测试(4个core)

Threadpool配置:

thread_handling=pool-of-threads

thread_pool_oversubscribe=25

 

三次并发200, 1000,2000测试平均tpmC分别为: 3500tpmC, 3414tpmC, 3318tpmC

连接数多后也是有一定的性能下降,但这个下降还能接受. 对于应用连接比较多的场景thread-pool看来还是一个不错的功能.

针对跑MySQL的Linux优化经验

译者:吴炳锡 来源:http://www.mysqlsupport.cn/ 联系方式: wubingxi#gmail.com 转载请注明作/译者和出处,并且不能用于商业用途,违者必究.

原文: http://www.mysqlperformanceblog.com/2013/12/07/linux-performance-tuning-tips-mysql/
因为很多MySQL的生产环境都在Linux下,我决定指出一些Linux下跑MySQL的很重要的优化点。这些是大家都知道的,也没什么新东西,但我想在这一个blog里收集整理一下Linux相关的配置优化经验。

文件系统:
ext4(or xfs) mount时使用notime选项
文件系统调度策略: 使用deadline or noop

# echo deadline >/sys/block/sda/queue/scheduler
add "elevator=deadline" to grub.conf

译者推荐: XFS , 目前来看Red hat Enterprise 7 后面XFS成为了默认的文件系统。

内存:
Swappiness and NUMA
译者注: 最好禁掉swappiness 或是在系统标识不使用他。

# echo 0 >/proc/sys/vm/swappiness
add "vm.swapiness=0" to /etc/sysctl.conf

使用numa的interleave all 模式
numactl –interleave=all 启动mysqld
如果使用Percona-server 在mysql_safe里有关于使用numa_interleave的选项。更多关于信息可以查看Percona Server对numa的支持

(并且别忘了使用innodb_flush_method=O_DIRECT)rformance/innodb_numa_s

译者注: 内存优化这块可以考虑使用jemalloc( tokudb,percona都有使用这个方式,官方版本需要自已加载)

CPU:
请确认关闭节能模式
检查:

/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

确认这里显示是不是ondemand,如查是则启用了节能模式。

另外检查/proc/cpuinfo并对比cpu MHZ的数字和”model name”后面显示的数字是否一样
如果使用了ondemand请禁用他。

例如: “ondemand” 在服务器上运行:

$ps ax|grep kondmand|wc -l
65
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
ondemand

另外查看CPU的标注频率是否和实际频率相符:

/proc/cpuinfo:
model name : Intel(R) Xeon(R) CPU E5-4640 0 @ 2.40GHz
..
cpu MHz : 1200.000

如果不符请禁用ondemand(需要更改bois里的配置)

译者注: 如果CPU超过24个核,建议使用MySQL5.6后面的版本。
这是一个简单的针对Linux跑MySQL的一个优化能增强MySQL的性能及更好用。我也你们知道的Linux,MySQL配置优化方法很感兴趣。请在回复里分享一下:)

比较Percona 5.6和Oracle MySQL区别

作者:吴炳锡 来源:http://www.mysqlsupport.cn/ 联系方式: wubingxi#gmail.com 转载请注明作/译者和出处,并且不能用于商业用途,违者必究.

Percona Server 5.6: Enterprise Grade MySQL® with Outstanding Performance

原版PPT猛击:这里

目前讲MySQL5.6 可以说是最好的生产用版本(5.7比5.6更好一点。) 目前5.6可以支持最多64个核(5.5 大概是24个)

Percona-Server是什么:

在MySQL5.6之可以理解为:

Percona Server =MySQL Community
+ Features
+ Bug Fixes
+ Performance Enhancement

 

Percona-Server 5.6 从MySQL5.6后可以理解为:

Percona Server =MySQL Community
+ Features
+ Bug Fixes
+ Performance Enhancement
+MySQL Enterprise Plugins

 

 

 

2013 Oracle技术嘉年华见

作者:吴炳锡 来源:http://www.mysqlsupport.cn/ 联系方式: wubingxi#gmail.com 转载请注明作/译者和出处,并且不能用于商业用途,违者必究.
今年有兴再次去Oracle技术嘉年华分享MySQL相关主题<<高可用MySQL:构建健壮数据中心>>,这次主要分享一下在MySQL高可用方面的一些经验.
大纲如下:
•高可用是什么
•高可用架构
 –基于共享存储
 –基于同步的架构
 –基于NDB的高可用架构
 –基于APP分布式事务或是第三方控制的高可用
•MySQL高可用所要面临的问题
 –高可用能接受的故障时间
 –数据一致性要求
•构建健壮的数据中心如何选型
 –选择较佳的方案
对2013技术嘉年华有兴趣还没买标的同学,我这里给你提供一个优惠码: OTNWBX

折扣票价与官网票价

>> > A票折扣价:800元  (官网票价1080元)

>> > B票折扣价:600元  (官网票价880元)

报名页(http://otn.itpub.net/regist.html

php连接不上MySQL问题排查

作者:吴炳锡 来源:http://www.mysqlsupport.cn/ 联系方式: wubingxi#gmail.com 转载请注明作/译者和出处,并且不能用于商业用途,违者必究.

现象
在PHP error log里发现:
PHP Warning: mysqli::mysqli(): (HY000/2003): Can’t connect to MySQL server on ‘XXX.XXX.XXX.XXX’ (99) in /u1/www/XXXX.php on line 10
PHP Warning: mysqli::close(): Couldn’t fetch mysqli in /u1/www/XXXX.php on line 11
推断:只有在高并发的环境下出现

诊断分析:
通过MySQL数据库上抓包,没发现异常。又把目标转到php 服务器上。
BTW:
linux开着selinux连接MySQL在测试中基本上属于1ms+,禁掉selinux后在0.96左右。selinux还是要禁掉的。
既然又怀疑是PHP的问题就写一个程序测试(禁掉selinux后):
cat tconn.php

function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}

$time_start = microtime_float();
for ( $i=0; $i<30000; $i++){  
$dbh=new mysqli("XXX.XXX.XXX.XXX", "wubx", "wubxwubx", "userdb", 3308);
$dbh->close();
}
$time_end= microtime_float();
$time_use= ($time_end - $time_start)/30000;
print "$time_use\n";

#php tconn.php
0.00090954260031382
再次运行就开始大量的报错。

PHP Warning: mysqli::mysqli(): (HY000/2003): Can't connect to MySQL server on 'XXX.XXX.XXX.XXX' (99) in /u1/www/XXXX.php on line 10
PHP Warning: mysqli::close(): Couldn't fetch mysqli in /u1/www/XXXX.php on line 11

中止该程序后,通过
#strace php tconn.php 运行
得到:

connect(3, {sa_family=AF_INET, sin_port=htons(3308), sin_addr=inet_addr("XXX.XXX.XXX.XXX")}, 16) = -1 EADDRNOTAVAIL (Cannot assign requested address)
shutdown(3, 2 /* send and receive */) = -1 ENOTCONN (Transport endpoint is not connected)

看到这个大概明白是本地的网络可能注册不上了,也难怪在MySQL抓包看也正常。
参考:http://www.unixguide.net/network/socketfaq/4.5.shtml

看样子是本地tcp不能重用造成的。改一下在测试
sysctl -w net.ipv4.tcp_tw_reuse=1;
在次测试问题不存在了。在这个上面碰了一下后顺便改一下/etc/sysctl.conf添加:

net.ipv4.tcp_max_syn_backlog = 819200
net.core.netdev_max_backlog = 400000
net.core.somaxconn = 4096
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=0

#sysctl -p

总结:
php连接MySQL的原因有很多,这个只是一个高并发环境会出现的问题也比较难查。其它连不上只要好重现都比较好查,一般通过抓包都能分析出来。 这个同样适用于做为App的Server大量和中间层交互的也需要注意。

慢查询日志使用

作者:吴炳锡 来源:http://www.mysqlsupport.cn/ 联系方式: wubingxi#gmail.com 转载请注明作/译者和出处,并且不能用于商业用途,违者必究.

MySQL慢日志往往是大家定位SQL性能问题。通过慢日志分析可以调整索引使用。这是使用最多的一个功能。

目前MySQL也支持毫秒级别以下的慢日志记录,这个功能其实有很多用处,这里大概给大家讲解一下。该功能开启参数:long_query_time

通常使用这个参数的几个环境:

需要得到一个业务的所有SQL可以在测试环境中MySQL的long_query_time设置为0.000001:

set global long_query_time=0.000001;

flush logs;

这样基本上所有对MySQL请求的sql都会记录到慢日志中。通过日志分析可以全面了解一下SQL样式及整体运行调用分布。(重要的库可以考虑开启该参数记录相应的log用于审计使用)

同样对于生产环境,可以通过开启该参数,定期收集一下线上的SQL运行情况,做一些对比,方便了解目前线上SQL运行的情况。能更供更多的指导。 有了慢查询日志,通过慢查询日志分析工具很容易得到一份不错的分析结果。 对于慢日志,目前来讲,官方版本还是有点弱,这也是我推荐使用Percona-Server的一个原因之一,该版本的慢日志功能非常强大,有兴趣的同学也可以猛击(Percona Slow Query Log)去学习一下吧。 也建议官方MySQL开发团队能学习一下Percona对Slow Query的处理,对于DBA排查问题非常有帮助。

新媒传信招聘MySQL DBA

作者:吴炳锡 来源:http://www.mysqlsupport.cn/ 联系方式: wubingxi#gmail.com 转载请注明作/译者和出处,并且不能用于商业用途,违者必究.

北京新媒传信科技有限公司正式成立于2007年3月,是北京神州泰岳软件股份有限公司的全资子公司.

工作环境:
拥有自行开发的一套 MySQL 容灾机制,管理20T以上的用户核心数据,大规模分布式集群环境。大数据,高并发,等待你的加入.

任职要求:
3年以上MySQL DBA工作经验,具备数据库开发能力;
精通/熟悉MySQL数据库的运行机制和体系架构,运行管理与优化;
精通MySQL复制、Cluster、备份/恢复原理,熟练掌握数据库维护工具;
精通MySQL存储引擎InnoDB、MyISAM,存储过程和事务;
熟悉Linux操作系统的使用,有一定网络管理知识;
熟悉Perl/PHP/Shell编程;
对NOSQL产品有一定的了解;

相关工作要求:
3年以上MySQL DBA工作经验,具备数据库开发能力;
精通/熟悉MySQL数据库的运行机制和体系架构,运行管理与优化;
精通MySQL复制、Cluster、备份/恢复原理,熟练掌握数据库维护工具;
精通MySQL存储引擎InnoDB、MyISAM,存储过程和事务;
熟悉Linux操作系统的使用,有一定网络管理知识;
熟悉Perl/PHP/Shell编程;
对NOSQL产品有一定的了解;

其它要求:
良好的沟通能力,团队合作意识较强
具有积极乐观的工作态度
能够吃苦耐劳,诚实正直,有责任心,能够承受一定的工作压力
大学本科以上,计算机相关专业

PS:

如果你觉的自

有兴趣的同学可以联系我wubingxi#gmail.com 或是weibo 联系 @吴炳锡

FAQ:一个表里取不唯一记录取最后一行方法

作者:吴炳锡 来源:http://www.mysqlsupport.cn/ 联系方式: wubingxi#gmail.com 转载请注明作/译者和出处,并且不能用于商业用途,违者必究.

如下表:

CREATE TABLE `t1` (
`userid` int(11) DEFAULT NULL,
`atime` datetime DEFAULT NULL,
KEY `idx_userid` (`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

数据如下:

MySQL> select * from t1;
+--------+---------------------+
| userid | atime |
+--------+---------------------+
| 1 | 2013-08-12 11:05:25 |
| 2 | 2013-08-12 11:05:29 |
| 3 | 2013-08-12 11:05:32 |
| 5 | 2013-08-12 11:05:34 |
| 1 | 2013-08-12 11:05:40 |
| 2 | 2013-08-12 11:05:43 |
| 3 | 2013-08-12 11:05:48 |
| 5 | 2013-08-12 11:06:03 |
+--------+---------------------+
8 rows in set (0.00 sec)

其中userid不唯一,要求取表中每个userid对应的时间离现在最近的一条记录.初看到一个这条件一般都会想到借用临时表及添加主建借助于join操作之类的.
给一个简方法:

MySQL> select userid,substring_index(group_concat(atime order by atime desc),",",1) as atime from t1 group by userid;
+--------+---------------------+
| userid | atime |
+--------+---------------------+
| 1 | 2013-08-12 11:05:40 |
| 2 | 2013-08-12 11:05:43 |
| 3 | 2013-08-12 11:05:48 |
| 5 | 2013-08-12 11:06:03 |
+--------+---------------------+
4 rows in set (0.03 sec)

Good luck!

发表在 FAQ

MariaDB thread pool解读

作者:吴炳锡 来源:http://www.mysqlsupport.cn/ 联系方式: wubingxi#gmail.com 转载请注明作/译者和出处,并且不能用于商业用途,违者必究.

Thread pool是什么

MySQL是每个连接上来都要创建一个线程来执行语句。这样每一个新的连接进来即会创建一个新的线程,这种动作对MySQL本身压力比较大。Threadpool是提供一种线程代理的模型执行每个连接的语句。而MySQL内部维护一个可能接受的线程总数,减少线程太多在CPU切换等方面的压力。

使用Threadpool的好处

  1. 使用线程代理的模型在连接数已知可控的情况下,提前创建好过线程并利用操作系统的threadpool技术维护,能减少很多开销。
  2. 尽可能的使用操作系统的线程方面的管理,把线程管理开销降到最低。 3. 利用thread_pool_max_threads控制资源使用

什么情况下Thread Pool作用比较小:

  1. 并发太高及有长的语句操作。 如:内部threadpool的总数为:10个,外面并发来了1000个请求,现在都来争用这10个内部线程,这个开销也比较重。同样道理加大threadpool后,innodb内部的并发也会受到限制。
  2. 突发的大量连接。这个情况下threadpool还有一定的作用,但是效果不明显了。如果为了防止大量的连接进来。可以考虑增加thread_pool_min_threads及thread_pool_idle_timeout的值,让平时也维护一个大的threadpool
  3. 高并发的环境,有可能简单的查询也会变慢。虽然select 1;这样的查询很简单应该会很快完成。但在threadpool的下面也需要排队等待从theadpool得到可用的线程才能执行。

使用方法:

目前支持threadpool的有MariaDB, Percona, 官方MySQL的一个收费功能。配置启用。

在my.cnf

[mysqld]

#thread pool

thread_handling=pool-of-threads

更多细节实现WL#246   threadpool-in-55