Memcached repcached 高可用

Memcached + repcached 高可用环境

repcached 就是一个让memcached的机器能够互为主从,前端可以加一台HAProxy,后端两台memcached互为主从后,写入任何一点都会同步到另外一边.
由于 Memcached 自己没有防止单点的措施,因为为了保障 Memcached 服务的高可用,我们需要借助外部的工具来实现高可用的功能。
本文引入 Repcached 这个工具,通过使用该工具我们可以完成 Memcached 服务的主从功能。
Repcached 用来实现 Memcached 复制功能的一个工具。它所构建的主从方案是一个单主单从的方案,不支持多主多从。
但是,它的特点是,主从两个节点可以互相读写,从而可以达到互相同步的效果。
假设主节点坏掉,从节点会很快侦测到连接断开,然后它会自动切换到监听状态( listen)从而成为主节点,并且等待新的从节点加入。
假设原来挂掉的主节点恢复之后,我们只能人工手动以从节点的方式去启动。原来的主节点并不能抢占成为新的主节点,除非新的主节点挂掉。这也就意味着,基于 Repcached 实现的 Memcached 主从,针对主节点并不具备抢占功能。
假设从节点坏掉,主节点也会很快侦测到连接断开,然后它就会重新切换到监听状态(listen),并且等待新的从节点加入。
假设主从节点都挂掉,则数据就丢失了!因此,这是 Repcached 的一个短板,不过后期我们可以通过结合其它的工具来弥补这个缺点。
OK,简单介绍到这里。下面我们通过实验来看,基于 Repcached 的 Memcached 主从架构是如何部署,以后如何测试和管理的。

安装memcached 和依赖:

yum install libevent libevent-devel memcached -y

wget http://downloads.sourceforge.net/repcached/memcached-1.2.8-repcached-2.2.tar.gz

[root@srv-3 ~]# rpm -ql memcached
/etc/sysconfig/memcached          # 配置文件
/usr/bin/memcached                # 可执行文件
/usr/bin/memcached-tool
/usr/lib/systemd/system/memcached.service   # 启动脚本
/usr/share/doc/memcached-1.4.15
/usr/share/doc/memcached-1.4.15/AUTHORS
/usr/share/doc/memcached-1.4.15/CONTRIBUTORS
/usr/share/doc/memcached-1.4.15/COPYING
/usr/share/doc/memcached-1.4.15/ChangeLog
/usr/share/doc/memcached-1.4.15/NEWS
/usr/share/doc/memcached-1.4.15/README.md
/usr/share/doc/memcached-1.4.15/protocol.txt
/usr/share/doc/memcached-1.4.15/readme.txt
/usr/share/doc/memcached-1.4.15/threads.txt
/usr/share/man/man1/memcached-tool.1.gz
/usr/share/man/man1/memcached.1.gz


# 修改memcached 配置文件:
[root@srv-3 ~]# vim /etc/sysconfig/memcached 
PORT="11211"                  # 端口
USER="memcached"              # 启动用户
MAXCONN="4096"                # 最大连接数
CACHESIZE="1024"              # 最大使用的内存
OPTIONS=""                    # 其他参数

解压并部署replications:

tar xvf memcached-1.2.8-repcached-2.2.tar.gz
cd memcached-1.2.8-repcached-2.2
 ./configure --prefix=/data/soft/repcached --enable-replication
make                        # 这一步可能会出错 按照下面的解决办法
make install 

#  发现错误:
config.status: executing depfiles commands
[root@srv-3 memcached-1.2.8-repcached-2.2]# make
gcc -DHAVE_CONFIG_H -I.  -DNDEBUG   -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:696:30: error: ‘IOV_MAX’ undeclared (first use in this function)
         if (m->msg_iovlen == IOV_MAX ||        #  错误提示在这里
                              ^
memcached.c:696:30: note: each undeclared identifier is reported only once for each function it appears in

解决问题:
vim  memcached.c    # 56 57 58 把57行去掉 改成下面这样既可.     

# /* FreeBSD 4.x doesn't have IOV_MAX exposed. */
#ifndef IOV_MAX
#define IOV_MAX 1024
#endif



#  启动memcahed
   *** 每台机器都不能启动memcahed 11211,否则会产生冲突导致高可用版本无法启动.  ***
   *** 直接按照下面的命令行启动高可用版本的memcached 即可占用的事 16000 和11211 端口 ***
2.1.1 )  启动 10.10.5.12 上的replications:
/data/soft/repcached/bin/memcached -d -m 2048  -p 11211 -u memcached -c 4096  -x 10.10.5.13 -X 16000

2.1.2 )  启动 10.10.5.13 上的replications:
/data/soft/repcached/bin/memcached -d -m 2048  -p 11211 -u memcached -c 4096  -x 10.10.5.12 -X 16000

参数解释:
-d      后台运行
-m      使用多大的内存
-p      占用端口
-u      启动用户
-c      允许的连接数
-x      对端的IP地址
-X      探测对端监控端口

验证是否可以同步:

# 先搞个脚本:
3.1 )  安装这3个软件python3 + pip3 + python-memcahed 
yum install python3 -y
pip3 install python-memcached


3.2 ) 批量的在其中一台memcached 里面添加数据,
[root@srv-3 ~]# cat memcache_1.py 
#!/usr/bin/env python3 
import memcache
m = memcahce.Client(['10.10.5.13:11211'],debug=True)
for i in range(100):
    m.set("key%d" % i,"v%d" % i)
    ret = m.get('key%d' % i)
    print(ret)


3.3 ) 在13 的memcached 上添加了100个数据,在5.12 上查看一下是否有数据同步过来:

[root@srv-2 bin]# telnet 10.10.5.12 11211
Trying 10.10.5.12...
Connected to 10.10.5.12.
Escape character is '^]'.
get key79
VALUE key79 16 3
v79
END
get key80
VALUE key80 16 3
v80

****** 以上的key证明我们已经成功的获取了KEY信息,证明2台机器的memcache 是可以同的。



然后修改一下代码里面的10.10.5.13 到 10.10.5.12 重新添加进去900个KEY
[root@srv-3 ~]# cat memcache_1.py 
#!/usr/bin/env python3 
import memcache
m = memcahce.Client(['10.10.5.12:11211'],debug=True)
for i in range(200,1000):
    m.set("key%d" % i,"v%d" % i)
    ret = m.get('key%d' % i)
    print(ret)

## 查看5.13 上是否有了key200 - key1000 之间的key。 
[root@srv-3 ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get key888
VALUE key888 16 4                 # 成功获取memcahced 同步成功.
v888
END





原文地址:https://www.cnblogs.com/zhenxing06/p/12870984.html