MySQL

  • 关于MaxScale2.1的BSL协议

    ·

    MaxScale是一个非常赞的MySQL Proxy产品,相比MySQL Route或者ProxySQL来看,也是非常有竞争力的。但是MaxScale有些特别,虽然是开放源代码的,但并不是一个“Open Source”的项目,他使用了特有的授权协议:BSL协议(全称:Business Source License)。那什么是BSL协议? 这里做个简单的说明,感兴趣的可以继续阅读文章后面的链接做延伸阅读。

    BSL全称是Business Source License,最新版本是1.1(完整内容)。这里简单概括一下协议的主要内容:

    1. BSL协议不是一个“Open Source”的协议,虽然你可以拿到源代码,使用这个软件,但是会受到限制的。比如MaxScale,在生产环境,如果后端超过3个实例,就必须购买商业授权。

    2. BSL协议虽然不是一个开源协议,但是,使用BSL协议的软件在发布的最多4年后(也可以是更短的时间,可以在协议中定义),必须遵循GPLv2(或之后的GPL版本)协议分发。比如MaxScale2.1版本将在2019-07-01之后遵循GPL协议。

    3. 对于非生产环境,BSL协议的软件可以不受限制的使用。

    4. 所以,BSL协议虽然不是一个开源协议,但是使用BSL协议的软件,最终会变成开源软件。

    5. BSL协议是MariaDB公司新定义的协议。需要注意,MariaDB依旧是GPL的,因为MySQL是GPL的,没人能够改变这个。

    6. MariaDB公司遵循BSL的软件有:MaxScale、MariaDB ColumnStore Backup Restore Tool、MariaDB ColumnStore MaxScale CDC Data Adapter、MariaDB ColumnStore Kafka Data Adapter。

    7. BSL协议应该是Monty等,经历了MySQL的被收购之后,关于开源软件和商业公司对抗的一个新的探索。可以看到BSL是介于开源、闭源之间的。 (more…)

  • Amazon RDS价格一瞥

    ·

    本文尝试通过一些直观的数据和表格,来看看Amazon某个规格的RDS实例到底是什么价格以及如何计费。

    亚马逊RDS计费分为两个主要的部分,一个是“实例费用”(CPU和内存),另一个是“存储费用”(磁盘容量和IOPS)。这两类资源的费用,又细分为单可用区和多可用区,另外,还可以选择“按小时计费”、又或者是“包年计费”的方式购买,这些对价格都有很大影响。本文分多个部分细致介绍了亚马逊如何计算一个RDS实例的价格。

    “实例费用”

    “基本规格”

    基本规格根据CPU和内存使用来划分,Amazon RDS有如下基本规格:

    Snip20150319_9 (more…)

  • MariaDB商标和版权

    ·

    10月20日,Monty专门撰文解释了MariaDB商标相关的协议,也解释了背后这么做的原因和历史。本文也顺便介绍了一下MariaDB的代码分发协议。

    MariaDB商标讨论很早之前邮件组就有,例如:Jeremy Cole的邮件The MariaDB Foundation and MariaDB trademark?,Federico Razzoli的邮件trademarks,Mark Callaghan也关注过这个问题:Google search for “mariadb trademark”。因为一些原因,MariaDB商标归属一直都没有明确对外说明,这次算是敲定了。

    MariaDB Corporation和MariaDB Foundation

    先解释两个组织或公司:MariaDB Corporation和MariaDB Foundation。

    MariaDB Corporation Ab(有时也叫MariaDB Corporation): 是一家商业公司(stock company),前身是SkySQL,是一家支持MariaDB,MySQL培训、咨询的商业公司,提供MariaDB Enterprise和MariaDB Enterprise Cluster等服务。

    MariaDB Foundation: 致力于推广、保护、改进MariaDB的代码、社区、和相关生态系统。是一个非盈利组织,在特拉华州(delaware)注册。

    虽说是两个独立的组织,其核心都是MariaDB。现在MariaDB Foundation临时董事(Directors)是如下四人:Rasmus Johansson (chair),Michael “Monty” Widenius,Jeremy Zawodny,Sergei Golubchik,除了Jeremy Zawodny是就职于Craigslist.com其他人都就职MariaDB Corporation Ab(more…)

  • mysqladmin是MySQL一个重要的客户端,最常见的是使用它来关闭数据库,除此,该命令还可以了解MySQL运行状态、进程信息、进程杀死等。本文介绍一下如何使用mysqladmin extended-status(因为没有”歧义”,所以可以使用ext代替)了解MySQL的运行状态。

    1. 使用-r/-i参数

    使用mysqladmin extended-status命令可以获得所有MySQL性能指标,即show global status的输出,不过,因为多数这些指标都是累计值,如果想了解当前的状态,则需要进行一次差值计算,这就是mysqladmin extended-status的一个额外功能,非常实用。默认的,使用extended-status,看到也是累计值,但是,加上参数-r(–relative),就可以看到各个指标的差值,配合参数-i(–sleep)就可以指定刷新的频率,那么就有如下命令:

    (more…)
  • 在VPS上构建自己Blog

    ·

    随着各种SNS流行,写博客的人也越来越少,就连“博客伴侣”–Google Reader也关停了,写博客作为一个很好的分享和个人积累平台,一直坚持下来了,还将坚持下去。本文介绍自己如何在VPS上搭建自己的博客,这里使用”老派”的LAMP。随着云计算的流行,相信类似需求的人会增多,希望这篇博客能对其他人有点作用。

    1. 选择虚拟主机(VPS)

    这就是一件很烦人(因为穷)的事情。

    如果选择国内主机,则可以考虑阿里云,基础配置单核/512MB/5Mb带宽每年价格大概在650左右,如果放弃独享带宽(个人博客应该无所谓),则可以降价到460块。

    如果是国外主机的话,选择就比较多了,常见的有Linode,内存1GB的每年月1300元左右,因为有日本机房,所以对国外的主机来说,通常Linode速度更快(通常100ms-200ms);Dreamhost的VPS低配,300MB内存,每年约900元左右。常见选择还有Godaddy、budgetvm(便宜)等。

    我选择的是digitalocean,因为便宜,使用1个月了,速度也很稳定。

    digitalocean是最近兴起的极简云主机,号称55秒完成部署。整个购买、使用、付款都非常简洁,最大的特点是便宜,另外SSD硬盘也是一个亮点,经测磁盘性能确实不错,不过因为机房主要在欧美(纽约、旧金山、阿姆斯特丹)离国内都比较远,所以延迟较大,约300ms(ping一下我的博客就知道了,想想每次放我的博客,数据都从纽约过来,也就不觉得慢了)。价格比较便宜,360元每年,512MB内存,20GB磁盘。今年8月,digitalocean获得种子投资3百万美元2012年从TechStars孵化出来。非常喜欢digitalocean的极简原则,别人在把功能做多,他在把功能做少。希望,自己以后的工作也能够是这个样子,现在这份工作是没戏了,不好意思,说多了。

    2. 安装httpd+MySQL+PHP

    博客使用的是WordPress,需要PHP环境运行,这里选择了LAMP。安装非常快捷

    yum install httpd
    yum install mysql
    yum install php
    yum install php-mysql
    service httpd restart
    service mysqld restart or mysqld_safe &

    在MySQL中建好Wordpress需要使用的数据库用户。然后将Wordpress代码放到httpd的web目录中,在通过浏览器访问Wordpress就可以完成其配置。

    3. 配置httpd和MySQL的内存使用

    默认按照通常都能够跑起来,不过,如果按照默认配置跑,512MB很快会爆掉,从而出现OOM:

    Out of memory: Kill process 27968 (mysqld) score 146 or sacrifice child Killed process 27968, UID 27, (mysqld) total-vm:264472kB, anon-rss:73204kB, file-rss:36kB

    3.1 MySQL的配置

    设置50MB的InnoDB缓存空间,用于将Wordpress的内存缓存到内存中:

    innodb_log_buffer_size=30MB

    InnoDB的日志文件设置两组,每组50MB(这是消耗磁盘空间):

    innodb_log_file_size=50M innodb_log_files_in_group=2

    这样MySQL内存使用能够限制在约50MB。

    3.1 httpd的配置

    httpd配置需要特别注意,默认配置内存消耗可能很容易超过512MB的限制。httpd2.2版本,默认情况httpd使用模块置prefork来多线程管理。它的默认配置是:

    <IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 20 ServerLimit 256 MaxClients 256 MaxRequestsPerChild 4000</IfModule>

    这意味httpd最多可以起256个进程处理请求,每个进程约占用35MB(RES),而且只有闲置进程超过20个(MaxSpareServers)才会清理,所以,这个配置下,通常都有20个进程常驻,内存使用就很容易超过512MB了。

    下面是修改后的配置:

    <IfModule prefork.c> StartServers 3 MinSpareServers 2 MaxSpareServers 4 ServerLimit 256 MaxClients 10 MaxRequestsPerChild 100</IfModule>

    这样最大并发是10个进程,当限制进程超过4个的时候,就开始kill。对于我这种低压力个人博客,已经够了。

    最后,通常httpd使用模块prefork或者worker维护多线程,在这篇文章中Apache – prefork vs. worker mode, how to check mode and more,介绍了:(a)如何区分你使用哪个模块;(b)如何配置使用哪个模块;(c)他们的优缺点。

    4. 配置swap

    digitalocean的VPS默认是没有swap,所以内存一旦超出,则会立刻发生OOM。因为digitalocean以ssd为特点,所以直接用其磁盘来做一个swap分区弥补内存补足是非常好的。

    操作参考:Linux Add a Swap File – Howto

    在这自己购买VPS之前,一直蹭用Ningoo的Dreamhost主机,感谢。

    后续还会再考虑测试使用Google App Engine和Amazon AWS。

  • 如果需要恢复的二进制日志较多,较复杂,强烈建议使用MySQL自身复制来恢复binlog,而不要使用mysqlbinlog。

    在MySQL手册中一直是推荐使用mysqlbinlog工具来实现指定时间点的数据恢复,事实上,这是一个经常”让人郁闷”的办法。更好的办法是,使用MySQL内部复制线程中的SQL Thread来做恢复。

    这个idea来自Lazydba同学;在Google稍作搜索,在Xaprb上Baron Schwartz也很早提到了使用类似的方法来恢复binlog,在那篇讨论中,还可以看到Jeremy Cole也提到:使用MySQL手册中推荐的方法是困难重重的,而且mysqlbinlog这个办法从逻辑上来说也是一个错误–因为这样MySQL不得不在两个不同的地方实现一套相同的逻辑,最终难免会出错。使用mysqlbinlog来恢复,你可能会需要以下“让人郁闷”的问题:

    (*) Max_allowed_packet问题 (*) 恼人的Blob/Binary/text字段问题 (*) 特殊字符的转义问题 (*) 没有"断点恢复":执行出错后,没有足够的报错,也很难从失败的地方继续恢复

    1. 如何操作

    本文不打算写一个step by step的文档,只介绍主要的思路和粗略的操作步骤。

    1.1 将binlog作为relay log来执行

    优点:实施简单;缺点:需要关闭一次数据库(不确定不关闭数据库行不行);

    思路:直接将要恢复的binlog拷贝到relay log目录,并修改slave-info相关的文件,让MySQL把binlog当做relay log来执行

    简单的操作步骤: (more…)