• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 设置InnoDB memcached插件

    本节介绍如何daemon_memcached在MySQL服务器上设置插件。由于memcached守护程序与MySQL服务器紧密集成,以避免网络流量并最大程度地减少延迟,因此您需要在使用此功能的每个MySQL实例上执行此过程。

    注意

    在设置daemon_memcached插件之前,请查阅“ InnoDB内存缓存插件的安全注意事项”,以了解防止未经授权的访问所需的安全步骤。

    先决条件

    • daemon_memcached插件仅在Linux,Solaris和macOS平台上受支持。不支持其他操作系统。
    • 从源代码构建MySQL时,必须使用-DWITH_INNODB_MEMCACHED=ON。这个构建选项在MySQL插件目录(plugin_dir)中生成两个共享库,这些共享库是运行该daemon_memcached插件所需的:

      • libmemcached.so:MySQL 的memcached守护程序插件。
      • innodb_engine.somemcachedInnoDBAPI插件。
    • libevent必须安装。

      • 如果您不是从源代码构建MySQL,则该libevent库不包含在您的安装中。使用操作系统的安装方法来安装libevent 1.4.12或更高版本。例如,根据操作系统,您可以使用apt-getyumport install。例如,在Ubuntu Linux上,使用:

        sudo apt-get install libevent-dev
        
      • 如果您是从源代码版本安装的MySQL,则libevent1.4.12与软件包捆绑在一起,位于MySQL源代码目录的顶层。如果您使用的捆绑版本libevent,则无需采取任何措施。如果要使用的本地系统版本libevent,则必须使用将-DWITH_LIBEVENTbuild选项设置为systemor 来构建MySQL yes

    安装和配置InnoDB memcached插件

    1. 配置daemon_memcached插件,以便它可以InnoDB通过运行innodb_memcached_config.sql位于中的配置脚本来与表进行交互MYSQL_HOME/share。该脚本安装innodb_memcache有三个需要的表数据库(cache_policiesconfig_options,和containers)。它还将demo_test样本表安装在test数据库中。

      mysql> source MYSQL_HOME/share/innodb_memcached_config.sql
      

      运行innodb_memcached_config.sql脚本是一次性操作。如果您以后卸载并重新安装daemon_memcached插件,则表将保留在原位。

      mysql> USE innodb_memcache;
      mysql> SHOW TABLES;
      +---------------------------	+
      | Tables_in_innodb_memcache 	|
      +---------------------------	+
      | cache_policies            	|
      | config_options            	|
      | containers                	|
      +---------------------------	+
      
      mysql> USE test;
      mysql> SHOW TABLES;
      +----------------	+
      | Tables_in_test 	|
      +----------------	+
      | demo_test      	|
      +----------------	+
      

      在这些表中,innodb_memcache.containers表是最重要的。containers表中的条目提供了到InnoDB表列的映射。InnoDBdaemon_memcached插件一起使用的每个表都需要在containers表中输入一个条目。

      innodb_memcached_config.sql脚本在containers表中插入一个条目,为该表提供映射demo_test。它还将单行数据插入demo_test表中。此数据使您可以在安装完成后立即验证安装。

      mysql> SELECT * FROM innodb_memcache.containers\G
      *************************** 1. row 	***************************
                        name	: aaa
                   db_schema	: test
                    db_table	: demo_test
                 key_columns	: c1
               value_columns	: c2
                       flags	: c3
                  cas_column	: c4
          expire_time_column	: c5
      unique_idx_name_on_key	: PRIMARY
      mysql> SELECT * FROM test	.demo_test	;	+----	+------------------	+------	+------	+------	+
      | c1 	| c2               	| c3   	| c4   	| c5   	|
      +----	+------------------	+------	+------	+------	+
      | AA 	| HELLO, HELLO     	|    8 	|    0 	|    0 	|
      +----	+------------------	+------	+------	+------	+
      

      有关innodb_memcache表和demo_test示例表的更多信息,请参见“ InnoDB memcached插件内部”。

    2. daemon_memcached通过运行以下INSTALL PLUGIN语句激活插件:

      mysql> INSTALL PLUGIN daemon_memcached soname "libmemcached.so";
      

      插件安装完成后,每次重新启动MySQL服务器都会自动激活它。

    验证InnoDB和memcached设置

    要验证daemon_memcached插件设置,请使用telnet会话发出memcached命令。默认情况下,memcached守护程序在端口11211上侦听。

    1. test.demo_test表中检索数据。表中的单行数据demo_test的键值为AA

      telnet localhost 11211
      Trying 127.0.0.1...
      Connected to localhost.
      Escape character is '^]'.
      get AA
      VALUE AA 8 12
      HELLO, HELLO
      END
      
    2. 使用set命令插入数据。

      set BB 10 0 16
      GOODBYE, GOODBYE
      STORED
      

      哪里:

      • set是存储值的命令
      • BB是关键
      • 10是该操作的标志;被memcached忽略,但可以被客户端用来指示任何类型的信息;指定0是否未使用
      • 0是到期时间(TTL);指定0是否未使用
      • 16是提供的值块的长度(以字节为单位)
      • GOODBYE, GOODBYE是存储的值
    3. 通过连接到MySQL服务器并查询test.demo_test表,验证插入的数据是否存储在MySQL 中。

      mysql> SELECT * FROM test.demo_test;
      +----	+------------------	+------	+------	+------	+
      | c1 	| c2               	| c3   	| c4   	| c5   	|
      +----	+------------------	+------	+------	+------	+
      | AA 	| HELLO, HELLO     	|    8 	|    0 	|    0 	|
      | BB 	| GOODBYE, GOODBYE 	|   10 	|    1 	|    0 	|
      +----	+------------------	+------	+------	+------	+
      
    4. 返回telnet会话,并使用key检索先前插入的数据BB

      get BB
      VALUE BB 10 16
      GOODBYE, GOODBYE
      END
      quit
      

    如果您关闭MySQL服务器(这也会关闭集成的Memcached服务器),则进一步的尝试访问memcached数据的尝试将失败,并显示连接错误。通常,memcached数据也会在此时消失,并且当memcached重新启动时,您将需要应用程序逻辑将数据加载回内存中。但是,InnoDBmemcached插件会自动为您完成此过程。

    当您重新启动MySQL时,get操作再次返回您存储在较早的memcached会话中的键/值对。当请求密钥并且关联的值尚未在内存缓存中时,将从MySQL test.demo_test表中自动查询该值。

    创建一个新的表和列映射

    此示例显示了如何InnoDB使用daemon_memcached插件设置自己的表。

    1. 创建一个InnoDB表。该表必须具有带有唯一索引的键列。城市表的键列是city_id,它被定义为主键。该表还必须包括列flagscasexpiry值。可能有一个或多个值列。该city表有三个值列(namestatecountry)。

      注意

      对列名没有特殊要求,因为将有效映射添加到innodb_memcache.containers表中。

      mysql> CREATE TABLE city (
             city_id VARCHAR(32),
             name VARCHAR(1024),
             state VARCHAR(1024),
             country VARCHAR(1024),
             flags INT,
             cas BIGINT UNSIGNED, 
             expiry INT,
             primary key(city_id)
             ) ENGINE=InnoDB;
      
    2. innodb_memcache.containers表中添加一个条目,以便daemon_memcached插件知道如何访问该InnoDB表。该条目必须满足innodb_memcache.containers表定义。有关每个字段的描述,请参见“ InnoDB memcached插件内部”。

      mysql> DESCRIBE innodb_memcache.containers;
      +------------------------	+--------------	+------	+-----	+---------	+-------	+
      | Field                  	| Type         	| Null 	| Key 	| Default 	| Extra 	|
      +------------------------	+--------------	+------	+-----	+---------	+-------	+
      | name                   	| varchar(50)  	| NO   	| PRI 	| NULL    	|       	|
      | db_schema              	| varchar(250) 	| NO   	|     	| NULL    	|       	|
      | db_table               	| varchar(250) 	| NO   	|     	| NULL    	|       	|
      | key_columns            	| varchar(250) 	| NO   	|     	| NULL    	|       	|
      | value_columns          	| varchar(250) 	| YES  	|     	| NULL    	|       	|
      | flags                  	| varchar(250) 	| NO   	|     	| 0       	|       	|
      | cas_column             	| varchar(250) 	| YES  	|     	| NULL    	|       	|
      | expire_time_column     	| varchar(250) 	| YES  	|     	| NULL    	|       	|
      | unique_idx_name_on_key 	| varchar(250) 	| NO   	|     	| NULL    	|       	|
      +------------------------	+--------------	+------	+-----	+---------	+-------	+
      

      innodb_memcache.containers城市表的表条目定义为:

      mysql> INSERT INTO `innodb_memcache`.`containers` (
             `name`, `db_schema`, `db_table`, `key_columns`, `value_columns`,
             `flags`, `cas_column`, `expire_time_column`, `unique_idx_name_on_key`)
             VALUES ('default', 'test', 'city', 'city_id', 'name|state|country', 
             'flags','cas','expiry','PRIMARY');
      
      • default为该containers.name列指定将city表配置为InnoDBdaemon_memcached插件一起使用的默认表。
      • InnoDB表列(namestatecountry)映射到containers.value_columns使用“| ”分隔符。
      • flagscas_column以及expire_time_column该领域innodb_memcache.containers表通常不使用的应用程序显著daemon_memcached插件。但是,InnoDB每个表都需要一个指定的表列。插入数据时,请0为这些列指定是否未使用。
    3. 更新innodb_memcache.containers表后,重新启动daemon_memcache插件以应用更改。

      mysql> UNINSTALL PLUGIN daemon_memcached;
      
      mysql> INSTALL PLUGIN daemon_memcached soname "libmemcached.so";
      
    4. 使用telnet,city使用memcachedset命令将数据插入表中。

      telnet localhost 11211
      Trying 127.0.0.1...
      Connected to localhost.
      Escape character is '^]'.
      set B 0 0 22
      BANGALORE|BANGALORE|IN
      STORED
      
    5. 使用MySQL,查询test.city表以验证是否存储了您插入的数据。

      mysql> SELECT * FROM test.city;
      +---------	+-----------	+-----------	+---------	+-------	+------	+--------	+
      | city_id 	| name      	| state     	| country 	| flags 	| cas  	| expiry 	|
      +---------	+-----------	+-----------	+---------	+-------	+------	+--------	+
      | B       	| BANGALORE 	| BANGALORE 	| IN      	|     0 	|    3 	|      0 	|
      +---------	+-----------	+-----------	+---------	+-------	+------	+--------	+
      
    6. 使用MySQL,将其他数据插入test.city表中。

      mysql> INSERT INTO city VALUES ('C','CHENNAI','TAMIL NADU','IN', 0, 0 ,0);
      mysql> INSERT INTO city VALUES ('D','DELHI','DELHI','IN', 0, 0, 0);
      mysql> INSERT INTO city VALUES ('H','HYDERABAD','TELANGANA','IN', 0, 0, 0);
      mysql> INSERT INTO city VALUES ('M','MUMBAI','MAHARASHTRA','IN', 0, 0, 0);
      
      注意

      建议您指定的值0flagscas_columnexpire_time_column领域,如果他们不使用。

    7. 使用telnet,发出memcachedget命令以检索您使用MySQL插入的数据。

      get H
      VALUE H 0 22
      HYDERABAD|TELANGANA|IN
      END
      

    配置InnoDB memcached插件

    memcached可以在配置文件的参数中编码的MySQL配置文件或mysqld启动字符串中指定传统的配置选项daemon_memcached_optionmemcached配置选项在插件加载时生效,这在每次启动MySQL服务器时都会发生。

    例如,要使memcached监听端口11222而不是默认端口11211,请指定-p11222作为daemon_memcached_option配置选项的参数:

    mysqld .... --daemon_memcached_option="-p11222"
    

    其他memcached选项可以编码在daemon_memcached_option字符串中。例如,您可以指定选项以减少最大同时连接数,更改键值对的最大内存大小或启用错误日志的调试消息,等等。

    也有特定于daemon_memcached插件的配置选项。这些包括:

    • daemon_memcached_engine_lib_name:指定实现InnoDBmemcached插件的共享库。默认设置为innodb_engine.so
    • daemon_memcached_engine_lib_path:目录的路径,其中包含实现InnoDBmemcached插件的共享库。默认值为NULL,表示插件目录。
    • daemon_memcached_r_batch_size:定义读取操作的批量提交大小(get)。它指定在进行提交后进行的memcached读取操作数。默认情况下,此参数设置为1,因此无论数据是通过memcached还是通过SQL 更新,每个请求都将访问表中最近提交的数据。当该值大于1时,每次调用都会增加用于读操作的计数器。一个调用重置读取和写入计数器。daemon_memcached_r_batch_sizegetInnoDBgetflush_all
    • daemon_memcached_w_batch_size:定义了批提交大小写操作(setreplaceappendprependincrdecr,等)。daemon_memcached_w_batch_size默认情况下,此参数设置为1,这样在发生中断的情况下不会丢失所有未提交的数据,并且基础表上的SQL查询可以访问最新数据。当该值大于1时,用于写入操作的计数器被递增为每个addsetincrdecr,和delete呼叫。一个flush_all调用重置读取和写入计数器。

    默认情况下,您无需修改daemon_memcached_engine_lib_namedaemon_memcached_engine_lib_path。例如,如果要对memcached使用其他存储引擎(例如NDB memcached引擎),则可以配置这些选项。

    daemon_memcached可以在MySQL配置文件或mysqld启动字符串中指定插件配置参数。它们在您加载daemon_memcached插件时生效。

    更改daemon_memcached插件配置时,请重新加载插件以应用更改。为此,发出以下语句:

    mysql> UNINSTALL PLUGIN daemon_memcached;
    
    mysql> INSTALL PLUGIN daemon_memcached soname "libmemcached.so";
    

    重新启动插件时,将保留配置设置,必需的表和数据。

    有关启用和禁用插件的更多信息,请参见“MySQL服务器插件”。