金庸武功之“蛤蟆功”--memcached主從複製

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

方式二:整合版本安裝

  1.  yum -y install gcc gcc-c++

  2. 安裝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包:

 wget https://sourceforge.net/projects/repcached/files/repcached/2.2.1-1.2.8/memcached-1.2.8-repcached-2.2.1.tar.gz  


  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主備模式構建完成了。。。 











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章