序言
4月12号写了一篇在测试环境的1台主机上搭建9个redis节点和1个twemproxy的博客,这个是根据我在测试环境真实搭建成功的过程来写的,最近完成了生产环境的9个redis节点和2个twemproxy的搭建,所以也记录一下
在看这篇博客之前希望你已经搭建好了9个redis节点,否则是无法搭建Twemproxy的,而这9个redis节点是每3台为一组,一组是1主2备,而主节点可读可写,2个从节点只能读。
如果没有搭建,可以按照我今天刚写的博客搭建完成后再来参考我的这篇来搭建。
主机情况
主机 | 主备 |
---|---|
127.0.1.0 | 主 |
127.0.2.0 | 备 |
我这里采用的是一主一备的模式来搭建,2台主机的搭建是一模一样的。
我参考的博客:
文章链接1
文章链接2
--------------------开始搭建和配置啦-------------------
1、新建用户
在2台主机新建用户
groupadd twempsrv
useradd -m -d /home/twempsrv -g twempsrv -s /bin/bash -u 502 twempsrv
2、解压
解压从测试环境打包的twemproxy,如果想看最开始是怎么安装的,可以看我的这篇文章
tar -zxvf twemproxy.tar.gz
3、修改配置文件
修改配置文件nutcracker.yml
cd /home/twempsrv/twemproxy/twemproxy-master/installs/sbin/conf
vim nutcracker.yml
配置文件内容
redis:
listen: 0.0.0.0:22122
hash: fnv1a_64
distribution: ketama
auto_eject_hosts: true
redis: true
server_retry_timeout: 30000
server_failure_limit: 2
servers:
- 127.0.0.1:7000:1 server0
- 127.0.0.3:7003:1 server3
- 127.0.0.5:7006:1 server6
4、检查配置文件格式
cd /home/twempsrv/twemproxy/twemproxy-master/installs/sbin
./nutcracker -t
显示内容:
nutcracker: configuration file 'conf/nutcracker.yml' syntax is ok
5、修改配置文件的名称
cp nutcracker.yml redis_22122.yml
注:之所以要修改配置文件名称是因为更新配置文件的脚本需要获取里面的redis_22122
6、启动nutcracker
cd /home/twempsrv/twemproxy/twemproxy-master/installs/sbin
nutcracker -d -c /home/twempsrv/twemproxy/twemproxy-master/installs/sbin/conf/nutcracker.yml -p /home/twempsrv/twemproxy/twemproxy-master/installs/run/redisproxy.pid -o /home/twempsrv/twemproxy/twemproxy-master/installs/run/redisproxy.log
7、编写启动脚本
cd /home/twempsrv/twemproxy/twemproxy-master/installs/sbin/sh
vim downtwemproxy.sh
启动脚本内容
#!/bin/bash
SERVER_NAME="nutcracker"
/home/twempsrv/twemproxy/twemproxy-master/installs/sbin/nutcracker -d -c /home/twempsrv/twemproxy/twemproxy-master/installs/sbin/conf/nutcracker.yml -p /home/twempsrv/twemproxy/twemproxy-master/installs/run/redisproxy.pid -o /home/twempsrv/twemproxy/twemproxy-master/installs/run/redisproxy.log
sp_pid=`ps -ef | grep $SERVER_NAME | grep -v grep | awk '{print $2}'`
if [ -z "$sp_pid" ];
then
echo "cannot run $SERVER_NAME,please check!"
else
echo "$SERVER_NAME is starting, pid:"$sp_pid
fi
cd $BIN_DIR
8、编写停止脚本
cd /home/twempsrv/twemproxy/twemproxy-master/installs/sbin/sh
vim uptwemproxy.sh
停止脚本内容
#!/bin/bash
SERVER_NAME="nutcracker"
sp_pid=`ps -ef | grep $SERVER_NAME | grep -v grep | awk '{print $2}'`
if [ -z "$sp_pid" ];
then
echo "stop fail! The $SERVER_NAME not start!"
else
kill -9 $sp_pid
echo "stop success! pid:"$sp_pid
fi
cd $BIN_DIR
9、创建sentinel的启动环境
cd /home/twempsrv/twemproxy/
mkdir redis_sentinel
cd redis_sentinel
mkdir bin conf logs pid sh
从7000端口的主机将 redis-cli和 redis-sentinel
传到bin目录下
cd bin
scp rdsclsr@127.0.0.1:/bal/rdsclsr/redis/redis-5.0.8/installs/bin/redis-server .
scp rdsclsr@127.0.0.1:/bal/rdsclsr/redis/redis-5.0.8/installs/bin/redis-cli .
注:命令的最后有个点(.),表示传到当前目录
11、本机的sentinel的启动脚本
cd /home/twempsrv/twemproxy/redis_sentinel/sh
vim up_tw_sentinel.sh
启动脚本的内容
#!/bin/bash
/home/twempsrv/twemproxy/redis_sentinel/bin/redis-sentinel /home/twempsrv/twemproxy/redis_sentinel/conf/sentinel.conf
12、本机的sentinel的停止脚本
cd /home/twempsrv/twemproxy/redis_sentinel/sh
vim down_tw_sentinel.sh
停止脚本的内容
#!/bin/bash
/home/twempsrv/twemproxy/redis_sentinel/bin/redis-cli -h 10.253.47.143 -p 25379 shutdown
13、编写更新配置文件的脚本
为了在master宕机后,将选举出来的master写入到nutcracker.yml文件中,需要写一个更新配置文件的脚本,脚本client-reconfig.sh
cd /home/twempsrv/twemproxy/twemproxy-master/installs/sbin
mkdir logs sh
vim /home/twempsrv/twemproxy/twemproxy-master/installs/sbin/sh/client-reconfig.sh
脚本内容:
# reconfig nutcracker.yml add by fanhf in 202006151700
#!/bin/sh
monitor_name="$1" ##monitor master-group-name
master_old_ip="$4"
master_old_port="$5"
master_new_ip="$6"
master_new_port="$7"
twemproxy_name=$(echo $monitor_name |awk -F'_' '{print $1"_"$2}')
twemproxy_bin="/home/twempsrv/twemproxy/twemproxy-master/installs/sbin/nutcracker"
twemproxy_conf="/home/twempsrv/twemproxy/twemproxy-master/installs/sbin/conf/${twemproxy_name}.yml"
twemproxy_pid="/home/twempsrv/twemproxy/twemproxy-master/installs/sbin/logs/${twemproxy_name}.pid"
twemproxy_log="/home/twempsrv/twemproxy/twemproxy-master/installs/sbin/logs/${twemproxy_name}.log"
twemproxy_cmd="${twemproxy_bin} -c ${twemproxy_conf} -p ${twemproxy_pid} -o ${twemproxy_log} -v 11 -d"
sed -i "s/${master_old_ip}:${master_old_port}/${master_new_ip}:${master_new_port}/" ${twemproxy_conf}
ps -ef |grep "${twemproxy_cmd}" |grep -v grep |awk '{print $2}'|xargs kill
${twemproxy_cmd}
sleep 1
ps -ef |grep "${twemproxy_cmd}" |grep -v grep
14、执行动态修改127.0.1.0.:25379 sentinel 的配置的命令,添加 client-reconfig-script 项
进入sentinel的目录
cd /home/twempsrv/twemproxy/redis_sentinel
在twemproxy的主上依次执行下面的3条命令
/home/twempsrv/twemproxy/redis_sentinel/bin/redis-cli -h 127.0.1.0 -p 25379 sentinel set redis_22122_group1 client-reconfig-script /home/twempsrv/twemproxy/twemproxy-master/installs/sbin/sh/client-reconfig.sh
/home/twempsrv/twemproxy/redis_sentinel/bin/redis-cli -h 127.0.1.0 -p 25379 sentinel set redis_22122_group2 client-reconfig-script /home/twempsrv/twemproxy/twemproxy-master/installs/sbin/sh/client-reconfig.sh
/home/twempsrv/twemproxy/redis_sentinel/bin/redis-cli -h 127.0.1.0 -p 25379 sentinel set redis_22122_group3 client-reconfig-script /home/twempsrv/twemproxy/twemproxy-master/installs/sbin/sh/client-reconfig.sh
在twemproxy的从上执行上面的三个命令时需要将ip地址由127.0.1.0
换成127.0.2.0
我在执行上面的命令的时候,出现了错误的信息:
(error)ERR Reconfiguration of scripts path is denied for security reasons.Check the deny-scripts-reconfig configuration in your Sentinel configuration
从这句话可以很明显的看出问题:sentinel.conf里的deny-scripts-reconfig
配置的问题,.
我最开始的时候是停掉sentinel,把这句配置删掉,然后把sentinel拉起,再执行,但依然是这个错误,就这么重复了几次,和同事说这件事的时候,我猛然想到,如果把配置的值由yes改为no
会怎么样,于是尝试了一下。
修改3台sentinel的配置文件和twemproxy主机上的配置:将deny-scripts-reconfig的值修改为no,就可以解决问题。
所以,得出的经验是:不能在启动哨兵之前将这句配置给删掉,一旦启动后,这句话就会被重新写进去,执行上面的命令依然会报错。
15、测试7000宕机后是否修改配置文件
测试一下上面的配置是否成功,当我把7000给杀掉,看看能否自动修改redis_22122.yml的配置文件
其实这个过程还有点小曲折,我反复试了好几次,把7000杀掉,配置文件纹丝未动,重新把上面的3个命令执行一遍,再次重启7000,再杀掉7000,还是不行,于是想肯定是哪里除了问题,看到我的redis_22122.yml的配置文件:
redis:
listen: 0.0.0.0:22122
hash: fnv1a_64
distribution: ketama
auto_eject_hosts: true
redis: true
server_retry_timeout: 30000
server_failure_limit: 2
servers:
- 127.0.0.1:7000:1 server0
- 127.0.0.3:7003:1 server3
- 127.0.0.5:7006:1 server6
里面还配置了server0、server3和server6
,我在想替换脚本里面没有把server给替换掉,无法匹配,所以不行,于是就把server0、server3和server6去掉
,变成了这样
redis:
listen: 0.0.0.0:22122
hash: fnv1a_64
distribution: ketama
auto_eject_hosts: true
redis: true
server_retry_timeout: 30000
server_failure_limit: 2
servers:
- 127.0.0.1:7000:1
- 127.0.0.3:7003:1
- 127.0.0.5:7006:1
再次把7000 杀掉,等了十几秒,怀着忐忑的心情看了一下配置文件,哇塞!!我成功啦,太 开森啦~
redis:
listen: 0.0.0.0:22122
hash: fnv1a_64
distribution: ketama
auto_eject_hosts: true
redis: true
server_retry_timeout: 2000
server_failure_limit: 1
servers:
- 127.0.0.2:7001:1
- 127.0.0.3:7003:1
- 127.0.0.5:7006:1
再把7000拉起,7001杀掉,再拉起7001后配置文件又会自动恢复到之前的7000端口。
16、编辑切机脚本
vim /home/twempsrv/twemproxy/twemproxy-master/installs/sbin/sh/twemp_swap_script.sh
切机脚本内容
#!/bin/bash
if [ "$1" == "start" ]
then
echo start twempoxy time :`date +%Y:%m:%d%t%H:%M:%S` >> /home/twempsrv/twemproxy/twemproxy-master/installs/sbin/logs/starttwemp.log
sh /home/twempsrv/twemproxy/twemproxy-master/installs/sbin/sh/uptwemproxy.sh
echo twempoxy is starting......
fi
if [ "$1" == "stop" ]
then
echo stop twempoxy time:`date +%Y:%m:%d%t%H:%M:%S` >> /home/twempsrv/twemproxy/twemproxy-master/installs/sbin/logs/stoptwem.log
sh /home/twempsrv/twemproxy/twemproxy-master/installs/sbin/sh/downtwemproxy.sh
echo twempoxy stoped......
fi
肯定有的小伙伴会想,不用keepalived进行高可用吗?(整合keepalived可以参考博客),这个考虑是必须的,我们确实用了,不过用的是Pacemaker和pcs搭建的,这个我没有搭建过,是同事搭建的,所以我没有发言权,等我有机会搭建后再再补充博客吧。
与君共勉!!!