Memcache是一套开源,高性能的分布式的内存对象缓存系统,目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著 。
Memcache将所有数据存储在内存中,并在内存里维护一个统一的巨大的Hash表,它能存储任意类型的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。
首先讨论一个问题:这个问题在大并发,高负载的网站中必须考虑!如何让速度更快。
解决方案:
传统的RDBMS
页面静态化
MemCached缓存技术
基于Memcached的网站架构
简单的说: memcached就是在内存中维护一张巨大的hash表,通过自己的一套路由算法来维护数据的操作。
每次先分配一个Slab,相当于一个page,大小1M。
然后在1M的空间里根据内容再划分相同大小的chunk
优点是:最大限度的利用内存,避免产生内存碎片
缺点是:会造成内存的浪费
懒过期方式(Lazy Expiration):
memcached内部不监视数据是否过期,而是get时查看记录时间,检查是否已经过期,这叫惰性过期。
LRU算法:采用最近最少使用算法淘汰内存中的数据
yum install gcc
上传libevent安装包至software目录
确认是否已经安装,并删除旧版本
rpm -qa | grep libevent
rpm -e libevent-1.4.13-4.el6.i686 --nodeps
解压至software目录下
tar -zxvf ./libevent-2.0.21-stable.tar.gz ./
安装至目录/opt/module
下
进入解压后的libevent目录下
依次执行如下命令
./configure --prefix=/opt/module/libevent-2.0.21
make
make install
上传MemCached安装包至software目录
解压至software目录下
tar -zxvf ./memcached-1.4.25.tar.gz ./
进入解压后的memcached目录
执行如下代码
./configure --prefix=/opt/module/memcached-1.4.25 --with-libevent=/opt/module/libevent-2.0.21
注:上述代码中第一个路径需要指定你的MemCached安装位置,第二个指定libevent的安装路径
接着依次执行
make
make install
./memcached -u root -d -m 128
-p:指定端口 默认:11211
-u:指定用户名(root用户必须使用该选项)
-m:分配的内存,默认:64M
-c:最大并发连接,默认1024
-d:启动一个守护进程
安装过程中出现的报错问题:
error while loading shared libraries: libevent-2.0.so.5: cannot open shared obje
解决方法:
whereis libevent-2.0.so.5
查看libevent-2.0.so.5
的位置所在
[root@bigdata111 bin]### whereis libevent-2.0.so.5
libevent-2.0.so: /usr/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5
注:这是已经解决完问题时候的。解决之前是另外一个路径
ldd /opt/module/memcached-1.4.25
,检查memcached的情况[root@bigdata111 memcached-1.4.25]### ldd /opt/module/memcached-1.4.25/bin/memcached
linux-vdso.so.1 => (0x00007ffd5d5b8000)
libevent-2.0.so.5 => not found
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fe6f9b2e000)
libc.so.6 => /lib64/libc.so.6 (0x00007fe6f9760000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe6f9f91000)
注意:libevent-2.0.so.5 所在这一行是not found
LD_DEBUG=libs /opt/module/memcached-1.4.25/bin/memcached -v
找到memcached 运行时找libevent的路径
[root@bigdata111 bin]### LD_DEBUG=libs /opt/module/memcached-1.4.25/bin/memcached -v
21478: find library=libevent-2.0.so.5 [0]; searching
21478: search cache=/etc/ld.so.cache
21478: search path=/lib64/tls/x86_64:/lib64/tls:/lib64/x86_64:/lib64:/usr/lib64/tls/x86_64:/usr/lib64/tls:/usr/lib64/x86_64:/usr/lib64 (system search path)
21478: trying file=/lib64/tls/x86_64/libevent-2.0.so.5
21478: trying file=/lib64/tls/libevent-2.0.so.5
21478: trying file=/lib64/x86_64/libevent-2.0.so.5
21478: trying file=/lib64/libevent-2.0.so.5
21478: trying file=/usr/lib64/tls/x86_64/libevent-2.0.so.5
21478: trying file=/usr/lib64/tls/libevent-2.0.so.5
21478: trying file=/usr/lib64/x86_64/libevent-2.0.so.5
21478: trying file=/usr/lib64/libevent-2.0.so.5
21478:
./memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
至此,问题已找到,是因为 libevent-2.0.so.5没有在memcached运行时默认去找的地方
error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
翻译:
加载共享库时出错:libevent-2.0.so.5:无法打开共享库文件:没有这样的文件或目录
opt/module/libevent-2.0.21/lib/
下的libevent-2.0.so.5
软连接到/usr/lib64/
即可。[root@bigdata111 bin]### ln -s /opt/module/libevent-2.0.21/lib/libevent-2.0.so.5 /usr/lib64/
注:可能版本不同,有些是lib64
目录,有些是lib
目录,具体需要看你第三步的路径显示的是哪一个
telnet 127.0.0.1 11211
add key1 0 0 4
abcd
STORED
注:第三行不需要自己输入,会自己出来
参数解释:
add key1 0 0 4
key1 key的名称
第一个0 标志位 不用关心
第二个0 数据过期时间,0表示不过期
4 表示 value的长度
get key1
VALUE key1 0 4
abcd
END
统计信息的命令:
stats 统计当前Memcached状态
stats items 保存的数据信息
stats slabs
import net.spy.memcached.MemcachedClient;
import java.io.IOException;
import java.io.Serializable;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Future;
/**
* Created by root on 2019/9/6.
*/
public class Demo1 {
public static void main(String[] args) throws Exception {
d();
}
// 插入数据
public static void a() throws Exception {
//建立MemcachedClient实例
MemcachedClient client = new MemcachedClient(new InetSocketAddress("192.168.109.133",11211));
Future<Boolean> f = client.set("key2",10,"Hello World");
if (f.get().booleanValue()){
client.shutdown();
}
}
// 查询数据
public static void b() throws Exception {
//建立MemcachedClient实例
MemcachedClient client = new MemcachedClient(new InetSocketAddress("192.168.109.133",11211));
Object object = client.get("key1");
System.out.println("取到的值是: " + object);
client.shutdown();
}
public static void c() throws Exception {
//建立MemcachedClient实例
MemcachedClient client = new MemcachedClient(new InetSocketAddress("192.168.109.133",11211));
Future<Boolean> f = client.set("key3",0,new Student());
if (f.get().booleanValue()){
client.shutdown();
}
}
// 基于客户端的分布式插入数据
public static void d() throws Exception {
//建立MemcachedClient实例
List<InetSocketAddress> list = new ArrayList<>();
list.add(new InetSocketAddress("192.168.109.133",11211));
list.add(new InetSocketAddress("192.168.109.133",11212));
list.add(new InetSocketAddress("192.168.109.133",11213));
MemcachedClient client = new MemcachedClient(list);
for (int i = 0; i<20;i++){
System.out.println("插入数据:" + i);
client.set("key"+i,0,"value"+i);
Thread.sleep(1000);
}
client.shutdown();
}
}
class Student implements Serializable{}
用key做hash运算得到一个整数,根据余数路由。
例如:服务器端有三台MemCached服务器
根据key,做hash运算
7%3=1,那么就路由到第2台服务器。
6%3=0,那么路由到第1台服务器
5%3=2,那么路由到第3台服务器
优点:数据分布均衡在多台服务器中,适合大多数据需求。
缺点:如果需要扩容或者有宕机的情况,会造成数据的丢失。
基本原理
一致性hash算法下扩容
down机
安装具有复制功能的MemCached版本
上传至software目录,解压至software目录
tar -zxvf memcached-1.2.8-repcached-2.2.tar.gz -C ./
./configure --prefix=/opt/module/memcached-1.2.8-repcached
--with-libevent=/opt/module/libevent-2.0.21/ --enable-replication
注意:
第一个目录依旧是你需要安装的目录
第二个目录是之前安装的libevent目录
默认memcached单个进程只支持到2G内存,需要更大内存支持的话,需要打开64位支持,编译的时候加参数:--enable-64bit
,由于我们只是用于学习,所以不需要那么大内存
编译的目录依旧是software下你解压的目录
make
make install
注意:此时会报错
make all-recursive
make[1]: Entering directory `/usr/local/memcached'
Making all in doc
make[2]: Entering directory `/usr/local/memcached/doc'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/usr/local/memcached/doc'
make[2]: Entering directory `/usr/local/memcached'
gcc -DHAVE_CONFIG_H -I. -DNDEBUG -m64 -g -O2 -MT memcached-memcached.o -MD
MP -MF .deps/memcached-memcached.Tpo -c -o memcached-memcached.o `test -f
memcached.c' || echo './'`memcached.c
memcached.c: In function ‘add_iov’:
memcached.c:697: error: ‘IOV_MAX’ undeclared (first use in this function)
memcached.c:697: error: (Each undeclared identifier is reported only once
memcached.c:697: error: for each function it appears in.)
make[2]: *** [memcached-memcached.o] Error 1
make[2]: Leaving directory `/usr/local/memcached'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/usr/local/memcached'
make: *** [all] Error 2
解决办法:
编辑解压后目录下的memcached.c
文件
将下下面的几行进行修改
/* 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
make
make install
启动第一台MemCached,使用-x指定对端服务器的地址
./memcached -d -u root -m 128 -x 192.168.64.129
启动第二台MemCached,使用-x指定对端服务器的地址
./memcached -d -u root -m 128 -x 192.168.64.130
Keepalived是一个交换机制的软件。Keepalived的作用是检测服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
利用Keepalived实现MemCached的主主复制高可用架构:
Keepalived在memcached主服务器产生一个虚拟IP(VIP)
Keepalived可以通过不断的检测memcached主服务器的11211端口是否正常工作,
如果发现memcached Down机,虚拟IP就从主服务器移到从服务器
暂不需要搭建。
内容来源于网络,如有侵权,请联系作者删除!