RadonDB架构解析

RadonDB在DTCC大会主会场宣布开源了, 一个期待已久的产品终于走进了开源社区。 感谢青云领导层的对技术贡献的情怀。

做为一个MySQL从业人员,从我对RadonDB关注到使用,将近有半年多时间,这次RadonDB开源,基本也全程参与,在这里开源计划到最终在DTCC展现,也深深感受为开源,公司也需要付出很多很多。

这里了为了能快速的让大家了解RadonDB,我这里对RadonDB架构做一个简单的梳理,本着更容易大家理的态度不夸大,更利于接近于实质, 同时也方便大家深入去学习RadonDB。

RadonDB整体架构

RadonDB官网: http://radondb.io

RadonDB基于Golang开发,由四部分组成:

  •    Radon SQL 路由层 ,Proxy模式  下载地址: https://github.com/radondb/radon
  •    Xenon  MySQL Plus高可用组件 下载地址: https://github.com/radondb/xenon
  •    存储节点 ,官方MySQL或是Percona分支,推荐一主两从,增强半同步
  •    计算节点  ,目前使用的TokuDB做为全量数据存储,推荐优化后的分支: https://github.com/xelabs/tokudb

 

Radon作用:

  •    SQL解析及路由,混合OLTP和OLAP
  •    分布式事务支持
  •    用户验证, 在Radon中验证,不需要MySQL端创建
  •    连接池功能
  •    SQL审计日志记录(默认没开启,开启后会记录全量的请求,用于审计使用)
  •    记录全量SQL的binlog,用于计算节点数据实时复制
  •    原生集群支持,配置在节点间自动同步

Xenon(MySQL Plus)作用:

MySQL的高可用组件,这个也是我一直觉的增加半同步出现后,是MHA的一个最佳替换产品。 还有很多好玩的功能可以去在上面扩展,主要功能如下

  •   MySQL高可用选主
    • 基于Raft(依赖于GTID)选主
    • 数据一致性依赖于增强半同步(semi-sync)
  • 故障切换动作
    • 借助于配置中leader-start-command  & leader-stop-command  调用相应的脚本完成
    • 这一块也可以自已扩展,结合Consul,ZK来玩
  • MySQL故障后切为从节点后,自动拉起并修复制关系,也可以自动重建(需要配置)
  • 集成Xtrabackup备份调度实现

MySQL存储节点:

利用MySQL的增强半同步构建,一主两从。

主要用于存储数据中的某个分片,有点类似于Redis Cluster结构中的一个主从分组。 官方使用三个节点,为了高可用,推荐至少两个节点。 实验环境,也可以使用一个节点(在单节点结构下MySQL Plus不是必须的)

计算节点:

目前利用作者优化过的TokuDB版本存储分库分表后的全量数据,这样复杂的SQL请求可以转到该节点上运行,官方目前该节点配置是三个,也可以是1-2个, 如果复制SQL比较多,这个地方需要增多一点,实现多个从节点上的SQL运算。 官方反馈,这个地方也需在找新的技术替代,如: Greenplum或是ClickHouse,也可能是MariaDB的ColumnDB。

该节点要担任:SQL中无分区Key的查询,join查询等复杂类的操作。 该节点数据主要靠Radon给多写实现。 如果没这部分操作,可以不要计算节点。不过,推荐放置,这样相当于有一个地方有一个全量数据。对数据安全也是一个增强。

同样该节点也可以后续加入,通过https://github.com/xelabs/go-mydumper 全集群某个分片全量迁移,然后在结合Radon记录的GTID信息实现增量同步。

计算节点可以说是RadonDB中的一个亮点,借助于Radon实现了一个全量数据维护,这复杂的查询或是统计的分析都可以到计算机节点实现,这个地方如果将来换成一个OLAP类的数据库,就更回完美。

借用官方的架构图供大家在看一下:

 

RadonDB优点

大致对整个结构有一个了解后,我们再看看几个实质的问题,RadonDB有优秀的地方,大致总结以下几点:

  1.  自动分库分表,透明扩容。

    • 在RadonDB中目前只支持Hash拆分,默认把一个表分成: 4096个slot,实际分配到多个子表中,例如青云产品中配置成32个子表,那么每个子表对应128个Solt(4096/32)。 例如创建一张表:
    • create table zst_user(id int not null, wubx varchar(32))   partition by hash(id)
    • 如果有一个MySQL存储分片,会在这个存储分片上建出来32张实际的表,每个表对应id Hash后的128个Slot
    • 诱明扩容
      • 在RadonDB,可以配置当一个表增长超过多大时,当集群中添加节新的存储节点时,会动态进行数据迁移,默认配置单表超过1G,这个步骤迁移是通过利用go-mydumper导出,记录Radon上该节点的GTID,然后到目标节点导入,再通过Radon上补Binlog方式上后,实现访问路由变更。
  2.  对SQL执行没有限制

    • 带有分区Key的查询,可以路由的相应的存储节点计算
    • 不带分区key的会路由到所有存储节点计算,然后在radon中合并
    • 对于有条件及含聚集函数的查询大多还是在存储节点运算后在Radon上合并返回结果,这块需要进一步分析一下执行情况。
    • 对于join,子查询等复杂类的SQL需要计算节点支持,在计算节点运算后返回给前端。
  3.  自带高可用套件: Xenon (MySQL Plus)

    • 支持MySQL节点上故障快速切换及利用API指令把节点重建(调用的xtrabackup)
    • 在数据一致性,安全性方面,还是依赖于MySQL的增强半同步,所以也推荐三个节点。

RadonDB不足之处:

RadonDB 现在可以说刚出江湖,核心代码1万行左右, 学习Golang的同学不要错过。 加上其它类库引入。 Radon代码11万+, Xenon代码5万行+ 整体来说还是一个轻量级结构。

目前还有一些不足及改进的地方:

1.  Radon 这个Proxy模型中, 目前默认提供单节点读写,支持读IP,业务层需要自已处理读写分离。 这样实质的业务压力还是在Proxy这一层(能不能抗住业务,需要亲测一下),需要考虑多节点同时提供读写能力。(这个其实现在Proxy模型都号称支持多节点同时读写,但对于数据一致性要求强的环境差不多都会出问题)。 这块官方为了金融环境,还是比较保守,实质上多个Radon可以成为无状态对外提共服务,更新冲突,可以让数据库自已来处理。 多个Proxy也相当于更多的连接, 这块实际测试中,可以考虑让多个Radon都对外服务,提高Radon的利用率。

2. Xenon(MySQL Plus)相对独立,没有和Radon有更多的交互, 这个是一个亮点,Xenon后续也可以用到不同的分布式结构下面。但做为产品中的一个组件,还是需要考虑和Radon有更多的交互,如:复制延迟情况, MySQL节点故障后,新选举出来的主,可以同步给Radon,把现有的VIP方案去掉。  这种分离的结构,也给了我们使用者更多灵活的空间,例如结构Consul来玩。感觉有利有弊,有很大的优空间。非常看好Xenon(MySQL Plus),绝对的一个高可用的利器。

3. 某些方面还有待提高,例如计算节点添加, 借助于Radon的Binlog实现,这一块也可以借助于官方的复制实现。需要进一步讨论。 这块可以通过后续DBA的运维手段改善。全量数据维护这块, 也是后续中维护的一个难点,需要提前规划好。

4. 集群中现在成员资源使用绝对不饱合,估计使用在30%以下。 Radon目前单节点提供服务,存储节点,也可只有从节点提供服务。  这块也是金融级高可用的通命,特别是两地三中心架构中,更加浪费。

总的感受

RadonDB  整体非常不错,设计方面,非常独道,属于一个多年开发经验,理解开发中痛点的一个数据库产品MyNewSQL,代码也比较精简,觉的也是学习Golang不错的项目。对于理解数据库架构设计也是一不错的东西。知数堂准备把RadonDB放置到课堂中做为教学内部中的一部分。也欢迎大家一块来交流RadonDB相使使用经验。 欢迎加知数堂-王者侠谷中交流:

 

 

 

新一代MySQL高可用:MySQL Plus

在基于MySQL传统复制的时代(MySQL版本低于5.5)MHA在MySQL高可用中可以说是独领风骚。在MySQL 5.6及GTID的出现后,MHA在这方面就显的不给力,和MHA作者交流,作者基本放弃该软件的维护,MHA作者现就职在Facebook,也没在使用MHA,他也认为在GTID环境下MHA存在的价值不大,不过你如果你还在使用传统复制,还是可以考虑使用MHA做主从的高可用(太老了,建议升级)。

下面我们围绕以下几点来讨论一下:

  1. 在MySQL 5.7 后为什么不需要MHA
  2. MySQL Plus 是什么,能解决什么问题
  3. MySQL Plus看他们如何搞定金融支持

MySQL 5.7后为什么不需要MHA

基于MySQL 5.7 GTID复制已经成熟,另外基于MySQL5.7的增强半同步性进一步提升: 所以在使用MySQL 5.7的复制可以使用: MySQL 5.7+GTID+增强半步, 在该结构中, 不存在会丢数据的问题。 所以MHA在这个结构基本失去了存在的意义。

但使用: MySQL 5.7+GTID+增强半步,也意为着新的知识,可能需要DBA同学们也要更新一下知识。而且在MySQL 5.7中引入binlog group commit, 又是对复制的一个加速。 所以说MySQL5.7 在复制完整性及性能上都有较大的提升,建议没升级的同学尽快升级了。

官方对MySQL 5.7的测试传送门: https://www.mysql.com/why-mysql/benchmarks/

MySQL Plus是什么,能解决什么问题

在3306π北京活动中 青云的蒙哲分享了青云RDS中高可用组件: MySQL Plus。 MySQL Plus是基于一套Raft构建的MySQL中自动选主及维护主从的套件,整体结构如下:

在该结构中Xenon之间会进行通信,在该结构中推荐三个节点的MySQL构建复制,听作者讲也支持两个节点的MySQL构建集群。

在MySQL Plus主要解决:

  1.  集群切换的强一致性(从上面架构看,更多的依赖于MySQL增强半同步,MySQL Plus在控制切换时,会做复制完成校验,从而且保证数据一致)
  2. 主从秒级别切换
  3. 无中心化自动选主

MySQL Plus看他们如何搞定金融环境

MySQL Plus 可以简单的理解是一个MySQL 5.7 GTID增强半同步复制的高可用管理组件。 在MySQL半同步配置方面,为了支持金融业务,青云给的配置如下:

  • rpl_semi_sync_master_wait_no_slave=ON
  • rpl_semi_sync_master_timeout=1000000000000000000
  • rpl_semi_sync_master_wait_point=AFTER_SYNC

看到这个配置我才想明白为什么他们建议是三个节点,在rpl_semi_sync_master_timeout配置上可以说不允许退化到异步复制, 另外RadonDB负责人交流,在MySQL Plus架构中主节点上至少要求一个Slave给半同步应答。 所以2个节点对架构的稳定性也是一个保证。 另外在金融环境中,作者推荐所有请求都在主库上完成, 免的存在复制延迟造成交易数据异常。

在金融架构中,青云也提供一套基于MySQL Plus之上构建建的分库分表机制, 基于MySQL的事务强一致性约,在该平台支持OLTP和OLAP更感觉有点NewSQL的感觉。

下面是官方给的一个总结:

重大消息

如果想了解更多3306π是青云MySQL Plus PPT信息可以关注 3306pai公众号,回复“bj”获取 3306π北京的PPT打包下载。

MySQL Plus 官方要开源了,希望通过MySQL Plus给MySQL 5.7 GTID复制提供一个新的高可用方案。

更重大消息: QingCloud RDS : RadonDB也要开源了,大家期待一下吧。 如果感兴趣提前体验或是更多的关注 RadonDB发展,也可以加到QQ群:748415432  和群主及 RadonDB负责人直接对喊话。   技术在于相互沟通,你的建议也需是将来一个非常不错的功能。

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

如何成为MySQL DBA

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

        互联网高速发展的成功,得益于MySQL数据库的给力支持。MySQL本身发展的速度较快,性能方面提升显著,让传统企业也有想法使用MySQL提供服务。目前看来MySQL DBA的缺口非常大。所以欢迎加入到MySQL DBA的团队中来。

        有同学一提到MySQL DBA或是DBA都把高难度入门联系到一块。我从事MySQL DBA差不多10几年了,在这里我也给大家讲述一下怎么成为一名MySQL DBA, 少走湾路,快速成为MySQL DBA。

        首先MySQL大多是跑在Linux环境上的,所以我们需要学习一下Linux的知识,最基础的需要了解:

      • Linux的安装及目录结构意义
      • 常用的Linux命令,大概20多个
      • 网络基本知识,进一步了解网关及路由相关概念,dhcp
      • 撑握一定的Linux网络服务,如果LAMP结构,dns,  ftp 等

      其实具备上面的条件,你就可以开始MySQL DBA的学习之路了,其它的知识,可以在学习在补。 MySQL DBA比较特殊,不象别的数据库一样,需要分为开发DBA,运维DBA,基本上MySQL DBA要把所有的活都干下来,因为MySQL太简单了,很好搞定。 那么下面给大家说一下MySQL DBA的学习路径:

      • 了解MySQL的版本意义
      • 学习MySQL的安装方式,从根本下理解MySQL的启动原理
      • 学习SQL语言,把高中数学中集合知识好好在学习一下,再来看SQL语言
      • 学习SQL在MySQL使用中的一些规范(这些最好找有经验的请教一下,或是看看大会中别人分享的学习思考)
      • 学习MySQL的高级特性: 触发器,事件,存储过程编程,分区等
      • 学习MySQL的复制,了解复制原理及实现及相关高可用配合中有什么不足
      • 学习PXC结构的实现,了解运维中的坑
      • 系统的学习一下MySQL的体系结构,思想如何做MySQL优化,总结配置优化
      • 学习MySQL的备份恢复,这块可能需要多一些时间好好的系统的学习一下
      • 掌握几种压力测试的方法,方便优化后能做一个验证
      • 深入理解Innodb的体系结构,全面理解一下事务及锁的实现,能解析出来一个update tb1 set col1=col1+1 where pk=10;  这样的语句在Innodb都干了什么了。

  可以说上面的东西并不是很难,基本上只要认真努力,都可以进入到MySQL DBA的大门了。当然如果想进入更高级的DBA工作环境,还是需要点更高级的知识:

      • 理解MySQL的特点,方便在实际环境决择
      • 理解操作系统的IO调度,内存分配,CPU使用等
      • 理解复制的优缺点及改善的方法
      • 理解系统监控及系统瓶颈点分析
      • 有一定的问题排查思路
      • 可以全面的理解高可用的实现及自定义实现高可用架构
      • 有一定的平台管理意识及实现能力
      • 理解拆分的作用及实现的方法

     万里长征驶于足下,整体上来说踏上技术这条路,就要学会保持学习,能持续更新,敢于多关注现在的资源,利用现有的资源走上更的境界:

      • 了解现有硬件的特点
      • 了解业务的实现及难点
      • 了解常见NoSQL的使用
      • 关注新技术
      • 进入MySQL DBA架构师级别可以行容量的规划

     如果想系统提高一下MySQL DBA技术的,如果你是在职人员,可以利用周六时间来参加一下我的《MySQL DBA周末提高加班》,如果你现在没有工作,那可以考虑拼博3个月参加一下我组织的《MySQL DBA零基础就业脱产班》 一同走上MySQL DBA岗位。请联系我: QQ/weixin: 82565387. 2016年一起腾飞。

     在技术的成长之路,还有有一个比较重要的路径: 多参加同行业技术交流,关注行业技术实现。推荐: MySQL中国用户组, FireFlyClub 也欢迎各位加入。

[20150924]公开分享-优秀MySQL DBA进化之路

作者:吴炳锡 来源:http://wubx.net/ 联系方式: wubingxi#163.com 转载请注明作/译者和出处,并且不能用于商业用途,违者必究.
分享主题: 优秀MySQL DBA进化之路
分享时间: 2015年9月24日 20:30-22:00
分享方式: 加入QQ群: 373900864 或 125572178,并通过YY频道: 86142750 语音直播(请提前下载YY语音客户端)

分享嘉宾: 吴炳锡
北京新媒传信数据库架构师,专注于后端高性能服务及DB存储治理。
中国CMUG核心组织者,MySQL布道者。
熟悉MySQL高可用方案,丰富的大型系统后端存储规划设计,
熟悉多机房架构设计及运维,丰富的自动化平台开发及实践。
个人博客:http://wubx.net

内容简介:
分享者结合自已10年+的MySQL DBA工作相关工作, 通过中高级DBA工作中的工内容,给大家全面展示一下MySQL DBA工作的职责及技能需求,给自已想成为MySQL DBA的人员一个主线,同时给大家指出学习MySQL DBA技能中的注意事项。
内容大纲:
1. 为什么要成为MySQL DBA
2. 如何成为MySQL DBA
3. MySQL DBA的工作内容
4. 优秀的MySQl DBA怎么练成
5. MySQL DBA路在何方

备注:

如果你的群里想进行直播,请联系我QQ: 82565387

美的招聘-MySQL DBA

美的现在也想走开源路线,所以大量需要开源相关的人才,MySQL DBA也成了招聘中的重中之重。

该公司强烈推荐,二线城市,一线的待遇,舒适的生活:) 

具体信息如下:

高级MySQL数据库架构师
职位描述:
1.负责数据库架构规划、设计及技术指导;
2.负责关键技术研究及实现,提供满足产品设计规划的数据库领域设计方案;
3.及时解决项目开发或产品研发中的技术难题,对设计平台的最终性能和稳定性负责;
4.负责mysql数据库技术规范建设;
5.培训软件工程师,指导复杂模块的开发;

职位要求:
1.具备5年以上大型Mysql数据库开发设计经验;
2.具备MySQL,ORACLE,SQLserver等数据库的一种或多种的运行机制和体系架构经验;
3.精通sql语句,熟悉数据库的备份恢复及数据迁移等策略,熟练为数据库打补丁,版本升级等;
4.熟悉分布式数据库设计和建设方案,海量数据库分库分表策略以及高并发OLTP、OLAP系统的设计和维护;
5.精通数据库产品性能分析和测试,对数据库的优化,存储性能有较深的研究和操作经验;
6.精通Linux系统,熟练各种命令;
7.了解mogondB等NOSQL、的数据存储产品,熟悉不同类型和数据库的底层运行原理和优缺点;
8.了解Hadoop集群的搭建、配置与管理,对Hadoop源码有深入研究,有对Hadoop优化方面的经验优先;
9.善于处理数据库运行故障和安全加固;
10.熟悉建立数据库仓库及有数据分析与挖掘基础优先。

高级MySQL数据库管理工程师
职位描述:
1.负责Mysql数据库日常运维及故障解决,备份恢复维护;
2.负责Mysql数据库性能调优及数据安全,并负责补丁升级;
3.负责MySQL数据库集群、分库/分表和高可用方案实施等;
4.处理日常事务性数据库操作,提供业务和公司决策支持;
5.协助开发完成数据库表的设计及SQL调优;

职位要求:
1.三年以上DBA相关管理经验,具备大型互联网高并发下Mysql数据库管理经验;
2.精通/熟悉MySQL数据库的运行机制和体系架构,深入理解InnoDB引擎,熟悉MySQL数据库应用运行体系及高可用解决方案;
3.精通/熟悉Mysql数据库的管理,具备批量化数据库运维经验;
4.精通/熟悉MySQL数据库性能调优,SQL优化,服务器优化;
5.熟悉Linux操作系统管理与维护;
6.熟悉shell/perl/python等脚本编写;
7.有MongoDB、Redis、HBase等维护经验优先;
高级MySQL数据库开发工程师
职位描述:
1.负责数据库设计及代码开发;
2.配合产品部门制定数据库技术方案,分库分表策略,数据迁移方案;
3.参与数据库查询分析和性能优化,参与制定SQL编写规范、代码开发和SQL审查;

职位要求:
1.三年以上数据库开发经验;
2.精通数据库基本原理,熟悉SQL语言,精通掌握存储过程等技术;
3.熟悉数据仓库的ETL开发和主题数据建模;
4.熟悉Linux操作系统,具有Shell, C或Java编程经验;
5.熟悉基于MySQL的大规模分布式系统,具有基于MySQL的大规模分布式系统设计/开发经验者优先;
6.熟悉MySQL内核,具有分析其代码实现和具有修改、编写经验者优先;

工作地点:广东顺德
简历邮箱:pirate@linuxboy.cn
待遇从优,欢迎各方人才加入!!!

针对跑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配置优化方法很感兴趣。请在回复里分享一下:)

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大量和中间层交互的也需要注意。

新媒传信招聘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 联系 @吴炳锡

Ubuntu工作机使用FlashCache技术加速

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

Flashcache是facebook的一个开源项目,用于数据库加速中.大致结构,在传统磁盘前面放置一个ssd装置,充当缓存,把热的数据保持在缓存中,写的过程也是在先写ssd然后由ssd同步到传统磁盘.真正的数据最终还是保持在传统磁盘中.这样ssd杯掉也不用担心数据丢失.同时又可以有大容量,高性能的体验.

现在ssd也挺便宜的,新一点的笔记本里都有ssd磁盘.那么这里简介绍一下,怎么用ssd加速home及其它分区,引导这块不涉及.缺点: ssd只是用来做cache不能存入实质的东西.

前提:
ssd有空余的分区或是有个ssd盘不使用.操作系统是ubuntu或是其它linux

大致步骤:
1. 安装git

$sudo apt-get install git-core

2. 下载flashcache源码:

#git clone https://github.com/facebook/flashcache.git

3. 进入目录编辑

#make
#make install

//如果失败看提示,一般是内核源码没安装的原因
4. 加载flashcache模块

#modprobe flashcache

确定加载完成:

#dmesg |tail
......flashcache: flashcache-1.0 initialized

表示成功
另外还可以:

lsmod |grep flashcache

看到相应的信息即成功.

为了开机能加载这个模块,需要这个模块名写入/etc/modules中

#echo "flashcache" >> /etc/modules

好这里完成了基本环境的安装.下面以/home分区加速设制为,其它一样.
我的ssd分了/dev/sda1 用于/ , /dev/sda2用于了swap 还有/dev/sda3 ,/dev/sda4分区出没使用.我在传统磁盘里划出来100G /dev/sdb1用于/home目前还没挂载.
5. 格式化/dev/sdb1 如果原来/home节点已经划分有分区, 只用umount掉即可,然后在fstab去掉自动挂载(flashcache目前不能自动挂载)
#mkfs.ext4 /dev/sdb1
把原来/home的数据复制或是移到动/dev/sdb1上.
#mount /dev/sdb1 /mnt
#cp -r /home/* /mnt
#umount /mnt
需在注意cp过去后权限是不是和原来的一样.

6. 初始化flashcache
#ls -la /dev/disk/by-uuid/
找到/dev/sdb1 对应的uuid

#flashcache_create -v -p back home_flashcache /dev/sda3 /dev/disk/by-uuid/4b75b04e-5930-4042-89b8-40894067dac6

这样即创建完毕.
7. 挂载那个flash设备

#mount /dev/mapper/home_flashcache /home

即可以体验flashcache加载的东西了.
8. 收尾工作,开机自动挂载flashcache加速的设备,利用rc.local完成
在rc.local里添加:

flashcache_load /dev/sda3
mount /dev/mapper/home_flashcache /home

这样即可开始挂载/home节点了.

如果不想使用flashcache技术,可以通过如下命令删除该功能:
umount /home
dmsetup remove cachedev
flashcache_destory
mount 相应的节点即可

说明: 以# 开头的操作表示以root权限进行的操作,以$开头的表始以普通用做的操作.

Mysql 事务级别说明

      mysql 事务级别说明作/译者:吴炳锡 wubingxi#gmail.com 来源:http://www.mysqlsupport.cn/ 转载请注明作/译者和出处,并且不能用于商业用途,违者必究。

来源于my.cnf

#Set the default transaction isolation level. Levels available are:
# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE #transaction_isolation = REPEATABLE-READ

READ-UNCOMMITTED: 未提交读 会出现脏读、不可重复读、幻读 ( 隔离级别最低,并发性能高 )
READ-COMMITTED:
提交读 会出现不可重复读、幻读问题(锁定正在读取的行)
REPEATABLE-READ: 可重复读 会出幻读(锁定所读取的所有行)
SERIALIZABLE:  序列化 保证所有的情况不会发生(锁表)

 

详细说明:
     未提交读——这通常称为 ‘dirty read’:non-locking SELECT 的执行使我们不会看到一个记录的可能更早的版本;因而在这个隔离级别下是非 ‘consistent’ reads;这级隔离级别的运作如同 READ COMMITTED。处于这个隔离级的事务可以读到其他事务还没有提交的数据。如果这个事务使用其他事务未提交的变化作为计算的基础,然后那些未提交的变 化被他们的父事务撤销,则会导致误差。
     提交读——在一个事务中已经COMMIT的数据可以在其他事务中看到。如果这个事务频繁提交的话,其他的大的查询事务中可能会得到多个不同的结果。
    可重复读——这是 InnoDB 默认的事务隔离级。在一个事务中所有读都是连续的。
    序列化——提供最大程度的隔离,如果每个事务都以这种隔离级运行就会影响Mysql的性能,因为需要大量的资源来使大量事务在任一时刻不被看到。如果一个事 务在执行一个SELECT操作,另外的事务不允许执行UPDATE操作,这个隔离级别下的SELECT操作被阴式地转换为 SELECT … LOCK IN SHARE MODE。
     不可重复读的重点是修改 : 同样的条件 , 你读取过的数据 , 再次读取出来发现值不一样了 幻读的重点在于新增或者删除 同样的条件 , 第 1 次和第 2 次读出来的记录数不一样

设置事务的隔离级别:
mysql>SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

需要super优先权执行这个操作。
      取得当前事务的隔离级别: mysql>select @@tx_isolation;默认情况下,隔离级别变量的值是基于每个会话设置的,但是可以通过添加global关键字对所有的会话进行全局设置。