主要瓶颈是:从库的slave SQL thread 是单进程的。
对于从库复制拖延的问题解决方式:
1. 牺牲安全性换性能: 设置 innodb_flush_log_at_trx_commit to 2; 设置 innodb_locks_unsafe_for_binlog
to 1; 设置 delay_key_write to ALL for MyISAM。
2. 分析到底哪些SQL导致从库执行慢,想办法让其走外部数据通道。
例如:对一些高负荷的数据统计/归档等操作,用SELECT导入文件后,再LOAD到主库/从库。REPLACE INTO summary_db.summary_table (col1, col2, ...) SELECT col1, sum(col2, ...) FROM ain_db.enormous_table GROUP BY col1;
3. 在relay logs执行之前,其他程序在从库预抓取要执行变更的数据到缓存,使得replication io不用等待。例如 UPDATE sakila.film SET rental_duration=4 WHERE film_id=123;是relay log中需要执行的语句,在这之前执行 SELECT rental_duration FROM sakila.film WHERE film_id=123; 但是这种方法的应用的条件有:
-在服务器端的I/O不吃紧的情况下,mysql的复制程序有自己的I/O瓶颈
-数据量必须大于服务内存
- MYSQL默认的storage要支持行级锁,例如innodb
4. 如果是带宽有限影响同步,开启slave_compressed_ protocol可节省传输带宽
5.MySQL Sandbox (带验证,在主机建立多个MYSQL进程,从而分散复制线程)
其中3、4都未使用过,待验证……