目录
在分布式/群集redis/memcached/kafka/hadoop/mycat中使用到的一致性Hash算法
一.memcached的详述
memcached的定义
- memcache是一套分布式的高速缓存系统,由LiveJournal的Bard Fitzpartrick开发,但目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度,提升效果十分显著。memcache是一套开放源代码软件,以BSD license授权发布的
- 以下是memcache官网(http://memcached.org/)
memcached的工作方式
- 工作流程:先检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作,如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份memcached中(memcache客户端不负责,需要程序明确实现);每次更新数据库的同时更新memcached中的数据,保持一致性;当分配给memcached内存空间用完之后,会使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效策略首先被替换,然后再替换掉最近未使用的数据
memcached的特点
- memcached本质上是一个内存key-value缓存,它通过减轻数据库负载加速动态web应用。
- memcached不支持数据的持久化,服务器关闭之后数据全部丢失。
- memcached协议简单,使用的是基于文本行的协议。
- memcached是多线程工作,redis是单线程工作,各个memcached服务器之间互不通信,各自独立存取数据,不共享任何信息
- memcached服务器不具有分布式功能,分布式部署取决于memcache客户端
- memcached用lazy expiration(懒淘汰)实现key过期
- memcached通过提前分配内存保证运行性能,很少出现内存碎片
- memcached使用非阻塞IO服用网络模型,目的是提高数据吞吐量
- memecached使用listen/work的多线程模型,优点是能够充分利用多核,但是会带来一些锁冲突
memcached为什么不支持持久化,不支持复杂数据结构?
业务决定技术方案,memcached以“以服务的方式,而不是库的方式管理KV内存”,为设计目标,它与其他缓存数据库不一样的是KV内存管理组件库,持久化和复杂数据结构并不是它的初衷
memcached的使用场景
- 数据查询缓存:将数据库的数据加载到memcached,提供程序的访问速度
- 计数器的场景:通过incr/decr命令实现评论数量、点击数统计、操作次数等场景
- 乐观锁实现:例如计划任务多实例部署的场景,通过CAS实现不重复执行
- 防重复处理命令:CAS命令
集群和分布式的区别:集群可以在单机或者多台机子上部署多个相同配置的服务;分布式在多台机子上部署多个不同服务
在分布式/群集redis/memcached/kafka/hadoop/mycat中使用到的一致性Hash算法
- 在集群增加或者减少机器的时候,如果用hash算法就会出现大面积缓存不足的情况,造成数据库服务器崩溃,所以此时出现了一致性hash算法。将数据存放在hash取模之后的一个节点,但是一致性hash算法无法解决负载均衡的问题,因为数据本身就是不均衡的。所以加强版本是增加虚拟节点,原因是虚拟节点越多,则数据尽可能均匀。但是虚拟节点是需要维护的,数量也有上限(2^32)。一致性hash算法是无法完全达到均匀数据的。
二.部署memcached
网络拓扑图
- memcached服务器提供缓存数据库,在LAMP架构主机上安装memcache,memcache提供API接口,在LAMP上的php上调用这个接口,把数据缓存在memcached
环境配置
主机名 | IP地址 | 系统 | 软件包 |
memcached | 192.168.43.101 | centos7 | libevent-2.1.8-stable.tar.gz memcached-1.5.6.tar.gz |
lamp | 192.168.43.102 | centos7 | memcached-1.5.6.tar.gz httpd-2.4.29.tar.bz2 apr-1.6.2.tar.gz apr-util-1.6.0.tar.gz mysql-5.6.26.tar.gz php-5.6.11.tar.bz2 |
配置memcached服务器
- 配置主机名
hostnamectl set-hostname memcached
- 安装事件通知库,libevent(可在memcached官网上下载)
-
##解压数据包
-
tar xzvf libevent-2.1.8-stable.tar.gz -C /opt
-
cd /opt/libevent-2.1.8
-
##安装环境包
-
yum install -y gcc gcc-c++ make
-
##编译、安装libevent
-
./configure --prefix=/usr/
local/libevent
-
make && make install
由于memcached安装依赖于libevent,所以必须先安装libevent
- 安装memcahed
-
##解压软件包
-
tar xzvf memcached-1.5.6.tar.gz -C /opt
-
##手工编译安装
-
cd /opt/memcached-1.5.6/
-
./configure --prefix=/usr/
local/memcached --with-libevent=/usr/
local/libevent
-
make && make install
-
-
##优化memcached的执行文件
-
ln -s /usr/
local/memcached/bin/* /usr/
local/bin
-
-
##开启memcached服务
-
## -d守护进程;-m指定缓存大小;-p指定端口;-u指定用户
-
memcached -d -m 32m -p 11211 -u root
-
-
##验证进程是否开启
-
netstat -natp | grep 11211
-
[root@memcahced ~]
# netstat -natp | grep 11211
-
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 45004/memcached
-
tcp6 0 0 :::11211 :::* LISTEN 45004/memcached
-
[root@memcahced ~]
#
-
-
##关闭防火墙和SElinux功能
-
systemctl stop firewalld.service
-
setenforce 0
-
-
##使用telnet连接memcached数据库
-
##查看是否存在telnet功能
-
rpm -q telnet
-
yum install telnet -y
-
-
##连接数据库
-
[root@memcahced ~]
# telnet 192.168.43.101 11211
-
Trying 192.168.43.101...
-
Connected to 192.168.43.101.
-
Escape character is
'^]'.
-
- memcached缓存数据库的命令操作
分组 | 命令 | 描述 |
存储命令 | set | 用于将value存储在指定的key中。key已经存在,则更新该key所对应的原来的数据 |
add | 用于将value存储在指定的key中,存在则不更新 | |
replace | 替换已存在的key的value,不存在,则替换失败 | |
append | 命令用于向已经存在key的value后面追加数据 | |
prepend | 向已存在的key的value前面追加数据 | |
cas | 比较和替换,对比后,没有被其他用户修改的情况下才能写入 | |
检索命令 | get | 获取存储在key中的value,不存在,则返回空 |
gets | 获取带有CAS令牌存的value,若key不存在,则返回为空 | |
删除 | delete | 删除已存在的key |
计算 | incr/decr | 对已经存在的key的数据值进行自增或自减操作 |
统计 | stats | 返回统计信息例如PID、版本号、连接数等 |
stats items | 显示各个slab中item的数目和存储时长(最后一次访问距离现在的秒数) | |
stats sizes | 显示所有item的大小和个数 | |
stats slabs | 显示各个slab的信息,包括chunk的大小、数目、使用情况等 |
|
清除 | flush_all | 清除所有内容 |
配置LAMP和memcache
- 修改主机名
hostnamectl set-hostname lamp
- 配置LAMP架构(手工编译),具体配置访问 https://blog.csdn.net/qq_42761527/article/details/103494977
- 配置memcache
-
##解压memcache软件包
-
tar xzvf memcache-2.2.7.tgz -C /opt
-
-
##手工编译安装
-
cd /optmemcache-2.2.7/
-
##由于没有执行脚本文件,所以执行下列命令,生成configure
-
/usr/
local/php5/bin/phpize
-
##配置,开启memeche,增加PHP模块
-
./configure --
enable-memcache --with-php-config=/usr/
local/php5/bin/php-config
-
make && make install
-
-
vim /usr/
local/php5/php.ini
-
-
##找出一处位置增加
-
extension_dir =
"/usr/local/php5/lib/php/extensions/no-debug-zts-20131226/"
-
##指向memcache模块
-
extension = memcache.so
-
-
##编辑php测试页面
-
vim /usr/
local/httpd/htdocs/index.php
-
<?php
-
$memcache = new Memcache();
-
$memcache->connect(
'192.168.43.101',11211);
-
$memcache->
set(
'key',
'Memcache test Successful',0,60);
-
$result =
$memcache->get(
'key');
-
unset(
$memcache);
-
echo
$result;
-
?>
-
~
-
-
##重启httpd服务
-
service httpd stop
-
service httpd start
-
验证配置
- 出现如下画面则,说明部署成功
注:在mecache上关闭防火墙、SElinux功能
转载:https://blog.csdn.net/qq_42761527/article/details/104309886
查看评论