Repcached介紹
Repchched項目地址:http://repcached.sourceforge.net/
關於repcached
“repcached”是一個補丁集合,它添加數據複製功能到memcached 1.2.x。
主要目的
實現冗餘memcached系統。
主要功能多主複製。
異步數據複製。
支持所有的memcached命令(set, add, delete, incr/decr, flush_all, cas)。
Memcached 1.4.x的Repcached補丁
地址:http://mdounin.ru/
最新補丁:http://mdounin.ru/files/repcached-2.3.1-1.4.13.patch.gz
工作原理
repcached實現了memcached複製的功能,它是一個單master單slave的方案,但master/slave都是可讀寫的,而且可以相互同步,如果master壞掉slave偵測到連接斷了,它會自動listen而成爲master,這時壞掉的master只能啓用爲slave,它們之間互換角色,才能保持複製功能,換句話說,master沒有搶佔功能;而如果slave壞掉,master也會偵測到連接斷,它就會重新listen等待新的slave加入。
應用場景
用memcached做session共享或其它服務時會存在memcached的單點故障,如果memcached宕機,那麼整個系統用戶無法登陸(session)。
基於這種情況,採用repcached做memcached的主從冗餘。
Repcached下載地址
http://sourceforge.net/projects/repcached/files/repcached/
Repcached安裝方式
Repcached有兩種安裝方式:
1.補丁版本安裝
先安裝相應版本的memcached,然後對應版本的Repcached補丁。
2.整合版本安裝
直接安裝整合版本的memcached
方式一:補丁版本安裝
1. 安裝Memcache,相關安裝方法可以參見博文:
http://ultrasql.blog.51cto.com/9591438/1632179
2. 下載對應的repcached版本補丁安裝文件:
假設安裝的memcahced版本爲1.2.8,下載針對該版本最新的補丁:
wget http://softlayer-dal.dl.sourceforge.net/project/repcached/repcached/2.2.1-1.2.8/repcached-2.2.1-1.2.8.patch.gz
gzip -cd ../repcached-2.2.1-1.2.8.patch.gz | patch -p1
./configure --enable-replication
make && make install
方式二:整合版本安裝
yum -y install gcc gcc-c++
安裝libevent:
cd /tmp
wget http://downloads.sourceforge.net/levent/libevent-2.0.22-stable.tar.gz
tar zxvf libevent-2.0.22-stable.tar.gz
cd libevent-2.0.22-stable
./configure --prefix=/usr/
make && make install
將libevent的庫文件添加到動態庫中:
vi /etc/ld.so.conf
在最後添加如下行:
/usr/ //此處爲要添加的libevent庫目錄
重新加載動態lib庫
ldconfig
注意:如果無此步驟,在啓動memcached時,會提示看不到libevent的庫文件。
測試libevent是否安裝成功:
ll /usr/lib/libevent*
3. 創建啓動帳號:
groupadd memcached
useradd -g memcached memcached
4. 創建PID進程目錄並修改所有者:
mkdir /var/run/memcached
chown -R memcached.memcached /var/run/memcached
5. 安裝整合memcached-repcached包:
tar zxvf memcached-1.2.8-repcached-2.2.1.tar.gz
mv memcached-1.2.8-repcached-2.2.1 memcached
cd memcached
./configure --prefix=/usr/local/memcached --with-libevent=/usr/ --enable-replication --enable-64bit
注意:默認memcached單個進程只支持到2G內存,需要更大內存支持的話,需要打開64位支持,編譯的時候加參數:
--enable-64bit
make && make install
提示編譯出錯:
make all-recursive
make[1]: Entering directory `/usr/local/memcached'
Making all in doc
make[2]: Entering directory `/usr/local/memcached/doc'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/usr/local/memcached/doc'
make[2]: Entering directory `/usr/local/memcached'
gcc -DHAVE_CONFIG_H -I. -DNDEBUG -m64 -g -O2 -MT memcached-memcached.o -MD
MP -MF .deps/memcached-memcached.Tpo -c -o memcached-memcached.o `test -f
memcached.c' || echo './'`memcached.c
memcached.c: In function ‘add_iov’:
memcached.c:697: error: ‘IOV_MAX’ undeclared (first use in this function)
memcached.c:697: error: (Each undeclared identifier is reported only once
memcached.c:697: error: for each function it appears in.)
make[2]: *** [memcached-memcached.o] Error 1
make[2]: Leaving directory `/usr/local/memcached'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/usr/local/memcached'
make: *** [all] Error 2
解決方案:
vi memcached.c
將下面的幾行
/* FreeBSD 4.x doesn't have IOV_MAX exposed. */
#ifndef IOV_MAX
#if defined(__FreeBSD__) || defined(__APPLE__)
# define IOV_MAX 1024
#endif
#endif
修改爲
/* FreeBSD 4.x doesn't have IOV_MAX exposed. */
#ifndef IOV_MAX
# define IOV_MAX 1024
#endif
重新編譯和安裝:
make && make install
修改memcached目錄所有者:
cd ..
chown -R memcached.memcached memcached
配置主從複製
參數說明:
-x 設置從哪個IP上進行同步。
-X 指定數據同步的端口。
Memcached默認服務端口是11211,默認同步監聽端口是11212。
啓動Master:
/usr/local/memcached/bin/memcached -d -m 100 192.168.11.51 -p 11211 -u memcached -c 1024 -x 192.168.11.52 -X 11212 -P /var/run/memcached/memcached-rep.pid
查看監聽端口:
netstat -tupln | grep memcached
tcp 0 0 192.168.11.51:11211 0.0.0.0:* LISTEN 18634/memcached
tcp 0 0 192.168.11.51:11212 0.0.0.0:* LISTEN 18634/memcached
udp 0 0 192.168.11.51:11211 0.0.0.0:* 18634/memcached
啓動Slave:
/usr/local/memcached/bin/memcached -d -m 100 -l 192.168.11.52 -p 11211 -u memcached -c 1024 -x 192.168.11.51 -X 11212 -P /var/run/memcached/memcached-rep.pid
說明:-x 192.168.11.51用於同步的Master的IP地址。
查看監聽端口:
netstat -tupln | grep memcached
tcp 0 0 192.168.11.52:11211 0.0.0.0:* LISTEN 24262/memcached
udp 0 0 192.168.11.52:11211 0.0.0.0:* 24262/memcached
驗證數據同步
在Master創建數據:
[root@test01 bin]# telnet 192.168.1.10 11211
Trying 192.168.1.10…
Connected to 192.168.1.10.
Escape character is ‘^]’.
get key1
END
set key1 0 0 2
aa
STORED
quit
Connection closed by foreign host.
在Slave獲取數據:
[root@test02 bin]# telnet 192.168.1.11 11211
Trying 192.168.1.11…
Connected to 192.168.1.11.
Escape character is ‘^]’.
get key1
VALUE key1 0 2
aa
END
quit
Connection closed by foreign host.
在Slave創建數據:
[root@test02 bin]# telnet 192.168.1.11 11211
Trying 192.168.1.11…
Connected to 192.168.1.11.
Escape character is ‘^]’.
get key2
END
set key2 0 0 3
bbb
STORED
get key2
VALUE key2 0 3
bbb
END
quit
Connection closed by foreign host.
在Master獲取數據:
[root@test01 bin]# telnet 192.168.1.10 11211
Trying 192.168.1.10…
Connected to 192.168.1.10.
Escape character is ‘^]’.
get key2
VALUE key2 0 3
bbb
END
quit
Connection closed by foreign host.
Memcached高可用
啓動Master和Slave時不要加-l參數指定監聽地址,否則keepalived無法監聽VIP的地址。
/usr/local/memcached/bin/memcached -d -m 100 192.168.82.91 -p 11211 -u memcached -c 1024 -x 192.168.82.92 -X 11212 -P /var/run/memcached/memcached-rep.pid
然後配置上keepalived就可以作爲高可用了。
以下是keppalived配置信息,在此就不多數了,相信大家都熟悉keepalived的作用了
MASTER 主機 配置信息
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface eth1
virtual_router_id 51
priority 101 主機 爲 101
advert_int 1
authentication {
auth_type PASS 驗證類型
auth_pass 1111 驗證密碼自己修改即可,記得主備機上的密碼要一致
}
virtual_ipaddress {
192.168.1.120 虛擬IP 地址
}
}
SLAVE 從機 配置信息
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface eth1
virtual_router_id 51
priority 100 從機 爲 100
advert_int 1
authentication {
auth_type PASS 驗證類型
auth_pass 1111 驗證密碼自己修改即可,記得主備機上的密碼要一致
}
virtual_ipaddress {
192.168.1.120 虛擬IP 地址
}
}
通過虛擬IP進行memcached 存取操作
要用這個VIP啓動memcached
[root@localhost happy]# telnet 192.168.1.120 11211
Trying 192.168.1.120…
Connected to 192.168.1.120.
Escape character is ‘^]’.
set key 0 0 6
123456
STORED
get key
VALUE key 0 6
123456
END
get key1
VALUE key1 0 2
aa
END
quit
Connection closed by foreign host.
OK keepalived + memcached主備模式到此設置完成了,下面我們來停止一臺機器上的keepalived模擬down機,然後再用虛擬IP 192.168.1.120鏈接memcached並對其進行讀寫,看下能否正常訪問到memcached數據就知道了主備模式是否健全了
[root@localhost happy]# telnet 192.168.1.120 11211
Trying 192.168.1.120…
Connected to 192.168.1.120.
Escape character is ‘^]’.
get key
VALUE key 0 6
123456
END
get key1
VALUE key1 0 2
aa
END
quit
Connection closed by foreign host.
OK MEMCACHED一切正常,不僅memcached實現了內存複製,而且keepalived運行也一切正常,至此一個完整可靠的memcached主備模式構建完成了。。。