一致性hash算法
nginx配置 memcache hash分配方法
Tip: upstream 做负载均衡时,要用 IP 或者 远程主机名 ,不能使用 localhost
nginx说明文档-官方网址
url:http://nginx.org/en/docs/
ngx_http_upstream_consistent_hash说明-官方网址
url:https://www.nginx.com/nginx-wiki/build/dirhtml/modules/consistent_hash/
点击底部 Download from GitHub
url:https://github.com/replay/ngx_http_consistent_hash
cd /server/package
wget https://github.com/replay/ngx_http_consistent_hash/archive/master.zip
unzip master.zip
#unzip解压到指定文件夹
# unzip master.zip -d /server/package/ngx_http_consistent_hash-master
# 查看文件一切正常
cd ngx_http_consistent_hash-master
# 进入原来下载nginx的解压包路径
cd /server/package/nginx-1.12.2
#查看现有的nginx如何编译的
/server/nginx/sbin/nginx -V
可以看到如下返回参数
# 执行以下命令查看如何编译第三方模块
./configure --help|grep module
# 重新编译nginx
./configure --prefix=/server/nginx/ --add-module=/server/package/ngx_http_consistent_hash-master
# 杀掉目前正在进行的nginx进程
pkill -9 nginx
make && make install
#安装完毕后,启动nginx
/server/nginx/sbin/nginx
vim /server/nginx/conf/vhost/test001.com.conf
upstream mcserver{
consistent_hash $request_uri;
#upstream 做负载均衡时,要用 IP 或者 远程主机名 ,不能使用localhost
server 127.0.0.1:11211 ;
server 127.0.0.1:11212 ;
server 127.0.0.1:11213 ;
}
location /{
set $memcached_key "$uri";
memcached_pass mcserver;
error_page 404 /callback.php/usr/bin/memcached -u memcached -p 11212;
# root /data/html;
#index index.php index.html index.htm;
}
启动memcached
/usr/bin/memcached -u nobody -vv -p 11211
/usr/bin/memcached -u nobody -vv -p 11212
/usr/bin/memcached -u nobody -vv -p 11213
访问站点
url:http://test001.com/user3.html
会发现,[get /user3.html] 在11212memcached服务上,但是存储的时候
[add /user3.html 1 300 46] 却又存储到了11211的服务上
此处解决了nginx请求memcache时会根据uri固定请求某台服务器的问题
PHP配置memcache Hash分配,与nginx保持一致
http://pecl.php.net/package-search.php?pkg_name=memcache&bool=AND&submit=Search
点击memcache进入以下url
url:http://pecl.php.net/package/memcache
点击一个版本的序列号后,点击右下角的 view document
进入
url:https://www.php.net/memcache
点击 运行时配置
最终进入
url:https://www.php.net/manual/en/memcache.ini.php
可以将 standard 改为 consistent
vim /server/php/etc/php.ini
增加
memcache.hash_strategy = consistent
# 重启PHP
/server/php/sbin/php-fpm
vim /data/html/callback.php
#代码如下
<?php
# print_r($_SERVER);
$uri = $_SERVER['REQUEST_URI'];
$uid = substr($uri,5,strpos($uri,'.')-5);
#echo $uid;
## 本次新增
$mem = new memcache();
$mem->addServer('127.0.0.1','11211');
$mem->addServer('127.0.0.1','11212');
$mem->addServer('127.0.0.1','11213');
$con = mysqli_connect('localhost','root','root@1234');
$sql = 'use test';
mysqli_query($con,$sql);
$sql2 = 'set names utf8';
mysqli_query($con,$sql2);
$sql3= 'select * from user where uid='.$uid;
$rs = mysqli_query($con,$sql3);
$user = mysqli_fetch_assoc($rs);
echo 'From mysql query';
if(empty($user)){
echo 'no this user';
}else{
$html = '<h1>'.$user['uname'].'</h1>';
echo $html;
## 本次注释
# $mem = new memcache();
# $mem->connect('localhost','11211');
## 存储数据进行了优化
$mem->add($uri,$html ,0,300);
$mem->close();
}