天天看点

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,如需转载请自行联系原作者