得知互动
标题:
Memcached内存数据库群集
[打印本页]
作者:
Vecloud
时间:
2022-5-11 14:36
标题:
Memcached内存数据库群集
Memcached概述一套开源的高性能分布式内存对象缓存系统
所有的数据都存储在内存中
支持任意存储类型的数据
提高网址访问的速度
Memcached缓存机制当程序写入缓存数据请求时,Memcached的API接口将KEY输入路由算法模块路由到集群中的一台服务,之后由API接口与服务器进行通信,完成一次分布式缓存写入Key索引建立在API中,值value数据存在后面的memcached中Memcached分布式要依赖于Memcached的客户端来实现
多个Memcached服务器是独立的
分布式数据如何存储是路由算法所决定
Memcached路由算法求余数hash算法先用key做hash运算的到一个整数,再去做hash算法,根据余数进行路由。不适合在动态变化的环境中一致性hash算法按照hash算法把对应key通过一定hash算法处理后映射形成一个首尾接闭合循环,然后通过使用与对象存储一样的hash算法将机器也映射到环中,顺时针方向计算将所有对象存储到离自己最近的机器中。适合在动态变化中使用Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能。关于这个东西,相信很多人都用过,本文意在通过对memcached的实现及代码分析,获得对这个出色的开源软件更深入的了解,并可以根据我们的需要对其进行更进一步的优化。末了将通过对BSM_Memcache扩展的分析,加深对memcached的使用方式理解。
Memcached是什么在阐述这个问题之前,我们首先要清楚它“不是什么”。很多人把它当作和SharedMemory那种形式的存储载体来使用,虽然memcached使用了同样的“Key=>Value”方式组织数据,但是它和共享内存、APC等本地缓存有非常大的区别。Memcached是分布式的,也就是说它不是本地的。它基于网络连接(当然它也可以使用localhost)方式完成服务,本身它是一个独立于应用的程序或守护进程(Daemon方式)。Memcached使用libevent库实现网络连接服务,理论上可以处理无限多的连接,但是它和Apache不同,它更多的时候是面向稳定的持续连接的,所以它实际的并发能力是有限制的。在保守情况下memcached的最大同时连接数为200,这和Linux线程能力有关系,这个数值是可以调整的。关于libevent可以参考相关文档。 Memcached内存使用方式也和APC不同。APC是基于共享内存和MMAP的,memcachd有自己的内存分配算法和管理方式,它和共享内存没有关系,也没有共享内存的限制,通常情况下,每个memcached进程可以管理2GB的内存空间,如果需要更多的空间,可以增加进程数。Memcached适合什么场合在很多时候,memcached都被滥用了,这当然少不了对它的抱怨。我经常在论坛上看见有人发贴,类似于“如何提高效率”,回复是“用memcached”,至于怎么用,用在哪里,用来干什么一句没有。memcached不是万能的,它也不是适用在所有场合。
Memcached是“分布式”的内存对象缓存系统,那么就是说,那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源,即使是UNIX本地连接也一样。 在我之前的测试数据中显示,memcached本地读写速度要比直接PHP内存数组慢几十倍,而APC、共享内存方式都和直接数组差不多。可见,如果只是本地级缓存,使用memcached是非常不划算的。
Memcached在很多时候都是作为数据库前端cache使用的。因为它比数据库少了很多SQL解析、磁盘操作等开销,而且它是使用内存来管理数据的,所以它可以提供比直接读取数据库更好的性能,在大型系统中,访问同样的数据是很频繁的,memcached可以大大降低数据库压力,使系统执行效率提升。另外,memcached也经常作为服务器之间数据共享的存储媒介,例如在SSO系统中保存系统单点登陆状态的数据就可以保存在memcached中,被多个应用共享。
需要注意的是,memcached使用内存管理数据,所以它是易失的,当服务器重启,或者memcached进程中止,数据便会丢失,所以memcached不能用来持久保存数据。很多人的错误理解,memcached的性能非常好,好到了内存和硬盘的对比程度,其实memcached使用内存并不会得到成百上千的读写速度提高,它的实际瓶颈在于网络连接,它和使用磁盘的数据库系统相比,好处在于它本身非常“轻”,因为没有过多的开销和直接的读写方式,它可以轻松应付非常大的数据交换量,所以经常会出现两条千兆网络带宽都满负荷了,memcached进程本身并不占用多少CPU资源的情况。
下面我们开始做memcached群集实验环境4 192.168.136.238 主服务器
5 192.168.136.239 从服务器
6 192.168.136.185 客户端
客户端访问的漂移地址 192.168.136.188**
4主服务器安装memcached,libevent事件库,mamgent代理包[root@localhost ~]# mkdir /abc[root@localhost ~]# mount.cifs //192.168.100.25/memcached /abc #挂载Password for root@//192.168.100.25/memcached: [root@localhost ~]# cd /abc/[root@localhost abc]# lsLAMP-php5.6 magent-0.5.tar.gz memcached-1.5.6.tar.gzlibevent-2.1.8-stable.tar.gz memcache-2.2.7.tgz[root@localhost abc]# tar zxvf libevent-2.1.8-stable.tar.gz -C /opt #事件库,memcached依赖于事件库[root@localhost abc]# tar zxvf memcached-1.5.6.tar.gz -C /opt/ #服务端memcached[root@localhost abc]# yum install gcc gcc-c++ make -y #安装环境包[root@localhost abc]# mkdir /opt/magent[root@localhost abc]# tar zxvf magent-0.5.tar.gz -C /opt/magent/[root@localhost opt]# cd libevent-2.1.8-stable/[root@localhost libevent-2.1.8-stable]# ./configure --prefix=/usr [root@localhost libevent-2.1.8-stable]# make && make install #编译安装[root@localhost libevent-2.1.8-stable]# cd ../memcached-1.5.6/[root@localhost memcached-1.5.6]# ./configure --with-libevent=/usrmakemake install5从服务器安装memcached,libevent事件库[root@localhost ~]# mkdir /abc[root@localhost ~]# mount.cifs //192.168.100.25/memcached /abcPassword for root@//192.168.100.25/memcached: [root@localhost ~]# cd /abc/[root@localhost abc]# lsLAMP-php5.6 magent-0.5.tar.gz memcached-1.5.6.tar.gzlibevent-2.1.8-stable.tar.gz memcache-2.2.7.tgz[root@localhost abc]# tar zxvf libevent-2.1.8-stable.tar.gz -C /opt #事件库,memcached依赖于事件库[root@localhost abc]# tar zxvf memcached-1.5.6.tar.gz -C /opt/ #服务端memcached[root@localhost abc]# yum install gcc gcc-c++ make -y[root@localhost opt]# cd libevent-2.1.8-stable/[root@localhost libevent-2.1.8-stable]# ./configure --prefix=/usr[root@localhost libevent-2.1.8-stable]# make && make install[root@localhost libevent-2.1.8-stable]# cd ../memcached-1.5.6/[root@localhost memcached-1.5.6]# ./configure --with-libevent=/usrmakemake install4主服务器配置magent[root@localhost memcached-1.5.6]# cd /opt/[root@localhost opt]# lslibevent-2.1.8-stable magent memcached-1.5.6 rh[root@localhost opt]# cd magent/[root@localhost magent]# vim ketama.h #改两行#ifndef SSIZE_MAX #define SSIZE_MAX 32767 [root@localhost magent]# vim Makefile #指定makefile文件,改一行LIBS = -levent -lmmake #编译[root@localhost magent]# lsketama.c ketama.h ketama.o magent magent.c magent.o Makefile[root@localhost magent]# yum install openssh-clients -y #安装scp远程同步软件包[root@localhost magent]# cp magent /usr/bin/ #把magent脚本放到/usr/local中,让系统能识别[root@localhost magent]# scp magent root@192.168.136.239:/usr/bin/ #把mangent文件拷贝到从服务器上主从都关闭防火墙[root@localhost bin]# systemctl stop firewalld.service [root@localhost bin]# setenforce 0主从都装[root@localhost bin]# yum install keepalived -y4主服务器配置主从同步[root@localhost magent]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalivedvrrp_script magent { #写一个函数脚本 script "/opt/shell/magent.sh" ##指定脚本位置 interval 2 ##检测脚本时间间隔}global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id MAGENT_HA #主服务器id,两台不能一样}vrrp_instance VI_1 { state MASTER interface ens33 #主服务器网卡 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 #默认验证 } track_script { #调函数名magent magent} virtual_ipaddress { 192.168.136.188 #客户端访问的漂移地址 } } 5从服务器安装openssh客户端[root@localhost bin]# cd /etc/keepalived/[root@localhost keepalived]# mv keepalived.conf keepalived.conf.bak #改名字[root@localhost keepalived]# yum install openssh-clients -y4主服务器用scp把keepalived文件传到从服务器[root@localhost magent]# cd /etc/keepalived/[root@localhost keepalived]# scp keepalived.conf root@192.168.136.239:/etc/keepalived/5从服务器配置主从同步[root@localhost keepalived]# lskeepalived.conf keepalived.conf.bak[root@localhost keepalived]# vim keepalived.conf! Configuration File for keepalivedvrrp_script magent { script "/opt/shell/magent.sh" interval 2}global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id MAGENT_HB #routed_id不能相同}vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 52 #从服务器虚拟id不能和主服务器一样 priority 90 #优先级比主服务器低 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { magent} virtual_ipaddress { 192.168.136.188 } } 4主服务器配置magent脚本[root@localhost keepalived]# mkdir /opt/shell[root@localhost keepalived]# cd /opt/shell/[root@localhost shell]# vim magent.sh#!/bin/bashk=`ps -ef | grep keepalived | grep -v grep | wc -l` #检查keepaliveed进程,如果开启if [ $k -gt 0 ]; then # -n连接数量 -l指定漂移地址,-p指定端口映射到主从服务器的地址 magent -u root -n 51200 -l 192.168.136.188 -p 12000 -s 192.168.136.238:11211 -b 192.168.136.239:11211elsepkill -9 magentfi[root@localhost shell]# chmod +x magent.sh [root@localhost shell]# systemctl start keepalived.service [root@localhost shell]# netstat -ntap | grep 12000tcp 0 0 192.168.136.188:12000 0.0.0.0:* LISTEN 124720/magent 5从服务器同样的操作[root@localhost keepalived]# mkdir /opt/shell[root@localhost keepalived]# cd /opt/shell/[root@localhost shell]# vim magent.sh#!/bin/bashk=`ps -ef | grep keepalived | grep -v grep | wc -l`if [ $k -gt 0 ]; then magent -u root -n 51200 -l 192.168.136.188 -p 12000 -s 192.168.136.238:11211 -b 192.168.136.239:11211elsepkill -9 magentfi[root@localhost shell]# chmod +x magent.sh [root@localhost shell]# systemctl start keepalived.service [root@localhost shell]# netstat -ntap | grep 12000 #查看magent端口tcp 0 0 192.168.136.188:12000 0.0.0.0:* LISTEN 11660/magent 开启4主服务器memcached[root@localhost shell]# memcached -m 512k -u root -d -l 192.168.136.238 -p 11211 #启动主,-m指定空间大小[root@localhost shell]# netstat -ntap | grep 11211 tcp 0 0 192.168.136.238:11211 0.0.0.0:* LISTEN 44647/memcached 开启5从服务器memecached[root@localhost shell]# memcached -m 512k -u root -d -l 192.168.136.239 -p 11211 #启动从[root@localhost shell]# netstat -ntap | grep 11211tcp 0 0 192.168.136.239:11211 0.0.0.0:* LISTEN 42654/memcached 客户端 验证用telnet去连接memcached 内存数据库[root@localhost ~]# telnet 192.168.136.188 12000Trying 192.168.136.188...Connected to 192.168.136.188.Escape character is '^]'.add username 0 0 7 #我们先写个键值对数据1234567 STORED去4主服务器查看数据有没有[root@localhost shell]# telnet 192.168.136.238 11211Trying 192.168.136.238...Connected to 192.168.136.238.Escape character is '^]'.geer^H^HERRORget usernameVALUE username 0 71234567END验证5从服务器数据有没有同步[root@localhost shell]# telnet 192.168.136.239 11211Trying 192.168.136.239...Connected to 192.168.136.239.Escape character is '^]'.get usernameVALUE username 0 71234567END
欢迎光临 得知互动 (https://bbs.dezhifl.com/)
Powered by Discuz! X3.4