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입니다 (운영 라이브 저널 기술팀) 성능을 향상시키기 위해 동적 시스템에서 데이터베이스의 부하를 줄이기 위해 사용 분산 메모리 오브젝트 캐싱 시스템의 세트를 개발했다. 이 일에 대해서는, 많은 사람들이 깊은 이해이 우수한 오픈 소스 소프트웨어에 도착, 이것은 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를 데이터베이스 프런트 엔드 캐시로 사용된다. 이 데이터베이스보다 훨씬 적은 SQL 구문 분석, 디스크 작업 및 기타 비용이며, 직접 데이터베이스를 읽기 성능을보다가 대형 시스템에서, 더 나은 제공 할 수 있도록이 데이터를 관리하는 메모리를 사용하기 때문에, 액세스는 동일한 데이터입니다 자주, memcached를 데이터베이스는 크게 스트레스를 줄이고 시스템의 효율성을 향상시킬 수 있습니다. 이러한 시스템을 저장하는 서버와 기억 매체 사이에서 공유 또한, 자주 memcached를 데이터 로그 - 상기 SSO 시스템에서 단일 데이터 포인트의 상태를 다수의 애플리케이션에 의해 공유되는 memcached 의해 저장 될 수있다.

이 데이터가 손실되고, 서버를 다시 시작하거나 memcached를 프로세스가 중단되면, 휘발성 그래서, memcached를 메모리 관리 데이터를 사용하여, 그것은 memcached를 영구 데이터를 사용할 수 없습니다 있습니다. 많은 사람들이 오해는, memcached를 성능이 사실에 메모리와 하드 디스크 정도 아주 좋은, 좋은 대조이다, 사용 메모리 memcached를 수백 개선의 쓰기 속도를 읽고되지 않습니다는 실제 병목 현상은 네트워크 연결, 그리고 그것을 사용 그 자체가 과도한 오버 헤드 및 직접 읽기와 쓰기가 있기 때문에, 매우 "빛"이라는 혜택에 비해 디스크 데이터베이스 시스템, 쉽게 데이터 교환의 매우 많은 양의 대응할 수있는, 너무 자주 두 개의 기가비트 네트워크 대역폭이있을 것 전체 부하를, memcached를 프로세스 자체는 많은 CPU 리소스를 차지하지 않습니다.

여기에서 우리는 memcached를 클러스터 작업을 수행하기 시작

실험 환경

4 192.168.136.238 마스터
서버로부터 192.168.136.239 5
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]# 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
[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=/usr
make
make install

5 서버에서 memcached를, libevent 라이브러리 이벤트를 설치

[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]# 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
[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=/usr
make
make install

4 주 설정 magent

[root@localhost memcached-1.5.6]# cd /opt/
[root@localhost opt]# ls
libevent-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 -lm
make #编译
[root@localhost magent]# ls
ketama.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 [email protected]:/usr/bin/ #把mangent文件拷贝到从服务器上

마스터 및 슬레이브는 방화벽 폐쇄

[root@localhost bin]# systemctl stop firewalld.service 
[root@localhost bin]# setenforce 0

마스터 및 슬레이브가 설치됩니다

[root@localhost bin]# yum install keepalived -y

4 주 설정 마스터 - 슬레이브 동기화

[root@localhost 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 클라이언트를 설치하기

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

파일 서버로부터 전송 된 주 서버의 SCP 4 keepalived

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

마스터 - 슬레이브 동기화 서버에서의 구성 5

[root@localhost keepalived]# ls
keepalived.conf  keepalived.conf.bak
[root@localhost 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

[root@localhost keepalived]# mkdir /opt/shell
[root@localhost keepalived]# cd /opt/shell/
[root@localhost 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
[root@localhost shell]# chmod +x magent.sh 
[root@localhost shell]# systemctl start keepalived.service 
[root@localhost shell]# netstat -ntap | grep 12000
tcp        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/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
[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     

memecached 서버에서 5 열기

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

확인 텔넷 클라이언트는 memcached를 데이터베이스 메모리에 연결

[root@localhost ~]# 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 주 서버

[root@localhost 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) 서버로부터 인증 동기화 데이터 없다

[root@localhost 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

추천

출처blog.51cto.com/14449524/2459410