mysql主从复制应用扩展


1.主从服务器的时间要同步(NTP)

创建一个时间服务器

*/5 * * * * /user/sbin/ntpdate ntpserver &> /dev/null

2.如何限制从服务器只读(配置在mysqld中)

在从服务器上启动read-only=ON

注意:仅能限制那不具有super权限的用户无法执行写操作,root的用户不受限

从服务器

SHOW GLOBAL VARIABLES LIKE '%read_only%';

主服务器

use mysql

GRANT ALL ON mydb.* TO 'testuser'@'192.168.130.%' IDENTIFIED BY 'testpass';

SELECT User,Host,Password FROM user; 

mysql -utestuser -h192.168.130.62 -p

use mydb;

MariaDB [mydb]> CREATE TABLE t1;

ERROR 1290 (HY000): The MariaDB server is running with the --read-only option so it cannot execute this statement

想限制所有用户,启用screen在里面运行

FLUSH TABLES WITH READ LOCK;


3.如何主从复制时的事务安全?(在)

sync_binlog=1 (每当有事务提交时,立即将与二进制日志缓冲区中的内容同步到二进制日志文件)


4.半同步复制

主服务器发起任何写操作时,这些写操作必须写到二进制日志中,并通知给从服务器。从服务器必须在本地完成数据修改然后反馈主服务器写操作已完成,主服务器再返馈前端OK。

多个从找一个反映最快的来响应,为了确保主从的数据一致。

/usr/local/mysql/lib/plugin/semisync_master.so在主服务器上安装

/usr/local/mysql/lib/plugin/semisync_slave.so在离主服务器最近的从服务器上安装

主服务器

mysql

INSTALL PLUGIN RPL_SEMI_SYNC_MASTER SONAME 'semisync_master.so';

SHOW GLOBAL VARIABLES LIKE '%semi%';

+------------------------------------+--------------+

| Variable_name                      | Value        |

+------------------------------------+--------------+

| rpl_semi_sync_master_enabled       | OFF          |是否启动半同步功能

| rpl_semi_sync_master_timeout       | 10000        |连接从节点的超时时间

| rpl_semi_sync_master_trace_level   | 32           |

| rpl_semi_sync_master_wait_no_slave | ON           |是否检测半同步从节点上线

| rpl_semi_sync_master_wait_point    | AFTER_COMMIT |

+------------------------------------+--------------+

SET GLOBAL rpl_semi_sync_master_enabled = ON;

SET GLOBAL  rpl_semi_sync_master_timeout = 10000; 

从服务器

mysql

INSTALL PLUGIN RPL_SEMI_SYNC_SLAVE SONAME 'semisync_slave.so';

SHOW GLOBAL VARIABLES LIKE '%semi%';

SET global rpl_semi_sync_slave_enabled = ON

STOP SLAVE io_therad;

START SLAVE io_therad;

在主服务器验证半同步

SHOW GLOBAL STATUS LIKE '%semi%';

卸载插件:

INSTALL PLUGIN plugin_name SONAME 'shared_library_name'

UNINSTALL PLUGIN plugin_name

半同步复制一旦某次等待超时,会自动降级为异步

5、复制过滤器(仅复制主服务器部分数据):

可以在主服务器上过滤也可以在从服务器上过滤,考虑的及时点还原问题,一般在从服务器上做过滤。


master上做过滤:

binlog_do_db=(白名单)

binlog_ignore_db=(黑名单)

slave上做过滤

replicate_do_db=(数据库白名单)

replicate_ignore_db=(数据库黑名单)

replicate_do_table= db_name.table_name (数据库白名单)

replicate_ignore_db= db_name.table_name (数据库黑名单)

使用正则表达式

replicate_wild_do_table=

replicate_wild_igonre_table=


想配置永久有效,将其配置到my.cnf的[mysqld]下。


基于语句复制:

数据量小,益于查看,适应性强

有些语句无法做精确复制,无法对使用了触发器、存储过程等代码的应用实现精确复制

基于行复制:

能够精确完成有着触发器、存储过程等代码场景中的复制,能完成几乎所有的复制功能,较少的cpu占用率

无法判断执行了什么样的sql语句,数据量可能略大


从服务器落后于主服务器

SHOW SLAVE STATUS\G;  

Seconds_Behind_Master:落后于主服务器的时长,0表示不落后

yum -y install https://www.percona.com/downloads/percona-toolkit/3.0.12/binary/redhat/6/x86_64/percona-toolkit-3.0.12-1.el6.x86_64.rpm

评估主从服务器表中的数据是否一致  

pt-table-checksum(在主服务上运行)

如果数据不一致,解决办法:

1.重新备份并在从服务器上导入数据

2.pt-table-sync高效查找主从服务器上表数据上的不同自动实现数据同步


为了提高复制时的数据安全性,在主服务器上的设定

sync_binlog=1

innodb_flush_log_at_trx_commit =1

此参数的值设定为1,性能下降会较严重,因此,一般设定为2等,此时,主服务器崩溃依然有可能导致从服务器无法获取到全部的二进制日志事件


如果msater意外崩溃导致二进制日志的某事件损坏,可以在从服务器上使用如下参数,忽略损坏的二进制日志,数据不一致性并无法避免

sql_slave_skip_counter=1


第三方复制解决方案 tungsten,galera