nginx 与 PHP 使用多台memcache服务器时,数据同步问题解决

本文详细介绍了如何在Nginx中配置一致性Hash算法以实现对Memcache的负载均衡,确保相同URI的请求始终路由到同一Memcache实例。同时,提供了PHP配置一致性Hash的指导,以保持与Nginx的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一致性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();
}
### 关于ArcGIS License Server无法启动的解决方案 当遇到ArcGIS License Server无法启动的情况,可以从以下几个方面排查并解决问题: #### 1. **检查网络配置** 确保License Server所在的计算机能够被其他客户端正常访问。如果是在局域网环境中部署了ArcGIS Server Local,则需要确认该环境下的网络设置是否允许远程连接AO组件[^1]。 #### 2. **验证服务状态** 检查ArcGIS Server Object Manager (SOM) 的运行情况。通常情况下,在Host SOM机器上需将此服务更改为由本地系统账户登录,并重启相关服务来恢复其正常工作流程[^2]。 #### 3. **审查日志文件** 查看ArcGIS License Manager的日志记录,寻找任何可能指示错误原因的信息。这些日志可以帮助识别具体是什么阻止了许可服务器的成功初始化。 #### 4. **权限问题** 确认用于启动ArcGIS License Server的服务账号具有足够的权限执行所需操作。这包括但不限于读取/写入特定目录的权利以及与其他必要进程通信的能力。 #### 5. **软件版本兼容性** 保证所使用的ArcGIS产品及其依赖项之间存在良好的版本匹配度。不一致可能会导致意外行为完全失败激活license server的功能。 #### 示例代码片段:修改服务登录身份 以下是更改Windows服务登录凭据的一个简单PowerShell脚本例子: ```powershell $serviceName = "ArcGISServerObjectManager" $newUsername = ".\LocalSystemUser" # 替换为实际用户名 $newPassword = ConvertTo-SecureString "" -AsPlainText -Force Set-Service -Name $serviceName -StartupType Automatic New-ServiceCredential -ServiceName $serviceName -Account $newUsername -Password $newPassword Restart-Service -Name $serviceName ``` 上述脚本仅作为示范用途,请依据实际情况调整参数值后再实施。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值