Keepalived+HAproxy实现redis高可用负载均衡_第1页
Keepalived+HAproxy实现redis高可用负载均衡_第2页
Keepalived+HAproxy实现redis高可用负载均衡_第3页
Keepalived+HAproxy实现redis高可用负载均衡_第4页
Keepalived+HAproxy实现redis高可用负载均衡_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Keepalived+HAproxy实现redis的高可用负载均衡总概:Keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟

2、主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。这里我利用HAproxy对多台redis服务器进行负载,然后用Keepalived对HAproxy进行监控:(主)服务器A:43 (从)服务器B:26A上安装redis(主)、reids-slave1(从)、redis-slave2(从)、HApro

3、xy、KeepalivedB上安装redis-slave3(从)、redis-slave4(从)、HAproxy、KeepalivedKeepalived监控A、B上的HAproxy,利用Keepalived的VIP漂移技术,若A、B上的HAprox都工作正常,则VIP与优先级别高的服务器(主服务器)绑定,当主服务器当掉时,则与从服务器绑定,而VIP则是暴露给外部访问的ip;HAproxy利用Keepalived生产的VIP对多台redis(从)进行读负载,当某台redis当掉,则将其移除,回复后加入集群。安装redis1、下载后解压 tar zxvf redis-2.6.14.tar.gz

4、到任意目录,例如/usr/local/redis-2.6.14解压后,进入redis目录 cd /usr/local/redis-2.6.14 make && make install2、配置redisvi /usr/local/redis-2.6.14/redis.confredis配置文件参数说明:1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程    daemonize no2. 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfi

5、le指定    pidfile /var/run/redis.pid3. 指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字    port 63794. 绑定的主机地址    bind 5.当 客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能    timeout 3006. 指定日志记录级别,R

6、edis总共支持四个级别:debug、verbose、notice、warning,默认为verbose    loglevel verbose7. 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null    logfile stdout8. 设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id    databases 169. 指定在多长时间内,有多少次更新操作

7、,就将数据同步到数据文件,可以多个条件配合    save <seconds> <changes>    Redis默认配置文件中提供了三个条件:    save 900 1    save 300 10    save 60 10000    分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。 10. 指定存储至本地数据库时是

8、否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大    rdbcompression yes11. 指定本地数据库文件名,默认值为dump.rdb    dbfilename dump.rdb12. 指定本地数据库存放目录    dir ./13. 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步    slaveof <mast

9、erip> <masterport>14. 当master服务设置了密码保护时,slav服务连接master的密码    masterauth <master-password>15. 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭    requirepass foobared16. 设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设

10、置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息    maxclients 12817. 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区    maxmemory &l

11、t;bytes>18. 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no    appendonly no19. 指定更新日志文件名,默认为appendonly.aof     appendfilename appendonly.aof20. 指定更新日志条件,共有3个可选值:     no:表示等操

12、作系统进行数据缓存同步到磁盘(快)     always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)     everysec:表示每秒同步一次(折衷,默认值)    appendfsync everysec 21. 指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)     vm-ena

13、bled no22. 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享     vm-swap-file /tmp/redis.swap23. 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0     vm-max-memory 024. Redis swap文件分成了很

14、多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不 确定,就使用默认值     vm-page-size 3225. 设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,在磁盘上每8个pages将消耗1byte的内存。     vm-pages 134

15、21772826. 设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4     vm-max-threads 427. 设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启    glueoutputbuf yes28. 指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法    hash-max-zipmap-entries 64   

16、 hash-max-zipmap-value 51229. 指定是否激活重置哈希,默认为开启(后面在介绍Redis的哈希算法时具体介绍)    activerehashing yes30. 指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件include /path/to/local.conf安装keepalived1、下载后解压 tar zxvf keepalived-1.2.7.tar.gz 到任意目录,例如/usr/local/keepalived-1.2.7解压后,进入keepalive

17、d目录cd /usr/local/keepalived-1.2.7 ./configureMake && make install(注:若这里报错提示没有装openssl,则执行yum y install openssl-devel安装,若还有其他的包没装,则执行yum命令进行安装)2、配置keepalivedcp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/mkdir /etc/keepalivedcp

18、/usr/local/etc/keepalived/keepalived.conf /etc/keepalived/ln -s /usr/local/sbin/keepalived /usr/sbin/vi /etc/keepalived.conf! Configuration File for keepalivedvrrp_script chk_haproxy script "/etc/keepalived/check_haproxy.sh"interval 2vrrp_instance VI_1 state MASTER #从服务器上改为BACKUPinterface

19、eth5 #用ipconfig查看virtual_router_id 51 priority 150 #从服务器上改为120authentication auth_type PASSauth_pass 1111track_script chk_haproxyvirtual_ipaddress 00 vi /etc/keepalived/check_haproxy.sh#!/bin/bashA=ps -C haproxy -no-header |wc -lif $A -eq 0 ;then/usr/local/haproxy/sbin/haproxy -f /usr/loc

20、al/haproxy/haproxy.confsleep 3if ps -C haproxy -no-header |wc -l -eq 0 ;then/etc/init.d/keepalived stopfifichmod 755 /etc/keepalived/check_haproxy.sh安装HAproxy1、下载后解压 tar zxvf haproxy-1.4.24.tar.gz 到任意目录,例如/usr/local/haproxy-1.4.24解压后,进入keepalived目录cd /usr/local/haproxy-1.4.24make TARGET=linux26 PREF

21、IX=/usr/local/haproxy 将haproxy安装到/usr/local/haproxymake install PREFIX=/usr/local/haproxy2、配置HAproxycd /usr/local/haproxy vi haproxy.cfg (注:这里是没有haproxy.cfg文件的,可以回到安装文件目录下将examples下的haproxy.cfg拷贝到usr/local/haproxy下)global log local0maxconn 3000 #限制单个进程的最大连接数chroot /usr/local/haproxyuid 99

22、#所属运行用户,默认99为nobodygid 99 #所属运行用户组,默认99为nobodydaemon #让进程作为守护进程在后台运行quietnbproc 2 #指定作为守护进程运行时的进程数pidfile /usr/local/haproxy/haproxy.piddefaultslog globalmode httpoption httplogoption dontlognull #不记录空连接log local3 info #日志级别err warning info debugretries 3 #设置在一个服务器上链接失败后的重连次数option redispa

23、tch #在连接失败或断开的情况下,允许当前会话被重新分发maxconn 3000 #可被发送到后端服务器的最大并发连接数contimeout 5000ms #设置等待连接到服务器成功的最大时间clitimeout 50000ms #设置客户端的最大超时时间srvtimeout 50000ms #设置服务器端的最大超时时间listen cluster 00:6380 #运行的端口及主机名 (这里用keepalived虚拟的ip及端口) mode tcp #使用tcp的4层模式 balance roundrobin #设置服务器负载分配算法 #option httpclos

24、e option forwardfor #option httpchk GET /keepalive.html #健康检测页面 server redis-slave1 43:63791 weight 100 check inter 2000 rise 2 fall 3 server redis-slave2 43:63792 weight 100 check inter 2000 rise 2 fall 3 server redis-slave3 26:63791 weight 100 check inter 2000 rise

25、 2 fall 3server redis-slave4 26:63792 weight 100 check inter 2000 rise 2 fall 3 # weight - 调节服务器的负重 # check - 允许对该服务器进行健康检查 # inter - 设置连续的两次健康检查之间的时间,单位为毫秒(ms),默认值 2000(ms) # rise - 指定多少次连续成功的健康检查后,可认定该服务器处于可操作状态,默认值 2 # fall - 指定多少次不成功的健康检查后,认为服务器为当掉状态,默认值 3 # maxconn - 指定可被发送到该服务器的最大并发

26、连接数listen localhost *:8888 #监控页面的端口 mode http transparent stats refresh 10s #统计页面自动刷新时间 stats uri /haproxyadmin #监控页面的访问地址 stats realm Haproxy statistic #统计页面密码框上提示文本 stats auth shiwei:shiwei #统计页面用户名和密码设置 stats hide-version #隐藏统计页面上HAProxy的版本信息3、加上日志支持vim /etc/rsyslog.conf在最下边增加local3.* /var/log/ha

27、proxy.loglocal0.* /var/log/haproxy.logvim /etc/sysconfig/rsyslog 修改: SYSLOGD_OPTIONS="-r -m 0" 重启日志服务service rsyslog restart测试(主)服务器A(43): 配置redis-slave1cd /usr/local/redis-2.6.14cp redis.conf redis.salvevi redis.slave修改端口:# Accept connections on the specified port, default is 6

28、379.# If port 0 is specified Redis will not listen on a TCP socket.port 63791配置主从:# Master-Slave replication. Use slaveof to make a Redis instance a copy of# another Redis server. Note that the configuration is local to the slave# so for example it is possible to configure the slave to save the DB w

29、ith a# different interval, or to listen to another port, and so on.# slaveof <masterip> <masterport>slaveof localhost 6379同上配置redis-slave2cp redis.conf redis.salve2vi redis.slave2修改端口:# Accept connections on the specified port, default is 6379.# If port 0 is specified Redis will not list

30、en on a TCP socket.port 63792配置主从:# Master-Slave replication. Use slaveof to make a Redis instance a copy of# another Redis server. Note that the configuration is local to the slave# so for example it is possible to configure the slave to save the DB with a# different interval, or to listen to anoth

31、er port, and so on.# slaveof <masterip> <masterport>slaveof localhost 6379启动redis、redis-slave1、redis-slave2/usr/local/redis-2.6.14/src/redis-server /usr/local/redis-2.6.14/redis.conf(若未配置成daemonize yes则会打印启动信息 )/usr/local/redis-2.6.14/src/redis-server /usr/local/redis-2.6.14/redis.slave/

32、usr/local/redis-2.6.14/src/redis-server /usr/local/redis-2.6.14/redis.slave2 (从)服务器B(26): 配置redis-slave3cd /usr/local/redis-2.6.14cp redis.conf redis.salvevi redis.slave修改端口:# Accept connections on the specified port, default is 6379.# If port 0 is specified Redis will not listen on a TCP

33、 socket.port 63791配置主从:# Master-Slave replication. Use slaveof to make a Redis instance a copy of# another Redis server. Note that the configuration is local to the slave# so for example it is possible to configure the slave to save the DB with a# different interval, or to listen to another port, an

34、d so on.# slaveof <masterip> <masterport>slaveof 43 6379同上配置redis-slave4cp redis.conf redis.salve2vi redis.slave2修改端口:# Accept connections on the specified port, default is 6379.# If port 0 is specified Redis will not listen on a TCP socket.port 63792配置主从:# Master-Slave replic

35、ation. Use slaveof to make a Redis instance a copy of# another Redis server. Note that the configuration is local to the slave# so for example it is possible to configure the slave to save the DB with a# different interval, or to listen to another port, and so on.# slaveof <masterip> <maste

36、rport>slaveof 43 6379启动redis-slave3、redis-slave4/usr/local/redis-2.6.14/src/redis-server /usr/local/redis-2.6.14/redis.slave/usr/local/redis-2.6.14/src/redis-server /usr/local/redis-2.6.14/redis.slave2这时候在主服务器上连接redis查看信息/usr/redis-2.6.14/src/redis-cli info# Replicationrole:masterconne

37、cted_slaves:4slave0:,63791,onlineslave1:,63792,onlineslave2:26,63791,onlineslave3:26,63792,online两台服务器的redis的主从配置OK。主服务器上启动Keepalivedrootalex# service keepalived start正在启动 keepalived: 确定(Keepalived启动后会去检查HAproxy,若HAproxy未启动,则启动HAproxy,若启动HAproxy失败,则关闭Keepalive

38、d)查看keepalived状况:rootalex# service keepalived statuskeepalived (pid 5420) 正在运行.查看HAproxy状况:rootalex# ps -aux|grep haproxyWarning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQnobody 5430 0.0 0.0 11980 944 ? Ss 16:37 0:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/ha

39、proxy/haproxy.confnobody 5431 0.0 0.0 11980 944 ? Ss 16:37 0:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.confroot 5618 0.0 0.0 103252 844 pts/2 S+ 16:38 0:00 grep haproxyKeepalived启动后自动将HAproxy启动了,查看Keepalived生成的VIP是否与主服务器绑定rootalex# ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mt

40、u 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet /8 scope host lo inet6 :1/128 scope host valid_lft forever preferred_lft forever2: eth5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000 link/ether 08:00:

41、27:42:71:2d brd ff:ff:ff:ff:ff:ff inet 43/24 brd 55 scope global eth5 inet 00/32 scope global eth5 inet6 fe80:a00:27ff:fe42:712d/64 scope link valid_lft forever preferred_lft foreverVIP绑定OK。打开HAproxy的图形管理界面:浏览器输入http:/localhost:8888/haproxy-admin用户名shiwei 密码shiwei这时候

42、我们Kill掉HAproxy,Keepalived检查到后会重新将HAproxy启动。rootalex sysconfig# killall haproxyrootalex sysconfig#刷新页面,可以看到HAproxy的pid改变了。这时我们将主服务器上的keepalived当掉,看VIP是否漂移到了从服务器上,从服务器接管服务。主服务器上:rootalex# killall keepalivedrootalex sysconfig# ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNK

43、NOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet /8 scope host lo inet6 :1/128 scope host valid_lft forever preferred_lft forever2: eth5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000 link/ether 08:00:27:42:71:2d brd ff:ff:ff:ff:ff:

44、ff inet 43/24 brd 55 scope global eth5 inet6 fe80:a00:27ff:fe42:712d/64 scope link valid_lft forever preferred_lft forever从服务器上:rootalex 桌面# ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 in

45、et /8 scope host lo inet6 :1/128 scope host valid_lft forever preferred_lft forever2: eth6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000 link/ether 08:00:27:be:47:90 brd ff:ff:ff:ff:ff:ff inet 26/24 brd 55 scope global eth6

46、inet 00/32 scope global eth6 inet6 fe80:a00:27ff:febe:4790/64 scope link valid_lft forever preferred_lft foreverVIP漂移OK。这时候重启主服务器的Keepalived,查看VIP是否漂移回来。rootalex# service keepalived start正在启动 keepalived: 确定rootalex# ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state

47、UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet /8 scope host lo inet6 :1/128 scope host valid_lft forever preferred_lft forever2: eth5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000 link/ether 08:00:27:42:71:2d brd ff:ff:ff:ff:

48、ff:ff inet 43/24 brd 55 scope global eth5 inet 00/32 scope global eth5 inet6 fe80:a00:27ff:fe42:712d/64 scope link valid_lft forever preferred_lft foreverVIP漂移到主服务器。接下来主服务器上通过VIP连接redisrootalex 桌面# /usr/local/redis-2.6.14/src/redis-cli -h 00 -p 6379redis 1

49、00:6379> keys *(empty list or set)redis 00:6379> set name shiweiOKredis 00:6379> keys *1) "name"redis 00:6379>实地址连接redisredis 00:6379> quitrootalex 桌面# /usr/redis-2.6.14/src/redis-cli -h 43 -p 6379redis 192.168

50、.4.143:6379> keys *1) "name"redis 43:6379>VIP连接redis-slave(注:这里我们不知道VIP访问哪台从redis,redis-slave1/3、2/4端口相同)rootalex 桌面# /usr/redis-2.6.14/src/redis-cli -h 00 -p 6380redis 00:6380> keys *1) "name"redis 43:6380> quit rootalex 桌面#

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论