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]alhost 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/2459410

时间: 2024-10-12 16:13:37

Memcached数据库群集的相关文章

九、数据库群集部署、配置(一)

九. 数据库群集部署.配置(一) 添加故障转移群集功能 1. 分别在SQL01,SQL02 上打开Powershell 命令提升符,执行如下命令添加故障转移功能,如图 Add-WindowsFeature -Source Z:\sources\sxs NET-Framework-Features,NET-Framework-Core,Failover-Clustering,RSAT-Clustering,RSAT-Clustering-PowerShell,RSAT-Clustering-Mgm

九、 数据库群集部署、配置(四)

九. 数据库群集部署.配置( 四) 向SQL Server 群集添加节点 1.  在SQL02 上运行SQL 2012 安装程序,如图 2.  选择"安装",如图 3.  选择"向SQL Server 故障转移群集添加节点",如图 4.  在安装程序支持规则对话框,选择"确定",如图 5.  在产品密钥对话框,选择版本,输入产品密钥,如图 6.  在许可条款对话框,选择"我接受许可条款",如图 7.  在产品更新对话框,选择&

九、数据库群集部署、配置 (二)

九. 数据库群集部署.配置(二) 配置DTC 角色高可用 在群集管理器对话框,选择"配置角色",如图 2.  选择"下一步",如图 3.  在选择角色对话框,选择"分布式事务协调器(DTC)",选择"下一步",如图 4.  输入客户端访问群集角色名称,IP 地址,如图 5.  选择存储,选择磁盘3,如图 根据存储上划分的的ISCSI 磁盘进行选择 6.  在确认对话框,选择"下一步",如图 7.  完成DT

九、数据库群集部署、配置 (三)

九. 数据库群集部署.配置 (三) 创建MSSQL 群集 打开故障转移群集管理器,查看当前主服务器,如图 2.  登录sql01 (当前主服务器),查看主机和用户信息,如图 3.  在SQL01 服务器加载SQL 2012 光盘或ISO 文件,并打开,选择"从媒体安装或运 行程序",如图 4.  选择"安装",如图 5.  选择"新的SQL Server 故障转移群集安装",如图 6.  在安装程序支持规则对话框,选择"确定"

利用yum 安装 lamp环境搭载 cacti监控和memcached数据库

今天测试了一下yum安装lamp和cacti监/控已经memcached数据库 首先介绍下我的系统环境 centos6.7 x86-64 1安装cacti yum install cacti 安装cacti 会自动安装lamp环境, 2接下来是memcached的安装步骤 yum install -y epel-release  --安装epel扩展源 里面有提供memcached libmemcached包 yum install -y libevent  memcached libmemca

memcached数据库简单配置介绍

一.memcached数据库(基于内存的储存方式:默认端口11211)1.装包yum -y install memcached telnet (telnet是一款远程访问工具,mem软件无客户端,所以需安装telnet连接服务器)2.启服务:systemctl restart memcached.server查看端口是否启用:netstat -antpu | grep mem3.查看配置文件(默认不需要修改):vim /etc/sysconfig/memcached 4.连接数据库验证是否可用:

怎样从外网访问内网Memcached数据库

外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Memcached数据库 默认安装的Memcached数据库端口是11211. 2. 实现步骤 2.1 下载并解压holer软件包 Holer软件包:holer-xxx.tar.gz Holer支持各种OS系统平台,请选择跟本地OS类型匹配的holer软件包. 2.2 获取holer acce

Memcached内存数据库群集

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

Memcached数据库缓存

Memcached 一.Memcached简介 Memcached是一个开源的,支持高性能,高并发的分布式内存缓存系统,由C语言编写,总共2000多行代码.从软件名称上看,前3个字符"Mem"就是内存的意思,而接下来的后面5个字符"cache"就是缓存的意思,最后一个字符d,是daemon的意思,代表是服务器端守护进程模式服务. Memcached服务分为服务器端和客户端两部分,其中,服务器端软件的名字形如Memcached-1.4.24.tar.gz,客户端软件的