### 15.20.7 InnoDB memcached 插件和复制

因为`daemon_memcached`插件支持 MySQL[二进制日志](glossary.html#glos_binary_log)，源服务器通过**内存缓存**可以复制接口以进行备份、平衡密集的读取工作负载和高可用性。全部**内存缓存**二进制日志记录支持命令。

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

以下部分展示了在使用二进制日志功能时如何使用`daemon_memcached`带有 MySQL 复制的插件。假设您已完成中所述的设置[第 15.20.3 节，“设置 InnoDB memcached 插件”](innodb-memcached-setup.html).

#### 启用 InnoDB memcached 二进制日志

1.  要使用`daemon_memcached`MySQL的插件[二进制日志](glossary.html#glos_binary_log)，启用[`innodb_api_enable_binlog`](innodb-parameters.html#sysvar_innodb_api_enable_binlog)源服务器上的配置选项。此选项只能在服务器启动时设置。您还必须使用以下命令在源服务器上启用 MySQL 二进制日志[`--log-bin`](replication-options-binary-log.html#sysvar_log_bin)选项。您可以将这些选项添加到 MySQL 配置文件中，或者在[**mysqld**](mysqld.html)命令行。

    ```
    mysqld ... --log-bin -–innodb_api_enable_binlog=1
    ```

2.  配置源服务器和副本服务器，如中所述[第 17.1.2 节，“设置基于二进制日志文件位置的复制”](replication-howto.html).

3.  采用[**mysql转储**](mysqldump.html)创建源数据快照，并将快照同步到副本服务器。

    ```
    source $> mysqldump --all-databases --lock-all-tables > dbdump.db
    replica $> mysql < dbdump.db
    ```

4.  在源服务器上，发出[`显示主状态`](show-master-status.html)获取源二进制日志坐标。

    ```
    mysql> SHOW MASTER STATUS;
    ```

5.  在副本服务器上，使用[`将复制源更改为`](change-replication-source-to.html)语句（来自 MySQL 8.0.23）或[`将主更改为`](change-master-to.html)语句（在 MySQL 8.0.23 之前）使用源二进制日志坐标设置副本服务器。

    ```
    mysql> CHANGE MASTER TO
           MASTER_HOST='localhost',
           MASTER_USER='root',
           MASTER_PASSWORD='',
           MASTER_PORT = 13000,
           MASTER_LOG_FILE='0.000001,
           MASTER_LOG_POS=114;

    Or from MySQL 8.0.23:
    mysql> CHANGE REPLICATION SOURCE TO
           SOURCE_HOST='localhost',
           SOURCE_USER='root',
           SOURCE_PASSWORD='',
           SOURCE_PORT = 13000,
           SOURCE_LOG_FILE='0.000001,
           SOURCE_LOG_POS=114;
    ```

6.  启动副本。

    ```
    mysql> START SLAVE;
    Or from MySQL 8.0.22:
    mysql> START REPLICA;
    ```

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

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

#### 测试 InnoDB memcached 复制配置

这个例子演示了如何测试`InnoDB` **内存缓存**使用复制配置**内存缓存**和 telnet 插入、更新和删除数据。MySQL 客户端用于验证源服务器和副本服务器上的结果。

该示例使用`演示测试`表，由`innodb_memcached_config.sql`初始设置期间的配置脚本`daemon_memcached`插入。这`演示测试`表包含单个示例记录。

1.  使用`放`命令插入一条记录，其键为`测试1`，标志值`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.  在源服务器上，检查记录是否已插入`演示测试`桌子。假设`演示测试`表之前没有修改过，应该有两条记录。带有键的示例记录`AA`，以及您刚刚插入的记录，键为`测试1`.这`c1`列映射到键，`c2`列到值，`c3`列到标志值，`c4`到 cas 值的列，以及`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.  使用`放`将键更新为值的命令`新的`.

    ```
    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.  删除`测试1`使用记录`删除`命令。

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

    当。。。的时候`删除`操作被复制到副本，`测试1`副本上的记录也被删除。

    ```
    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 二进制日志注释

二进制日志格式：

-   最多**内存缓存**操作映射到[DML](glossary.html#glos_dml)语句（类似于插入、删除、更新）。由于 MySQL 服务器没有实际处理 SQL 语句，所有**内存缓存**命令（除了`flush_all`) 使用基于行的复制 (RBR) 日志记录，它独立于任何服务器[`binlog_format`](replication-options-binary-log.html#sysvar_binlog_format)环境。

-   这**内存缓存** `flush_all`命令映射到[`截断表`](truncate-table.html)MySQL 5.7 及更早版本中的命令。自从[DDL](glossary.html#glos_ddl)命令只能使用基于语句的日志记录，`flush_all`命令通过发送一个复制[`截断表`](truncate-table.html)陈述。在 MySQL 8.0 及更高版本中，`flush_all`映射到`删除`但仍然通过发送一个复制[`截断表`](truncate-table.html)陈述。

    交易：

-   的概念[交易](glossary.html#glos_transaction)通常不属于**内存缓存**应用程序。出于性能考虑，[`daemon_memcached_r_batch_size`](innodb-parameters.html#sysvar_daemon_memcached_r_batch_size)和[`daemon_memcached_w_batch_size`](innodb-parameters.html#sysvar_daemon_memcached_w_batch_size)用于控制读写事务的批量大小。这些设置不影响复制。底层上的每个 SQL 操作`InnoDB`成功完成后复制表。

-   默认值为[`daemon_memcached_w_batch_size`](innodb-parameters.html#sysvar_daemon_memcached_w_batch_size)是`1`，这意味着每个**内存缓存**写操作立即提交。此默认设置会产生一定的性能开销，以避免在源服务器和副本服务器上可见的数据不一致。复制的记录始终在副本服务器上立即可用。如果你设置[`daemon_memcached_w_batch_size`](innodb-parameters.html#sysvar_daemon_memcached_w_batch_size)为大于`1`, 插入或更新的记录**内存缓存**在源服务器上不会立即可见；要在提交之前查看源服务器上的记录，请发出[`设置事务隔离级别读取未提交`](set-transaction.html).
