twemprox代理redis三主三从集群

目录

1 机器规划

2 集群主从复制搭建

3 哨兵模式的主从切换

4. twemprox代理redis的集群


1 机器规划

192.168.52.128(wyl01)192.168.52.129(wyl02)192.168.52.130(wyl03)
主(128)端口:7000主(129)端口:7000主(130)端口:7000
从(130)端口:7001从(128)端口:7001从(129)端口:7001

 

设计思想:主从尽量不要在一台机器上,两个主也尽量不要在一台机器上。

2 集群主从复制搭建

前面的博客讲过很多次的redis部署,这里我们不再过多的讲细节,我们以一台机器的配置为例,如128机器redis的主从配置文件

[root@wyl01 conf]# pwd
/opt/redis/conf
[root@wyl01 conf]# cat redis7000.conf 
bind 192.168.52.128
port 7000
appendonly yes
save ""

timeout 3600
daemonize yes

pidfile "/opt/redis/pid/redis7000.pid"
logfile "/opt/redis/log/redis7000.log"
dir "/opt/redis/data/7000"

128机器上的从实例配置文件

[root@wyl01 conf]# pwd
/opt/redis/conf
[root@wyl01 conf]# cat redis7001.conf 
bind 192.168.52.128
port 7001
appendonly yes
save ""

timeout 3600
daemonize yes

pidfile "/opt/redis/pid/redis7001.pid"
logfile "/opt/redis/log/redis7001.log"
dir "/opt/redis/data/7001"

slaveof 192.168.52.130 7000   #这里注意是130机器上的从实例

按照上述配置内容和机器规划的方案,配置129机器和130机器,然后启动服务,我们以128机器为例

每台机器上都有上述2个redis服务,只是ip不一样。这里我们看一下128机器上主服务和主对应的129上的从服务

[root@wyl01 redis]# redis-cli -h 192.168.52.128 -p 7000
192.168.52.128:7000> info replication
# Replication
role:master
connected_slaves:1
# 符合机器规划中的129上7001端口的服务为128机器上主的从服务
slave0:ip=192.168.52.129,port=7001,state=online,offset=317069,lag=1
master_replid:30b48e139a569853674811c07527f04696679bb0
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:317215
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:317215

目前为止redis的主从复制集群搭建完成。但是要做到高可用的redis集群还需要进行哨兵模式的主从故障的自动切换。

 

3 哨兵模式的主从切换

哨兵模式的介绍,以及配置内容的解释,网上介绍的比较多,参考他人博客。

哨兵概念
哨兵概念

sentinel 的功能:

  1. 监控(Monitoring),sentinel 时刻监控着redis master-slave 是否正常运行
  2. 通知(Notification),sentinel 可以通过api 来通知管理员,被监控的redis master-slave 出现了问题
  3. 自动故障转移(Automatic failover),当redis master 出现故障不可用状态,sentinel 会开始一次故障转移,将其中一个 slave 提升为新的master ,将其他的slave 将重新配置使用新的master同步,并使用Redis的服务器应用程序在连接时收到使用新的地址连接
  4. 配置提供者(Configuration provider) ,sentinel 作为在集群中的权威来源,客户端连接到sentinel来获取某个服务的当前Redis主服务器的地址和其他信息。当故障转移发生时,Sentinel 会报告新地址。

sentinel.conf配置文件如下,将配置文件发送到其他的两台机器上,并启动服务

[root@wyl01 redis-4.0.11]# sed -n '/^[^#]/p' sentinel.conf 
port 26379
dir /tmp
sentinel monitor my1master 192.168.52.128 7000 1
sentinel monitor my2master 192.168.52.129 7000 1
sentinel monitor my3master 192.168.52.130 7000 1
sentinel down-after-milliseconds my1master 30000
sentinel down-after-milliseconds my2master 30000
sentinel down-after-milliseconds my3master 30000
sentinel parallel-syncs my1master 1
sentinel parallel-syncs my2master 1
sentinel parallel-syncs my3master 1
sentinel failover-timeout my1master 180000
sentinel failover-timeout my2master 180000
sentinel failover-timeout my3master 180000
sentinel deny-scripts-reconfig yes

启动哨兵服务,并查看进程(三台都要启动),我们以128机器为例

[root@wyl01 redis]# nohup redis-server sentinel.conf --sentinel &

启动完毕后,添加配置,当主从切换的时候,执行reconfig.sh脚本

[root@wyl01 redis]# redis-cli -p 26379 sentinel set my1master client-reconfig-script /opt/redis/reconfig.sh

[root@wyl01 redis]# redis-cli -p 26379 sentinel set my2master client-reconfig-script /opt/redis/reconfig.sh

[root@wyl01 redis]# redis-cli -p 26379 sentinel set my3master client-reconfig-script /opt/redis/reconfig.sh

故障演示:

我们随便停一台服务,比如停129上的主服务,那么正确的演示结果是:129上的主停了,130机器上从服务,会变成主服务。

上图我们可以看到,130机器上的7001端口的服务原先是129机器上7000端口对应的从实例,那么现在已经变成上图1标识的主服务,这里我们恢复129上的7000端口服务,我们可以看到上图中2标识的信息,他已经变成130机器上7001服务对应的从实例了。其实我们去看看配置文件发现哨兵服务已经对redis.conf配置文件做了修改。其他的验证操作这里就不再过多验证了。

至此,我们的redis哨兵模式三主三从已经算是搭建成功,那么又有一个新的问题来了,我们的客户端怎么来连这个集群呢?

 

4. twemproxy代理redis的集群

twemproxy的安装可先行安装,采用编译安装。参考博客,twemproxy的配置如下

[root@wyl01 nutcracker]# cat /etc/nutcracker/nutcracker.yml 
alpha:
  listen: 192.168.52.128:2222
  hash: fnv1a_64
  distribution: ketama
  auto_eject_hosts: true
  redis: true
  server_retry_timeout: 2000
  server_failure_limit: 1
  servers:
   - 192.168.52.128:7000:1
   - 192.168.52.129:7000:1
   - 192.168.52.130:7000:1

启动twemproxy服务

[root@wyl01 redis]# nutcracker -d -c /etc/nutcracker/nutcracker.yml

编写insert_redis.sh脚本,批量插入数据,查看数据的分布情况

!/bin/bash

for (( i=1;i<=500;i++ ))
do  
redis-cli -h 192.168.52.128 -p 2222 <<EOF 
   set wyl$i '$i'
EOF
done

执行上述脚本,发现数据被分布到了128,129,130三个机器上。且各个机器上的从服务和对应着的主服务上的数据是一样的。

注意:上述讲到redis的哨兵可以做到主从切换,那么这里如果采用twemproxy代理,servers一栏中写的是

servers:
   - 192.168.52.128:7000:1
   - 192.168.52.129:7000:1
   - 192.168.52.130:7000:1

当主从切换后,比如把128上的主服务停止,那么129上的7001端口的服务才是主服务,这时候如果用twemproxy连接redis,那么数据是写不到129的7001端口的服务。所以这时候还需要动态的修改和启动twemprox服务。当128的主redis服务挂了,再切换后,我们需要对上面的servers中的内容做如下修改

servers:
   - 192.168.52.129:7001:1
   - 192.168.52.129:7000:1
   - 192.168.52.130:7000:1

具体操作如下:

修改哨兵的配置文件修改sentinel  deny-scripts-reconfig  yes  为下面的值。(三台都要修改,修改完启动)

编写修改twemproxy的配置文件和启动指令,脚本名称为reconfig.sh

[root@wyl01 redis]# cat reconfig.sh 
#!/bin/sh

## <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>

monitor_name="$1"   
master_old_ip="$4"
master_old_port="$5"
master_new_ip="$6"
master_new_port="$7"

twemproxy_bin="/usr/local/sbin/nutcracker"
twemproxy_conf="/etc/nutcracker/nutcracker.yml"

## 将新的master 端口和ip 替换掉 twemproxy 配置文件中旧的master 信息
sed -i "s/${master_old_ip}:${master_old_port}/${master_new_ip}:${master_new_port}/" ${twemproxy_conf}

##kill nutcracker进程
killall nutcracker

${twemproxy_bin} -d -c ${twemproxy_conf}

[root@wyl01 redis]# chmod +x reconfig.sh

动态添加reconfig.sh到哨兵的监控脚本中,当发生主从切换的时候,就会执行reconfig.sh脚本

[root@wyl01 redis]# redis-cli -p 26379 sentinel set my1master client-reconfig-script /opt/redis/reconfig.sh 
OK
[root@wyl01 redis]# redis-cli -p 26379 sentinel set my2master client-reconfig-script /opt/redis/reconfig.sh 
OK
[root@wyl01 redis]# redis-cli -p 26379 sentinel set my3master client-reconfig-script /opt/redis/reconfig.sh 
OK

 停止128机器上端口7000的服务,查看主从关系是否发生变化,以及twemproxy服务是否修改配置文件以及重启

129机器上查看7001端口的从服务,发现已经变成了主服务了

查看twemproxy服务的配置

[root@wyl01 nutcracker]# cat nutcracker.yml 
alpha:
  listen: 192.168.52.128:2222
  hash: fnv1a_64
  distribution: ketama
  auto_eject_hosts: true
  redis: true
  server_retry_timeout: 2000
  server_failure_limit: 1
  servers:
   - 192.168.52.128:7000:1
   - 192.168.52.129:7000:1
   - 192.168.52.130:7000:1 
[root@wyl01 nutcracker]# 
[root@wyl01 nutcracker]# cat nutcracker.yml 
alpha:
  listen: 192.168.52.128:2222
  hash: fnv1a_64
  distribution: ketama
  auto_eject_hosts: true
  redis: true
  server_retry_timeout: 1
  server_failure_limit: 1
  servers:
   - 192.168.52.129:7001:1   #发现已经发生改变
   - 192.168.52.129:7000:1
   - 192.168.52.130:7000:1

问题:这里哨兵的配置文件,里面也有关于脚本定义的配置,但是定义后启动总是失败,报错master name的问题,查看了也没什么问题,有知道的大牛,欢迎留言。

注意:当切换的时候发生报错,检查都没有问题的时候,注意是否有防火墙限制了。如果有防火墙,哨兵是访问不到有防火墙的那台redis服务。所以要开放端口。

FAQ:

在做压测的时候,出现一些错误,twemproxty (error) ERR Too many open files 是打开文件最大数的。可以在进程所能够打开的最大文件数,修改到65535即可,尽量大一点。

[root@wyl01 opt]# journalctl  _SYSTEMD_UNIT=nutcracker.service  --since "2019-07-10 15:33:00"  --until "2019-07-11 16:29:00"

Jul 10 16:53:09 wyl01 nutcracker[18794]: [2019-07-10 16:53:09.115] nc_server.c:489 socket for server '92.168.52.128:7000:1' failed: Too many open files

 

 

哨兵的配置文件和systemd管理的服务

port 26379
dir /tmp
sentinel monitor my1master 10.10.11.11 7100 1
sentinel auth-pass my1master 123456

sentinel monitor my2master 10.100.11.12 8100 1
sentinel auth-pass my2master 123456

sentinel monitor my3master 10.100.11.13 8101 1
sentinel auth-pass my3master 123456


sentinel down-after-milliseconds my1master 30000
sentinel down-after-milliseconds my2master 30000
sentinel down-after-milliseconds my3master 30000
sentinel parallel-syncs my1master 1
sentinel parallel-syncs my2master 1
sentinel parallel-syncs my3master 1
sentinel failover-timeout my1master 180000
sentinel failover-timeout my2master 180000
sentinel failover-timeout my3master 180000
sentinel deny-scripts-reconfig yes

systemd管理服务


[Unit]
Description=Redis Sentinel
After=network.target

[Service]
ExecStart=/usr/bin/redis-sentinel /data/sentinel/conf/sentinel.conf --supervised systemd
ExecStop=/usr/bin/redis-cli -h 10.10.11.11 -p 26379 -a 123456  shutdown
Type=notify
User=root
Group=root
RuntimeDirectoryMode=0755
LimitNOFILE=10240

[Install]
WantedBy=multi-user.target

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值