Centos7下memcache搭建集群

memcache分布式集群

memcached是一个高性能的分布式内存对象缓存系统,用于动态web应用以减轻数据库负载。他通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态,数据库驱动网站的速度。memcached基于一个存储键值对的hashmap。其守护进程(daemon)是用C语言写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。

memcache分布式集群搭建环境如下:

主机    ip地址    操作系统
magent1+keepalived-master    172.16.1.100    CentOS 7.3
magent2+keepalived-slave    172.16.1.110    CentOS 7.3
memcached1    172.16.1.120    CentOS 7.3
memcached2    172.16.1.130    CentOS 7.3
client    172.16.1.30    CentOS 7.3


1,首先安装依赖库libevent(四台服务器都安装)
libevent安装包官网下载: http://libevent.org/

[root@magent1-master ~]# tar zxf libevent-2.0.22-stable.tar.gz  -C /usr/src/
[root@magent1-master ~]# cd /usr/src/libevent-2.0.22-stable/
[root@magent1-master libevent-2.0.22-stable]# ./configure --prefix=/usr/ && make && make install

2,安装memcached软件(后两台memcached服务器安装)
memcached官网下载: https://memcached.org/downloads

[root@memcached1 ~]# tar zxf memcached-1.4.33.tar.gz -C /usr/src/
[root@memcached1 ~]# cd /usr/src/memcached-1.4.33/
[root@memcached1 memcached-1.4.33]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/
[root@memcached1 memcached-1.4.33]# make && make install


#启动memcached服务

主缓存:
[root@memcache1 memcached-1.4.33]#ln -s /usr/local/memcached/bin/memcached  /usr/local/sbin/
[root@memcached1 ~]# memcached -d -m 1024 -u root -l 172.16.1.120 -p 11211
[root@memcached1 ~]# netstat -anput | grep memcached
tcp        0      0 172.16.1.120:11211      0.0.0.0:*               LISTEN      9678/memcached  
#设置防火墙:(测试情况下可以关闭防火墙)
[root@memcached1 ~]# firewall-cmd  --add-port=11211/tcp --permanent
success
[root@memcached1 ~]# firewall-cmd --reload
success


备缓存:
[root@memcached2 memcached-1.4.33]# ln -s /usr/local/memcached/bin/memcached  /usr/local/sbin/
[root@memcached2 memcached-1.4.33]# memcached -d -m 1024 -u root -l 172.16.1.130 -p 11211
[root@memcached2 memcached-1.4.33]# netstat -anput | grep memcached
tcp        0      0 172.16.1.130:11211      0.0.0.0:*               LISTEN      8551/memcached  
#设置防火墙:(测试情况下可以关闭防火墙)
[root@memcached2 ~]# firewall-cmd --add-port=11211/tcp --permanent
success
[root@memcached2 ~]# firewall-cmd --reload
success


3,安装magent代理软件(2台Magent服务器安装)
Magent 是一款开源的 Memcached 代理服务器软件,使用它可以搭建高可用性的集群应用的 Memcached 服务 ,备份 Memcached 数据,尽管 Memcached 服务挂掉,前端也能获取到数据,客户端先连到 Magent 代理服务器 ,然后Magent 代理服务器 在可以连接多台 Memcached 服务器,然后可以进行数据的保存和备份数据。这样数据就不会丢失,保存了数据完整性。

magent安装包下载地址: http://memagent.googlecode.com/files/

#例如安装当前最新版本magent-0.6:
[root@magent1-master ~]# mkdir /usr/magent
[root@magent1-master ~]# tar zxf magent-0.6.tar.gz -C /usr/magent/
[root@magent1-master ~]# cd /usr/magent/
[root@magent1-master magent]# ls
ketama.c  ketama.h  magent.c  Makefile
#解决报错问题
[root@magent1-master magent]# vim ketama.h 
修改头部信息(最大值),修改内容如下:
#ifndef SSIZE_MAX
#define SSIZE_MAX 32767

[root@magent1-master magent]# ln -s /usr/lib64/libm.so /usr/lib64/libm.a
[root@magent1-master magent]# ln -s /usr/lib64/libevent-1.4.so.2 /usr/lib64/libevent.a
[root@magent1-master magent]# /sbin/ldconfig 
[root@magent1-master magent]# make
gcc -Wall -g -O2 -I/usr/local/include -m64 -c -o magent.o magent.c
gcc -Wall -g -O2 -I/usr/local/include -m64 -c -o ketama.o ketama.c
gcc -Wall -g -O2 -I/usr/local/include -m64 -o magent magent.o ketama.o /usr/lib64/libevent.a /usr/lib64/libm.a 
gcc: error: /usr/lib64/libevent.a: No such file or directory
make: *** [magent] Error 1

#如果还出现以上错误,修改Makefile文件:

[root@magent1-master magent]# vim Makefile 
找到 LIBS = /usr/lib64/libevent.a /usr/lib64/libm.a
修改为LIBS = /usr/lib/libevent.a /usr/lib64/libm.a 
#重新编译:
[root@magent1-master magent]# make
gcc -Wall -g -O2 -I/usr/local/include -m64 -o magent magent.o ketama.o /usr/lib/libevent.a /usr/lib64/libm.a
[root@magent1-master magent]# ls
ketama.c  ketama.h  ketama.o  magent  magent.c  magent.o  Makefile
[root@magent1-master magent]# cp magent /usr/bin/

主缓存和备缓存一样的启动命令,需要通过“-l” 参数指定漂移IP,因为还没有搭建keepalived,所以暂时不要启动Magent服务。

4,安装keepalived高可用软件(安装在2台Magent服务器上)
安装包官网下载: https://www.keepalived.org/download.html

#安装依赖:
[root@magent1-master ~]# yum -y install openssl-devel
#安装keepalived
[root@magent1-master ~]# tar zxf keepalived-1.2.13.tar.gz  -C /usr/src/
[root@magent1-master ~]# cd /usr/src/keepalived-1.2.13/
[root@magent1-master keepalived-1.2.13]# ./configure --prefix=/ && make && make install

#配置主缓存服务器:

[root@magent1-master ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL_R1
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.16.1.200     #指定漂移地址
    }
}

#启动keepalived:
[root@magent1-master ~]# service keepalived start
Unit keepalived.service could not be found.
Reloading systemd:                                         [  OK  ]
Starting keepalived (via systemctl):                       [  OK  ]

配置备缓存服务器:

[root@magent2-slave ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL_R2   #路由id保持不同
}

vrrp_instance VI_1 {
    state BACKUP   #状态为BACKUP
    interface ens33
    virtual_router_id 51
    priority 99    #优先级保持比master低
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.16.1.200   #漂移地址保持一致
    }
}

#启动服务:
[root@magent2-slave ~]# service keepalived start
Reloading systemd:                                         [  OK  ]
Starting keepalived (via systemctl):                       [  OK  ]

#解决脑裂问题:
由于防火墙会将vrrp 广播给过滤掉了,导致backup接受不到master的广播,然后自己去争抢了vip,我们称这种为脑裂现象,为了防止脑裂的发生,在不关闭防火墙的情况下,我们需要开启防火墙vrrp规则:

#注意:主和备服务器都需开启:
[root@magent1-master ~]# firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT   
success       //注释:ens33为设备网卡,224.0.0.18为vrrp主播地址
[root@magent1-master ~]# firewall-cmd --reload
success
#重启keepalived服务:
[root@magent1-master ~]# service keepalived restart
Restarting keepalived (via systemctl):                     [  OK  ]

#查看vip地址(确保只漂移在master主机上)

[root@magent1-master ~]# ip add show dev ens33  
    inet 172.16.1.200/32 scope global ens33

#启动magent服务:(主备启动命令相同)

[root@magent1-master ~]# magent -u root -n 51200 -l 172.16.1.200 -p 12000 -s 172.16.1.120:11211 -b 172.16.1.130:11211
[root@magent1-master ~]# netstat -anput | grep 12000
tcp        0      0 172.16.1.200:12000      0.0.0.0:*               LISTEN      23877/magent  
//注意:备缓存启动后是查看不到12000的监听端口的,因为现在是备用的状态。
#开放防火墙的12000端口(主备都需开启)
[root@magent1-master ~]# firewall-cmd --add-port=12000/tcp --permanent
success
[root@magent1-master ~]# firewall-cmd --reload
success

参数解释:

-u:用户
-n:最大连接数
-l:magent对外监听的ip地址
-p:magent对外监听的端口
-s:magent主缓存ip地址和端口
-b:magent备缓存ip地址和端口

5,客户端验证高可用集群
#确保能够ping通vip地址:
[root@sunqiuming-3 ~]# ping 172.16.1.200 -c 5
PING 172.16.1.200 (172.16.1.200) 56(84) bytes of data.
64 bytes from 172.16.1.200: icmp_seq=1 ttl=64 time=0.266 ms
64 bytes from 172.16.1.200: icmp_seq=2 ttl=64 time=0.417 ms
64 bytes from 172.16.1.200: icmp_seq=3 ttl=64 time=0.458 ms
64 bytes from 172.16.1.200: icmp_seq=4 ttl=64 time=0.443 ms
64 bytes from 172.16.1.200: icmp_seq=5 ttl=64 time=0.403 ms

--- 172.16.1.200 ping statistics ---

1)连接上主缓存的12000端口并插入数据:

#安装telnet工具
[root@sunqiuming-3 ~]# yum -y install telnet
[root@sunqiuming-3 ~]# telnet 172.16.1.200 12000 #远程连接的地址为VIP地址
Trying 172.16.1.200...
Connected to 172.16.1.200.
Escape character is '^]'.
set test 0 0 9        #存储一个key(test)- value(memcached)
memcached
STORED
get test
VALUE test 0 9
memcached
END
quit
Connection closed by foreign host.

2)连接主memcacehd节点的11211端口进行查看:

[root@sunqiuming-3 ~]# telnet 172.16.1.120 11211
Trying 172.16.1.120...
Connected to 172.16.1.120.
Escape character is '^]'.
get test   #获得该key的数据值
VALUE test 0 9
memcached
END
quit
Connection closed by foreign host.

3)连接备memcached节点的11211端口进行查看:

[root@sunqiuming-3 ~]# telnet 172.16.1.130 11211
Trying 172.16.1.130...
Connected to 172.16.1.130.
Escape character is '^]'.
get test
VALUE test 0 9
memcached
END
quit
Connection closed by foreign host.

说明主备memcacehd节点都有数据。

模拟故障,宕掉主memcached缓存节点

#停止memcacehd进程(或者断开主缓存节点的网卡)
[root@memcached1 ~]# killall memcached
[root@memcached1 ~]# netstat -anput  | grep memcached

#客户端查看:
[root@sunqiuming-3 ~]# telnet 172.16.1.200 12000
Trying 172.16.1.200...
Connected to 172.16.1.200.
Escape character is '^]'.
get test     #通过访问vip地址,能够正常获得数据
VALUE test 0 9
memcached
END

模拟keepalived故障(master服务器宕机)

#停止主keepalived的服务:
[root@magent1-master ~]# service keepalived stop
Stopping keepalived (via systemctl):                       [  OK  ]
[root@magent1-master ~]# service keepalived status
● keepalived.service - SYSV: Start and stop Keepalived
   Loaded: loaded (/etc/rc.d/init.d/keepalived; bad; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:systemd-sysv-generator(8)
#并且停止12000端口:
[root@magent1-master ~]# killall magent
[root@magent1-master ~]# netstat -anput | grep magent

#查看vip地址是否漂移到slave服务器上:

[root@magent2-slave ~]# ip addr show dev ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a6:d1:22 brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.110/24 brd 172.16.1.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 172.16.1.200/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::b0fb:5a7d:7c85:4b98/64 scope link 
       valid_lft forever preferred_lft forever

#启动备缓存服务器的magent服务(12000端口)

[root@magent2-slave ~]#  magent -u root -n 51200 -l 172.16.1.200 -p 12000 -s 172.16.1.120:11211 -b 172.16.1.130:11211
[root@magent2-slave ~]# netstat -anput | grep 12000
tcp        0      0 172.16.1.200:12000      0.0.0.0:*               LISTEN      23052/magent   
#这是个缺陷,在生产环境中,一般会编写触发式脚本,当master宕掉后,自动开启12000端口服务

#客户端再次查看:
[root@sunqiuming-3 ~]# telnet 172.16.1.200 12000
Trying 172.16.1.200...
Connected to 172.16.1.200.
Escape character is '^]'.


总结:
memcache的优点:可以做多主或者多从;
memcache的缺点:当主缓存节点宕掉又恢复,之前的缓存数据会丢失,通过magent取到的值就会为Null。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值