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代理包

[[email protected] ~]# mkdir /abc
[[email protected] ~]# mount.cifs //192.168.100.25/memcached /abc #挂载
Password for [email protected]//192.168.100.25/memcached:
[[email protected] ~]# cd /abc/
[[email protected] abc]# ls
LAMP-php5.6                   magent-0.5.tar.gz   memcached-1.5.6.tar.gz
libevent-2.1.8-stable.tar.gz  memcache-2.2.7.tgz
[[email protected] abc]# tar zxvf libevent-2.1.8-stable.tar.gz -C /opt #事件库,memcached依赖于事件库
[[email protected] abc]# tar zxvf memcached-1.5.6.tar.gz -C /opt/   #服务端memcached
[[email protected] abc]# yum install gcc gcc-c++ make -y #安装环境包
[[email protected] abc]# mkdir /opt/magent
[[email protected] abc]# tar zxvf magent-0.5.tar.gz -C /opt/magent/
[[email protected] opt]# cd libevent-2.1.8-stable/
[[email protected] libevent-2.1.8-stable]# ./configure --prefix=/usr
[[email protected] libevent-2.1.8-stable]# make && make install #编译安装
[[email protected] libevent-2.1.8-stable]# cd ../memcached-1.5.6/
[[email protected] memcached-1.5.6]# ./configure --with-libevent=/usr
make
make install

5从服务器安装memcached,libevent事件库

[[email protected] ~]# mkdir /abc
[[email protected] ~]# mount.cifs //192.168.100.25/memcached /abc
Password for [email protected]//192.168.100.25/memcached:
[[email protected] ~]# cd /abc/
[[email protected] abc]# ls
LAMP-php5.6                   magent-0.5.tar.gz   memcached-1.5.6.tar.gz
libevent-2.1.8-stable.tar.gz  memcache-2.2.7.tgz
[[email protected] abc]# tar zxvf libevent-2.1.8-stable.tar.gz -C /opt #事件库,memcached依赖于事件库
[[email protected] abc]# tar zxvf memcached-1.5.6.tar.gz -C /opt/   #服务端memcached
[[email protected] abc]# yum install gcc gcc-c++ make -y
[[email protected] opt]# cd libevent-2.1.8-stable/
[[email protected] libevent-2.1.8-stable]# ./configure --prefix=/usr

[[email protected] libevent-2.1.8-stable]# make && make install
[[email protected] libevent-2.1.8-stable]# cd ../memcached-1.5.6/
[[email protected] memcached-1.5.6]# ./configure --with-libevent=/usr
make
make install

4主服务器配置magent

[[email protected] memcached-1.5.6]# cd /opt/
[[email protected] opt]# ls
libevent-2.1.8-stable  magent  memcached-1.5.6  rh
[[email protected] opt]# cd magent/
[[email protected] magent]# vim ketama.h #改两行
#ifndef SSIZE_MAX
#define SSIZE_MAX 32767
[[email protected] magent]# vim Makefile  #指定makefile文件,改一行
LIBS = -levent -lm
make #编译
[[email protected] magent]# ls
ketama.c  ketama.h  ketama.o  magent  magent.c  magent.o  Makefile
[[email protected] magent]# yum install openssh-clients -y #安装scp远程同步软件包
[[email protected] magent]# cp magent /usr/bin/ #把magent脚本放到/usr/local中,让系统能识别
[[email protected] magent]# scp magent [email protected]:/usr/bin/ #把mangent文件拷贝到从服务器上

主从都关闭防火墙

[[email protected] bin]# systemctl stop firewalld.service
[[email protected] bin]# setenforce 0

主从都装

[[email protected] bin]# yum install keepalived -y

4主服务器配置主从同步

[[email protected] magent]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

vrrp_script magent {    #写一个函数脚本
        script "/opt/shell/magent.sh" ##指定脚本位置
        interval 2  ##检测脚本时间间隔
}

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   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客户端

[[email protected] bin]# cd /etc/keepalived/
[[email protected] keepalived]# mv keepalived.conf keepalived.conf.bak #改名字
[[email protected] keepalived]# yum install openssh-clients -y

4主服务器用scp把keepalived文件传到从服务器

[[email protected] magent]# cd /etc/keepalived/
[[email protected] keepalived]# scp keepalived.conf [email protected]:/etc/keepalived/

5从服务器配置主从同步

[[email protected] keepalived]# ls
keepalived.conf  keepalived.conf.bak
[[email protected] keepalived]# vim keepalived.conf
! Configuration File for keepalived

vrrp_script magent {
        script "/opt/shell/magent.sh"
        interval 2
}

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   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脚本

[[email protected] keepalived]# mkdir /opt/shell
[[email protected] keepalived]# cd /opt/shell/
[[email protected] shell]# vim magent.sh
#!/bin/bash
k=`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:11211
else
pkill -9 magent
fi
[[email protected] shell]# chmod +x magent.sh
[[email protected] shell]# systemctl start keepalived.service
[[email protected] shell]# netstat -ntap | grep 12000
tcp        0      0 192.168.136.188:12000   0.0.0.0:*               LISTEN      124720/magent       

5从服务器同样的操作

[[email protected] keepalived]# mkdir /opt/shell
[[email protected] keepalived]# cd /opt/shell/
[[email protected] shell]# vim magent.sh
#!/bin/bash
k=`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:11211
else
pkill -9 magent
fi
[[email protected] shell]# chmod +x magent.sh
[[email protected] shell]# systemctl start keepalived.service
[[email protected] shell]# netstat -ntap | grep 12000  #查看magent端口
tcp        0      0 192.168.136.188:12000   0.0.0.0:*               LISTEN      11660/magent        

开启4主服务器memcached

[[email protected] shell]# memcached -m 512k -u root -d -l 192.168.136.238 -p 11211  #启动主,-m指定空间大小
[[email protected] shell]# netstat -ntap | grep 11211
tcp        0      0 192.168.136.238:11211   0.0.0.0:*               LISTEN      44647/memcached     

开启5从服务器memecached

[[email protected] shell]# memcached -m 512k -u root -d -l 192.168.136.239 -p 11211 #启动从
[[email protected] shell]# netstat -ntap | grep 11211
tcp        0      0 192.168.136.239:11211   0.0.0.0:*               LISTEN      42654/memcached     

客户端 验证用telnet去连接memcached 内存数据库

[[email protected] ~]# telnet 192.168.136.188 12000
Trying 192.168.136.188...
Connected to 192.168.136.188.
Escape character is ‘^]‘.
add username 0 0 7  #我们先写个键值对数据
1234567
STORED

去4主服务器查看数据有没有

[[email protected] shell]# telnet 192.168.136.238 11211
Trying 192.168.136.238...
Connected to 192.168.136.238.
Escape character is ‘^]‘.
geer^H^H
ERROR
get username
VALUE username 0 7
1234567
END

验证5从服务器数据有没有同步

[[email protected] shell]# telnet 192.168.136.239 11211
Trying 192.168.136.239...
Connected to 192.168.136.239.
Escape character is ‘^]‘.
get username
VALUE username 0 7
1234567
END

原文地址:https://blog.51cto.com/14449524/2459411

时间: 2024-10-10 00:01:01

Memcached内存数据库群集的相关文章

Memcached数据库群集

Memcached概述 一套开源的高性能分布式内存对象缓存系统所有的数据都存储在内存中支持任意存储类型的数据提高网址访问的速度 Memcached缓存机制 当程序写入缓存数据请求时,Memcached的API接口将KEY输入路由算法模块路由到集群中的一台服务,之后由API接口与服务器进行通信,完成一次分布式缓存写入 Key索引建立在API中,值value数据存在后面的memcached中 Memcached分布式 要依赖于Memcached的客户端来实现多个Memcached服务器是独立的分布式

memcached内存数据库——部署及操作

概述 ?Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. 特点 1.协议简单: 2.基于libevent的事件处理: 3.内置内存存储方式: 4.memcached不互相通信的分布式. 存储方式

领会Memcached高可用群集(Memcached主主复制+Keepalived)

10月3号我写了高性能内存缓存对象缓存Memcached原理 (Memcached核心概念,部署),本片将Memcached高可用群集(Memcached主主复制+Keepalived)掌握一下. memcached高可用集群原理及介绍: memcached在实现分布式群集部署时,memcached服务之间是不能进行通讯的,分布式也是通过客户端的算法吧数据保存在不同的memcached中,所以当我们做完群集客户端往一个memcached节点写入数据后,另外两个节点是查询不到的. 那么如何结局额这

memcached的使用

一.windows下安装 环境:win7专业版+memcached_win32_1.4.5 步骤: 1.cmd切换到指定解压目录 2.memcached -d install安装 3.输入memcached –h,出现下图窗口说明已经安装成功 4.telnet测试是否正常运行 telnet 127.0.0.1 11211 如下图: 5.stats命令查看运行状态如下图: 二.linux下安装 环境:redhat5+memcached-1.4.25 所需安装包: 步骤: 1.解压libevent

Nginx的session一致性问题

session一致性memcached缓存数据库解决方案 1.安装memcached内存数据库 yum –y install memcached 可以用telnet localhost 11211 Set abc 0 0 5 12345 get abc 2.web服务器连接memcached的jar包拷贝到tomcat的lib 3.修改server.xml里面修改Engine标签,添加jvmRoute属性,目的是查看sessionid里面带有tomcat的名字,就是这里配置的jvmRoute <

主键,外键,自然主键,代理主键,关系型数据库及非关系型数据库

关系型数据库: 将复杂的数据结构转换为一个二维表格即利用关系模型把数据组织到一个二维数据表,通过SQL即结构化查询语句去操作数据:后期学习Jpa面向对象查询语句jpql语句操作数据 Oracle Oracle(甲骨文/神域) 运行稳定,可移植性高,功能齐全,性能超群!适用于大型企业领域.对企业收费. DB2 IBM 速度快.可靠性好,适于海量数据,恢复性极强.适用于大中型企业领域. SQL SERVER 微软 全面,效率高,界面友好,操作容易,但是不跨平台.适用于于中小型企业领域. MYSQL

内存数据库:memcached与redis技术的对比试验

本文以高性能nginx服务器为应用背景,想利用缓存技术来减轻系统负荷,加快响应时间,从而增加web服务器的吞吐量. redis是一种分布式内存数据库,memcached是一种内存缓存技术,它们都采用key-value方式来存取数据.不同的是redis具有硬盘备份技术,重启不丢失数据,而memcached是纯内存,重启会丢失数据. 采用思路是: 当nginx入口模块拿到数据请求,过滤内容无关字段,提取关键字段,做md5压缩.然后去查找缓存,看是否命中,没命中的话处理请求,返回数据后保存至缓存.如果

Centos7 下实现 memcached + keepalived 高可用群集

memcached + keepalived 高可用群集 memcached介绍 Memcached是一套开源的高性能分布式内存对象缓存系统,它将所有的数据都存储在内存中,因为在内存中会统一维护一张巨大的Hash表,所以支持任意存储类型的数据.很多网站通过使用 Memcached提高网站的访问速度,尤其是对于大型的需要频繁访问数据的网站.Memcached是典型的C/S架构,因此需要安装 Memcached服务端与 MemcachedAPI客户端. Memcached服务端是用C语言编写的,而

memcached群集

本实验实现的是memcached+magent+keepalived高可用群集: magent:代理memcached实现负载均衡 keepalived:magent主从HA高可用 memcached:缓存对象 实验要求: 主服务器:192.168.177.140(magent+memcached+libevent+keepalived) 从服务器:192.168.177.135(memcached+libevent+keepalived) 客户机:192.168.177.132(telnet软