• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • InnoDB内存缓存插件和复制

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

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

    以下各节说明将daemon_memcached插件与MySQL复制一起使用时如何使用二进制日志功能。假定您已完成“设置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. 按照“设置基于二进制日志文件位置的复制”中所述配置主服务器和从属服务器。
    3. 使用mysqldump创建主数据快照,并将快照同步到从属服务器。

      master shell> mysqldump --all-databases --lock-all-tables > dbdump.db
      slave shell> 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插入,更新和删除数据来测试InnoDBmemcached复制配置。MySQL客户端用于验证主服务器和从服务器上的结果。

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

    1. 使用该set命令插入键为test1,标记值为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列的标志值,该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. 使用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二进制日志说明

    二进制日志格式:

    • 大多数内存缓存操作都映射到 DML语句(类似于插入,删除,更新)。由于MySQL服务器没有处理实际的SQL语句,因此所有memcached命令(除外flush_all)均使用基于行的复制(RBR)日志记录,该记录独立于任何服务器binlog_format设置。
    • memcached的flush_all命令被映射到TRUNCATE TABLE在MySQL 5.7和更早版本的命令。由于 DDL命令只能使用基于语句的日志记录,因此flush_all可通过发送一条TRUNCATE TABLE语句来复制该命令。在MySQL 8.0及更高版本中,flush_all映射到DELETE但通过发送一条TRUNCATE TABLE语句仍被复制。

    交易:

    • 事务的概念通常不是memcached应用程序的一部分。出于性能方面的考虑,daemon_memcached_r_batch_size并且daemon_memcached_w_batch_size用于控制读取和写入事务的批处理大小。这些设置不会影响复制。InnoDB成功完成后,将复制基础表上的每个SQL操作。
    • 的默认值daemon_memcached_w_batch_size就是1,这意味着每个分布式缓存写操作被立即被提交。此默认设置会产生一定量的性能开销,以避免在主服务器和从属服务器上可见的数据不一致。复制的记录始终在从属服务器上立即可用。如果您设置daemon_memcached_w_batch_size的值大于1,则通过memcached插入或更新的记录不会立即在主服务器上显示;要在提交前参见主服务器上的记录,请发出SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED