mysql memcached 初探


--mysql 5.7 已经把memcache 与 innodb 结合在了一起
The InnoDB memcached plugin provides an integrated memcached daemon that can automatically store and retrieve data from InnoDB tables, turning the MySQL server into a fast “key-value store

--此时通过memcached数据已可以持久化
Data modified through memcached operations such as ADD, SET, INCR are stored to disk

--安装依赖包
 yum install libevent-dev 

--当编译数据库时要指定 DWITH_INNODB_MEMCACHED 选项
When you build MySQL server, you must build with -DWITH_INNODB_MEMCACHED=ON.
 libmemcached.so: the memcached daemon plugin to MySQL.
 innodb_engine.so: an InnoDB API plugin to memcached

 --创建依赖表
 mysql> source MYSQL_HOME/share/innodb_memcached_config.sql

 --其创建的表
mysql> use innodb_memcache;
mysql> show tables;
+---------------------------+
| Tables_in_innodb_memcache |
+---------------------------+
| cache_policies            |
| config_options            |
| containers                |
+---------------------------+  

cache_policies定义了缓存策略,包含如下选择:
innodb_only:只使用InnoDB作为数据存储。
cache-only:只使用传统的Memcached引擎作为后端存储。
caching:二者皆使用,如果在Memcached里找不到,就查询InnoDB。

config_options定义了分隔符号:
separator:Memcached只识别单值,使用此分隔符(|)来连接多个字段的值。
table_map_delimiter:通过此分隔符(.)来确认表和键,如:@@table.key。

 --按装插件
 install plugin daemon_memcached soname "libmemcached.so";

 --在my.cnf可以指定的 memcached 参数
 daemon_memcached_option
 daemon_memcached_engine_lib_name
 daemon_memcached_engine_lib_path
 daemon_memcached_r_batch_size
 daemon_memcached_w_batch_size

--daemon_memcached_r_batch_size和daemon_memcached_w_batch_size,这两个选项对性能影响较大,简单点说就是控制事务提交的频率,MySQL的缺省值均为1,也就是说每次都提交
When a memcached operation causes an insert, update, or delete in the underlying InnoDB table, that change might be committed to the underlying table instantly
(if daemon_memcached_w_batch_size=1) or some time later (if that configuration option value is greater than 1). In either case, the change can not be rolled back

--控制事务隔离级别
innodb_api_trx_level 

--默认 innodb_memcache 使用的表级别的锁
By default, innodb_api_disable_rowlock is set to OFF which means that memcached requests row locks for get and set operations. When innodb_api_disable_rowlock is set to ON, memcached requests a table lock instead of row locks.

--查看 innodb_memcache 参数
mysql> SHOW VARIABLES LIKE '%memcached%';
+----------------------------------+------------------+
| Variable_name                    | Value            |
+----------------------------------+------------------+
| daemon_memcached_enable_binlog   | OFF              |
| daemon_memcached_engine_lib_name | innodb_engine.so |
| daemon_memcached_engine_lib_path |                  |
| daemon_memcached_option          | -p11222          |
| daemon_memcached_r_batch_size    | 1                |
| daemon_memcached_w_batch_size    | 1                |
+----------------------------------+------------------+

--下面进行一些测试模拟
USE `test`

CREATE TABLE `users` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `username` VARCHAR(15) NOT NULL,
    `password` VARCHAR(32) NOT NULL,
    `email` VARCHAR(50) NOT NULL,
    `flags` INT(10) UNSIGNED DEFAULT '0',
    `cas_column` BIGINT(20) UNSIGNED DEFAULT '0',
    `expire_time_column` INT(10) UNSIGNED DEFAULT '0',
    PRIMARY KEY (`id`),
    UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB;

--然后添加几行测试数据:
INSERT INTO `users` (`username`, `password`, `email`)
VALUES
('foo', 'ffffffffffffffffffffffffffffffff', 'foo@domain.com'),
('bar', 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', 'bar@domain.com');

--接着在containers里配置这个表:
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', 'users', 'username', 'password|email',
    'flags', 'cas_column', 'expire_time_column', 'username'
);

--这里我们定义了多个字段(password和email)作为value_columns,并且使用竖线作为分隔符,实际上使用空格,分号,逗号之类分隔符也可以
--如果你的字段内容里包含了竖线,那么就会和缺省值发生冲突,此时你可以更新separator的定义,比如改成三个竖线等等,需要提醒的是,修改后别忘了重启Memcached插件
--因为们在配置的时候把表命名为default,所以在请求的时候不用传递表名。如果不存在default,那么会把名字按照字母顺序正序排列,排在第一位的就是缺省
--通过终端访问
[root@rudy ~]# telnet rudy 11222
get bar
VALUE bar 0 47
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|bar@domain.com
END
get foo
VALUE foo 0 47
ffffffffffffffffffffffffffffffff|foo@domain.com
END

--通过在sql中修改数据,memcached端可以感知到数据变化
mysql>  update users set password='123534rudy' where id=1;
Query OK, 1 row affected (0.02 sec)

get foo
VALUE foo 0 25
123534rudy|foo@domain.com

 --当mysql关闭,memcached 也自动关闭了
 shut down the MySQL server, which also shuts off the integrated memcached server. Further attempts to access the memcached data now fail with a connection error

 Memcached服务器使用基于Slab的内存管理方式,有利于减少内存碎片和频繁分配销毁内存所带来的开销。
 各个Slab按需动态分配一个page的内存(和4Kpage的概念不同,这里默认page为1M),page内部按照不同slab class的尺寸再划分为内存chunk供服务器存储KV键值对使用
(slab机制相当于内存池机制, 实现从操作系统分配一大块内存, 然后 memcached 自己管理这块内存, 负责分配与回收。)

 --memcached一些限制
 1. Memcached keys cannot contain spaces or newlines, because those characters are used as separators in the ASCII protocol
 2. In any query that performs arithmetic using the column values, use the CAST() function to convert from string to integer or other numeric type
 3. You cannot use a partitioned table for data queried or stored through the memcached interface.
 4. If the InnoDB column you use as a key can be longer than 250 bytes, hash it to a value that is less than 250 bytes
 5. To use multiple MySQL column values with memcached key/value pairs, in the innodb_memcache.containers entry associated with the MySQL table,
 specify in the value_columns field several column names separated by comma, semicolon, space, or pipe characters; for example, col1,col2,col3 or col1|col2|col3.
 6. In any query that performs arithmetic using the column values, use the CAST() function to convert from string to integer or other numeric type
 7. If the InnoDB column you use as a key can be longer than 250 bytes, hash it to a value that is less than 250 bytes

 --因为 innodb_memcache 会持久化数据,所以其使用原生的memcached性能有所下降
 Because using InnoDB in combination with memcached involves writing all data to disk, whether immediately or sometime later

 --如果要让 innodb_memcache 支持主从复制,需要配置innodb_api_enable_binlog参数
 To use the InnoDB memcached plugin with the MySQL binary log, enable the innodb_api_enable_binlog configuration option on the master server.

 --The memcached flush_all command is mapped to the TRUNCATE TABLE command
时间: 2024-08-31 08:09:36

mysql memcached 初探的相关文章

阿里云(ECS+RDS)部署PHP+MySQL网站初探

贴图太不方便,要查看图文版,请访问 http://note.youdao.com/noteshare?id=3fb19ba1b69c27b2ccd218f5403db0ca&sub=D2826597DF2A4DCD997CDAAAD4B157D5 ============================================================================   阿里云(ECS+RDS)部署PHP+MySQL网站初探     一.背景介绍 前段时间,用Ap

Mac Yosemite下安装Apache+PHP+MySQL+Memcached环境笔记

为了安装方便,需要注意几个小细节. 最好是安装了xcode之后再来安装此环境 Mac OS X 10.10 Yosemite 自带PHP5.5和Apache2.4做相应修改即可. Mac先安装所需工具 MacPort的下载:http://www.macports.org/ 下载安装port ,如果开有终端,记得安装完成后退出终端哟 安装GNU autotools: 要安装autotools需要如下几个文件 automake autoconf M4 安装顺序是M4 -> autoconf ->

Centos 下源码安装配置Nginx +PHP + fastcgi+mysql+MemCached

编译工具包是少不了的先搞起吧 yum -y install gcc gcc-c++ libxml2 libxml2-devel autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel  zlib zlib-devel glibc glibc-devel glib2 glib2-devel ./configure: error: the HTTP rewrite module requires the P

memcached和mysql的同步问题

问题描述 memcached和mysql的同步问题 memcached和mysql memcached和mysql都是服务器,怎样做让memcached和mysql进行同步呢,应该在操作的时候怎样编码呢, 虽然有个memcached_function_mysql.,但是怎么安装不上呢,这个又是怎么回事呢?我是新手 希望的到大家的指点.. 解决方案 http://www.cnblogs.com/goody9807/p/4277749.html 解决方案二: mysql中建立触发器 有数据变化就调用

MySQL中InnoDB的Memcached插件的使用教程_Mysql

安装    为了让文章更具完整性,我们选择从源代码安装MySQL,需要注意的是早期的版本有内存泄漏,所以推荐安装最新的稳定版,截至本文发稿时为止,最新的稳定版是5.6.13,我们就以此为例来说明,过程很简单,只要激活了WITH_INNODB_MEMCACHED即可: shell> groupadd mysql shell> useradd -r -g mysql mysql shell> tar zxvf mysql-5.6.13.tar.gz shell> cd mysql-5.

MySQL & NoSQL – Memcached 插件

大多数人都已经听说 NoSQL 数据库,其中使用最广泛的工具是 Memcached,你们通过 Memcached 再应用层和数据库之间添加一个缓存层.从 MySQL 5.6 开始,你可以获得一个全新的插件,这个插件把 MySQL 和 Memcached 集成起来.在此文中,我们将学习怎样在 Linux 中 安装这个插件,怎样做一些基础的配置. 先决条件 安装 libevent. 译者注:以下命令由译者提供. 命令如下: yum install libevent -y yum install ph

MySQL双机高可用的负载均衡(读写分离、主从自动切换)架构设计

架构简介   前几天网友来信说帮忙实现这样一个架构:只有两台机器,需要实现其中一台死机之后另一台能接管这台机器的服务,并且在两台机器正常服务时,两台机器都能用上.于是设计了如下的架构.ps://www.centos.bz/wp-content/uploads/2014/12/%E5%8F%8C%E6%9C%BAha%E6%9E%B6%E6%9E%84%E5%9B%BE.png" /> 此架构主要是由keepalived实现双机高可用,维护了一个外网VIP,一个内网VIP.正常情况时,外网V

Apache/Nginx+PHP+MySQL一键环境安装包

windows平台 1.Nginx PHP环境集成包: http://www.upupw.net/Nginx/     我用的就是这个,WIN平台搞开发 Apache PHP环境集成包:http://www.upupw.net/Apache/ 2.WINDOWS的NGINX+PHP+MYSQL+MEMCACHED的服务器集成环境 http://www.hdj.me/wnmpserver LINUX 平台 1.linux+apache/nginx+php+mysql lanmp/lamp/lnmp

Mysql 优化详细介绍

Mysql 优化详细介绍 MySQL 提供了很多参数进行服务器的设置, MySQL 在安装的时候提供几个默认的参数文件供选择,分别是: my-small.cnf . my-medium.cnf . my-large.cnf . my-huge.cnf . my-innodb-heavy-4G.cnf ,从文件名我们可以看出该配置文件适合的应用规模.通常情况下,我们可以选择使用接近自己的系统规模的配置文件,但是系统默认的参数在不同的生产环境可能不能完全满足实际的应用需求,我们可以再按照实际情况对部