Keepalived+Redis+Haproxy实现主从热备、负载均衡、秒级切换

时间:2024-05-23 16:44:46

Keepalived+Redis+Haproxy实现主从热备、负载均衡、秒级切换

  • 部署Redis集群

Keepalived+Redis+Haproxy实现主从热备、负载均衡、秒级切换

1)官方推荐,毋庸置疑。
2)去中心化,集群最大可增加1000个节点,性能随节点增加而线性扩展。
3)管理方便,后续可自行增加或摘除节点,移动分槽等等。
4)简单,易上手。

 

首先用两台虚拟机模拟6个节点,一台机器3个节点,创建出3 master、3 salve 环境。然后模拟成功,方可去线上生产服务器部署。

redis 采用 redis-3.2.4 版本。

两台虚拟机都是 CentOS

一台 CentOS6.5 (IP:192.168.52.50),

一台 CentOS7(IP:192.168.52.51)

安装过程
 

1. 下载并解压

cd /root/tools

wget http://download.redis.io/releases/redis-3.2.4.tar.gz

tar xf redis-3.2.4.tar.gz 

 

2. 编译安装

cd redis-3.2.4 make && make install

3. 将 redis-trib.rb 复制到 /usr/local/bin 目录下

cd src

cp redis-trib.rb /usr/local/bin/ 

4. 创建 Redis 节点

首先在 192.168.52.50 机器上 /root/tools/redis-3.2.4 目录下创建 redis_cluster 

目录;

mkdir redis_cluster

在 redis_cluster 目录下,创建名为7000、7001、7002的目录,并将 redis.conf 拷贝到这三个目录中

mkdir 7000 7001 7002

cp redis.conf redis_cluster/7000

cp redis.conf redis_cluster/7001

cp redis.conf redis_cluster/7002

分别修改这三个配置文件,修改如下内容

port  7000                            //端口7000,7001,7002

bind 本机ip                           //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群

daemonize yes      //redis后台运行

pidfile  /var/run/redis_7000.pid          //pidfile文件对应7000,7001,7002

cluster-enabled  yes              //开启集群  把注释#去掉

cluster-config-file nodes_7000.conf   //集群的配置  配置文件首次启动自动生成 7000,7001,7002

cluster-node-timeout  15000   //请求超时  默认15秒,可自行设置

appendonly  yes                       //aof日志开启

有需要就开启,它会每次写操作都记

录一条日志

接着在另外一台机器上(192.168.52.51),的操作重复以上三步,只是把目录改

为7003、7004、7005,对应的配置文件也按照这个规则修改即可

5. 启动各个节点

第一台机器上执行(在/src目录下)
redis-server ../redis_cluster/7000/redis.conf

redis-server ../redis_cluster/7001/redis.conf

redis-server ../redis_cluster/7002/redis.conf

另外一台机器上执行

redis-server ../redis_cluster/7003/redis.conf

redis-server ../redis_cluster/7004/redis.conf

redis-server ../redis_cluster/7005/redis.conf

6. 检查 redis 启动情况

##一台机器

ps -ef | grep redis

Keepalived+Redis+Haproxy实现主从热备、负载均衡、秒级切换

netstat -tnlp | grep redis

Keepalived+Redis+Haproxy实现主从热备、负载均衡、秒级切换

##另外一台机器

Keepalived+Redis+Haproxy实现主从热备、负载均衡、秒级切换

7.创建集群

Redis 官方提供了 redis-trib.rb 这个工具,就在解压目录的 src 目录中,第三步中已

将它复制到 /usr/local/bin 目录中,可以直接在命令行中使用了。使用下面这个命令

完成安装。

redis-trib.rb  create  --replicas 1 192.168.52.50:7000 192.168.52.50:7001 192.168.52.50:7002 192.168.52.51:7003 192.168.52.51:7004 192.168.52.51:7005

其中,前三个 ip:port 为第一台机器的节点,剩下三个为第二台机器。等等,出错了。这个工具是用 ruby 实现的,所以需要安装 ruby。安装命令如下:

yum -y install ruby ruby-devel rubygems rpm-build

gem install redis

报错:

gem install redis
    ERROR:  Error installing redis:
     redis requires Ruby version >= 2.2.2.
 

CentOS7 yum库中ruby的版本支持到 2.0.0,可gem 安装redis需要最低是2.2.2,采用rvm来更新ruby:

解决报错:

//具体RVM安装命令地址:http://rvm.io/

[[email protected] ~]# gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB 

[[email protected] ~]# curl -sSL https://get.rvm.io | bash -s stable
[[email protected] ~]# find / -name rvm -print
[[email protected] ~]# source /usr/local/rvm/scripts/rvm
[[email protected] ~]# rvm install 2.4.1
[[email protected] ~]# rvm use 2.4.1
[[email protected] ~]# rvm use 2.4.1 --default
[[email protected] ~]# rvm remove 2.0.0
[[email protected] ~]# ruby --version
[[email protected] ~]# gem install redis

之后再运行 redis-trib.rb 命令,会出现如下提示:

Keepalived+Redis+Haproxy实现主从热备、负载均衡、秒级切换

8. 集群验证

在第一台机器上连接集群的7002端口的节点,在另外一台连接7005节点,连接方式为 

redis-cli -h 192.168.52.50 -c -p 7002 ,加参数 -C 可连接到集群,因为上面 redis.conf 将 

bind 改为了ip地址,所以 -h 参数不可以省略。

在7005节点执行命令 set hello world ,执行结果如下:

Keepalived+Redis+Haproxy实现主从热备、负载均衡、秒级切换

在另外一台7002端口,查看 key 为 hello 的内容,get hello ,执行结果如下:

Keepalived+Redis+Haproxy实现主从热备、负载均衡、秒级切换

说明集群成功

简单说一下原理

redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的

每个节点都是平等的关系,都是对等的每个节点都保存各自的数据和整个集群的

状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了

我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。

Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽

 (hash slot)的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们set一个

key 时,会用CRC16算法来取模得到所属的slot,然后将这个key 分到哈希槽区间的节点上,

具体算法就是:CRC16(key) % 16384所以我们在测试的时候看到set 和 get 的时候,直接

跳转到了7000端口的节点

Redis 集群会把数据存在一个 master 节点,然后在这个 master 和其对应的salve

间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的 master 节点获取

数据。只有当一个master 挂掉之后,才会启动一个对应的 salve 节点,充当 master 

需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节

点小于总节点数的一半时,整个集群就无法提供服务了。

二、部署Keepalived,实现主从热备、秒级切换

redis1:192.168.52.50

redis2:192.168.52.51

VIP地址:192.168.52.91

1、安装keepalived

yum install keepalived -y

2、修改配置文件

redis1

[[email protected] ~]# cat /etc/keepalived/keepalived.conf

global_defs {

   notification_email {

        [email protected]

   }

   notification_email_from [email protected]

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

vrrp_instance VI_1 {

    state MASTER

    interface ens33

    virtual_router_id 51 #主备必须一致

    priority 99

    authentication {

        auth_type PASS

        auth_pass 1111

    }

 

    virtual_ipaddress {

        192.168.52.91 #VRRP HA虚拟地址

    }

}

redis2:

[[email protected] ~]# cat /etc/keepalived/keepalived.conf

global_defs {

   notification_email {

        [email protected]

   }

   notification_email_from [email protected]

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

vrrp_instance VI_1 {

    state MASTER

    interface ens33

    virtual_router_id 51

    priority 99

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.52.91

    }

}

 

 

3、开启服务、验证是否有VIP地址

[[email protected] keepalived]# systemctl restart keepalived

[[email protected] keepalived]# ip add

Keepalived+Redis+Haproxy实现主从热备、负载均衡、秒级切换

 

  • 部署haproxy,实现访问6379端口时,轮询访问六个节点

1)下载版本1.8.14版本的harpoxy软件并安装

tar xf haproxy-1.8.14.tar.gz

cd haproxy-1.8.14

make ARCH=x86_64 TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 PREFIX=/usr/local/haproxy

make install PREFIX=/usr/local/haproxy

cp haproxy  /usr/sbin/

2)配置haproxy相关的参数

 [[email protected] init.d]# vim /usr/lib/systemd/system/haproxy.service

[Unit]

Description=HAProxy Load Balancer

After=syslog.target network.target

 

[Service]

ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf -c -q

ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf -p /run/haproxy.pid

ExecReload=/bin/kill -USR2 $MAINPID

 

[Install]

WantedBy=multi-user.target

[[email protected] init.d]#  vim /etc/haproxy/conf/redis.cfg

listen  redis-api-6379

 bind 0.0.0.0:6379  #对client提供的VIP

 mode tcp

 server 192.168.52.50  192.168.52.50:7000  check inter 3000 fall 3 rise 5

 server 192.168.52.50  192.168.52.50:7001  check inter 3000 fall 3 rise 5

 server 192.168.52.50  192.168.52.50:7002  check inter 3000 fall 3 rise 5

 server 192.168.52.51  192.168.52.51:7003  check inter 3000 fall 3 rise 5

 server 192.168.52.51  192.168.52.51:7004  check inter 3000 fall 3 rise 5

 server 192.168.52.51  192.168.52.51:7005  check inter 3000 fall 3 rise 5

[[email protected] init.d]# vim /etc/haproxy/haproxy.cfg

global

maxconn 100000

chroot /usr/local/haproxy

stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin

uid 99

gid 99

daemon

nbproc 4

cpu-map 1 0

cpu-map 2 1

cpu-map 3 2

cpu-map 4 3

pidfile /usr/local/haproxy/run/haproxy.pid

log 127.0.0.1 local3 info

 

defaults

option http-keep-alive

option  forwardfor

maxconn 100000

mode http

timeout connect 300000ms

timeout client  300000ms

timeout server  300000ms

 

listen stats

 mode http

 bind 0.0.0.0:9999

 stats enable

 log global

 stats uri     /haproxy-status

 stats auth    haadmin:123456

测试

Keepalived+Redis+Haproxy实现主从热备、负载均衡、秒级切换

Keepalived+Redis+Haproxy实现主从热备、负载均衡、秒级切换

haproxy 访问端口9999 账号密码 haadmin:123456

http://192.168.52.91:9999/haproxy-status

Keepalived+Redis+Haproxy实现主从热备、负载均衡、秒级切换