目的:redis集群搭建
redis版本:redis5.0.8
两台机器:华为云低配Linux机器
用两台虚拟机模拟6个节点,一台机器3个节点,创建出3 master、3 salve 环境。
两台虚拟机都是Huawei Cloud EulerOS 2.0 ,一台 EulerOS (IP:192.168.2.180),一台 EulerOS (IP:192.168.3.23) 。
华为云两台机器内网互联
https://blog.csdn.net/craftsman2020/article/details/128127525
Linux安装部署Redis
https://blog.csdn.net/craftsman2020/article/details/122851974
redis5.0之前使用redis-trib.rb作为创建集群的命令,基于ruby语言实现,依赖于ruby环境。
redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6378 127.0.0.1:6377 127.0.0.1:6376 127.0.0.1:6375 127.0.0.1:6374
redis5.0之后使用redis-cli作为创建集群的命令,基于c语言实现,因为redis本身是基于c实现的,所以5.0之后的集群搭建不依赖其他环境,相比于5.0之前的版本,搭建简易了许多。
redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6378 127.0.0.1:6377 127.0.0.1:6376 127.0.0.1:6375 127.0.0.1:6374 --cluster-replicas 1
问题描述:WARNING: redis-trib.rb is not longer available!
You should use redis-cli instead
若使用docker搭建集群,此处较为简单
apt install ruby -y
若非docker搭建的需要升级ruby版本,redis需要ruby版本在2.3以上,yum安装的为2.0版本
#安装依赖
yum install -y ruby ruby-devel rubygems rpm-build
#安装rvm升级ruby
gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
curl -L get.rvm.io | bash -s stable
#安装ruby2.3以上版本
rvm install 2.3.4
#安装redis
gem install redis
redis集群需要至少要三个master节点,我们这里搭建三个master节点,并且给每个master再搭建一个slave节点,总共6个redis节点,三主三从,搭建集群的步骤如下:
分别在两台服务器下的redis安装目录下(/usr/local/redis/)创建redis-cluster目录
cd /usr/local/redis/
mkdir redis-cluster
在redis-cluster下分别创建8001,8002,8003 // 8004,8005,8006目录
# A机器创建目录
cd /usr/local/redis/redis-cluster
mkdir 8001 8002 8003
# 同理,切到B机器创建目录
mkdir 8004 8005 8006
cp /usr/local/redis/redis.conf /usr/local/redis/redis-cluster/8001/
1)daemonize yes
2)port 8001(分别对每个机器的端口号进行设置)
3)dir /usr/local/redis/redis-cluster/8001/(指定数据文件存放位置,必须要指定不同的目录位置,不然会丢失数据)
4)cluster-enabled yes(启动集群模式)
5)cluster-config-file nodes-8001.conf(集群节点信息文件,这里800x最好和port对应上)
6)cluster-node-timeout 5000
7) bind 127.0.0.1(去掉bind绑定访问ip信息, 注释掉,或改为0.0.0.0也可)
8) protected-mode no (关闭保护模式)
9)appendonly yes
如果要设置密码需要增加如下配置:
10)requirepass xxx (设置redis访问密码)
11)masterauth xxx (设置集群节点间访问密码,跟上面一致)
配置项说明
daemonize yes: 开启Redis的守护进程,redis服务在后台运行
port 8001: redis端口号,每个配置文件设置自己的端口号;本文档分别配置为 8001、8002 … 8006;
dir /usr/local/redis-cluster/8001/:设定数据文件存放位置,必须指定不同目 录位置,否则会丢失数据;
cluster-enalbed yes: 启动集群模式;默认是被注释掉的,取消注释;
cluster-config-file nodes-8001.conf: 集群节点信息文件。
默认为 nodes-6379.conf,将6379修改为本节点端口号即可。
注意 :尽管有此选项的名称,但这不是用户创建、也不是用户可编辑的配置文件,而是Redis群集节点每次发生更改时自动保留群集配置(基本上为状态)的文件,以便能够在启动时重新读取它。该文件列出了群集中其他节点,它们的状态,持久变量等等。由于某些消息的接收,通常会将此文件重写并刷新到磁盘上。
cluster-node-timeout 5000: 单位:毫秒; Redis群集节点可以不可用的最长时 间,而不会将其视为失败。如果主节点超过指定的时间不可达,它将由其从属设备进行 故障切换。并且每个无法在指定时间内到达大多数主节点的节点将停止接受查询。
bind 127.0.0.1 192.168.11.15:
127.0.0.1表示当前主机可通过127.0.0.1和 localhost访问本机节点;
192.168.11.15是当前主机IP,能够让其它服务器节点访问,否则无法创建集群;
如果bind为0.0.0.0 或者注释掉bind,表示所有机器都可以通过当前主机IP访问;
protected-mode no:redis3.2版本后新增protected-mode配置,默认是yes,即 开启;no:外部网络可直接访问;yes:需配置bind ip或者设置访问密码;
appendonly yes: 开启AOF持久化(Redis能在发生服务器电源故障或操作系统仍 然正常运行但Redis进程莫名挂掉的情况下,只丢失1秒的数据);
注 :如要设置密码,则需添加如下两个配置项
将修改好的8001的配置文件分别拷贝至8002-8006,修改响应的端口,文件名
cp /usr/local/redis/redis-cluster/8001/redis.conf /usr/local/redis/redis-cluster/8002/
cp /usr/local/redis/redis-cluster/8001/redis.conf /usr/local/redis/redis-cluster/8003/
scp /usr/local/redis/redis-cluster/8001/redis.conf [email protected]:/usr/local/redis/redis-cluster/8004/
scp /usr/local/redis/redis-cluster/8001/redis.conf [email protected]:/usr/local/redis/redis-cluster/8005/
scp /usr/local/redis/redis-cluster/8001/redis.conf [email protected]:/usr/local/redis/redis-cluster/8006/
新拷贝的五个文件仅修改配置项:port、dir、cluster-config-file 即可
redis-server /usr/local/redis/redis-cluster/8001/redis.conf
redis-server /usr/local/redis/redis-cluster/8002/redis.conf
redis-server /usr/local/redis/redis-cluster/8003/redis.conf
redis-server /usr/local/redis/redis-cluster/8004/redis.conf
redis-server /usr/local/redis/redis-cluster/8005/redis.conf
redis-server /usr/local/redis/redis-cluster/8006/redis.conf
redis-cli -a 123456--cluster create --cluster-replicas 1 192.168.2.180:8001 192.168.2.180:8002 192.168.2.180:8003 192.168.3.23:8004 192.168.3.23:8005 192.168.3.23:8006
连接A机器任意一个节点
redis-cli -a 123456 -c -h 192.168.2.180 -p 8001 -a 123456
redis-cli -a xxx -c -h 192.168.3.23 -p 8005 -a 123456
redis-cli -a 123456 -c -h 192.168.2.180 -p 8001 shutdown
redis-cli -a 123456 -c -h 192.168.2.180 -p 8002 shutdown
redis-cli -a 123456 -c -h 192.168.2.180 -p 8003 shutdown
redis-cli -a 123456 -c -h 192.168.3.23 -p 8004 shutdown
redis-cli -a 123456 -c -h 192.168.3.23 -p 8005 shutdown
redis-cli -a 123456 -c -h 192.168.3.23 -p 8006 shutdown
#!/bin/bash
#所有服务器节点的hostname
allnodes=('cnode-1' 'cnode-2' 'cnode-3')
#端口号开始
PORT=7001
#结束端口号
ENDPORT=7003
#密码,如果redis没配置密码可省略
PASSWROD=123456
while [ $((PORT < ENDPORT)) != "0" ]; do
for ip in ${allnodes[@]};
do
#判断某个端口是否已被占用,如果是,则执行关闭命令
count=`ssh $ip lsof -i:$PORT | wc -l`
if [ $count -gt 0 ];
then
echo "Stopping Redis $ip:$PORT"
ssh $ip redis-cli -p $PORT -a $PASSWROD shutdown 2>/dev/null
else
echo "no redis $ip:$PORT"
fi
done
PORT=$((PORT+1))
done
exit 0
集群总线
每个Redis集群中的节点都需要打开两个TCP连接。一个连接用于正常的给Client提供服务,比如6379,还有一个额外的端口(通过在这个端口号上加10000)作为数据端口,例如:redis的端口为6379,那么另外一个需要开通的端口是:6379 + 10000, 即需要开启 16379。 16379端口用于集群总线,这是一个用二进制协议的点对点通信信道。这个集群总线(Cluster bus)用于节点的失败侦测、配置更新、故障转移授权,等等。
解决方案:
知道了问题所在, 自然就知道如何去解决了, 只需要将开启Redis端口对应的 集群总线端口即可。例如: 6379 + 10000 = 16379。所以开放每个集群节点的客户端端口和集群总线端口才能成功创建集群!
注意:所有redis集群机器都要放开对应的redis客户端端口和集群总线端口。
如果你是在虚拟机上搭建redis集群、那么你直接关闭防火墙即可解决。
systemctl stop firewalld.service 关闭防火墙
systemctl disable firewalld 永久关闭防火墙
但如果你是在云服务器上搭建的redis集群,那么你就需要去安全组放开对应的redis集群总线端口。
华为云服务器的端口开放设置如下图:
在给redis集群环境添加节点时候遇到一个问题,提示新增的Node不为空。
解决方法:
appendonly yes
# The name of the append only file (default: "appendonly.aof")
appendfilename "appendonly.aof"
dir就是设置备份文件目录的,如果没设置,在哪文件夹下开启过服务,那个文件夹下就会生成一个dump.rdb.
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir /usr/local/redis/redis-cluster/8004
################################# REPLICATION #################################
cluster-config-file nodes-8004.conf
# Cluster node timeout is the amount of milliseconds a node must be unreachable
# for it to be considered in failure state.
# Most other internal time limits are multiple of the node timeout.
#
cluster-node-timeout 15000
我的dir目录设置在/usr/local/redis/redis-cluster/800x/, 删除如下图:
删除aof和cluster-config-file所在的文件
清空各节点数据库
完成上面几个操作之后,再重新创建节点,成功。
注:这种情况可能发生在每次非正常关闭redis集群的时候。
可能的原因之一是端口号没开放
如果是华为云服务器,登录华为云,在安全组中配置,操作如下:
创建集群时,报Could not connect to Redis at 192.168.2.180:8001: Connection refused。
我们想要其他机连接我们的Redis服务,有三种方式:
- 想办法让Redis运行在protected-mode为no的模式。
- 如果protected-mode为yes,那么我们可以在Redis服务上设置bind,也就是我们的一台机器有几个ip,指定我们的服务绑定监听本机的哪个ip。
- 如果protected-mode为yes,除了设置bind外,亦可通过设置密码的形式,也即是设置参数requirepass,从而达到可以从其他机器访问的目标。
redis-cli我们最常用的三个参数就是-h、-p、-a选项,分配用来指定连接的redis-server的host、port和登录密码。
通过redis-cli –help发现,redis-cli还提供了其他很多的参数和功能。
echo -en "chen.qun" | redis-cli -x set name
redis-cli -r 100 -i 1 info stats | grep instantaneous_ops_per_sec
-c
开启reidis cluster模式,连接redis cluster节点时候使用。
-rdb
获取指定redis实例的rdb文件,保存到本地。
redis-cli -h 192.168.44.16 -p 6379 --rdb 6379.rdb
-scan和- -pattern
是用scan命令扫描redis中的key,- -pattern选项指定扫描的key的pattern。相比keys pattern模式,不会长时间阻塞redis而导致其他客户端的命令请求一直处于阻塞状态。
redis-cli --scan --pattern 'chenqun_*'
echo -en '*3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$5\r\nvalue\r\n' | redis-cli --pipe
参考:http://redis.io/topics/mass-insert
redis-cli --bigkeys
redis-cli --eval myscript.lua key1 key2 , arg1 arg2 arg3
Redis集群的搭建,追加服务启停脚本
https://blog.csdn.net/alwaysbefine/article/details/109790828