Innodb with Memcached –安装

来源:互联网 发布:仓库管理系统源码.net 编辑:程序博客网 时间:2024/06/10 09:16

本文在文章:http://hi.baidu.com/cwbdde/blog/item/adc89b0ed94f80d17acbe1a7.html的基础上做了一些改动,应用到自己的系统上,由于机器上以前有一个mysql,所以这是在同一机器上安装两个mysql的情况。

InnoDB with Memcached是在提供MySQL服务的同一进程中提供Memcached服务。memcached是作为MySQL的插件程式,通过访问本地的InnoDB API直接访问innodb数据。如下图:



准备工作

由于mysql5.5版本之后不提供configure源码安装的方式,而采用cmake方式,没安装cmake,那就提前安装一下吧,很简单。
yum install cmake

安装mysql5.6.2

wget http://downloads.mysql.com/snapshots/pb/mysql-5.6-labs-innodb-memcached/mysql-5.6.2-labs-innodb-memcached.tar.gz

1)、下载MySQL。


#cd /usr/local/src


#wget http://downloads.mysql.com/snapshots/pb/mysql-5.6-labs-innodb-memcached/mysql-5.6.2-labs-innodb-memcached.tar.gz


2)、添加必要的组和拥有者


#groupadd mysql


#useradd -r -g mysql mysql


3)、解压MySQL


#tar -zvxf mysql-5.5.8.tar.gz


4)、配置编译


#mkdir /usr/local/mysql-5.6.2


#mkdir /mysql-5.6.2_data


#cd /usr/local/src/mysql-5.6.2


编译参数
#cmake . \
  -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.6.2/ \
  -DMYSQL_DATADIR=/mysql-5.6.2_data/ \
  -DMYSQL_UNIX_ADDR=/tmp/mysql.3308.sock \
  -DWITH_MYISAM_STORAGE_ENGINE=1 \
  -DWITH_INNOBASE_STORAGE_ENGINE=1 \
  -DWITH_BLACKHOLE_STORAGE_ENGINE=0 \
  -DWITH_ARCHIVE_STORAGE_ENGINE=0 \
  -DWITHOUT_PARTITION_STORAGE_ENGINE=1 \
  -DENABLED_LOCAL_INFILE=1 \
  -DMYSQL_TCP_PORT=3308 \
  -DEXTRA_CHARSETS=all \
  -DDEFAULT_CHARSET=utf8 \
  -DDEFAULT_COLLATION=utf8_general_ci \
  -DWITH_DEBUG=0 \
  -DWITH_EMBEDDED_SERVER=1 \
  -DWITH_SSL=system \
  -DWITH_READLINE=1
  
注意:编译参数里有几项需要根据自己具体情况设置。我这里将MySQL5.5.16运行于3306端口,并安装在mysql5516目录。


-DCMAKE_INSTALL_PREFIX=/usr/local/webserver/mysql5516/   设置mysql的安装目录


-DMYSQL_DATADIR=/data0/mysql/3306/data 设置mysql数据库文件的位置


-DMYSQL_UNIX_ADDR=/data0/mysql/3306/mysqld.sock 设置mysql启动后sock文件位置


-DMYSQL_TCP_PORT=3308 设置mysql的监听端口


-DDEFAULT_CHARSET=utf8                        //使用utf8字符


-DDEFAULT_COLLATION=utf8_general_ci            //校验字符


-DEXTRA_CHARSETS=all                            //安装所有扩展字符集


-DENABLED_LOCAL_INFILE=1                        //允许从本地导入数据




#make


#make install


注意事项:


重新编译时,需要清除旧的对象文件和缓存信息。 


# make clean
# rm -f  CMakeCache.txt 


4)、设置目录权限


# cd /usr/local/mysql-5.6.2


# chown -R root:mysql . //把当前目录中所有文件的所有者所有者设为root,所属组为mysql


# chown -R mysql:mysql /mysql-5.6.2_data
 


5)、配置文件


# cp support-files/my-medium.cnf /etc/my-5.6.2.cnf //这个配置仅适合小内存系统(32M - 64M)


打开如下注释:


innodb_data_home_dir = /usr/local/mysql/data
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /usr/local/mysql/data


innodb_buffer_pool_size = 16M
innodb_additional_mem_pool_size = 2M


innodb_log_file_size = 5M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50


添加默认字符集:


[client] 
default-character-set = utf8    // 添加编码支持
[mysqld]
default-character-set = utf8   // 添加编码支持
max_connections = 10000     //根据服务器性能调节
basedir = /usr/local/mysql //设置安装目录,这样在系统启动时才能正确运行到/etc/rc.d/init.d/mysql start


6)、创建系统数据库的表


# cd /usr/local/mysql-5.6.2


# ./scripts/mysql_install_db --defaults-file=/etc/my-5.6.2.cnf --basedir=/usr/local/mysql-5.6.2 --datadir=/mysql-5.6.2_data/ --user=mysql --pid-file=/mysql-5.6.2_data/mysql-5.6.2.pid --port=3308 --socket=/tmp/mysql.3308.sock

启动mysql

/usr/local/mysql-5.6.2/bin/mysqld --basedir=/usr/local/mysql-5.6.2 --datadir=/mysql-5.6.2_data/ --plugin-dir=/usr/local/mysql-5.6.2/lib/plugin --user=mysql --log-error=/mysql-5.6.2_data/mysqld.log --open-files-limit=51200 --pid-file=/mysql-5.6.2_data/mysqld.pid --socket=/tmp/mysql.3308.sock --port=3308 &

导入配置表

scripts目录下有个innodb_memcached_config.sql文件,是对memcached插件的配置

cd /usr/local/mysql2/bin/
./mysql -uroot -P3308 -S /tmp/mysql.3308.sock < ../scripts/innodb_memcached_config.sql

运行完这个脚本,会创建一个innodb_memcache的数据库,以及下面3个表:containers,cache_policies和config_options。
containers是innodb和memcached之间的一个映射关系表,描述了memcached的数据属性(比如key,value,过期时间等)是如何存放在innodb的表中的,以及每个属性对应到表中哪些字段上. containers表只有一行记录,是因为目前memcached插件只支持每次只能将memcached操作到一张表上。官方资料上说,未来会支持更加灵活的配置,这样memcached的操作就能映射到多个表了。
cache_policies表中的配置指定了数据存储的形态,目前有3种:

innodb_only: 默认形态,数据直接存入innodb engine 中cache_only: 同传统的memcache server一样,数据只存在内存中caching: 先查找内存中缓存,如果找不到,再向innodb engine中找

config_options表目前只有一条记录,指定了分隔符,默认值是’|',用于多列数据情况下的分隔。
另外,test库里面会有个demo_test表,记录了

加载memcached插件

mysql>install plugin daemon_memcached soname 'libmemcached.so';
mysql>show variables like  '%memcached%';
+———————————-+——————+
| Variable_name | Value |
+———————————-+——————+
| daemon_memcached_engine_lib_name | innodb_engine.so |
| daemon_memcached_engine_lib_path | |
| daemon_memcached_option | |
| daemon_memcached_r_batch_size | 1048576 |
| daemon_memcached_w_batch_size | 32 |
+———————————-+——————+

可以查看一些配置属性,可以在配置文件[mysqld]部分自行调整。
这里主要说下面两个参数:

daemon_memcached_r_batch_size:读操作批量提交大小的阀值(It specifies after how many ops we will do a commit. By default, this is set as a very large number, 1048576.)daemon_memcached_w_batch_size:写操作批量提交大小的阀值(set, replace, append, prepend, incr, decr etc.) By default, this is set as 32.)
其他的配置属性,比如memcahced的属性可以在daemon_memcached_option指定,比如,指定11212端口
loose-daemon_memcached_option=’-p 11222′即可。

这里解释下loose前缀的作用,经常会在配置插件属性的时候,看到HandlerSocket属性中有loose_handlersocket_port这种写法,其实目的是为了:”选项有前缀loose,如果程序未识别出选项不会提示错误退出,只是会发出一条警告,不至于会终止程序。”

测试一下

mysql>use innodb_memcache;
mysql>select * from containers;
+——+———–+———–+————-+—————+——-+————+——————–+————————+
| name | db_schema | db_table | key_columns | value_columns | flags | cas_column | expire_time_column | unique_idx_name_on_key |
+——+———–+———–+————-+—————+——-+————+——————–+————————+
| aaa | test | demo_test | c1 | c2 | c3 | c4 | c5 | PRIMARY |
+——+———–+———–+————-+—————+——-+————+——————–+————————+

可以看到数据是存放在test库的demo_test表中,实际应用的时候可以自己修改。

往memcache里面添加条数据,如下:

#php -r ‘$m = memcache_connect(“localhost”, 11211); $m->add(“key”, “value”); var_dump($m->get(“key”));’
string(5) “value”

select查询之前,由于daemon_memcached_w_batch_size配置的存在如果数据字节小于32是不会显示的,所以需要修改下,如下:

mysql>set session TRANSACTION ISOLATION LEVEL read uncommitted;
mysql>SELECT * FROM demo_test WHERE c1 = ‘key’;
+—–+——-+——+——+——+
| c1 | c2 | c3 | c4 | C5 |
+—–+——-+——+——+——+
| key | value | 0 | 1 | NULL |
+—–+——-+——+——+——+
1 row in set (0.00 sec)

对于用memcache来存放session的服务,同样可以这样实现:

[php.ini文件设置]
; when using the “memcache” extension:
session.save_handler=memcache
; when using the “memcached” extension:
; session.save_handler=memcached
session.save_path=”tcp://localhost:11211″
[php代码]
php -r “session_start();$_SESSION['foo'] = ‘bar’;”
 [mysql终端]
mysql> select * from demo_test where c1 = ‘m1h4iqmp6hc7e4l85qlld0gtd1′;
+——+——+—————————-+——+—————-+——+——+——+——+——+——+
| cx | cy | c1 | cz | c2 | ca | CB | c3 | cu | c4 | C5 |
+——+——+—————————-+——+—————-+——+——+——+——+——+——+
| NULL | NULL | m1h4iqmp6hc7e4l85qlld0gtd1 | NULL | foo|s:3:”bar”; | NULL | NULL | 0 | NULL | 4 | NULL |
+——+——+—————————-+——+—————-+——+——+——+——+——+——+
1 row in set (0.00 sec)

小结
InnoDB with Memcached是在提供MySQL服务的同一进程中提供Memcached服务 ,这与HandlerSocket的架构模式几乎是一样的。性能提升的原理同HandlerSocket类似,可以参考另一篇文章http://www.domysql.com/html/180.html
当前版本提供的功能做个小结

memcached作为mysqld的守护插件:mysqld和memcached是在同一进程空间中运行,对数据的访问具有非常低的延迟支持多列:用户可以通过value映射到多个列,该值是分离预先定义的“分离器”。可选的本地缓存:"cache-only", "innodb-only", 和 "caching", 适用于Memcached的set,get,delete和flush操作. 不但可以省去开发中使用Memcached来缓存数据的麻烦,并且具有更好的可靠性和数据一致性批量操作:用户可以通过指定daemon_memcached_r_batch_size和daemon_memcached_w_batch_size大小来进行批量提交支持所有的memcached配置选项,通过daemon_memcached_option参数设置

 

start_mysql.sh方式

#!/bin/bash

bash -c "/usr/local/mysql2/bin/mysqld_safe --defaults-file=/mysql/3308/my.cnf" &

stop_mysql.sh方式

#!/bin/bash

/usr/local/mysql2/bin/mysqladmin -u root -p -S /mysql/3308/mysql.sock shutdown

 

my.cnf样本

 

[client]

#password   = your_password

port        = 3308

socket      = /mysql/3308/mysql.sock

 

# Here follows entries for some specific programs

 

[mysqld_safe]

datadir = /mysql/3308/data

log-error = /mysql/3308/mysql_error.log

pid-file = /mysql/3308/mysql.pid

 

# The MySQL server

[mysqld]

port        = 3308

socket      = /mysql/3308/mysql.sock

skip-external-locking

key_buffer_size = 16M

max_allowed_packet = 1M

table_open_cache = 64

sort_buffer_size = 512K

net_buffer_length = 8K

read_buffer_size = 256K

read_rnd_buffer_size = 512K

myisam_sort_buffer_size = 8M

原创粉丝点击