复制过滤器的原理就是,主节点只复制一个或一部分数据库的数据到从节点上,并不是全部复制;
复制过滤器可以设置类似“黑白名单”的功能,来设置哪些数据可以复制到从节点,哪些是不可以的
复制过滤器有两种实现:一是在主节点配置,一是在从节点配置
在主节点配置复制过滤器缺点就是二进制日志记录的是某一库的数据信息,而不会记录其他库信息,这样当其他库故障时就无法从二进制日志进行重放恢复。
所以,一般不会在主节点配置过滤;
在从节点配置复制过滤就比较常用了,但是也有缺点,就是增加IO读写的压力,因为主节点记录所有库的二进制日志信息依然会被从节点IO线程读取,并存储在
从节点的中继日志中,由于设置了过滤,在从节点执行SQL线程时只会重放未被过滤掉的操作;
下面举个例子说明:
在从节点配置过滤器STOP SLAVE;
#首先将从节点的功能关闭
SET @@global.replicate_ignore_table='mydb.tbl';
#我们将mydb数据库中的tbl表过滤掉,即从节点的mysql数据库不会包含此表
START SLAVE IO_THREAD,SQL_THREAD;
#开启从节点的IO和SQL线程
#配置完成,接下来测试
测试create database mydb;
#在主节点创建数据库mydb,此时在从节点上是能够同步此库的
create table tbl(id int primary key,name char(30));
#在主节点创建mydb.tbl表,然后在从节点查看此表是否被过滤MariaDB [mydb]> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.101 #主节点host
Master_User: repluser #主节点授权复制的账户
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-log.000003 #要复制的主节点的二进制日志
Read_Master_Log_Pos: 936 #从此二进制日志的什么位置开始复制
Relay_Log_File: relay-log.000007 #从节点的中继日志,即将二进制日志通过IO读入中继日志的
Relay_Log_Pos: 643
Relay_Master_Log_File: master-log.000003
Slave_IO_Running: Yes #从节点的IO功能是否开启,重要
Slave_SQL_Running: Yes #从节点的SQL功能是否开启,重要
Replicate_Do_DB: #白名单,Do表示允许,即不过滤
Replicate_Ignore_DB: #黑名单,Ignore表示拒绝,即过滤,除了数据库,还可以对表做过滤
Replicate_Do_Table:
Replicate_Ignore_Table: mydb.tbl #ignore表示黑名单即过滤,所以我们在从节点show tables;是看不到此表的
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 936
Relay_Log_Space: 1216
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
#从节点落后于主节点的时间,单位是秒。主节点写入时是并行执行,而从节点IO读取则是串行操作,所以当主节点频繁写入时,主从间的差异会越来越大
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0 #IO和SQL错误信息
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)
由于我们在从节点设置的是过滤mydb.tbl表,但是如果在mydb库中创建tbl2表,那么此表会被复制到从节点。
实验结束