Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

使用 Yac 2.0.2 时出现了缓存不一致的问题 #122

Closed
zhongweikang opened this issue Nov 15, 2021 · 6 comments
Closed

使用 Yac 2.0.2 时出现了缓存不一致的问题 #122

zhongweikang opened this issue Nov 15, 2021 · 6 comments

Comments

@zhongweikang
Copy link

环境

$ cat /proc/version
Linux version 3.10.0-1160.11.1.el7.x86_64 gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) 

$ php/bin/php -v
PHP 7.1.10 (cli) (built: Jan 18 2018 19:52:06) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.1.10, Copyright (c) 1999-2017, by Zend Technologies

$ php/bin/php --ri yac
yac

yac support => enabled
Version => 2.0.2
Shared Memory => mmap
Serializer => php

Directive => Local Value => Master Value
yac.enable => On => On
yac.debug => Off => Off
yac.keys_memory_size => 4M => 4M
yac.values_memory_size => 64M => 64M
yac.compress_threshold => -1 => -1
yac.enable_cli => 1 => 1

                                Cache info
Total Shared Memory Usage(memory_size) => 71303168
Total Shared Memory Usage for keys(keys_memory_size) => 4194304
Total Shared Memory Usage for values(values_memory_size) => 67108864
Size of Shared Memory Segment(segment_size) => 4194304
Number of Segments (segment_num) => 16
Total Slots Number(slots_size) => 32768
Total Used Slots(slots_num) => 0

问题描述

我们有一个 ip.conf 文件,里边维护了一批 ip 白名单,且这个文件的最近一次变更是在 10 月 29 号。
ip.conf 文件,在 yac 中的缓存过期时间是 86400s ~ 172800s ( 1天 ~ 2天)。

问题出现在 11 月 4 号的凌晨 2 点,代码里读取到的 ip 与 文件里的 ip 出现了不一致的情况。
内存里读到的 ip:10.18..63.254
而实际文件里的 ip:10.188.63.254

缓存不一致的问题已经在我们生产环境第二次出现了,不知道是不是已知问题?

麻烦鸟哥帮忙看下咋回事,感谢

@laruence
Copy link
Owner

如果这个文件变更不是很频繁的话,我建议你们可以使用yaconf, 不会出现不一致的情况,Yac是有一定概率出错的。

@zhongweikang
Copy link
Author

鸟哥,Yac 写入或者读出缓存的时候,不是有 crc 的校验么,为什么还会发生缓存不一致的问题呢?

在文章:https://www.laruence.com/2013/03/18/2846.html 里找到了这么一句话

可见, 最严重的错误, 就是A和B的缓存都失效, 但是Yac不会把错误数据返回给用户, 当下一次来查询Cache的时候, 因为存在crc校验, 所以都miss.

@letwang
Copy link

letwang commented Feb 28, 2022

crc碰撞 了解下,所以Yac还是会一定概率出错的。

@zhongweikang
Copy link
Author

crc碰撞 了解下,所以Yac还是会一定概率出错的。

为什么一个bug会被这么理所当然的解释,而不是尝试去修复.

所以结论就是

想要上生产环境,就必须容忍这个bug,或者换成 yaconf

@letwang
Copy link

letwang commented May 18, 2022

实际上,我已经使用了APCu代替了YacYaconf
Yac的毛病,正如你发现的 1个BUG 还当成理所当然 当然是不对的,可用在不那么重要的数据上。
Yaconf的毛病,正如我提到的:laruence/yaconf#67 BUG提了1年了,还没修复,所以 我无法继续等待了。
而我发现APCu是PHP官网出品,功能不仅仅完美替代了YacYaconf,而且其他方面都更加强大~

比如我的项目HookPHP,使用了APCu和PHP8.1的预加载技术,你可以参考下:

  1. 业务配置字典文件支持多及目录 https://github.com/letwang/HookPHP/tree/master/app/admin/config
  2. 配置PHP服务启动时自动加载业务配置 https://github.com/letwang/HookPHP/blob/master/Dockerfile#L460
  3. 把配置数据预加载到服务器常驻内存 https://github.com/letwang/HookPHP/blob/master/preload.php
  4. APCu缓存管理面板 https://github.com/letwang/HookPHP/blob/master/apc.php

@zhongweikang
Copy link
Author

实际上,我已经使用了APCu代替了YacYaconfYac的毛病,正如你发现的 1个BUG 还当成理所当然 当然是不对的,可用在不那么重要的数据上。 Yaconf的毛病,正如我提到的:laruence/yaconf#67 BUG提了1年了,还没修复,所以 我无法继续等待了。 而我发现APCu是PHP官网出品,功能不仅仅完美替代了YacYaconf,而且其他方面都更加强大~

比如我的项目HookPHP,使用了APCu和PHP8.1的预加载技术,你可以参考下:

  1. 业务配置字典文件支持多及目录 https://github.com/letwang/HookPHP/tree/master/app/admin/config
  2. 配置PHP服务启动时自动加载业务配置 https://github.com/letwang/HookPHP/blob/master/Dockerfile#L460
  3. 把配置数据预加载到服务器常驻内存 https://github.com/letwang/HookPHP/blob/master/preload.php
  4. APCu缓存管理面板 https://github.com/letwang/HookPHP/blob/master/apc.php

感谢回复

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants