文档章节

nginx+php+memcache实现hash一致性memcache 集群

o
 osc_zfz9ur01
发布于 2018/12/17 12:40
字数 1002
阅读 17
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

我们工作中可能会遇到key-value数据库,如果我们面对的不止一台memcache服务器,而是很多台。那么现在就回出现一个问题:

当我们访问nginx服务器的时候,我们会判断memcache中是否有相应的值,如果没有我们就从数据库中读取数据,但是这个时候我们该在那一台memcache服务器读取,又应该在那一台memcache服务器存储呢?

假设我们有1/2/3/4/5台memcache服务器,我们第一次访问nginx,所有memcache服务器都没有相应的存储。

那么我们就应该要从关系型数据库读取数据,并保存到memcache服务器。

假设,保存到1号服务器。

现在,我们用和第一次访问参数一样的url进行nginx访问,那么现在要从哪一个memcache服务器读取呢。nginx默认的集群算法为“取模”,也就是循环使用。

也就是第二次的访问,应该是到2号服务器上读取,但是我们存储的数据却在1号memcache服务器。这个时候就读不到了,所以,我们又会在2号memcache中存储相应的值。这就不行了。

我们希望达到的效果为,相同的参数的url访问nignx和memcache的时候,我们读取和存储的memcache是同一台。

这就需要用到我们的hash一致性算法来解决了。

mysql数据库为:

以下是我们的解决步骤:

1、首先,我们需要在nginx上添加hash一致性算法模块。

  下载ngx_http_consistent_hash算法插件。

  下载地址:https://github.com/replay/ngx_http_consistent_hash

  

 

  回到nginx安装包:cd nginx-1.14.2/

  make clean

  ./configure --prefix=/usr/local/nginx --add-module=/usr/installsoft/ngx_http_consistent_hash-master/

  我们的hash插件,是放在/usr/installsoft/文件夹下的。

  make && make install

  启动nginx:/usr/local/nginx/sbin/nginx

2、编辑nginx.conf添加红色部分

http {
include mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

#access_log logs/access.log main;

sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

upstream imgserver {
server 111.231.226.228:81 weight=1 max_fails=2 fail_timeout=3;
server 111.231.226.228:82 weight=1 max_fails=2 fail_timeout=3;
}
upstream mcserver {
consistent_hash $request_uri;
server 111.231.226.228:11214;
server 111.231.226.228:11212;
server 111.231.226.228:11213;
}

编辑location,修改红色部分。

server {
listen 80;
server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {

#以$rui为memcache hash一致性算法的key
set $memcached_key "$uri";

memcached_pass mcserver;

#如果没有读取到,这执行回调callback.php
error_page 404 /callback.php;
# root html;
# index index.php index.html index.htm;
}

3、将php的hash算法改为:consistent

在/usr/local/fastphp/lib/php.ini中添加下面代码。我的php是安装在/usr/local/fastphp下的,你们的以自己为准,上面的nginx同理。

memcache.hash_strategy=consistent

重启php。先杀了,在启动。

pkill -9 php-fpm

./sbin/php-fpm 

4、编写我们的额回调callback.php程序。

<?php
$uri = $_SERVER['REQUEST_URI'];
$uid = substr($uri,5,strpos($uri,'.')-5);

//设置memcache集群

$mem = new memcache();
$mem->addServer('111.231.226.228',11212);
$mem->addServer('111.231.226.228',11213);
$mem->addServer('111.231.226.228',11214);

//连接mysql数据库
$conn = mysql_connect('127.0.0.1','root','');

$sql = 'use test';
mysql_query($sql,$conn);
$sql = 'set names utf8';
mysql_query($sql,$conn);

$sql = 'select * from user where uid='.$uid;
$rs = mysql_query($sql,$conn);

//echo一下好让我们知道是从memcache来的,还是读取数据库来的。

echo 'from mysql query<br />';

$user = mysql_fetch_assoc($rs);

if(empty($user)) {
echo 'no this user';
}else{
$html = '<h1>'.$user['uname'].'</h1>';
echo $html;

//想memcache中添加值。
$mem->add($uri,$html,0,300);
$mem->close();
}
?>

以上步骤都做完后,我们来看效果:

访问nginx http 服务器。

第一次访问/user8.html.从下图,我们可以看到,因为memcache中没有/html8.html的数据,所以是从mysql数据库中读取的。并且是在我们打开的4号memcache会话框执行的(端口号11214)

 

我们进行一次刷新,也就是相同的url再请求一次。有以下结果。我们可以看到,这天数据是从memcache中取出来的,并且走的也是4号窗口(11214)。

我们再来测试一个。得到相同的结果,但是请求的是,5号窗口(11214端口的memcache服务)

 

得到以上结果,代表我们配置成功。

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
用vertx实现高吞吐量的站点计数器

工具:vertx,redis,mongodb,log4j 源代码地址:https://github.com/jianglibo/visitrank 先看架构图: 如果你不熟悉vertx,请先google一下。我这里将vertx当作一个容器,上面所有的圆圈要...

jianglibo
2014/04/03
4.2K
3
SQLServer实现split分割字符串到列

网上已有人实现sqlserver的split函数可将字符串分割成行,但是我们习惯了split返回数组或者列表,因此这里对其做一些改动,最终实现也许不尽如意,但是也能解决一些问题。 先贴上某大牛写的s...

cwalet
2014/05/21
9.6K
0
CDH5: 使用parcels配置lzo

一、Parcel 部署步骤 1 下载: 首先需要下载 Parcel。下载完成后,Parcel 将驻留在 Cloudera Manager 主机的本地目录中。 2 分配: Parcel 下载后,将分配到群集中的所有主机上并解压缩。 3 激...

cloud-coder
2014/07/01
6.8K
1
Promises/A 和 when() 实现--When.js

When.js 是 cujojs 的轻量级的 Promises/A 和 when() 实现,从 wire.js 的异步核心和 cujojs 的 IOC 容器派生而来。包含很多其他有用的 Promiss 相关概念,例如联合多个 promiss、mapping 和...

匿名
2013/02/15
7.4K
0
集群存储系统--YFS

YFS集群存储系统由多个元数据服务器(MDS)、多个块数据服务器(CDS)和多个客户端(client)互联组成集群; 数据被分成64M固定大小的数据块(Chunk),每个数据块在CDS本地以常规文件的形式...

匿名
2013/02/19
1.8K
0

没有更多内容

加载失败,请刷新页面

加载更多

在视图控制器之间传递数据 - Passing Data between View Controllers

问题: I'm new to iOS and Objective-C and the whole MVC paradigm and I'm stuck with the following: 我是iOS和Objective-C以及整个MVC范例的新手,但我坚持以下几点: I have a view th......

fyin1314
12分钟前
6
0
Elasticsearch中mapping值得注意的一些小细节

简介 在Elasticsearch中mapping有很多可以配置的地方,但是使用多了就会发现,一般情况有关mapping最常用、也最实用的就简单的几个需要注意的地方。 下面就简单的介绍一下关于这些mapping中值...

trayvon
15分钟前
0
0
趣味编程-大鱼吃小鱼(5-7岁)

上一节老师教小朋友们编写了摘星星的游戏,今天跟着了老师学一下大鱼吃小鱼这个游戏吧!拿上你们的平板,跟着老师一起来做吧。 防止失联,点个“在看”!多多转发分享是老师录制视频的动力哦...

rainbow0124
今天
1
0
大集合!写作辅助工具

↑公众号关注 “Graph-AI” 专注于 图机器学习 大集合!论文写作辅助工具 这里收集论文写作过程中的辅助工具,比如包括Latex、画图、图表、语法、词语搭配、文献查找\下载\整理、翻译等。 会...

chengsen
08/01
0
0
SSL指纹的自定义功能-VMLogin 中文版防关联指纹浏览器在1.2.6.7 版本更新中加入

VMLogin 中文版指纹浏览器 在本次1.2.6.7 版本更新中加入了SSL指纹的自定义功能。 VMLogin 中文版浏览器:https://www.vmlogin.cc/ 主要可以设置 密码套件 的个数和顺序,这样能可以对抗一些...

VMlogin中文版防关联浏览器
26分钟前
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部