Shanghai, China

E-mail: henter@henter.me
Weibo: @周攀Henter

MySQL主从同步的坑

配置完slave后,show slave status\G;报错如下

Got fatal error 1236 from master when reading data from binary log: 'Slave can not handle replication events with the checksum that master is configured to log; the first event 'mysql-bin.000002' at 120, the last event read from './mysql-bin.000002' at 120, the last byte read from './mysql-bin.000002' at 120

后来发现是因为主库MySQL版本是5.6, 从库是5.5

5.6的版本中加入了replication event checksum,主从复制时间校验功能,所以需要把这个关掉才能正常同步到5.5的slave

修改主库 /etc/my.cnf

增加下一行

binlog_checksum=none

重启mysql

现在再看从库status就正常了~

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.0.121
                  Master_User: replication
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 120
               Relay_Log_File: mysqld-relay-bin.000002
                Relay_Log_Pos: 266
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: kudong
          Replicate_Ignore_DB: mysql,information_schema
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 120
              Relay_Log_Space: 423
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
1 row in set (0.00 sec)

用Node.js结合RabbitMQ实现APN推送

最近刚开始看nodejs,于是想把之前写得稀烂的Python+RabbitMQ实现多线程APN推送推送重写一次。

实际完成后代码量很少,用到了两个库 node-apnnode-amqp,我要做的只是将两者结合起来打打酱油。

需要完善的部分:

rabbitmq的ack机制

现在仅仅是拿到消息调用推送函数后就返回ack了,实际上此时并不确定是否推送成功了(因为是异步),所以应该是在推送的transmitted事件触发后再返回ack。

准备工作:

安装rabbitmq
拿到推送证书 cert.pem和key.pem
修改receive.js中的队列名称

运行:

npm install
node receive.js

demo代码已发到https://github.com/henter/NodeRabbitMQAPN

APN推送峰值大概为2000条每秒,完爆之前python多线程的实现方式。

Python+RabbitMQ实现多线程APN推送

这篇是用来填坑的,填之前的一篇Python实现APN推提到的坑。。 之前的apn推送实现方式比较原始,没有做容错、超时等处理,只能将就着用,现在做了些改进,另外,结合RabbitMQ队列实现多线程推送。

代码已发到https://github.com/henter/PythonRabbitMQAPN

主要分为4个文件

receive.py          连接rabbitmq,开启多线程
thread_manager.py   仅仅为开启多线程做调用
push_ios.py         推送
apns.py             推送接口

实现代码比较搓,大家将就着看吧

另外,pika这个库官方并不推荐用于多线程环境,推荐在每个线程内单独连接RabbitMQ,导致的结果就是,如果开启比较多线程,会产生大量的RabbitMQ连接,CPU占用比较高。

Pika does not have any notion of threading in the code. If you want to use Pika with threading, make sure you have a Pika connection per thread, created in that thread. It is not safe to share one Pika connection across threads.

这种实现方式只能算是勉强够用,线程数量是根据队列内的消息数量动态控制的,推送高峰期会产生比较多的连接,会断断续续产生rabbitmq连接失败的问题,平时基本稳定。

APN推送峰值大概为300条每秒(开启100个线程时),效率比较低。

代码如下:

PS:

后来也尝试过rabbitpy这个库(作者也是pika的维护者),号称是线程安全。 不过测试过程中发现另外一个问题,在同一线程内只能同时用一个Consumer,否则会报错

测试下来虽然没有前面的报错,不过两者性能相差不大,最终还是没有用这个库。

后面打算用NodeJS重写这套推送系统。

Mac下PhpStrom无法输入中文的问题

很早就遇到这个问题了,在用PhpStrom时无法输入中文。表现为,中文输入法状态栏上有中文显示,但是输入到IDE里面就是英文。

刚开始以为是输入法问题,换了QQ输入法、Squirrel鼠须管等,都没办法。

后来干脆放弃了,正好强迫自己在项目中使用英文写注释什么的。

现在由于项目内必须要用中文,google之,找了好几个方法试了才搞定。

有效方法如下:

sudo vim /Applications/PhpStorm.app/bin/idea.vmoptions

在最后一行加上

-J-Djava.awt.im.style=on-the-spot

然后,Command+Q完全退出PhpStrom

切换当前输入法为英文状态

重新启动PhpStrom,OK了,可以正常输入中文。

参考:

http://www.blogjava.net/JAVA-HE/archive/2011/11/15/363772.html

https://code.google.com/p/rimeime/issues/detail?id=311

Fork me on GitHub