由于 Memcached 没有防止单点的措施,因为为了保障 Memcached 服务的高可用,实现高可用的功能,本文引入 Repcached ,通过使用该工具我们可以完成 Memcached 服务的主从功能。

安装顺序:

1. 先安装libevent,因为memcached依赖它;
2. 给memcached打上repcached补丁,支持主从结构,实现高可用;
3. 安装memcached,启用replication;

1. libevent

# wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz -P /tools
# ./configure --prefix=/usr/local/
# make && make install

2. repcached && memcached

当前补丁最新位1.4.13,memcached的版本应该一致,否则会出现异常;

# wget https://memcached.googlecode.com/files/memcached-1.4.13.tar.gz -P /tools
# wget http://mdounin.ru/files/repcached-2.3.1-1.4.13.patch.gz -P ./

# tar zxvf memcached-1.4.13.tar.gz -C /tools
# gzip -d repcached-2.3.1-1.4.13.patch.gz

# cd /tools/memcached-1.4.13
# patch -p1 -i ../repcached-2.3.1-1.4.13.patch
# ./configure --prefix=/usr/local/ --with-libevent=/usr/local/ --enable-replication
# make && make install

如果启动时出现“memcached: error while loading shared libraries:libevent-2.0.so.5: cannot
open shared object file: No such file or directory”之类的信息,表示memcached 找不到
libevent 的位置
 所以,请先使用whereis libevent 得到位置,然后连接到memcached 所寻找的路径
 首先查看,libevent 在哪里
# whereis libevent
 libevent: /usr/local/lib/libevent.la /usr/local/lib/libevent.so /usr/local/lib/libevent.a
然后,再看memcached 从×××它
# LD_DEBUG=libs memcached -v 2>&1 > /dev/null | less
可以看到:是/usr/lib/libevent-2.0.so.5,所以,创建软链
[root@localhost tools]# ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5
再次启动

3. memcached (with repcached) 主从测试

在本机的两个不同的端口上启动两个memcached实例,一主一从,然后测试相互之间的数据同步。 memcached主从测试在本机的两个不同的端口上启动两个memcached实例,一主一从,然后测试相互之间的数据同步。

3.1 启动两个memcached实例

# memcached -d -m -p 11211 -u root -l 192.168.0.130 -x 192.168.0.129 -X 11222 -P /tmp/localhost_master.pid -vv
# memcached -d -m -p 11212 -u root -l 192.168.0.129 -x 192.168.0.130 -X 11222 -P /tmp/localhost_slave.pid -vv

两个实例的端口分别为11211和11212,共同的监听端口为11222。

3.2 通过telnet测试数据的同步

进入master,set两个值

[root@localhost tmp]# telnet 192.168.0.130 11211
Trying 192.168.0.130...
<34 new auto-negotiating client connection
Connected to 192.168.0.130.
Escape character is '^]'.
set name 0 0 7
34: Client using the ascii protocol
<34 set name 0 0 7
shining
>34 STORED
replication: pop
replication: pop
STORED

进入slave,get刚才设置的值

[root@localhost tmp]# telnet 192.168.0.129 11211
Trying 192.168.0.129...
<33 new auto-negotiating client connection
Connected to 192.168.0.129.
Escape character is '^]'.
get name
33: Client using the ascii protocol
<33 get name
>33 sending key name
>33 END
VALUE name 0 7
shining
END