使用atlas却发现“读库闲置,框架还是去主库读写数据”
配置完atlas之后,发现使用jdbc
框架的话,读库和写库各司其职,但是使用mybatis
框架之后,就发现框架的读写都去了主库,把读库放置一边,那么这种情况是因为有事务存在的话,atlas就会强制走主库
,遇到这种情况就检查一下是否有事务的存在,比如@Transactional
,如果要解决的话,就加上@Transactional(propagation=Propagation.NOT_SUPPORTED)
即可。
自动读写分离挺好,但有时候我写完马上就想读,万一主从同步延迟怎么办?
SQL语句前增加 /*master*/
就可以将读请求强制发往主库。在mysql命令行测试该功能时,需要加-c
选项,以防mysql客户端过滤掉注释信息。不过这不能从本质上解决问题,使用Atlas需要考虑到这点,提高主机的IO性能,加大memory可以缓解延迟症状,但依旧不能避免延迟的出现,尤其是读多写少的应用。
resource limit的问题
atlas有自己的连接池,会吃掉很多CPU, php
应用端改用短链接来连接atlas, 这时候atlas对php
发送来的sql只负责验证和转发的操作,后端DB的连接由atlas自己管理,未使用的连接线程进行剔除操作(DB的wait_timeout
和interactive_timeout
设置为300s,超时亦退出)。
1
2
3
4
5
62014-04-12 20:56:29: (warning) (libevent) event_del: event has no event_base set.
2014-04-12 20:56:29: (critical) last message repeated 5 times
2014-04-12 20:56:29: (critical) network-conn-pool-lua.c.144: socket() failed: Too many open files (24)
2014-04-12 20:56:29: (warning) (libevent) event_del: event has no event_base set.
2014-04-12 20:56:30: (debug) chassis-unix-daemon.c:168: 12951 returned: 12951
2014-04-12 20:56:30: (critical) chassis-unix-daemon.c:196: [angel] PID=12951 died on signal=11 (it used 16 kBytes max) ... waiting 3min before restart
如果MySQL后端的连接数也满了可能会报以下错误:
1
2
32014-11-13 12:21:07: (critical) network_mysqld_proto_password_scramble: assertion `20 == challenge_len' failed
2014-11-13 12:21:07: (warning) (libevent) event_del: event has no event_base set.
2014-11-13 12:21:07: (critical)
可以临时增加MySQL connection
数量:
1
echo -n “Max processes=SOFT_LIMIT:HARD_LIMIT” > /proc/`pidof mysqld`/limits
出现Too many open files
的错误,怎么办?>
关于Too many open files
错误,可能由两种情况引起:
一、php长连接连接到atlas后,每个线程占用一个FD,直到超出系统资源限制而出现too many错误;
二、php应用端发送到atlas的sql过多,大量并发的情况下,linevent维护的队列过多,每个event吃一个FD,超出系统资源限制引起Too many open files
错误;
避免Too many open files
错误,增加用户的ulimit值加大FD
的使用量,可增加系统ulimit资源到 ~/.bash_profile
文件或/etc/security/limits.conf
文件:
1
2
3
4
5
6# cat .bash_profile
# .bash_profile
...
...
export PATH
ulimit -n 16384