zoukankan      html  css  js  c++  java
  • Mysql和Memcached的连动

    Memcached 和 mysqld 的联通

    一 概述:
    1. what's UDFs ?
      UDFs是User Defined Functions的缩写,表示Mysql用户自定义的函数,应用程序可以利用这些函数从MySQL5.0以上的版本的数据库中访问Memcached写入或者获取的数据。此外,MySql 从5.1版本开始支持触发器。从而可以在触发器中使用UDFs直接更新Memcached的内容,这种方式降低了应用程序的设计和编写的复杂性。

    2. 下面简单介绍UDFs的安装和使用。安装UDFs需要在数据库服务器上安装两个包,分别是libmemcached和memcached_functions_mysql,这两个包都可以从http://download.tangent.org/下载,安装如下:

      2.1. 需要的软件有memcached-1.2.6,libevent-1.4.4-stable,libmemcached-0.30这些软件非常简单,yum -y install libmemcached* 就可以安装了,因此不做说明。
      2.2. 安装mysql,也不做说明。
      2.3. 安装Memcached_functions_mysql,基本步骤如下:下载地址:https://launchpad.net/memcached-udfs

       # 下载解包以后,进入到目录下面,开始执行下面的安装命令
       [root@salt memcached_functions_mysql-1.1]# ./configure --with-mysql=/usr/bin/mysql_config --prefix=/usr/local/memcached_functions_mysql
       [root@salt memcached_functions_mysql-1.1]# make && make install
    

    安装完以后,切换到源码目录下,把memcached_function_mysql 装到mysql内部里面去,有2中方法:

    • 第一种方法是在MySQL的SQL命令行中执行memcached_functions_mysql源码目录下的sql/install_functions.sql
    • 第二种方法是运行memcached_functions_mysql源码目录下的utils/install.pl这个Pcrl脚本,把memcache function作为UDFs加入MySQL。

    下面我采取的是第二种方法:

       [root@salt memcached_functions_mysql]# cd /tmp/memcached_functions_mysql-1.1
    [root@salt utils]# cp /usr/local/memcached_functions_mysql/lib/libmemcached_functions_mysql.so /usr/lib64/mysql/plugin/
    [root@salt memcached_functions_mysql-1.1]# cd utils/
    [root@salt utils]# ls
    install.pl
    [root@salt utils]# ./install.pl 
    

    如果你的数据库设置了密码,那么就在install.pl脚本的78行附近,把密码传个那个opt_password的变量:

     73 $opt_schema ||= 'test';
     74 $opt_user   ||= 'root';
     75 $opt_host   ||= 'localhost';
     76 $opt_password   ||= '123456';     # 78行,添加这个变量,告诉连接数据库的密码
     77 my $existing_functions;
     78 
     79 my $dbh= DBI->connect("DBI:mysql:$opt_schema", $opt_user, $opt_password)
     80     or croak "Unable to connect! $DBI::errstr
    ";
    

    一路回车敲击Y后,终于把Memcached_function_mysql装进到了mysql中,我们在数据库检查下,共32行:

    select name,dl from mysql.func;
    +------------------------------+---------------------------------+
    | name                         | dl                              |
    +------------------------------+---------------------------------+
    | memc_cas_by_key              | libmemcached_functions_mysql.so |
    | memc_cas                     | libmemcached_functions_mysql.so |
    | memc_servers_set             | libmemcached_functions_mysql.so |
    | memc_add                     | libmemcached_functions_mysql.so |
    | memc_libmemcached_version    | libmemcached_functions_mysql.so |
    | memc_add_by_key              | libmemcached_functions_mysql.so |
    | memc_server_count            | libmemcached_functions_mysql.so |
    | memc_stat_get_keys           | libmemcached_functions_mysql.so |
    | memc_append                  | libmemcached_functions_mysql.so |
    | memc_replace_by_key          | libmemcached_functions_mysql.so |
    | memc_prepend                 | libmemcached_functions_mysql.so |
    | memc_behavior_get            | libmemcached_functions_mysql.so |
    | memc_udf_version             | libmemcached_functions_mysql.so |
    | memc_set_by_key              | libmemcached_functions_mysql.so |
    | memc_get_by_key              | libmemcached_functions_mysql.so |
    | memc_increment               | libmemcached_functions_mysql.so |
    | memc_behavior_set            | libmemcached_functions_mysql.so |
    | memc_stats                   | libmemcached_functions_mysql.so |
    | memc_list_distribution_types | libmemcached_functions_mysql.so |
    | memc_list_hash_types         | libmemcached_functions_mysql.so |
    | memc_append_by_key           | libmemcached_functions_mysql.so |
    | memc_servers_behavior_set    | libmemcached_functions_mysql.so |
    | memc_replace                 | libmemcached_functions_mysql.so |
    | memc_set                     | libmemcached_functions_mysql.so |
    | memc_prepend_by_key          | libmemcached_functions_mysql.so |
    | memc_get                     | libmemcached_functions_mysql.so |
    | memc_list_behaviors          | libmemcached_functions_mysql.so |
    | memc_delete                  | libmemcached_functions_mysql.so |
    | memc_stat_get_value          | libmemcached_functions_mysql.so |
    | memc_decrement               | libmemcached_functions_mysql.so |
    | memc_delete_by_key           | libmemcached_functions_mysql.so |
    | memc_servers_behavior_get    | libmemcached_functions_mysql.so |
    +------------------------------+---------------------------------+
    32 rows in set (0.30 sec)
    
    

    二 memcached_function_mysql的应用实例:

    1 创建2张表

    新建2张表,urls和results,更新urls表中的内容,使系统自动更新Memcached的内容,results用来记录更新Memcached失败的记录。

    SQL语句:

    mysql> create database test character set 'utf8';
    mysql> create table urls(id int(10) not null,url varchar(255) not null default '',primary key(`id`));
    mysql> create table results(id int(10) not null,result varchar(255) not null default 'error',time timestamp null default current_timestamp , primary key (`id`));
    
    2 创建3个触发器

    2.1. 当向urls表中插入数据时,对Memcached执行set操作,trigger大代码如下:

    mysql> delimiter //     # 切换结束符
    mysql> drop trigger if exists url_mem_insert;
        -> create trigger url_mem_insert before insert on urls
        -> for each row begin set @mm = memc_set(NEW.id,NEW.url);
        -> if @mm <>0 then
        -> insert into results(id) values(NEW.id);
        -> end if;
        -> END//
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> DELIMITER ;
    

    2.2. 当对urls表中的数据进行更新时,对Memcached执行replace操作。sql语句如下

    mysql> delimiter //
    mysql> drop trigger if exists url_mem_update;
        -> create trigger url_mem_update before update on urls for each row begin
        -> set @mm = memc_replace(OLD.id , NEW.url);
        -> if @mm <> 0 then
        -> insert into results(id) values(OLD.id);
        -> end if;
        -> end //
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    Query OK, 0 rows affected (0.36 sec)
    
    mysql> delimiter ;
    

    2.3. 当对urls表中的数据进行删除操作时,对Memcached执行delete操作,sql代码如下:

    mysql> delimiter //
    mysql> drop trigger if exists url_mem_delete;
        -> create trigger url_mem_delete before delete on urls for each row begin
        -> set @mm = memc_delete(OLD.ID);
        -> if @mm <> 0 then
        -> insert into results(id) values(OLD.id);
        -> end if;
        -> end //
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    Query OK, 0 rows affected (0.29 sec)
    
    mysql> delimiter ;
    

    2.4. 设置Memcached相关参数
    2.4.1. 设置UDFs操作Memcached服务器的IP地址和端口

    mysql> select memc_servers_set('127.0.0.1:11211')
        -> ;
    +-------------------------------------+
    | memc_servers_set('127.0.0.1:11211') |
    +-------------------------------------+
    |                                   0 |
    +-------------------------------------+
    1 row in set (0.35 sec)
    
    mysql> select memc_server_count();
    +---------------------+
    | memc_server_count() |
    +---------------------+
    |                   1 |
    +---------------------+
    1 row in set (0.00 sec)
    

    2.4.2. 在Mysql命令行中列出可以修改Memcached参数的行为,执行命令和输出结果如下:

    mysql> select memc_list_behaviors()G;
    *************************** 1. row ***************************
    memc_list_behaviors(): 
    MEMCACHED SERVER BEHAVIORS
    MEMCACHED_BEHAVIOR_SUPPORT_CAS
    MEMCACHED_BEHAVIOR_NO_BLOCK
    MEMCACHED_BEHAVIOR_TCP_NODELAY
    MEMCACHED_BEHAVIOR_HASH
    MEMCACHED_BEHAVIOR_CACHE_LOOKUPS
    MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
    MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE
    MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
    MEMCACHED_BEHAVIOR_KETAMA
    MEMCACHED_BEHAVIOR_POLL_TIMEOUT
    MEMCACHED_BEHAVIOR_RETRY_TIMEOUT
    MEMCACHED_BEHAVIOR_DISTRIBUTION
    MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
    MEMCACHED_BEHAVIOR_USER_DATA
    MEMCACHED_BEHAVIOR_SORT_HOSTS
    MEMCACHED_BEHAVIOR_VERIFY_KEY
    MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT
    MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
    MEMCACHED_BEHAVIOR_KETAMA_HASH
    MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
    MEMCACHED_BEHAVIOR_SND_TIMEOUT
    MEMCACHED_BEHAVIOR_RCV_TIMEOUT
    MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT
    MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK
    MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK
           
    MEMCACHED_HASH_DEFAULT
    MEMCACHED_HASH_MD5
    MEMCA
    1 row in set (0.00 sec)
    
    ERROR: 
    No query specified
    
    

    设置MEMCACHED_BEHAVIOR_NO_BLOCK 为打开状态,这样Memcached出现问题的时候,也就是连接不上的时候,数据可以继续插入Mysql中,但有报错提示;如不设置此值,那么Memcached失败时,数据需要到memcached失败超时后才可以插入到表中。
    通过下面的设置,可以避免这样的情况发生:

    mysql> select  memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1');
    +--------------------------------------------------------------+
    | memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1') |
    +--------------------------------------------------------------+
    |                                                            0 |
    +--------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> select  memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1');
    +-----------------------------------------------------------------+
    | memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1') |
    +-----------------------------------------------------------------+
    |                                                               0 |
    +-----------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    

    2.4.3. 测试Mysql与Memcached的数据同步性
    2.4.3.1. 数据增加

    • 我们先在mysql上插入一条数据:
    mysql> insert into urls values(2,'http://www.baidu.com');
    Query OK, 1 row affected (0.04 sec)
    mysql> select memc_get('2');
    +-------------------+
    | memc_get('2')     |
    +-------------------+
    | http://www.jd.com |
    +-------------------+
    1 row in set (0.02 sec)
    

    然后在另一个终端上telnet memcached执行命令,命令如下:

    [root@salt ~]# telnet 127.0.0.1 11211
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    get 2    #2就是id号,我们刚才插入数据的ID号为2,所以这里也是为2
    VALUE 2 0 20
    http://www.baidu.com    
    END
    

    2.4.3.2 删除数据
    mysql:

    mysql> delete from test.urls where id=2;
    

    memcached:

    get 2
    END
    

    2.4.3.3 修改数据同理可得,在mysql一端修改后,自动同步到memcached上去。

  • 相关阅读:
    Java线程状态和关闭线程的正确姿势
    Eclipse最全的编码设置
    Maven中的src/test/java颜色不正常
    web.xml 各版本的 Schema 头部声明
    程序员面试系列
    几款强大的网页生成工具
    endnoteX9批量导入enw
    关于Ubuntu16.04里安装elasticsearch-head显示集群健康值未连接的问题
    U盘做了系统盘,写入如硬盘映像过程中终止,怎么格式化硬盘重新写入?
    使用jupyter notebook出现kernel error
  • 原文地址:https://www.cnblogs.com/liaojiafa/p/6029313.html
Copyright © 2011-2022 走看看