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の場合でも、リソースを必要とするので、システム効率が遅くなります。私の前のテストデータ表示では、直接PHPの配列よりもローカルメモリの読み取りおよび書き込み速度をゆっくりと数回memcachedをし、APC、および直接共有メモリ・アレイは似ています。参照してください、唯一のローカルレベルのキャッシュ場合、memcachedを使用することは非常に不経済です。

多くの場合、memcachedのは、データベースのフロントエンドのキャッシュとして使用されています。それはデータベースよりもはるかに少ないSQLの構文解析、ディスク操作やその他の費用であり、直接データベースのパフォーマンスを読むよりも、それは大規模なシステムでは、より良い提供することができますので、それは、データを管理するためにメモリを使用するので、アクセスは同じデータがあります頻繁に、memcachedのデータベースが大きく、システムの効率を向上させる、ストレスを減少させることができます。さらに、そのようなシステムログインSSOシステムでシングルポイントデータの状態を保存するようなサーバの記憶媒体との間で共有することが多いmemcachedのようなデータは、複数のアプリケーションによって共有、memcachedをすることによって保存することができます。

それは、データが失われ、サーバーが再起動される、またはmemcachedのプロセスが中断されたときに、揮発性であるので、memcachedのメモリ管理データを使用して、それはmemcachedの永続的なデータを使用することができない、ということに注意してください。多くの人々誤解、memcachedのパフォーマンスは実際には非常に良好で、メモリやハードディスク程度で良好なコントラスト、使用memcachedのメモリであり、読み、何百もの書き込み速度は、その実際のボトルネックがネットワーク接続され、そしてそれを使用する、改良され得ることはありませんそれ自体が無理なオーバーヘッドとの直接読み込みと書き込みがあるので、非常に「光」であることのメリットに比べてディスクデータベース・システム、それが簡単にデータ交換の非常に大きな量に対応できるので、多くの場合、2つのギガビットネットワーク帯域幅があるでしょう全負荷を持って、memcachedのプロセス自体は、CPUリソースの多くを取りません。

ここでは、memcachedのクラスタを行うことを始めます

実験環境

4 192.168.136.238マスター
サーバーから5 192.168.136.239
6 192.168.136.185クライアント
クライアント192.168.136.188にアクセスドリフトアドレス**

memcachedの4マスターサーバーのインストール、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  #客户端访问的漂移地址
    }   
}   

OpenSSHのクライアントをインストールするには、サーバーから5

[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のデータベースメモリに接続するための検証のTelnetクライアント

[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