服务器配置
未来信息
请看在压缩包中的doc/protocol.txt
文件,或者Github上有详细信息。
protocol.txt
文件的版本是你运行的memcached的,统计计数器和命令是定期更新的。 命令行参数
Memcached默认配备的是命令行参数的基本性文档。请查看memcached的-h
或者man 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时你自己不要写错或正在编辑初始化脚本。
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"。该值应当为零或者接近零。
线程
线程通过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
酷不酷?在stats
和stats settings
,你可以双重检查,你告诉memcached要做什么,和想要他做什么。
客户端配置
常见的客户端配置
大多数客户端在一些重要方面都是相似的。虽然执行时不同,但包含许多共同概念。
Hashing
通过服务器所有客户端都支持至少一种"hashing"方法的密钥。请注意,客户端彼此可能不兼容。如果使用perl的Cache::Memcached
,并期望和PHP客户端相同的方式解决密钥,是不能进行工作的。
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通讯的。