我们工作中可能会遇到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服务)

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

nginx+php+memcache实现hash一致性memcache 集群的更多相关文章

  1. 使用nginx实现动静分离的负载均衡集群

    一.概述: LB负载均衡集群分两类: LVS (四层)和 nginx或haproxy (七层) 客户端通过访问分发器的VIP来访问网站 |现在应用更复杂,比如现在网站页面有: .php .html . ...

  2. Nginx+ 多个Memcached+ 多个Tomcat集群配置来实现 sticky Session

    假如有 大于2 台的Tomcat servers,如何实现sticky session特点的高可靠web 服务? 方案设计: 前端使用nginx(最好是淘宝的 tengine)作为we 流量分发器,向 ...

  3. nginx 的安装、优化、服务器集群

    一.安装 下载地址:http://nginx.org  找到 stable 稳定版 安装准备:nginx 依赖于pcre(正则)库,如果没有安装pcre先安装 yum install pcre pcr ...

  4. Galera Cluster——一种新型的高一致性MySQL集群架构

    原文链接:https://www.sohu.com/a/147032902_505779,最近被分配定位mysql的问题,学习下. 1. 何谓Galera Cluster 何谓Galera Clust ...

  5. 使用Nginx在windows和linux上搭建集群

    Nginx Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器 特点:反向代理 负载均衡 动静分离… 反向代理(Reverse Pro ...

  6. Nginx学习笔记(反向代理&搭建集群)

    一.前言 1.1 大型互联网架构演变历程 1.1.1 淘宝技术 淘宝的核心技术(国内乃至国际的 Top,这还是2011年的数据) 拥有全国最大的分布式 Hadoop 集群(云梯,2000左右节点,24 ...

  7. 使用apache和nginx代理实现tomcat负载均衡及集群配置详解

    实验环境: 1.nginx的代理功能 nginx proxy: eth0: 192.168.8.48 vmnet2 eth1: 192.168.10.10 tomcat server1: vmnet2 ...

  8. LVS+keeplived+nginx+tomcat高可用、高性能jsp集群

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://kerry.blog.51cto.com/172631/557749 #!/bin ...

  9. Nginx+Keepalived负载均衡+后端LNMP网站集群

    Centos6.4 x86,4台,地址是10.10.10.11-14,vip给的100,目标是在13和14安装nginx+keepalived,11和12安装nginx+mysql+php,做为web ...

随机推荐

  1. IOT-SpringBoot-angular启动

    1  D:\workspace_iot\iot-hub\src\main\angular     cmd 启动  npm  start 2  eclipse中启动springboot 3  local ...

  2. ansible-playbook 快速入门

    管理用户密码: --- - hosts: test tasks: - name: changed password shell: echo root:123456 | chpasswd remote_ ...

  3. Java学习路径及练手项目合集

    Java 在编程语言排行榜中一直位列前排,可知 Java 语言的受欢迎程度了. 实验楼上的[Java 学习路径]中将首先完成 Java基础.JDK.JDBC.正则表达式等基础实验,然后进阶到 J2SE ...

  4. ASP.NET MVC5+EF6+EasyUI 后台管理系统--系统权限及操作指引

    系列目录 1.权限包括菜单权限,按钮权限,数据权限 2.角色组和用户之间是多对多的关系,即多个用户可以拥有多个角色组,权限是拥有角色组的并集 1.菜单界面,菜单都是动态数据由模块管理进行设置 2.权限 ...

  5. python更新zip文件中文件

    #更新zip文件中某一个文件import os import shutil import tempfile import zipfile from rat_tool.pack import * too ...

  6. cocos2d-x JS 获取当前系统时间(解决屏幕双击点击事件)

    记录一下,好开心,感觉今天自己又学到东西了,对于屏幕双击事件本来还毫无头绪的,今天得以解决总算没白费加班,其实原理很简单:就是在点击事件里做一个判断,这个判断就是需要获取当前系统的时间的毫秒差,第一次 ...

  7. 那种多空计算方法更正确呢?——从此图看应该是TEST005

    那种方法计算多空逆转更正确呢?——从此图1看应该是TEST005,但是实际上是ZCL_多空! TEST005具有滞后性!也就是说跌了一些在报警,可能已经跌了10%(如图2) ZCL_多空:当计算结果和 ...

  8. 大数据项目(MTDAP)随想

    Spark MLlib进行example测试的时候,总是编译不通过,报少包<Spark MLlib NoClassDefFoundError: org/apache/spark/ml/param ...

  9. MongoDB下,启动服务

    D:\MongoDB>mongod --dbpath D:\MongoDB\Data --logpath D:\MongoDB\Log\MongoDB.log --logappend --ser ...

  10. 【转】HTTP429

    转载:http://codewa.com/question/45600.html Q:How to avoid HTTP error 429 (Too Many Requests) python Q: ...