您的位置:首页 > 健康 > 美食 > 高性能内存对象缓存Memcached

高性能内存对象缓存Memcached

2024/10/6 22:19:55 来源:https://blog.csdn.net/wkysdhr/article/details/140519636  浏览:    关键词:高性能内存对象缓存Memcached

一、Memcached概述

        Memcached 是一套开源的高性能分布式内存对象缓存系统,它将所有的数据都存储在内存中,因为内存中会统一维护一张巨大的 Hash 表,所以支持任意存储类型的数据。很多网站使用 Memcached 提高网站的访问速度,尤其是需要频繁访问数据的大型网站。
        Memcached 是典型的 C/S 架构,因此需要构建 Memcached 服务器端与 MemcachedAPI客户端。Memcached 服务器端是用C语言编写的,而Memcached API客户端可用任何语言来编写(如 PHP、Python、Per 等),并通过 Memcached 协议与 Memcached 服务器端进行通信。
        当Web客户端发出请求到Web服务器的应用程序时,应用程序会调用 Memcached APl客户端程序库接口去连接 Memcached 服务器查询数据。如果 Web 客户端所请求的数据在Memcached 服务端中已经缓存,则 Memcached 服务端会将数据返回给 Web 客户端;否则,会将 Web 客户端请求发送至MySQL数据库,由数据库查询并返回请求的数据给Memcached 以及 Web 客户端,与此同时 Memcached 服务器也会将数据进行保存,方便下次用户请求使用。

二、Memcached特点

1.数据存储方式和数据过期方式

Memcached 具有独特的数据存储方式和数据过期方式。

(1)数据存储方式:Slab Allocation

        Slab Allocation 即按组分配内存,每次先分配一个 Slab,相当于一个大小为 1M的页。然后,在 1M 的空间里根据数据划分大小相同的 Chunk。该方法可以有效解决内存碎片问题,但也可能会使内存空间产生浪费。

(2)数据过期方式:LRU、Laxzy Expiration

        LRU 和 Laxzy Expiration 是数据过期的两种方式。
        LRU 是指追加的数据空间不足时,会根据LRU的情况淘汰最近最少使用的记录
        Laxzy Expiration 即惰性过期,是指使用 get 时查看记录时间,从而检查记录是否已经过期。

2.Memcached 缓存机制

        缓存是常驻在内存的数据,能够快速进行读取,而Memcached 就是这样一款非常出色的缓存软件。当程序写入缓存数据请求时,Memcached的API接口将 Key 输入路由算法模块并路由到集群中的一台服务器,之后由API接口与服务器进行通信,完成一次分布式缓存写入。

3.Memcached 分布式

        Memcached分布式部署主要依赖于Memcached的客户来端实现,多个Memcached 服务器是独立的。分布式数据如何存储是由路由算法所决定。当数据到达客户端程序库,客户端的算法就依据路由算法来决定保存的 Memcached 服务器。读取数据时,客户端依据使用保存数据时相同的路由算法选中和存储数据时相同的服务器来读取数据。

4.Memcached 路由算法

(1)求余数 hash 算法

        求余数 hash 算法先用 key 做 hash 运算得到一个整数,再去做 hash 算法,根据余数进行路由,这种算法适合大多数据需求。但是不适合用在动态变化的环境中,比如有大量机器添加或者删除,这样会导致大量的对象存储位置失效。

(2)一致性 hash 算法

        一致性 hash 算法适合在动态变化的环境中使用。原理是按照 hash 算法把对应的 key 通过一定的 hash 算法处理后映射形成一个首尾相接闭合循环,然后通过使用与对象存储一样的hash算法将机器也映射到环中,顺时针方向计算将所有对象存储到离自己最近的机器中。

三、Memcached案例实施

1.Memcached主主复制架构

(1)配置Memcached服务器

此步骤在两台memcache服务器上都执行
        安装Libevent

[root@memcache1 ~]# systemctl stop firewalld
[root@memcache1 ~]# setenforce 0
[root@memcache1 ~]# yum -y install gcc* psmisc
[root@memcache1 ~]# tar zxvf libevent-2.1.8-stable.tar.gz 
[root@memcache1 ~]# cd libevent-2.1.8-stable
[root@memcache1 libevent-2.1.8-stable]# ./configure --prefix=/usr/local/libevent
[root@memcache1 libevent-2.1.8-stable]# make && make install

         安装带有复制功能的 Memcached

[root@memcache1 ~]# tar zxvf memcached-1.2.8-repcached-2.2.tar.gz 
[root@memcache1 ~]# cd memcached-1.2.8-repcached-2.2
[root@Memcached1 memcached-1.2.8-repcached-2.2]# ./configure --prefix=/usr/local/memcached_replication --enable-replication --with-libevent=/usr/local/libeven

        进入并修改配置文件

[root@memcache1 memcached-1.2.8-repcached-2.2]# vim memcached.c#找到如下几行(在55行--60行):
/* FreeBSD 4.x doesn't have IOV_MAX exposed. */
#ifndef IOV_MAX
#if defined(__FreeBSD__) || defined(__APPLE__)        //删除
# define IOV_MAX 1024
#endif                                                //删除
#endif[root@memcache1 memcached-1.2.8-repcached-2.2]# make && make install

        启动Memcached服务

在memcache1上启动
[root@memcache1 ~]# ln -s /usr/local/libevent/lib/libevent-2.1.so.6 /usr/lib64/
[root@Memcached1 ~]# /usr/local/memcached_replication/bin/memcached -d -u root -m 128 -x 192.168.10.102在memcache2上启动
[root@memcache1 ~]# ln -s /usr/local/libevent/lib/libevent-2.1.so.6 /usr/lib64/
[root@Memcached1 ~]# /usr/local/memcached_replication/bin/memcached -d -u root -m 128 -x 192.168.10.101

        在两台服务器上检查进程

[root@memcache1 ~]# netstat -anpt | grep memcached

        使用telnet进行简单验证复制功能

在 Memcached1 上插入一条具有特点的键值
[root@memcache1 ~]# yum -y install telnet
[root@memcache1 ~]# telnet 192.168.10.102 11211
set username 0 0 8    
12345678
STORED在 Memcached2 上进行查看刚刚插入的键值
[root@memcache2 ~]# yum -y install telnet
[root@memcache2 ~]# telnet 192.168.10.102 11211
get username
VALUE username 0 8
12345678
END

(2)Memcached主主复制+Keepalived高可用架构

        两台主机都安装配置keepalived

[root@memcache1 ~]# yum -y install keepalived
root@memcache1 ~]# vim /etc/keepalived/keepalived.conf 

        配置主Keepalived

! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_01            ##主从Keepalivedip不能相同vrrp_skip_check_adv_addr#vrrp_strict                ##注释vrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_script check_down {     ##定义要执行的脚本script "/etc/keepalived/memcached.sh"		##脚本路径和名称interval 1		##间隔1秒执行一次
}vrrp_instance VI_1 {state BACKUP      ##master角色不能设置nopreempt,所以此处要设置为BACKUPinterface ens33virtual_router_id 51priority 100    ##从主机的优先级要小于此数字advert_int 1nopreempt		##添加,此语句关闭了抢占功能,从主机不需要authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.10.100
}track_script {		##调用前面的脚本check_down
}}

        编写要执行的脚本

[root@memcached1 keepalived]# vim /etc/keepalived/memcached.sh#!/bin/bash
#
if [ $(ps -C memcached --no-header | wc -l) -eq 0 ]; thensystemctl stop keepalived
fi[root@memcached1 keepalived]# chmod +x /etc/keepalived/memcached.sh

        配置从Keepalived

[root@memcache2 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_02vrrp_skip_check_adv_addr#vrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_script check_down {     
script "/etc/keepalived/memcached.sh"		
interval 1		
}vrrp_instance VI_1 {state BACKUP      interface ens33virtual_router_id 51priority 99    ##从主机的优先级要小于此数字advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.10.100
}track_script {		##调用前面的脚本check_down
}}

(3)配置Memcached API客户端

        安装LAMP平台

[root@memcached-api ~]# yum -y install httpd mariadb mariadb-server php php-devel php-mysql zlib zlib-devel
[root@memcached-api ~]# systemctl start mariadb
[root@memcached-api ~]# mysqladmin -u root password 'pwd123'
[root@memcached-api ~]# systemctl start httpd

        编译安装Libmemcached

[root@memcached-api ~]# systemctl stop firewalld
[root@memcached-api ~]# setenforce 0
[root@memcached-api ~]# yum -y install gcc*
[root@memcached-api ~]# tar zxvf libmemcached-1.0.18.tar.gz 
[root@memcached-api ~]# cd libmemcached-1.0.18
[root@memcached-api libmemcached-1.0.18]# ./configure --prefix=/usr/local/libmemcached --with-memcached=/usr/local/memcached
[root@memcached-api libmemcached-1.0.18]# make && make install

        编译安装Memcached扩展

[root@memcached-api ~]# tar -xzvf memcached-2.2.0.tgz 
[root@memcached-api ~]# cd memcached-2.2.0/
[root@memcached-api memcached-2.2.0]# phpize
[root@memcached-api memcached-2.2.0]# ./configure --enable-memcached --with-php-config=/usr/local/php5/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached --disable-memcached-sasl --with-zlib-dir
[root@memcached-api memcached-2.2.0]# make && make install

        配置 PHP 添加 Memcached 组件

[root@memcached-api ~]# vim /etc/php.iniextension=memcached.so[root@memcached-api ~]# systemctl restart httpd

        通过 PHPinfo 查看是否已经添加 Memcached 扩展模块

[root@memcached-api ~]# vim /var/www/html/test1.php<?php
phpinfo();
?>

        测试 Memcached-API 功能

[root@memcached-api ~]# vim/var/www/html/test2.php<?php 
$memcache = new Memcached(); 
$memcache->addServer('192.168.10.101', 11211); 
$memcache->set('key', 'Memcache test successful!', 0, 60); 
$result = $memcache->get('key'); 
unset($memcache); 
echo $result; 
?> 

(4)测试验证

        在两台服务器上启动keepalived
        在客户端修改缓存服务器地址

[root@memcached-api ~]# vim /usr/local/httpd/htdocs/test3.php<?php 
$memcache = new Memcached(); 
$memcache->addServer('192.168.10.100', 11211); 
$memcache->set('key', 'Memcache test successful!', 0, 60); 
$result = $memcache->get('key'); 
unset($memcache); 
echo $result; 
?> 

        浏览器访问测试

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com