您好,登錄后才能下訂單哦!
一套開源的高性能分布式內存對象緩存系統(tǒng)
所有的數(shù)據(jù)都存儲在內存中
支持任意存儲類型的數(shù)據(jù)
提高網址訪問的速度
當程序寫入緩存數(shù)據(jù)請求時,Memcached的API接口將KEY輸入路由算法模塊路由到集群中的一臺服務,之后由API接口與服務器進行通信,完成一次分布式緩存寫入
Key索引建立在API中,值value數(shù)據(jù)存在后面的memcached中
要依賴于Memcached的客戶端來實現(xiàn)
多個Memcached服務器是獨立的
分布式數(shù)據(jù)如何存儲是路由算法所決定
求余數(shù)hash算法
先用key做hash運算的到一個整數(shù),再去做hash算法,根據(jù)余數(shù)進行路由。不適合在動態(tài)變化的環(huán)境中
一致性hash算法
按照hash算法把對應key通過一定hash算法處理后映射形成一個首尾接閉合循環(huán),然后通過使用與對象存儲一樣的hash算法將機器也映射到環(huán)中,順時針方向計算將所有對象存儲到離自己最近的機器中。適合在動態(tài)變化中使用
Memcached是danga.com(運營LiveJournal的技術團隊)開發(fā)的一套分布式內存對象緩存系統(tǒng),用于在動態(tài)系統(tǒng)中減少數(shù)據(jù)庫負載,提升性能。關于這個東西,相信很多人都用過,本文意在通過對memcached的實現(xiàn)及代碼分析,獲得對這個出色的開源軟件更深入的了解,并可以根據(jù)我們的需要對其進行更進一步的優(yōu)化。末了將通過對BSM_Memcache擴展的分析,加深對memcached的使用方式理解。
在闡述這個問題之前,我們首先要清楚它“不是什么”。很多人把它當作和SharedMemory那種形式的存儲載體來使用,雖然memcached使用了同樣的“Key=>Value”方式組織數(shù)據(jù),但是它和共享內存、APC等本地緩存有非常大的區(qū)別。Memcached是分布式的,也就是說它不是本地的。它基于網絡連接(當然它也可以使用localhost)方式完成服務,本身它是一個獨立于應用的程序或守護進程(Daemon方式)。
Memcached使用libevent庫實現(xiàn)網絡連接服務,理論上可以處理無限多的連接,但是它和Apache不同,它更多的時候是面向穩(wěn)定的持續(xù)連接的,所以它實際的并發(fā)能力是有限制的。在保守情況下memcached的最大同時連接數(shù)為200,這和Linux線程能力有關系,這個數(shù)值是可以調整的。關于libevent可以參考相關文檔。 Memcached內存使用方式也和APC不同。APC是基于共享內存和MMAP的,memcachd有自己的內存分配算法和管理方式,它和共享內存沒有關系,也沒有共享內存的限制,通常情況下,每個memcached進程可以管理2GB的內存空間,如果需要更多的空間,可以增加進程數(shù)。
在很多時候,memcached都被濫用了,這當然少不了對它的抱怨。我經常在論壇上看見有人發(fā)貼,類似于“如何提高效率”,回復是“用memcached”,至于怎么用,用在哪里,用來干什么一句沒有。memcached不是萬能的,它也不是適用在所有場合。
Memcached是“分布式”的內存對象緩存系統(tǒng),那么就是說,那些不需要“分布”的,不需要共享的,或者干脆規(guī)模小到只有一臺服務器的應用,memcached不會帶來任何好處,相反還會拖慢系統(tǒng)效率,因為網絡連接同樣需要資源,即使是UNIX本地連接也一樣。 在我之前的測試數(shù)據(jù)中顯示,memcached本地讀寫速度要比直接PHP內存數(shù)組慢幾十倍,而APC、共享內存方式都和直接數(shù)組差不多??梢姡绻皇潜镜丶壘彺?,使用memcached是非常不劃算的。
Memcached在很多時候都是作為數(shù)據(jù)庫前端cache使用的。因為它比數(shù)據(jù)庫少了很多SQL解析、磁盤操作等開銷,而且它是使用內存來管理數(shù)據(jù)的,所以它可以提供比直接讀取數(shù)據(jù)庫更好的性能,在大型系統(tǒng)中,訪問同樣的數(shù)據(jù)是很頻繁的,memcached可以大大降低數(shù)據(jù)庫壓力,使系統(tǒng)執(zhí)行效率提升。另外,memcached也經常作為服務器之間數(shù)據(jù)共享的存儲媒介,例如在SSO系統(tǒng)中保存系統(tǒng)單點登陸狀態(tài)的數(shù)據(jù)就可以保存在memcached中,被多個應用共享。
需要注意的是,memcached使用內存管理數(shù)據(jù),所以它是易失的,當服務器重啟,或者memcached進程中止,數(shù)據(jù)便會丟失,所以memcached不能用來持久保存數(shù)據(jù)。很多人的錯誤理解,memcached的性能非常好,好到了內存和硬盤的對比程度,其實memcached使用內存并不會得到成百上千的讀寫速度提高,它的實際瓶頸在于網絡連接,它和使用磁盤的數(shù)據(jù)庫系統(tǒng)相比,好處在于它本身非?!拜p”,因為沒有過多的開銷和直接的讀寫方式,它可以輕松應付非常大的數(shù)據(jù)交換量,所以經常會出現(xiàn)兩條千兆網絡帶寬都滿負荷了,memcached進程本身并不占用多少CPU資源的情況。
4 192.168.136.238 主服務器
5 192.168.136.239 從服務器
6 192.168.136.185 客戶端
客戶端訪問的漂移地址 192.168.136.188**
[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 #安裝環(huán)境包
[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
[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
[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中,讓系統(tǒng)能識別
[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 -y
[root@localhost magent]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
vrrp_script magent { #寫一個函數(shù)腳本
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 { #調函數(shù)名magent
magent
}
virtual_ipaddress {
192.168.136.188 #客戶端訪問的漂移地址
}
}
[root@localhost bin]# cd /etc/keepalived/
[root@localhost keepalived]# mv keepalived.conf keepalived.conf.bak #改名字
[root@localhost keepalived]# yum install openssh-clients -y
[root@localhost magent]# cd /etc/keepalived/
[root@localhost keepalived]# scp keepalived.conf root@192.168.136.239:/etc/keepalived/
[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 {
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 #優(yōu)先級比主服務器低
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
magent
}
virtual_ipaddress {
192.168.136.188
}
}
[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連接數(shù)量 -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
[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
[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
[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
[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 #我們先寫個鍵值對數(shù)據(jù)
1234567
STORED
[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
[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
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。