Documentation Home
MySQL 8.0 参考手册  / 第 15 章 InnoDB 存储引擎  / 15.20 InnoDB 内存缓存插件  /  14.21.6 InnoDB memcached 插件和复制

14.21.6 InnoDB memcached 插件和复制

因为该daemon_memcached插件支持 MySQL二进制日志,所以可以复制通过memcached接口在源服务器上进行的更新以 进行备份,平衡密集读取工作负载和高可用性。二进制日志记录支持 所有memcached命令。

您不需要daemon_memcached 在副本服务器上设置插件。此配置的主要优点是增加了源上的写入吞吐量。复制机制的速度不受影响。

daemon_memcached以下部分展示了在将插件与 MySQL 复制结合 使用时如何使用二进制日志功能。假设您已经完成第 14.21.3 节,“设置 InnoDB memcached 插件”中描述的设置。

启用 InnoDB memcached 二进制日志

  1. 要将daemon_memcached插件与 MySQL二进制日志一起使用,请在源服务器上启用 innodb_api_enable_binlog 配置选项。此选项只能在服务器启动时设置。--log-bin您还必须使用该选项在源服务器上启用 MySQL 二进制日志 。您可以将这些选项添加到 MySQL 配置文件或 mysqld命令行中。

    mysqld ... --log-bin -–innodb_api_enable_binlog=1
  2. 配置源服务器和副本服务器,如 第 16.1.2 节“设置基于二进制日志文件位置的复制”中所述。

  3. 使用mysqldump创建源数据快照,并将快照同步到副本服务器。

    source $> mysqldump --all-databases --lock-all-tables > dbdump.db
    replica $> mysql < dbdump.db
  4. 在源服务器上,发出SHOW MASTER STATUS以获取源二进制日志坐标。

    mysql> SHOW MASTER STATUS;
  5. 在副本服务器上,使用CHANGE MASTER TO语句使用源二进制日志坐标设置副本服务器。

    mysql> CHANGE MASTER TO
           MASTER_HOST='localhost',
           MASTER_USER='root',
           MASTER_PASSWORD='',
           MASTER_PORT = 13000,
           MASTER_LOG_FILE='0.000001,
           MASTER_LOG_POS=114;
  6. 启动副本。

    mysql> START SLAVE;

    如果错误日志打印类似于以下内容的输出,则副本已准备好进行复制。

    2013-09-24T13:04:38.639684Z 49 [Note] Slave I/O thread: connected to
    master 'root@localhost:13000', replication started in log '0.000001'
    at position 114

测试 InnoDB memcached 复制配置

此示例演示如何 使用memcached 和 telnet 插入、更新和删除数据来测试InnoDB memcached 复制配置。MySQL 客户端用于验证源服务器和副本服务器上的结果。

该示例使用该demo_test表,该表是 在插件innodb_memcached_config.sql初始设置期间由配置脚本 创建的。daemon_memcacheddemo_test表包含一个示例记录。

  1. 使用set命令插入一条记录,key为test1,flag值为 10,过期值为 0,cas值为1,值为 t1

    telnet 127.0.0.1 11211
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    set test1 10 0 1
    t1
    STORED
  2. 在源服务器上,检查记录是否已插入到demo_test表中。假设该 demo_test表之前没有被修改过,应该有两条记录。示例记录的键为AA,而您刚刚插入的记录的键为test1。列 c1映射到键,列映射到 c2值, 列映射到c3标志值, 列映射到c4cas值, 列映射到c5过期时间。到期时间设置为 0,因为它未被使用。

    mysql> SELECT * FROM test.demo_test;
    +-------+--------------+------+------+------+
    | c1    | c2           | c3   | c4   | c5   |
    +-------+--------------+------+------+------+
    | AA    | HELLO, HELLO |    8 |    0 |    0 |
    | test1 | t1           |   10 |    1 |    0 |
    +-------+--------------+------+------+------+
  3. 检查以验证相同的记录是否已复制到副本服务器。

    mysql> SELECT * FROM test.demo_test;
    +-------+--------------+------+------+------+
    | c1    | c2           | c3   | c4   | c5   |
    +-------+--------------+------+------+------+
    | AA    | HELLO, HELLO |    8 |    0 |    0 |
    | test1 | t1           |   10 |    1 |    0 |
    +-------+--------------+------+------+------+
  4. 使用set命令将键更新为值new

    telnet 127.0.0.1 11211
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    set test1 10 0 2
    new
    STORED

    更新被复制到副本服务器(注意cas值也被更新)。

    mysql> SELECT * FROM test.demo_test;
    +-------+--------------+------+------+------+
    | c1    | c2           | c3   | c4   | c5   |
    +-------+--------------+------+------+------+
    | AA    | HELLO, HELLO |    8 |    0 |    0 |
    | test1 | new          |   10 |    2 |    0 |
    +-------+--------------+------+------+------+
  5. test1使用 delete命令 删除记录。

    telnet 127.0.0.1 11211
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    delete test1
    DELETED

    delete操作复制到副本时,副本test1上的记录也被删除。

    mysql> SELECT * FROM test.demo_test;
    +----+--------------+------+------+------+
    | c1 | c2           | c3   | c4   | c5   |
    +----+--------------+------+------+------+
    | AA | HELLO, HELLO |    8 |    0 |    0 |
    +----+--------------+------+------+------+
  6. flush_all使用命令 从表中删除所有行 。

    telnet 127.0.0.1 11211
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    flush_all
    OK
    mysql> SELECT * FROM test.demo_test;
    Empty set (0.00 sec)
  7. Telnet 到源服务器并输入两条新记录。

    telnet 127.0.0.1 11211
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'
    set test2 10 0 4
    again
    STORED
    set test3 10 0 5
    again1
    STORED
  8. 确认这两条记录已复制到副本服务器。

    mysql> SELECT * FROM test.demo_test;
    +-------+--------------+------+------+------+
    | c1    | c2           | c3   | c4   | c5   |
    +-------+--------------+------+------+------+
    | test2 | again        |   10 |    4 |    0 |
    | test3 | again1       |   10 |    5 |    0 |
    +-------+--------------+------+------+------+
  9. flush_all使用命令 从表中删除所有行 。

    telnet 127.0.0.1 11211
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    flush_all
    OK
  10. 检查以确保该flush_all 操作已复制到副本服务器上。

    mysql> SELECT * FROM test.demo_test;
    Empty set (0.00 sec)

InnoDB memcached 二进制日志注释

二进制日志格式:

  • 大多数memcached操作都映射到 DML语句(类似于插入、删除、更新)。由于 MySQL 服务器没有实际处理 SQL 语句,因此所有 memcached命令(除了 flush_all)都使用基于行的复制 (RBR) 日志记录,它独立于任何服务器 binlog_format设置。

  • memcached flush_all命令映射到 TRUNCATE TABLE命令 。由于 DDL命令只能使用基于语句的日志记录,因此flush_all 通过发送 TRUNCATE TABLE语句来复制命令。

交易: