天天看點

Memcached實戰之複制----基于repcached的主從

       由于 Memcached 自己沒有防止單點的措施,因為為了保障 Memcached 服務的高可用,我們需要借助外部的工具來實作高可用的功能。本文引入 Repcached 這個工具,通過使用該工具我們可以完成 Memcached 服務的主從功能。

       Repcached 它是由日本人開發的,用來實作 Memcached 複制功能的一個工具。它所建構的主從方案是一個單主單從的方案,不支援多主多從。但是,它的特點是,主從兩個節點可以互相讀寫,進而可以達到互相同步的效果。

       假設主節點壞掉,從節點會很快偵測到連接配接斷開,然後它會自動切換到監聽狀态( listen)進而成為主節點,并且等待新的從節點加入。

       假設原來挂掉的主節點恢複之後,我們隻能人工手動以從節點的方式去啟動。原來的主節點并不能搶占成為新的主節點,除非新的主節點挂掉。這也就意味着,基于 Repcached 實作的 Memcached 主從,針對主節點并不具備搶占功能。

       假設從節點壞掉,主節點也會很快偵測到連接配接斷開,然後它就會重新切換到監聽狀态(listen),并且等待新的從節點加入。

       假設主從節點都挂掉,則資料就丢失了!是以,這是 Repcached 的一個短闆,不過後期我們可以通過結合其它的工具來彌補這個缺點。

       OK,簡單介紹到這裡。下面我們通過實驗來看,基于 Repcached 的 Memcached 主從架構是如何部署,以後如何測試和管理的。

1

2

3

4

5

6

7

<code>環境:</code>

<code>CentOS 6.5 x86_64位 采用最小化安裝,系統經過了基本優化</code>

<code>selinux 為關閉狀态,iptables 為無限制模式</code>

<code>主機名:nolinux</code>

<code>源碼包存放位置:</code><code>/usr/local/src</code>

<code>libevent版本:2.0.21</code>

<code>memcached版本:1.4.20</code>

一、基礎環境準備

<code>[root@master ~]</code><code># yum -y install gcc gcc-c++</code>

二、Memcached安裝

1、安裝libevent

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

<code>[root@master ~]</code><code>#cd /usr/local/src</code>

<code>[root@master src]</code><code># wget http://code.taobao.org/p/nolinux/src/memcached/src/libevent-2.0.21-stable.tar.gz?orig</code>

<code>[root@master src]</code><code># tar zxvf libevent-2.0.21-stable.tar.gz</code>

<code>[root@master src]</code><code># cd libevent-2.0.21-stable</code>

<code>[root@master libevent-2.0.21-stable]</code><code>#  ./configure --prefix=/usr</code>

<code>[root@master libevent-2.0.21-stable]</code><code>#  make</code>

<code>[root@master libevent-2.0.21-stable]</code><code>#  make install</code>

<code>[root@master libevent-2.0.21-stable]</code><code># ll /usr/lib/libevent*  # libevent安裝完後,會在/usr/lib目錄下出現如下内容</code>

<code>lrwxrwxrwx 1 root root 21 Aug 11 13:49 </code><code>/usr/lib/libevent-2</code><code>.0.so.5 -&gt; libevent-2.0.so.5.1.9 </code>

<code>-rwxr-xr-x 1 root root 968690 Aug 11 13:49 </code><code>/usr/lib/libevent-2</code><code>.0.so.5.1.9 </code>

<code>-rw-r--r-- 1 root root 1571802 Aug 11 13:49 </code><code>/usr/lib/libevent</code><code>.a </code>

<code>lrwxrwxrwx 1 root root 26 Aug 11 13:49 </code><code>/usr/lib/libevent_core-2</code><code>.0.so.5 -&gt; libevent_core-2.0.so.5.1.9 </code>

<code>-rwxr-xr-x 1 root root 585225 Aug 11 13:49 </code><code>/usr/lib/libevent_core-2</code><code>.0.so.5.1.9 </code>

<code>-rw-r--r-- 1 root root 978482 Aug 11 13:49 </code><code>/usr/lib/libevent_core</code><code>.a </code>

<code>-rwxr-xr-x 1 root root 970 Aug 11 13:49 </code><code>/usr/lib/libevent_core</code><code>.la </code>

<code>lrwxrwxrwx 1 root root 26 Aug 11 13:49 </code><code>/usr/lib/libevent_core</code><code>.so -&gt; libevent_core-2.0.so.5.1.9 </code>

<code>lrwxrwxrwx 1 root root 27 Aug 11 13:49 </code><code>/usr/lib/libevent_extra-2</code><code>.0.so.5 -&gt; libevent_extra-2.0.so.5.1.9 </code>

<code>-rwxr-xr-x 1 root root 404852 Aug 11 13:49 </code><code>/usr/lib/libevent_extra-2</code><code>.0.so.5.1.9 </code>

<code>-rw-r--r-- 1 root root 593392 Aug 11 13:49 </code><code>/usr/lib/libevent_extra</code><code>.a </code>

<code>-rwxr-xr-x 1 root root 977 Aug 11 13:49 </code><code>/usr/lib/libevent_extra</code><code>.la </code>

<code>lrwxrwxrwx 1 root root 27 Aug 11 13:49 </code><code>/usr/lib/libevent_extra</code><code>.so -&gt; libevent_extra-2.0.so.5.1.9 </code>

<code>-rwxr-xr-x 1 root root 935 Aug 11 13:49 </code><code>/usr/lib/libevent</code><code>.la </code>

<code>lrwxrwxrwx 1 root root 30 Aug 11 13:49 </code><code>/usr/lib/libevent_pthreads-2</code><code>.0.so.5 -&gt; libevent_pthreads-2.0.so.5.1.9 </code>

<code>-rwxr-xr-x 1 root root 18430 Aug 11 13:49 </code><code>/usr/lib/libevent_pthreads-2</code><code>.0.so.5.1.9 </code>

<code>-rw-r--r-- 1 root root 18670 Aug 11 13:49 </code><code>/usr/lib/libevent_pthreads</code><code>.a </code>

<code>-rwxr-xr-x 1 root root 998 Aug 11 13:49 </code><code>/usr/lib/libevent_pthreads</code><code>.la </code>

<code>lrwxrwxrwx 1 root root 30 Aug 11 13:49 </code><code>/usr/lib/libevent_pthreads</code><code>.so -&gt; libevent_pthreads-2.0.so.5.1.9 </code>

<code>lrwxrwxrwx 1 root root 21 Aug 11 13:49 </code><code>/usr/lib/libevent</code><code>.so -&gt; libevent-2.0.so.5.1.9</code>

<code>[root@master libevent-2.0.21-stable]</code><code># cd ..</code>

2、安裝memcached

<code>[root@master src]</code><code># tar zxvf memcached-1.4.20.tar.gz</code>

<code>[root@master src]</code><code># cd memcached-1.4.20</code>

<code>[root@master memcached-1.4.20]</code><code># ./configure --with-libevent=/usr</code>

<code>[root@master memcached-1.4.20]</code><code># wget http://code.taobao.org/p/nolinux/src/memcached/src/memcached-1.4.20.tar.gz?orig</code>

<code>[root@master memcached-1.4.20]</code><code># make</code>

<code>[root@master memcached-1.4.20]</code><code># make install</code>

<code>[root@master memcached-1.4.20]</code><code># cd ..</code>

<code>[root@master src]</code><code># ll /usr/local/bin/memcached    # 安裝完成後會把memcached 放到 /usr/local/bin/memcached </code>

<code>-rwxr-xr-x 1 root root 341907 Aug 11 13:52 </code><code>/usr/local/bin/memcached</code>

注意:如果中間出現報錯,請仔細檢查錯誤資訊,按照錯誤資訊來配置或者增加相應的庫或者路徑

三、repcached安裝

方式一:使用repcached版本

<code>[root@master src]</code><code># wget http://downloads.sourceforge.net/repcached/memcached-1.2.8-repcached-2.2.tar.gz</code>

<code>[root@master src]</code><code># tar zxf memcached-1.2.8-repcached-2.2.tar.gz</code>

<code>[root@master src]</code><code># cd memcached-1.2.8-repcached-2.2</code>

方式二:使用patch版本

<code>[root@master memcached-1.2.8-repcached-2.2]</code><code># wget http://downloads.sourceforge.net/repcached/repcached-2.2-1.2.8.patch.gz</code>

<code>[root@master memcached-1.2.8-repcached-2.2]</code><code># gzip -cd ../repcached-2.2-1.2.8.patch.gz | patch -p1</code>

<code>[root@master memcached-1.2.8-repcached-2.2]</code><code># ./configure --enable-replication</code>

<code>[root@master memcached-1.2.8-repcached-2.2]</code><code>#  make</code>

<code>[root@master memcached-1.2.8-repcached-2.2]</code><code>#  make install</code>

<code>[root@master memcached-1.2.8-repcached-2.2]</code><code># cd ..</code>

以上操作,我們需要針對主節點和備節點都操作!這裡我僅僅以主節點的部署為例!切記!

四、啟動配置

1、啟動master

<code>[root@master ~]</code><code># memcached -v -d -p 11211 -l 192.168.0.102 -u root -P /tmp/memcached1.pid </code>

<code>[root@master ~]</code><code># replication: listen </code>

<code>[root@master ~]</code><code># replication: accept</code>

2、啟動salve

<code>[root@slave src]</code><code># memcached -v -d -p 11211 -l 192.168.0.103 -u root -x 192.168.0.102 -P /tmp/memcached1.pid </code>

<code>[root@slave src]</code><code># replication: connect (peer=192.168.0.102:11212) </code>

<code>replication: marugoto copying </code>

<code>replication: start </code>

<code>[root@slave src]</code><code>#</code>

3、回到master節點

<code>[root@master ~]</code><code># replication: accept  # 啟動正常後,master 将 accept</code>

五、測試

       由于我們主節點和從節點的memcached服務都騎起來了,并且監聽也都正常,是以以下的測試操作全部放到master節點進行。

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

<code>[root@master ~]</code><code># telnet 192.168.0.102 11211    # 連接配接到我們主節點,添加一個記錄</code>

<code>Trying 192.168.0.102... </code>

<code>Connected to 192.168.0.102. </code>

<code>Escape character is </code><code>'^]'</code><code>. </code>

<code>set</code> <code>key 0 0 6 </code>

<code>sunsky </code>

<code>STORED </code>

<code>quit </code>

<code>Connection closed by foreign host. </code>

<code>[root@master ~]</code><code># telnet 192.168.0.103 11211    # 連接配接到我們的從節點,檢視主節點的記錄是否同步過來</code>

<code>Trying 192.168.0.103... </code>

<code>Connected to 192.168.0.103. </code>

<code>get key </code>

<code>VALUE key 0 6 </code>

<code>END </code>

<code>[root@master ~]</code><code># pkill memcached     # 現在,殺掉我們主節點的memcached程序</code>

<code>replication: cleanup start </code>

<code>replication: close </code>

<code>replication: cleanup complete</code>

<code>[root@slave src]</code><code># replication: close  # 備節點此時變為監聽狀态,即變成了主節點</code>

<code>replication: listen</code>

<code>[root@master ~]</code><code># telnet 192.168.0.103 11211   # 檢視從節點上面的資料是否還存在</code>

<code>[root@master ~]</code><code># memcached -v -d -p 11211 -l 192.168.0.102 -u root -x 192.168.0.103 -P /tmp/memcached.pid   #  由于memcached的主/從沒有搶占功能,是以主恢複之後,隻能作為現有主節點的從節點[root@master ~]# replication: connect (peer=192.168.0.103:11212) </code>

<code>[root@slave src]</code><code># replication: accept    # 在上面加入之後,下面之前的從節點就會蹦出如下輸入,表示開啟同步</code>

<code>replication: marugoto start </code>

<code>replication: marugoto 1 </code>

<code>replication: marugoto owari</code>

<code>[root@master ~]</code><code># telnet 192.168.0.102 11211   # 我們連接配接到剛剛恢複的節點,可以看到資料又回來了</code>

<code>Connection closed by foreign host.</code>

       以上就是我們做的關于memcached基于repcached的主從複制實驗了。通過實驗,我們可以看出,通過他我們實作了主從中任何一個當機,都不會影響另外一台機器上的資料。

在文章最後,我們再來總結以下基于 Repcached 的 Memcached 主從的優缺點:

<code>優點:</code>

<code>1、能夠實作 cache 的備援功能</code>

<code>2、主從之間可以互相讀寫</code>

<code>缺點:</code>

<code>1、盡可以一主一從,單對單</code>

本文轉自 aaao 51CTO部落格,原文連結:http://blog.51cto.com/nolinux/1544931,如需轉載請自行聯系原作者