高性能内存对象缓存

1:数据存储方式与数据过期方式

数据存储方式多种多样,以下为常见的几种:

1.关系型数据库:如 MySQL、Oracle 等,通过表格形式组织数据,具有严格的数据结构和关系约束,适用于结构化数据的存储和管理。例如企业的财务数据、员工信息等。

3.非关系型数据库:包括 MongoDB、Cassandra 等,采用灵活的数据模型,如文档型、键值对型等,能够处理大规模和高并发的数据读写。像社交媒体平台上的用户动态、评论等数据适合用此类方式存储。

4.文件系统:直接将数据存储为文件,如文本文件、二进制文件等。常用于存储图片、音频、视频等大型文件。

分布式存储系统:如 Hadoop 的 HDFS,能够在多个节点上分布存储数据,实现大规模数据的可靠存储和高效访问。
数据过期方式

数据过期方式通常取决于数据的性质、业务需求和存储策略。常见的有以下几种:

1.基于时间戳:为数据添加创建时间或更新时间的字段,根据设定的时间阈值来判断数据是否过期。例如,一个电商网站可能会将 30 天前的订单标记为过期。

2.基于数据的使用频率:如果某些数据长时间未被访问或使用,就将其视为过期。比如缓存中的数据,若长时间未被请求,就会被清除。

3.基于数据的重要性或业务规则:例如金融交易数据可能需要保留一定年限,超过这个年限则过期。

4.容量限制:当存储容量达到上限时,按照一定规则删除较旧或不太重要的数据。比如日志数据,当存储空间满时,删除最早的部分日志。

2: Memcached 缓存机制

其缓存机制具有以下几个关键特点:
1. 基于内存存储: 数据直接存储在内存中,这使得数据的读取和写入速度极快,能够显著提高应用程序的性能。例如,对于频繁访问但数据变动不频繁的用户信息、配置数据等,Memcached 能够快速响应请求。
2. 键值对存储: 以简单的键值对形式存储数据。键作为数据的唯一标识符,值则是实际存储的数据。这种简单的数据结构易于管理和操作。
3. 分布式架构: 可以在多个服务器上部署,通过分布式算法将数据均匀分布在不同的节点上,从而实现横向扩展,提高缓存的容量和性能。
4. 过期策略: 支持为每个缓存项设置过期时间。当时间到达后,相应的缓存项会被自动删除,以释放内存空间。
5. 数据一致性: Memcached 本身不保证数据的一致性。在数据更新时,需要在应用层处理数据同步的逻辑。
6. 缓存淘汰策略: 当内存不足时,会根据预先设定的淘汰策略删除一些缓存项,常见的策略如 LRU(最近最少使用)。

例如,在一个高并发的电商网站中,商品的热门分类信息可以存储在 Memcached 中,当用户频繁访问这些分类时,能够快速获取数据,而不必每次都从数据库读取,大大减轻了数据库的压力,提高了网站的响应速度。

在一个社交应用中,用户的最近登录时间等信息可以利用 Memcached 的缓存机制进行存储,以快速判断用户的活跃状态。

总之,Memcached 的缓存机制在提高系统性能、减轻数据库负载方面发挥着重要作用,但在使用时需要结合具体的业务需求和场景,合理配置和管理缓存。

3: Memcached 分布式

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

4:Memcached 路由算法

1. 求余数算法

基本原理是将 key 做哈希运算,得到一个整数,然后对 Memcached 服务器的数量进行求余数,根据余数来决定存储到哪个 Memcached 实例。

例如,有 4 台 Memcached 服务器,计算方式如下:

8 % 4 = 0,则数据存储到第 1 台服务器(余数从 0 开始计数);

7 % 4 = 3,则数据存储到第 4 台服务器;

6 % 4 = 2,则数据存储到第 3 台服务器;

5 % 4 = 1,则数据存储到第 2 台服务器。

这种算法的优点是能够使数据较为均匀地分布在每个 Memcached 服务器上。然而,它存在很大的缺点,一旦某个 Memcached 服务器宕机,或有新的 Memcached 服务器加入,就可能会找不到数据,导致严重的数据丢失。
2. 一致性哈希算法

一致性哈希算法通过一个叫作一致性哈希环的数据结构实现 key 到缓存服务器的哈希映射。具体算法过程为:先构造一个长度为 0 到 2^32 的整数环(即一致性哈希环),根据节点名称(通常是 IP)的哈希值(其分布范围同样为 0 到 2^32)将缓存服务器节点放置在这个哈希环上。然后根据需要缓存的数据的 key 值计算得到其哈希值(其分布范围也同样为 0 到 2^32),然后在哈希环上顺时针查找距离这个 key 的哈希值最近的缓存服务器节点,完成 key 到服务器的哈希映射查找。

当缓存服务器集群需要扩容时,只需要将新加入的节点名称的哈希值放入一致性哈希环中。由于 key 是顺时针查找距离其最近的节点,因此新加入的节点只影响整个环中的一小段。这样能保证大部分被缓存的数据还可以继续命中,例如 3 台服务器扩容至 4 台服务器,可以继续命中原有缓存数据的概率是 75%,远高于余数哈希算法的 25%,而且随着集群规模越大,继续命中原有缓存数据的概率也逐渐增大。

Memcached 实现主主复制和高可用的方式

Memcached 主主复制架构

1:安装带有复制功能的 Memcached

安装 Libevent

复制代码
systemctl stop firewalld
setenforce 0
yum -y install gcc* psmisc

安装memcached-1.2.8-repcached

复制代码
[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/libevent

[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

#修改成如下所示:(删掉上面红色的两行)
/* FreeBSD 4.x doesn't have IOV_MAX exposed. */
#ifndef IOV_MAX
# define IOV_MAX 1024
#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 -antp |grep memcached
tcp        0      0 0.0.0.0:11211           0.0.0.0:*               LISTEN      52646memcached     
tcp        0      0 192.168.10.101:11212    192.168.10.102:38298    ESTABLISHED 52646memcached     
tcp6       0      0 :::11211                :::*                    LISTEN      52646memcached 

[root@memcache2 ~]# netstat -antp |grep memcached
tcp        0      0 0.0.0.0:11211           0.0.0.0:*               LISTEN      29976memcached     
tcp        0      0 192.168.10.102:38298    192.168.10.101:11212    ESTABLISHED 29976memcached     
tcp6       0      0 :::11211                :::*                    LISTEN      29976memcached 
使用 telnet 进行简单验证复制功能

在 Memcached1 上插入一条具有特点的键值

复制代码
[root@memcache1 ~]# yum -y install telnet
[root@memcache1 ~]# telnet 192.168.10.102 11211
set username 0 0 8    #自定义信息+永不过期+8个字节
12345678
STORED
get username
VALUE username 0 8
12345678
END
quit

在 Memcached2 上进行查看刚刚插入的键值

复制代码
[root@localhost ~]# telnet 192.168.10.101 11211
Trying 192.168.10.101...
Connected to 192.168.10.101.
Escape character is '^]'.
get username
VALUE username 0 8
zhangsan
END

Memcached 主主复制+Keepalived 高可用架构

安装配置 keepalived (两台主机都安装)

复制代码
[root@memcache1 ~]# yum -y install keepalived

配置主 keepalived

复制代码
[root@memcache1 ~]# vim /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_01
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script check_down {     ##定义要执行的脚本
script "/etc/keepalived/memcached.sh"		##脚本路径和名称
interval 1		##间隔1秒执行一次
}


vrrp_instance VI_1 {
    state BACKUP      ##master角色不能设置nopreempt,所以此处要设置为BACKUP
    interface ens33
    virtual_router_id 51
    priority 100    ##从主机的优先级要小于此数字
advert_int 1
nopreempt		##添加,此语句关闭了抢占功能,从主机不需要
    authentication {
        auth_type PASS
        auth_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 ]; then
       systemctl stop keepalived
fi

[root@memcached1 keepalived]# chmod +x /etc/keepalived/memcached.sh

配置从keepalived

复制代码
[root@memcache2 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_02
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script check_down {     ##定义要执行的脚本
script "/etc/keepalived/memcached.sh"		##脚本路径和名称
interval 1		##间隔1秒执行一次
}


vrrp_instance VI_1 {
    state BACKUP      
    interface ens33
    virtual_router_id 51
    priority 99    ##从主机的优先级要小于此数字
advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.100
}

track_script {		##调用前面的脚本
 check_down
}

}



[root@memcached2 keepalived]# 	

#!/bin/bash
#
if [ $(ps -C memcached --no-header | wc -l) -eq 0 ]; then
       systemctl stop keepalived
fi

[root@memcached2 keepalived]# chmod +x /etc/keepalived/memcached.sh

测试验证

在两台服务器上启动keepalived

复制代码
[root@Memcached1 ~]# systemctl start keepalived 
[root@memcached2 ~]# systemctl start 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; 
?> 

pkill memcached

检查当前主机的memceched进程和keepalived进程,

关闭memcached后,该主机的keepalived也会被脚本关闭,于是VIP就漂移到了另一台主机,待此主机修好后,把memcached和keepalived开启,由于设置了不抢占,VIP不会抢占回来,但是把第二台主机的memcached关闭后,第二台主机的keepalived也会关闭,于是VIP就漂移回了第一台主机。完成故障的转移。

相关推荐
段帅龙呀6 小时前
Redis构建缓存服务器
服务器·redis·缓存
夜斗小神社21 小时前
【黑马点评】(二)缓存
缓存
Hello.Reader1 天前
Redis 延迟监控深度指南
数据库·redis·缓存
Hello.Reader1 天前
Redis 延迟排查与优化全攻略
数据库·redis·缓存
在肯德基吃麻辣烫2 天前
《Redis》缓存与分布式锁
redis·分布式·缓存
先睡2 天前
Redis的缓存击穿和缓存雪崩
redis·spring·缓存
CodeWithMe3 天前
【Note】《深入理解Linux内核》 Chapter 15 :深入理解 Linux 页缓存
linux·spring·缓存
大春儿的试验田3 天前
高并发收藏功能设计:Redis异步同步与定时补偿机制详解
java·数据库·redis·学习·缓存
likeGhee3 天前
python缓存装饰器实现方案
开发语言·python·缓存
C182981825753 天前
OOM电商系统订单缓存泄漏,这是泄漏还是溢出
java·spring·缓存