8_企业架构缓存中间件分布式memcached

news2024/11/25 6:46:35

企业架构缓存中间件分布式memcached

学习目标和内容

1、能够理解描述网站业务访问流程

2、能够理解网站业务的优化方向

3、能够描述内存缓存软件Memcached的作用

4、能够通过命令行操作Memcached

5、能够操作安装php的memcached扩展 extension

6、能够实现session存储到memcached的案例

7、能够实现启动memcached多实例

一、大型网站优化

1、网站访问流程

随着网站迭代开发,访问会变慢

LNMP架构中网站应用访问流程

浏览器(app)=>web服务器=>后端服务(php)=>数据库(mysql)

访问流程越多,访问速度和出现问题的几率也越大

优化访问速度,就需要减少访问步骤或者提高单步骤的速度

2、如何优化

根据网页的访问流程,可以进行以下优化:

①提高web服务器并发 负载均衡(多台服务器架构) nginx

②页面静态化 把经常访问,但是数据不经常发生变动的动态页面,制作为静态页面

③内存缓存优化 把经常访问的数据,加载到内存中使用

④数据库优化 很多时候,还需要取数据库信息,所以优化数据库本身

二、背景描述及其方案设计

1、业务背景描述

时间:2016.6.-2016.9

发布产品类型:互联⽹动态站点 商城

⽤户数量: 10000-12000(⽤户量猛增)

PV : 100000-500000(24⼩时访问次数总和)

QPS: 50-100*(每秒访问次数)

DAU: 2000(每⽇活跃⽤户数)

随着业务量增加,访问量越来越大,用户在访问某些页面数据时,通过慢查询日志发现慢查询SQL,经过优化之后效果还是不够明显。而此类数据发生变动的频率又较小,故提出使用缓存中间件(一般会将数据存储到内存中)的方式,降低MySQL的读压力,提高整个业务架构集群的稳定和快速响应能力

2、模拟运维设计方案

根据以上业务需求,准备加入缓存中间件服务器

根据以上业务需求和方案,服务器架构升级为如下示意图

在本次业务架构中,使用缓存中间件解决以下两个问题:

①session共享

②缓存热点数据,首页面的分类信息

三、memcached介绍和安装启动

1、介绍

memory cache cache in memory 缓存放入内存中

Memcached 是国外 社区 网站 LiveJournal 的开发团队开发的 ==高性能的分布式内存缓存服务器==。一般的使用目的是,通过==缓存数据库查询结果,减少数据库访问次数==,以==提高动态 Web 应用的速度==、提高可扩展性

关于缓存的过期,有效期问题,由业务编程代码实现

2、安装启动软件

官方网址:memcached - a distributed memory object caching system

①上传软件到服务器

软件包名称memcached-1.5.8.tar.gz

②解压并编译安装

#memcache依赖libevent  安装libevent-devel解决
shell > yum -y install libevent-devel
#编译安装memcached
shell > tar xvf memcached-1.5.8.tar.gz
shell > cd memcached-1.5.8
shell > ./configure --prefix=/usr/local/memcached
shell > make && make install

③查看软件启动参数,并启动

shell > cd /usr/local/memcached/bin
shell > ./memcached -h

-p是设置Memcache监听的端口,最好是1024以上的端口;

-d是启动一个守护进程;

-m是分配给Memcache使用的内存数量,单位是MB;

-u是运行Memcache的用户;

-l是监听的服务器IP地址,可以有多个地址;

-c是最大运行的并发连接数,默认是1024;

-P是设置保存Memcache的pid文件

启动memcached

#进入memcached文件目录
shell > cd /usr/local/memcached/bin
#后台启动memcached  可以创建一个普通用户(memcached)  用来启动管理memcached软件
shell > ./memcached -uroot -d
#进程查看是否启动成功
shell > ps aux |grep memcached

#四、memcached使用

1、命令行连接和操作

1.1、telnet连接使用

memcached默认使用启动服务占用tcp 11211端口。可以通过telnet进行连接使用。

#安装telnet客户端
shell > yum -y install telnet
#通过telnet连接11211端口
shell > telnet 127.0.0.1 11211
#连接之后敲击多次,如果看到error,即为连接成功
#显示error的原因是,没有输入命令,所以memcached服务器回复error

1.2、存储命令

语法:set

set 命令用于将 value(数据值) 存储在指定的 key(键) 中

如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用 devops

set key flag exptime bytes

value

flag 服务端提供的一个标识,默认没什么意义,默认可以传个0,这个标识是为了编程语言一个状态,例如:flag(0,1) 代表是否采用压缩机制 0代表不压缩,1代表压缩

bytes 字节 计算机存储的最小单位 KB MB GB TB BB YB ZB

语法:add

add 命令用于将 value(数据值) 存储在指定的 key(键) 中

如果 add 的 key 已经存在,则不会更新数据(过期的 key 会更新),之前的值将仍然保持相同,并且您将获得响应 NOT_STORED

add key flag exptime bytes

value

语法:replace

replace 命令用于替换已存在的 key(键) 的 value(数据值)

如果 key 不存在,则替换失败,并且您将获得响应 NOT_STORED

replace key flag exptime bytes

value

语法:append

append 命令用于向已存在 key(键) 的 value(数据值) 后面追加数据

append key flag exptime bytes

value

语法:prepend

prepend 命令用于向已存在 key(键) 的 value(数据值) 前面追加数据

prepend key exptime bytes value

###1.3、删除命令

语法:delete

delete 命令用于删除已存在的 key(键)

delete key

语法:flush_all

注意此命令,在业务线上环境禁止执行。如果执行,可能会造成所有缓存清空不存在,所有的数据请求都直接到了数据库服务器。造成数据库压力瞬间变大。数据库宕机。

flush_all 命令用于清理缓存中的所有 key=>value(键=>值) 对

该命令提供了一个可选参数 time,用于在制定的时间后执行清理缓存操作

flush_all [time]

1.4、查找和计算命令

语法:get

get 命令获取存储在 key(键) 中的 value(数据值) ,如果 key 不存在,则返回空

get key1 key2 key3

语法:incr(相加)/decr(相减)

计数器 每做一次操作 +1

incr 与 decr 命令用于对已存在的 key(键) 的数字值进行自增或自减操作

incr 与 decr 命令操作的数据必须是十进制的32位无符号整数

incr key value

decr key value

1.5、统计状态命令

语法:stats

stats 命令用于返回统计信息例如 PID(进程号)、版本号、连接数等

stats

stats的参数参考

pid: memcache服务器进程ID

uptime:服务器已运行秒数

time:服务器当前Unix时间戳

启动时间: time-uptime

version:memcache版本

pointer_size:操作系统指针大小

rusage_user:进程累计用户时间

rusage_system:进程累计系统时间

curr_connections:当前连接数量

total_connections:Memcached运行以来连接总数

connection_structures:Memcached分配的连接结构数量

cmd_get:get命令请求次数

cmd_set:set命令请求次数

cmd_flush:flush命令请求次数

get_hits:get命令命中次数

get_misses:get命令未命中次数

delete_misses:delete命令未命中次数

delete_hits:delete命令命中次数

incr_misses:incr命令未命中次数

incr_hits:incr命令命中次数

decr_misses:decr命令未命中次数

decr_hits:decr命令命中次数

cas_misses:cas命令未命中次数

cas_hits:cas命令命中次数

cas_badval:使用擦拭次数

auth_cmds:认证命令处理的次数

auth_errors:认证失败数目

bytes_read:读取总字节数

bytes_written:发送总字节数

limit_maxbytes:分配的内存总大小(字节)

accepting_conns:服务器是否达到过最大连接(0/1)

listen_disabled_num:失效的监听数

threads:当前线程数

conn_yields:连接操作主动放弃数目

bytes:当前存储占用的字节数

curr_items:当前存储的数据总数

total_items:启动以来存储的数据总数

evictions:LRU释放的对象数目

reclaimed:已过期的数据条目来存储新数据的数目

缓存命中率:命中数(get获取到数据)/获取次数(get的次数)

get_hits/cmd_get,如果命中率低,业务代码缓存有问题,命中率为0,缓存没有起作用

==缓存穿透==

访问的数据,数据库不存在的数据,每次都不能够生成缓存,每次请求都直接访问数据库,穿透了缓存,缓存没有起到作用。数据库压力没有得到缓解。

解决方案,数据库查不到的,也做一个空缓存。

==缓存雪崩==

缓存具有失效时间,如果缓存失效时间都是一样,本来应该请求缓存的,但是因为缓存失效了,全部请求到了数据库,数据库压力剧增,可能会造成数据库宕机,进而造成系统崩溃。

解决方案,设置缓存的失效时间均匀分布。

2、小工具

memcached_tool.php软件,可以查看memcached运行状态、key(item)的数量了、内存使用量等

需要php的运行环境

①上传memcached_tool.php到web服务器

上传到虚拟机主机可以访问的目录即可。

本次上传到了server01服务器的/usr/local/nginx/html/tp5shop/public下

②修改连接参数

shell > vim /usr/local/nginx/html/tp5shop/public/memcached_tool.php

示例配置

登录地址看实际的地址,演示用,软件脚本在server01上,memcached服务在server08上,所以地址应该填写memcached服务所在地址server08的IP(192.168.17.107)

③查看使用

3、失效机制(了解)

①如果key过期了,value会及时删除么,空间会及时清空么?

②如果分配的存储空间,写满了,还允许写么?

6.1 Lazy Expiration

memcached 内部不会监视记录是否过期,而是在 get时查看记录的时间戳,检查记录是否过期。这种技术被称为 lazy(惰性)expiration。因此,memcached 不会在过期监视上耗费 CPU 时间

比如php的里session机制 懒惰机制 php垃圾回收机制 gc回收 python 变量垃圾回收机制

编程语言中,变量分配 栈空间(变量名称) 堆空间(变量值)

==memcached1.4.25之后 就不是懒惰机制了。==

6.2 LRU

memcached 会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。顾名思义,这是删除“最近最少使用”的记录的机制。因此,当 memcached 的内存空间不足时,就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想

不过,有些情况下 LRU 机制反倒会造成麻烦。memcached 启动时通过“­M”参数可以禁止 LRU

#五、PHP使用memcached

1、PHP扩展安装

在LNMP架构中,如果需要使用到memcached。首先需要安装对应的扩展,php7以上需要安装memcached扩展。

官方扩展地址:PECL :: The PHP Extension Community Library

①上传PHP扩展源码包

==需要在web服务器的上安装扩展,server01和server03==

memcached-3.1.3.tgz php的扩展 依赖libmemcached1.x以上版本

yum 本地源的 libmemcached依赖版本太低,不能够满足php扩展的依赖需要,需要手动源码编译libmemcached

libmemcached-1.0.18.tar.gz 依赖

②解压编译安装

#1、解决libmemcached依赖
shell > tar xvf libmemcached-1.0.18.tar.gz
shell > cd libmemcached-1.0.18
shell > ./configure --prefix=/usr/local/libmemcached && make && make install
#2、源码编译php扩展
shell > tar xvf memcached-3.1.3.tgz
shell > cd memcached-3.1.3
#扩展源码包和php关联生成configure文件  
#如果执行找不到phpize,说明之前没有给php安装目录bin目录配置环境变量,重新配置即可
shell > phpize
#编译安装php的memcached扩展
shell > ./configure --with-libmemcached-dir=/usr/local/libmemcached --disable-memcached-sasl
shell > make && make install

编译完成生成的扩展文件

③在php.ini配置文件里开启

shell > vim /usr/local/php/etc/php.ini

==重启php-fpm服务==

④检测扩展

==方法一:php -m==

通过php -m调用查看php所加载的依赖模块

shell > php -m |grep memcached

==方法二:通过web页面访问phpinfo==

<?php
phpinfo();

编写一个页面,通过web访问

2、PHP测试连接代码

php代码测试使用memcached

示例代码

<?php
//实例化类
$mem = new memcached();
//调用连接memcached方法 注意连接地址和端口号
$mem->addServer('192.168.17.107',11211);
//存数据
var_dump($mem->set('name','lnmp'));
//取数据
var_dump($mem->get('name'));

四、企业案例实现

1、session入memcached共享

session共享:

分布式负载均衡架构中,web服务器间的session是不共享(默认session存储在本地的文件的),会造成session校验不一致。校验验证码不通过,登录之后session不一致,造成无法判断是否登录。

解决方案:

①session生成校验在同一台服务器 nginx调度算法 ip_hash

②session共享 多台web服务器可以调用到session

文档参考

①修改项目配置文件

server01和server03都需要修改,并且web服务器都要安装好memcached扩展

shell > vim /usr/local/nginx/html/tp5shop/application/config.php

修改完成之后,之后的请求所生成的session,就被写入到memcached中了。

②访问测试

在memcached中,session_id作为key,session的内容作为value进行存储。

都是在业务代码中实现,服务架构中,只要按需配置即可。

2、缓存热点数据

把经常访问到的数据,发生变动较小,可以存储到内存缓存中,提供使用速度

注意修改web服务器的文件时,一定要都修改web1和web2

①修改缓存数据

修改代码文件

shell > /usr/local/nginx/html/tp5shop/application/home/controller/Base.php

②修改项目缓存配置

shell > vim /usr/local/nginx/html/tp5shop/application

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1287765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法通关村第十七关-青铜挑战贪心算法思想

大家好我是苏麟 , 今天说说贪心算法 . 贪心思想很难用理论解释&#xff0c;本文我们先通过案例来感受一下贪心是如何解决问题的 大纲 难以理解的贪心算法贪心问题举例分发饼干柠檬水找零分发糖果 难以理解的贪心算法 贪心的思想非常不好解释&#xff0c;而且越使用权威的语言解…

idea利用spring框架整合thymeleaf展现数据库数据

idea初步利用thymeleaf展现列表 上一篇文章简单展现自己写的列表&#xff1b; 这篇文章连接mysql数据库实现数据库数据展现 主要三个文件 controller指定html界面 package com.example.appledemo.controller;import com.example.appledemo.mapper.UserMapper; import com.exam…

编程模拟支付宝能量产生过程--数据控制流

#模拟支付宝蚂蚁森林的能量产生过程 behavior_points { # 定义行为对应的积分"步行": 2,"生活缴费": 10,"线下支付": 5,"网络购票": 5,"共享单车": 10 }total_points 0 # 初始化总积分while True: # 开…

Qlik 成为网络犯罪的焦点

研究人员警告说&#xff0c;Cactus 勒索软件组织正在利用 Qlik Sense 数据可视化、探索和监控解决方案中的关键漏洞来获得对企业网络的初始访问权限。 今年八月下旬&#xff0c;Qlik Sense 开发人员 针对影响 Windows 版本平台的两个关键漏洞发布了补丁 。 其中一个漏洞 CVE-…

嵌入式硬件和软件哪个好?

嵌入式硬件和软件哪个好? 嵌入式软硬件工程师哪个更有前途呢?一起来看看。 嵌入式是分为软硬件工程师的&#xff0c;首先我们先来看看嵌入式硬件工程师吧! 嵌入式硬件开发工程师主要编写嵌入式系统硬件总体方案和详细方案&#xff0c;要求理解嵌入式系统架构&#xff0c;有一…

18、pytest中fixture的作用域

官方实例 # content of conftest.py import smtplib import pytestpytest.fixture(scope"module") def smtp_connection():return smtplib.SMTP("smtp.163.com",25,timeout5)# content of test_module.pydef test_ehlo(smtp_connection):response,msg sm…

百面嵌入式专栏(岗位分析)海康高级linux开发工程师分析

文章目录 一、岗位的介绍二、刨析2.1、掌握调试工具2.2、块设备相关知识 三、简历建议 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; &#x1f4e2;本篇我们将对海康高级linux开发工程师岗位进行分析 。 一、岗位的介绍 地点&#xff1a;上…

推荐一款Excel快速加载SQL的插件,方便又好用

如果告诉你只需要双击一下&#xff0c;SQL数据库中存放在表里面的数据&#xff0c;就能加载到你的Excel中&#xff0c;你想不想要&#xff1f; 今天给大家推荐一款好用的Excel插件&#xff0c;安装简单&#xff0c;使用方便&#xff0c;是经常使用SQL数据库的不二。 这款插件…

2D与3D图形的基本变换

1. 2d transformations 1.1缩放(Scaling) 其实这个转换非常简单&#xff0c;如图所示就是把x与y进行s倍的缩放&#xff0c;而我们图中的这个矩阵正好满足这一算法。 1.2镜像(Reflection) 这个镜像变换可以和上面的做类比&#xff0c;简单看一下就行。 1.3错切(Shearing) 当然…

【Vue】安装 vue-router 库报错 npm ERR! ERESOLVE unable to resolve dependency tree

问题描述 运行npm install vue-router&#xff0c;安装vue-router库&#xff0c;npm报错。 npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: my-project0.1.0 npm ERR! Found: vue2.7.15 npm ERR! node_mod…

Java数据结构之《最短路径》(难度系数100)

一、前言&#xff1a; 这是怀化学院的&#xff1a;Java数据结构中的一道难度偏难(偏难理解)的一道编程题(此方法为博主自己研究&#xff0c;问题基本解决&#xff0c;若有bug欢迎下方评论提出意见&#xff0c;我会第一时间改进代码&#xff0c;谢谢&#xff01;) 后面其他编程题…

「X」Embedding in NLP|Token 和 N-Gram、Bag-of-Words 模型释义

ChatGPT&#xff08;GPT-3.5&#xff09;和其他大型语言模型&#xff08;Pi、Claude、Bard 等&#xff09;凭何火爆全球&#xff1f;这些语言模型的运作原理是什么&#xff1f;为什么它们在所训练的任务上表现如此出色&#xff1f; 虽然没有人可以给出完整的答案&#xff0c;但…

Cannot find module ‘node:url‘报错处理

在运行vite搭建的项目时&#xff0c;遇到Cannot find module node:url’报错。具体错误如图所示&#xff1a; 造成以上问题的原因是node版本较低。Vite 需要 Node.js 版本 14.18&#xff0c;16。 解决方案&#xff1a; 上面是通过nvm切换高版本node。 再次执行运行命令&…

RPG项目01_层级设置

基于“RPG项目01_UI面板Game”&#xff0c; 找到狼人 添加组件&#xff0c;让狼人一定区域自动跟随主角进行攻击 解释&#xff1a;【烘培蓝色】因为如果什么都不做就会被烘培成蓝色对应的功能就是 可修改区域功能 当将区域设置成不可行走状态&#xff0c;则不为蓝色 烘培&…

如何选择一款安全可靠的跨网安全数据交换系统?

随着网络和数据安全的重视程度增加&#xff0c;为了有效地保护内部的核心数据资产&#xff0c;普遍会采用内外网隔离的策略。像国内的政府机构、金融、能源电力、航空航天、医院等关乎国计民生的行业和领域均已进行了网络的隔离&#xff0c;将内部划分成不同的网段&#xff0c;…

nodejs+vue+ElementUi酒店餐饮客房点餐管理系统

系统非功能需求&#xff0c;只能是为了满足客户需求之外的非功能性要求。系统需要具有数据完整性验证的功能&#xff0c;对界面上非法的数据和不完整的数据进行提示&#xff0c;不能直接保存到数据库中&#xff0c;造成不完整性因素。运行软件:vscode 前端nodejsvueElementUi 语…

RPG项目01_技能释放

基于“RPG项目01_新输入输出”&#xff0c; 修改脚本文件夹中的SkillBase脚本&#xff1a; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; //回复技能&#xff0c;魔法技能&#xff0c;物理技能…

linux 内核同步互斥技术之信号量

信号量 信号量允许多个进程同时进入临界区&#xff0c;大多数情况下只允许一个进程进入临界区&#xff0c;把信号量的计数值设置为 1&#xff0c;即二值信号量&#xff0c;这种信号量称为互斥信号量。可允许多个锁持有者。 和自旋锁相比&#xff0c;信号量适合保护比较长的临界…

PostgreSql HOT 技术

摘自唐成的《PostgreSQL修炼之道&#xff1a;从小工到专家&#xff08;第2版&#xff09;》。 一、概述 因为多版本的原因&#xff0c;当 PostgreSQL 中更新一行时&#xff0c;实际上原数据行并不会被删除&#xff0c;只是插入了一个新行。如果表上有索引&#xff0c;而更新的…

身份统一管理创新与优化 ——华为云OneAccess应用身份管理服务的2023年

2023年&#xff0c;随着云计算、物联网、人工智能等技术的快速发展&#xff0c;企业面临着数字化转型的巨大挑战与机遇。身份统一管理是企业数字化转型的基础&#xff0c;也是业务发展的关键。如何高效、安全、灵活地实现身份统一管理&#xff0c;成为企业亟待解决的首要课题。…