联合memcache,repcached,magent,monit四个组件搭建高可用集群方案

一、基本介绍
1、组件承担的角色
1)memcache负责缓存对象。
2)repcached负责单主单从的同步备份。
3)magent代理实现N主N备。
4)monit监听以上组件的各个实例端口,保证故障自动重启。

2、集群思路
1)利用repcached对memcache进行1对1的主备设计
2)利用magent多MA负载分担实现N主N备方案。
3)利用monit的监听机制,实例宕机后,能够快速重启。

二、Monit安装及基本使用
1、下载安装
我用的是Centos 6.5,官网上发布了rpm包,直接下载安装即可
wget http://pkgs.repoforge.org/monit/monit-5.5-1.el6.rf.x86_64.rpm
rpm -ivh monit-5.5-1.el6.rf.x86_64.rpm

安装完成后,会在/etc目录下生成monit.conf文件和monit.d文件夹

2、启动
启动命令:/etc/init.d/monit start
默认监听端口为2812,启动成功后,可看到以下界面,说明安装成功
这里写图片描述

注意两点修改:
1)/etc/monit.conf文件中,要修改使用的IP地址,如例子为192.168.0.106,允许访问的地址设置为局域网内可访问,如192.168.0.1/24。若不先设置,默认启动的话,只能是本机浏览器访问才行,别的机器都不行。

set httpd port 2812 and
    use address 192.168.0.106  # only accept connection from localhost
    allow 192.168.0.1/24        # allow localhost to connect to the server and
    allow admin:monit      # require user 'admin' with password 'monit'
    allow @monit           # allow users of group 'monit' to connect (rw)
    allow @users readonly  # allow users of group 'users' to connect readonly

2)因为做实验的机器是安装在虚拟机Linux机器上的,本地为Windows,若还是无法访问,请尝试关闭Linux的防火墙:
#service iptables status 查看防火墙状态
#service iptables stop 关闭防火墙

3、配置文件修改
Monit是比较通用的监听组件,用得比较广泛,这里就针对目前要使用的Memcache相关组件进行监听配置的讲解(monit.conf里面已经有许多示例可以参照的)。
我们来看一个监控Apache的示例

#
# 监控apache
#
check process apache with pidfile /var/run/apache2.pid
    start program = "/etc/init.d/apache2 start"
    stop program  = "/etc/init.d/apache2 stop"
    # apache吃cpu和内存比较厉害,额外添加一些关于这方面的监控设置
    if cpu > 50% for 2 cycles then alert
    if cpu > 70% for 5 cycles then restart
    if totalmem > 1500 MB for 10 cycles then restart
    if children > 250 then restart
    if loadavg(5min) greater than 10 for 20 cycles then stop
    if failed host www.example.com port 8080 protocol http then restart
    if 3 restarts within 5 cycles then timeout
    group server
    # 可选,依赖于nginx
    depends on nginx

可以看出有以下几个关键点:
1、process 后面的是监控的进程名
2、start program和stop program是启动和停止的命令,注意这个命令不能是sh文件。
3、CPU占用率的监控写法还是比较简单的。
4、 if failed这一行写的是监听的IP和端口,这点很重要。
5、其他的语法,根据需要照着抄就OK。

所以说,Monit的监控进行的语法配置可以快速上手的,不过要精通就要另外下一番功夫了。

4、memcache进程监控写法
将memcache注册成服务,主要是方便start program和stop program两行命令方便书写。

check process memcache11211 with pidfile /tmp/memcached11211.pid
start program = "/usr/local/bin/memcached -d -m 64 -u root -l 192.168.0.106 -p 11211 -P /tmp/memcached11211.pid" with timeout 60 seconds
stop program  = "/usr/bin/kill `cat /tmp/memcached11211.pid`"

if failed host 192.168.0.106 port 11211 then restart
if cpu is greater than 40% for 2 cycles then alert
if cpu > 60% for 5 cycles then restart
if 10 restarts within 10 cycles then timeout

启动命令是能够正常使用的,我们在命令行操作中使用杀进程的方式人为的停止memcache服务,过一段时间后,发现monit能够让该memcache重新启动。不过好像stop program起不到效果,在页面上点击stop service无法停止memcache服务。

这里写图片描述

有个办法是使用安装版的memcache,将这个启动文件进行裁剪,只剩下stop方法,如下:

#!/bin/sh
#
# memcached:    MemCached Daemon
#
# chkconfig:    - 90 25
# description:  MemCached Daemon
#
# Source function library.
. /etc/rc.d/init.d/functions
. /etc/sysconfig/network
#[ ${NETWORKING} = "no" ] && exit 0
#[ -r /etc/sysconfig/dund ] || exit 0
#. /etc/sysconfig/dund
#[ -z "$DUNDARGS" ] && exit 0
stop()
{
        echo -n $"Shutting down memcached: "
        kill -9 `cat tmp/memcached11211.pid`
        echo
}
# See how we were called.
case "$1" in
  stop)
        stop
        ;;
    *)
        echo $"Usage: $0 {stop}"
        exit 1
esac
exit 0

其实就是将kill命令写进这个脚本文件里,然后将该文件保存在/etc/init.d/目录下,命名为stopmemcached11211。
这样,就可以在monit里配置/sbin/service stopmemcached11211 stop命令了。

因为这个脚本文件里,pid文件的名字是写死的,如果涉及多个memcache实例,只能copy多个这样的文件,然后再改一下文件名,本来想把这个命令做成参数化的,奈何对脚本文件编写不是很专业,临时写了个案例凑数,若有精通此项技能的同学,或是有别的好方法,还望多多指点,将这个改进一下。
repcached和magent也可以使用类似的操作。

详细的进程监控信息如下:
这里写图片描述

另外,Monit本身是实用性非常强的组件之一,关于其通用的配置,各位很容易找到,在这里就不班门弄斧了。

5、注意几点
1)monit的start program和stop program要写完整路径,如/sbin/service等。
2)新增的注册服务,若出现Permission denied错误时,增加执行权限就可以了:chmod +x stopmemcached11211。
3)使用monit监控repcached进程时,由于主备切换的关系,在monit里的启动命令要写成Slave类型的,并且在启动Monit前,要先启动相关的repcached进程。

三、集群架构图

这里写图片描述

结构示意图注释:
1)M1-S为memcache工作节点,M1-B为memcache备份节点,两节点之间使用repcached复制。
2)MA-1,MA-2,MA-N表示多个magent代理节点,处于中间层,用户不可见。
3)MA-USER,MA-MGR为用户可见的代理节点
4)MA-1,M1-S,M1-B三个节点表示一个单主单备的模型,多个这样的单主单备模型组成一套N主N备方案。

这样,无论M1-S,M2-S的节点如何宕机,都不会有单点故障,也不会导致memcache节点顺序变化。

问:如果MA-1宕机,会不会导致单点故障?或是MA-USER宕机,情形又如何呢?
答:应该不会,magent代理节点是无状态的,只要memcache有数据,都应该没问题。另外MA-MGR为MA-USER的备份节点,只要MA-MGR和MA-USER不要同时宕机,一般都没问题。

四、实战演练
1、整体方案描述
6个memcache节点,使用repcached,其中4个做工作节点,2个做备份节点
3个magent节点(作为第二层),2个做工作节点,1个做备份节点
2个用户工作节点,MA-USER为工作节点,MA-MGR为备份节点

2、端口分配(拟定,各位可根据实际情况任意指定)
由于占用端口数量较多,使用表格整理方便查看。

名称端口号监听复制端口号备注
memcached节点11221115001工作节点
memcached节点21221215001工作节点
memcached节点31231115002工作节点
memcached节点41231215002工作节点
memcached节点51241115003备份节点
memcached节点61241215003备份节点
magent节点113211第二层,对内可见,对外不可见
magent节点213212第二层,对内可见,对外不可见
magent节点313213第二层,对内可见,对外不可见
magent节点414211对外访问层
magent节点514212备份节点

3、启动命令
1)新建memcache repcached节点
memcached -p 12211 -X 15001 -l 192.168.0.106 -v -d -u root
memcached -p 12212 -X 15001 -x 192.168.0.106 -v -d -u root
memcached -p 12311 -X 15002 -l 192.168.0.106 -v -d -u root
memcached -p 12312 -X 15002 -x 192.168.0.106 -v -d -u root
memcached -p 12411 -X 15003 -l 192.168.0.106 -v -d -u root
memcached -p 12412 -X 15003 -x 192.168.0.106 -v -d -u root

将这6条语句放在startRepcached.sh 文件中

2)新建magent节点(第二层magent)
magent -u root -n 2048 -l 192.168.0.106 -p 13211 -s 192.168.0.106:12211 -b 192.168.0.106:12212
magent -u root -n 2048 -l 192.168.0.106 -p 13212 -s 192.168.0.106:12311 -b 192.168.0.106:12312
magent -u root -n 2048 -l 192.168.0.106 -p 13213 -s 192.168.0.106:12411 -b 192.168.0.106:12412

将这3条语句放在startSecondMagent.sh 文件中

2)新建magent节点(第二层magent)
magent -u root -n 2048 -l 192.168.0.106 -p 14211 -s 192.168.0.106:13211 -b 192.168.0.106:13213
magent -u root -n 2048 -l 192.168.0.106 -p 14212 -s 192.168.0.106:13212 -b 192.168.0.106:13213

将这3条语句放在startMagent.sh 文件中

PS:用做测试机时,我只用了一台Linux机器,各位可根据实际机器IP配置,修改相应的命令即可。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值