博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Memcached配置
阅读量:6091 次
发布时间:2019-06-20

本文共 4574 字,大约阅读时间需要 15 分钟。

  hot3.png

服务器配置

未来信息

请看在压缩包中的doc/protocol.txt文件,或者Github上有详细信息。

重要的是你所查看的protocol.txt文件的版本是你运行的memcached的,统计计数器和命令是定期更新的。

命令行参数

Memcached默认配备的是命令行参数的基本性文档。请查看memcached的-h或者man memcached这些当前的文档。服务致力于解决通常问题。

当第一次设置memcached时,应当注意如下参数-m-d-v
-m参数告诉memcached使用多少内存用于元素存储(Mbytes)。注意,这个参数设置的内存不是全局性的内存配额,所以memcached将会比你设定的使用更多的内存。这个设定为安全值。当设置小雨64MB时,仍然会使用64MB作为最小的使用量。
-d告诉memcached守护进程。如果你从初始化脚本运行memcached,不能设置这个选项。如果你首次使用memcached,将会以教育模式启动服务,没有-d参数,并且不会进行守护。
-v选项控制STDOUT/STDERR的信息复杂度。多个-v参数增加信息复杂度。单一的-v将会打印额外的启动信息,多个-v将会打印关于请求命中memcached的复杂度更多的信息。如果想尝试,有测试脚本完成你所期望的,在前台运行memcached,并具备一些复杂度开关。
使用大部分的默认设置是明智的。新特性往往并不会设置成默认设置。可以关注并尝试新的配置。

初始化脚本

如果你已经安装从你的操作系统的包管理系统中安装了memcached,odds已经具有初始化脚本。在启动选项中提供memcached接收的可选的配置方法。例如通过/etc/sysconfig/memcached文件。检查并取保运行memcached时你自己不要写错或正在编辑初始化脚本。

如果你自行编译memcached,在源代码中的scripts/目录包含几种初始化脚本的示例。

多个实例

在本地运行多个memcached是没有必要的。如果你坚持在开发环境中或者在本地中作节点测试,只需要更改监听端口,即:memcached -p 11212

网络

memcached默认以TCP和UDP的方式监听端口11211。-l允许绑定到特定接口或者IP地址。Memcached并没有花费过多的精力在防御随机的网络连接。因此,不要把memcached暴露在互联网中,或者其他任何不授信用户。这里可以使用SASL验证,但是并不能完全依赖和信任。

TCP

-p改变将会坚挺TCP连接,当通过-p改变端口,UDP端口将会效仿。

UDP

-u修改UDP端口,

Unix Sockets

如果希望通过单独的本地用户限制守护进程,或者不希望在网络中曝光,可以使用unix domain socket。-s <file>是需要你添加的参数。如果启用,则TCP/UDP将会被禁用。 ##连接限制 默认情况下,最大并发的连接数据设置为1024,正确配置这个选项是非常重要的。向memcached额外的连接将会等待其他连接的释放。 你将会接到实例在运行时发生的状态命令问题的通知,内容为"listen_disabled_num"。该值应当为零或者接近零。

Memcached可以与巨大数量的规模的连接保持简单。每个连接的内存开销都很低(当连接空闲时,甚至会更低),因此不要把连接数设置的很高。
假设你有五个Web服务,都是运行Apache。每个Apache进程的MaxClient设置为12。意味着kennel收到的并发连接的最大数目时5x12(60)。如果可行的话,尽量为了一下内容留下一些额外的连接,任务管理、添加更多的Web服务、定时器、脚本、等等。

线程

线程通过CPU测量memcached,通过"worker threads"的模式,意味着每个线程并发处理连接。由于使用了libevent库,并发连接将会有很好的可扩展性,每个线程都能够处理多个客户端。

这和一些Web服务例如Apache是不同的,那些Web服务使用一个进程或者线程处理单一的活跃客户端连接。因此memcached效率更高,比较低的线程数有很好的效果。(减少CPU的时间分片)在Web服务的比喻上,更像Nginx和Apache。
默认情况下会分配4个线程。处理计算机运行memcached非常的困难,否则不能设置比这个更高的数字。设置非常大的值(大于80)将会使memcached运行速度变得相当缓慢。

检查运行配置

$ echo "stats settings" | nc localhost 11211STAT maxbytes 67108864STAT maxconns 1024STAT tcpport 11211STAT udpport 11211STAT inter NULLSTAT verbosity 0STAT oldest 0STAT evictions onSTAT domain_socket NULLSTAT umask 700STAT growth_factor 1.25STAT chunk_size 48STAT num_threads 4STAT stat_key_prefix :STAT detail_enabled noSTAT reqs_per_event 20STAT cas_enabled yesSTAT tcp_backlog 1024STAT binding_protocol auto-negotiateSTAT auth_enabled_sasl noSTAT item_size_max 1048576END

酷不酷?在statsstats settings,你可以双重检查,你告诉memcached要做什么,和想要他做什么。

客户端配置

常见的客户端配置

大多数客户端在一些重要方面都是相似的。虽然执行时不同,但包含许多共同概念。

Hashing

通过服务器所有客户端都支持至少一种"hashing"方法的密钥。请注意,客户端彼此可能不兼容。如果使用perl的Cache::Memcached,并期望和PHP客户端相同的方式解决密钥,是不能进行工作的。

但有个例外,基于[ libmemcached]的客户端都使用相同的hashing算法。

Hashing一致性

(一致性哈希算法)是一种 在添加删除服务时更稳定的分布式键的模型。在一般的hashing散列算法中,服务数量的改变会引起许多key重新映射服务器中,造成大量缓存无法命中。通过算法描述的方法,映射出服务器列表上的键,当添加或者删除服务时,仅仅导致非常小数量的键值发生修改。

当使用一般的hash算法时,添加到第十一个服务将会导致40%以上的键值发生意外性变化。
然而,使用一致性hash算法添加第十一个服务将会发生小于10%的键值变化被重新分配。在实践过程中有些变化,但是肯定会有帮助。

服务器一致配置

当向配置中添加服务器时,请注意你应当添加向客户端添加相同服务器列表。

如果你有三个web服务,并且每个web服务均运行memcached实例,错误的方式时试探性地使用地址'local'实例作为'localhost'。这种方式并不是我们所期望的,服务器列表表现在不同的web服务中。意味着web服务器1号所有的key值,将会和服务器2号不同。导致用户和商业开发状态发生病态变化(过度cached未命中,导致的抽风)。
排序同样重要。一些客户端将会排序你所提供的服务列表,但另外的一些并不会进行排序。如果你具有“A、B、C”服务器。请在所有地方列为“A、B、C”。
使用Puppet/Chef/rsync/whatever是确保这些文件的同步性。

加权

在有缺陷的情况下,有时可能你的Memcached分配的内存比其他的实力要多。一些客户端支持在较大的服务器上应用权重。其他的客户端允许你多次填写同一个服务器,以获取更多的命中次数。

无论那种方法,都可以以加权的方式让程序运行的更好。

失效或者故障转移

当服务器实效或者提供无响应时,客户端将会做什么?

在黑盒状态的memcached,模式将会进行“切换”,通过尝试列表中下一个服务器。如果服务器崩溃,将会把键值重新分配到其他的适当的实例当中。
然而,有很多方式关闭机器。有时,这些机器并不希望一直关闭。如下场景:

  • Sysadmin Bob走过服务器B,并且将以太网线踢离了端口。
  • 服务器B的键值路由修改到了其他的实例上。
  • Sysadmin Bob是个勤劳的(并不聪明的)伙伴。他尽职的手动修复分开的以太网电缆。
  • 服务器B键值路由修改回自己。

当Bob意识到错误的发生,对缓存做的任何更新都丢失了,旧的数据被提交给用户。如果发生这种情况很糟糕:

  • 由于Bob的问题和无人值守服务器B的网络切断了几个小时。

恼人的是现在,数据已经非常过时了。

当另外的错误导致服务器不能工作,将会导致客户端实际上会修改服务器列表。最终将会比应当映射的键值,进行更多的重新映射。
现代生活尽可能的鼓励“失败”。也就是说,如果打算获取存储的缓存不可用的时候,简单继续运行,就好像cache未命中一种。如果有服务器B的情况下,仍旧在新旧数据之间进行切换的情况,将会降低影响。

压缩

压缩大信息是极好的减少快要爆炸的内存需求。对一些值进行压缩可以节约大量内存,还可以减少延迟,较小的值能够更快的通过网络获取到。

大多数客户端支持通过设置元素大小的闸值来启用或者禁用压缩。在每个元素的基础之上。较小的元素不会受益于数据的减小,并且会浪费CPU。

管理连接对象

不管你做什么都会发生常见的一次性错误,memcached竭尽全力运行连接。小型服务器的memcached被分配了50,000个连接,但你并不清楚发生了什么。

请小心的管理连接对象!如果不断的在每次希望连接memcached初始化连接对象,有泄漏连接的可能性。
某些客户端(例如PHP的一种)在不显著的地方管理打开了多少连接。不停调用'addServer()'方法将会导致连接泄漏,甚至已经添加了服务。阅读客户端文档确认哪些操作会创建连接,哪些不会创建连接。 #附录

UNIX Domain Socket

UNIX Domain Socket是在socket架构上发展起来的用于同一台主机的进程间通讯(IPC),它不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。UNIX Domain Socket有SOCK_DGRAM或SOCK_STREAM两种工作模式,类似于UDP和TCP,但是面向消息的UNIX Domain Socket也是可靠的,消息既不会丢失也不会顺序错乱。

UNIX Domain Socket可用于两个没有亲缘关系的进程,是全双工的,是目前使用最广泛的IPC机制,比如X Window服务器和GUI程序之间就是通过UNIX Domain Socket通讯的。

转载于:https://my.oschina.net/hava/blog/796744

你可能感兴趣的文章
Exchange Server 2003 SP2 数据存储大小限制修改
查看>>
expr命令用法-实例讲解
查看>>
酷派8705救砖
查看>>
iOS10里的通知与推送
查看>>
# C 语言编写二进制/十六进制编辑器
查看>>
EMS SQL Management Studio for MySQL
查看>>
我的友情链接
查看>>
做母亲不容易
查看>>
详细的文档(吐槽)
查看>>
DEVEXPRESS 随记
查看>>
Ember.js 入门指南——{{action}} 助手
查看>>
VMware下安装QT Creator
查看>>
Linux时间同步设置
查看>>
Measure Graphics Performance
查看>>
RetrunMoreRow
查看>>
Redis学习笔记(3)-Hash
查看>>
Git使用的常用命令
查看>>
微软职位内部推荐-Senior Software Engineer
查看>>
多线程开发
查看>>
(2) iOS开发之UI处理-UILabel篇
查看>>