数据存储方式多种多样,以下为常见的几种:
1.关系型数据库:如 MySQL、Oracle 等,通过表格形式组织数据,具有严格的数据结构和关系约束,适用于结构化数据的存储和管理。例如企业的财务数据、员工信息等。
3.非关系型数据库:包括 MongoDB、Cassandra 等,采用灵活的数据模型,如文档型、键值对型等,能够处理大规模和高并发的数据读写。像社交媒体平台上的用户动态、评论等数据适合用此类方式存储。
4.文件系统:直接将数据存储为文件,如文本文件、二进制文件等。常用于存储图片、音频、视频等大型文件。
分布式存储系统:如 Hadoop 的 HDFS,能够在多个节点上分布存储数据,实现大规模数据的可靠存储和高效访问。
数据过期方式
数据过期方式通常取决于数据的性质、业务需求和存储策略。常见的有以下几种:
1.基于时间戳:为数据添加创建时间或更新时间的字段,根据设定的时间阈值来判断数据是否过期。例如,一个电商网站可能会将 30 天前的订单标记为过期。
2.基于数据的使用频率:如果某些数据长时间未被访问或使用,就将其视为过期。比如缓存中的数据,若长时间未被请求,就会被清除。
3.基于数据的重要性或业务规则:例如金融交易数据可能需要保留一定年限,超过这个年限则过期。
4.容量限制:当存储容量达到上限时,按照一定规则删除较旧或不太重要的数据。比如日志数据,当存储空间满时,删除最早的部分日志。
其缓存机制具有以下几个关键特点:
1. 基于内存存储:数据直接存储在内存中,这使得数据的读取和写入速度极快,能够显著提高应用程序的性能。例如,对于频繁访问但数据变动不频繁的用户信息、配置数据等,Memcached 能够快速响应请求。
2. 键值对存储:以简单的键值对形式存储数据。键作为数据的唯一标识符,值则是实际存储的数据。这种简单的数据结构易于管理和操作。
3. 分布式架构:可以在多个服务器上部署,通过分布式算法将数据均匀分布在不同的节点上,从而实现横向扩展,提高缓存的容量和性能。
4. 过期策略:支持为每个缓存项设置过期时间。当时间到达后,相应的缓存项会被自动删除,以释放内存空间。
5. 数据一致性:Memcached 本身不保证数据的一致性。在数据更新时,需要在应用层处理数据同步的逻辑。
6. 缓存淘汰策略:当内存不足时,会根据预先设定的淘汰策略删除一些缓存项,常见的策略如 LRU(最近最少使用)。
例如,在一个高并发的电商网站中,商品的热门分类信息可以存储在 Memcached 中,当用户频繁访问这些分类时,能够快速获取数据,而不必每次都从数据库读取,大大减轻了数据库的压力,提高了网站的响应速度。
在一个社交应用中,用户的最近登录时间等信息可以利用 Memcached 的缓存机制进行存储,以快速判断用户的活跃状态。
总之,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 主主复制架构
安装 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
在 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 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就漂移回了第一台主机。完成故障的转移。