MyRocks_zh_doc

Read Free Replication特性

MyRocks具有一个名为“Read Free Replication”的功能,可显着提高复制性能。 此功能的灵感来自TokuDB。此外还有一个名为“Skip Unique Checking”的功能。

Read Free Replication意味着在UPDATE或DELETE期间不是从数据库中读取旧数据,而是使用binlog中的信息并跳过此步骤。 跳过唯一检查意味着我们可以禁用正在进行的检查,以确保在INSERT或UPDATE期间不存在PRIMARY或UNIQUE键。 这两个功能都可以提高性能,但也存在一些潜在的问题。

控制这些的设置如下:

* rocksdb-read-free-rpl-tables = <list_of_tables>  - 为指定的表列表启用“读取自由复制”。
  此功能需要基于行的二进制日志记录。 master上的binlog_row_image选项必须为FULL。
* rocksdb_skip_unique_check_tables = <list_of_tables>  - 这允许在复制滞后时跳过唯一键检查,
  并与unique_check_lag_threshold/unique_check_lag_reset_threshold 一起使用。
  设置这些值并且从站上的延迟足够高时,系统将停止对指定表执行唯一键检查。
是逗号分隔的列表,可以包含正则表达式。 例如,要指出您可以使用的所有表 .* ,或者如果您希望所有以workdb_开头的表,您可以使用workdb_.*。 Read Free Replication有一些限制,必须小心使用,否则某些索引可能会被破坏。 一般的经验法则是,您不应该在复制之外的从站上直接插入/更新/删除。如果直接修改从站,则二级索引损坏时有两个示例。 1、辅助索引一些行丢失 create table t (id int primary key, i1 int, i2 int, value int, index (i1), index (i2)) engine=rocksdb; insert into t values (1,1,1,1),(2,2,2,2),(3,3,3,3); s: delete from t where id <= 2; m: update t set i2=100, value=100 where id=1; s: mysql> select count(*) from t force index(primary); +----------+ | count(*) | +----------+ | 2 | +----------+ 1 row in set (0.00 sec) mysql> select count(*) from t force index(i1); +----------+ | count(*) | +----------+ | 1 | +----------+ 1 row in set (0.00 sec) mysql> select count(*) from t force index(i2); +----------+ | count(*) | +----------+ | 2 | +----------+ 1 row in set (0.00 sec) mysql> select * from t where id=1; +----+------+------+-------+ | id | i1 | i2 | value | +----+------+------+-------+ | 1 | 1 | 100 | 100 | +----+------+------+-------+ 1 row in set (0.00 sec) mysql> select i1 from t where i1=1; Empty set (0.00 sec) mysql> select i2 from t where i2=100; +------+ | i2 | +------+ | 100 | +------+ 1 row in set (0.00 sec) 2、辅助索引有额外的行 M: create table t (id int primary key, i1 int, i2 int, value int, index (i1), index (i2)) engine=rocksdb; insert into t values (1,1,1,1),(2,2,2,2),(3,3,3,3); S: update t set i1=100 where id=1; M: delete from t where id=1; S: mysql> select count(*) from t force index(primary); +----------+ | count(*) | +----------+ | 2 | +----------+ 1 row in set (0.00 sec) mysql> select count(*) from t force index(i1); +----------+ | count(*) | +----------+ | 3 | +----------+ 1 row in set (0.00 sec) mysql> select count(*) from t force index(i2); +----------+ | count(*) | +----------+ | 2 | +----------+ 1 row in set (0.00 sec) mysql> select i1 from t where i1=100; +------+ | i1 | +------+ | 100 | +------+ 1 row in set (0.00 sec) MyRocks支持一个类似的mysql系统变量'unique_checks',我觉得有些用户很有用。 禁用此会话变量(设置unique_checks = OFF)将禁用给定会话的唯一检查。 此系统变量也通过复制流传播,这意味着从属设备也将跳过唯一检查,这可以减少批量加载等大型事务的复制延迟。 与Read Free Replication类似,如果从站上不允许进行其他修改,则使用Skip Unique Checks对从站应该是安全的。 如果从站上允许更改(复制除外),则可能会在从站上获取不正确的数据。建议不要在主服务器上启用“跳过唯一检查”,除非您100%确定已插入的数据尚不存在。