Memcached是一种高性能的分布式内存对象缓存系统,用于加速动态Web应用程序,通过在内存中缓存数据和对象来减少数据库读取次数,从而提高网站的访问速度,以下是对memcache动态扩容的具体介绍:
1、动态扩容的概念
静态扩容:静态扩容是指在容器初始化时创建一块固定大小的空间,当对象数量达到一定阈值后,整个空间会进行扩容,这种方式在多线程环境下可能会导致性能问题和数据一致性问题。
动态扩容:动态扩容是指当容器中的对象数量达到一定阈值时,自动增加容量以容纳更多对象,与静态扩容不同,动态扩容不需要预先分配大量空间,而是在需要时才进行扩容,从而节省内存资源。
2、动态扩容的条件
条件触发:动态扩容通常在某些条件满足时触发,例如当item的数量超过hash表容量的1.5倍时。
变量含义:在Memcached中,有几个关键的变量用于控制动态扩容过程,如expand_bucket
表示正在移动的桶的序号,old_hashtable
是原先hash表的指针,primary_hashtable
是新hash表的指针。
3、动态扩容的步骤
启动维护线程:首先启动assoc_maintenance_thread
线程,如果此时未在同步,则阻塞在maintenance_cond
条件变量处。
设置扩容标志:当条件满足时,设置assoc_start_expand
为true,并唤醒maintenance_cond
条件变量。
加锁通知线程:设置锁粒度为全局锁,并通知各个线程;调用assoc_expand
函数重新给primary_hashtable
分配原先两倍的内存,设置expanding
为true,hashpower
递增。
移动数据:继续while循环,加全局锁和cache_lock
锁,从0开始,到hashsize(hashpower 1)
依次移动每一个桶,对于每一个桶,通过hash(ITEM_key(it), it>nkey) & hashmask(hashpower)
计算key在新的空间内的位置。
释放资源:当满足移动完成退出条件expand_bucket == hashsize(hashpower 1)
时,释放原先old_hashtable
hash表的空间,最后释放cache_lock
和全局锁。
4、动态扩容的问题
效率问题:全程锁引起的效率问题思考?当扩容的时候,通知其他线程锁粒度是全局的,开始扩容加的是全局锁,扩容完成才会释放全局锁,也就是说在扩容的过程中,其他线程对应的增删查改都不能进行。
解决办法:在传入参入的时候,设置hashpower
的大小,设的较大一些,这边要扩容的可能性越小。
memcache动态扩容是一种在内存使用达到一定阈值时自动增加容量的技术,它包括静态扩容和动态扩容两种方式,其中动态扩容更为灵活和高效,在实际应用中,需要根据具体需求选择合适的扩容策略,并注意解决可能出现的效率和一致性问题。
序号 | 扩容目的 | 扩容方法 | 扩容步骤 | 注意事项 |
1 | 提高Memcached性能 | 增加节点数量 | 1. 停止Memcached服务; 2. 添加新的Memcached节点; 3. 启动新的Memcached节点; 4. 更新客户端配置以连接新的节点; 5. 恢复Memcached服务 | 1. 确保新的节点硬件和软件配置与现有节点一致; 2. 在扩容过程中,尽量避免长时间中断服务; 3. 观察扩容后的性能,确保服务稳定运行 |
2 | 优化资源利用率 | 增加缓存容量 | 1. 停止Memcached服务; 2. 增加现有节点的内存容量; 3. 启动Memcached服务; 4. 更新客户端配置以连接新的节点; 5. 恢复Memcached服务 | 1. 确保现有节点的硬件支持增加内存容量; 2. 观察扩容后的性能,确保服务稳定运行; 3. 注意内存分配策略,避免内存碎片 |
3 | 备份和恢复 | 备份现有数据 | 1. 停止Memcached服务; 2. 备份现有数据到磁盘; 3. 停止现有节点; 4. 添加新的节点; 5. 恢复备份数据到新节点; 6. 启动新节点; 7. 更新客户端配置以连接新节点; 8. 恢复Memcached服务 | 1. 确保备份数据完整性和一致性; 2. 在恢复过程中,尽量避免长时间中断服务; 3. 观察扩容后的性能,确保服务稳定运行 |
归纳仅供参考,实际扩容方案可能因具体环境和需求而有所不同,在实施扩容时,请根据实际情况进行调整。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1185726.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复