可能会遇到的问题
1. Waiting for the cluster to join 一直等待
解决方法:参考 https://blog.csdn.net/truong/article/details/52531103 原因:redis集群不仅需要开通redis客户端连接的端口,而且需要开通集群总线端口。集群总线端口为redis客户端连接的端口 +10000,如redis端口为 7000,则集群总线端口为 17000
开放端口命令: firewall-cmd --permanent --add-port=17000/tcp firewall-cmd --permanent --add-port=17001/tcp firewall-cmd --reload
所有服务器的点需要开通redis的客户端连接端口和集群总线端口 注意:iptables放开,如果有安全组,也要放开这两个端口
2.[ERR] Node 10.211.55.12:7000 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
解决方法:参考 https://blog.csdn.net/vtopqx/article/details/50235737 1)将需要新增的节点下aof、rdb等本地备份文件删除; 2)同时将新Node的集群配置文件删除,即:删除 redis.conf 里面cluster-config-file 所对应文件夹中的文件; 3)重启redis
若再次添加新节点如果还是报错,则登录Node ./redis-cli–h x –p 对数据库进行清除: 127.0.0.1:7001> flushdb 重启redis
开始部署
1)统一安装在 /usr/local/myredis 目录下 2)3台服务器,每台服务器2个节点,3主3从,端口7000和7001
1.安装gcc
yum -y install gcc
2.下载redis安装包,不能连外网手动下载并上传到该文件目录下
手动下载地址:http://download.redis.io/releases/redis-5.0.2.tar.gz
mkdir /usr/local/myredis
cd /usr/local/myredis
wget http://download.redis.io/releases/redis-5.0.2.tar.gz
若出现:-bash: wget: 未找到命令,说明wget未安装 安装wget:yum -y install wget 重新执行 wget http://download.redis.io/releases/redis-5.0.2.tar.gz 命令
3.解压redis安装包:
tar -zxf redis-5.0.2.tar.gz
4.安装编译:
cd /usr/local/myredis/redis-5.0.2
make & make install
若报错:zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录 则执行:make MALLOC=libc
5.创建保存节点文件目录
mkdir -p ./rediscluster/node700{0,1}
6.编辑redis.conf文件
复制初始redis.conf文件并编辑
1.配置7000端口节点
cd rediscluster/node7000/
cp /usr/local/myredis/redis-5.0.2/redis.conf ./
vi redis.conf
#取消绑定ip,把 bind 127.0.0.1 注释
#bind 127.0.0.1
#修改保护模式为no,可以让非本机ip不加密码访问
protected-mode no
#修改为对应端口号
port 7000
#修改redis为后台启动
daemonize yes
#更改数据存储目录,方便管理
dir /usr/local/myredis/rediscluster/node7000
#开启集群,取消注释
cluster-enabled yes
#取消注释并修改为对应名称
cluster-config-file nodes-7000.conf
#集群超时参数,取消注释
cluster-node-timeout 15000
#修改为数据同步,改为aof备份
appendonly yes
#当主机和从机都down掉时,其它主节点是否可以写操作,no 可以,yes 不行,默认为yes。根据需求配置
#当主机和从机都down掉时并设置为no时,该主机所在槽位数据不可写。可能会造成数据丢失情况
cluster-require-full-coverage no
2.配置7001端口节点 把 7000 节点修改成功后的 redis.conf 文件复制到 7001 节点 复制并修改端口号
sed 's/7000/7001/g' /usr/local/myredis/rediscluster/node7000/redis.conf > /usr/local/myredis/rediscluster/node7001/redis.conf
7.开放端口
firewall方式:
firewall-cmd --permanent --add-port=7000/tcp
firewall-cmd --permanent --add-port=17000/tcp
firewall-cmd --permanent --add-port=7001/tcp
firewall-cmd --permanent --add-port=17001/tcp
firewall-cmd --reload
参数解释: 1、firwall-cmd:是Linux提供的操作firewall的一个工具; 2、–permanent:表示设置为持久; 移除端口命令:firewall-cmd --permanent --remove-port=8080/tcp 注意:每次开放或移除端口都需要重新加载防火墙,否则会无效。 重启防火墙命令:firewall-cmd --reload 查看开放端口命令:firewall-cmd --list-all
注意:redis集群不仅需要开通redis客户端连接的端口,而且需要开通集群总线端口。集群总线端口为redis客户端连接的端口 +10000。否则会出现 Waiting for the cluster to join 一直等待问题。
8.启动和关闭reids节点
启动 redis
/usr/local/myredis/redis-5.0.2/src/redis-server /usr/local/myredis/rediscluster/node7000/redis.conf
/usr/local/myredis/redis-5.0.2/src/redis-server /usr/local/myredis/rediscluster/node7001/redis.conf
关闭redis,关闭7000端口redis集群节点
/usr/local/myredis/redis-5.0.2/src/redis-cli -p 7000 shutdown
其它服务器按相同步骤操作
9.创建集群
所有6个节点配置完成并成功启动后,开始创建集群 创建集群,指定副本数为1
/usr/local/myredis/redis-5.0.2/src/redis-cli --cluster create 10.211.55.12:7000 10.211.55.13:7000 10.211.55.14:7000 10.211.55.12:7001 10.211.55.13:7001 10.211.55.14:7001 --cluster-replicas 1
其中: 1)前3个地址默认为主机,槽位共有16384个,根据主机平均分配 2)--cluster-replicas 2 表示从服务器数量,有1台主2台从服务器,可根据具体情况更改 创建完成后启动集群, -c 是以集群模式启动,写操作时会自动切换对应hash值服务器
/usr/local/myredis/redis-5.0.2/src/redis-cli -c -p 7000
10.相关命令
1)查看key值所属hash槽:cluster keyslot a 2)查询hash槽分布:cluster slots 3)查看集群节点信息:cluster nodes 4)查看集群状态信息:cluster info 5)查询集群中所有key
/usr/local/myredis/redis-5.0.2/src/redis-cli -c --cluster call 10.211.55.12:7000 keys \*
11.集群扩容
1.启动新节点:
/usr/local/myredis/redis-5.0.2/src/redis-server /usr/local/myredis/rediscluster/node7000/redis.conf
/usr/local/myredis/redis-5.0.2/src/redis-server /usr/local/myredis/rediscluster/node7001/redis.conf
2.添加主节点,默认为master
/usr/local/myredis/redis-5.0.2/src/redis-cli --cluster add-node 新的IP:端口 已存在的IP:端口(从建好集群中随便选择一个存在IP和端口)
3.添加从节点
/usr/local/myredis/redis-5.0.2/src/redis-cli --cluster add-node 新的IP:端口 已存在的IP:端口(从建好集群中随便选择一个存在IP和端口) --cluster-master-id 主节点ID(唯一标示,cluster nodes 命令可查看每个节点ID)
另外,如果添加的从节点之前保存有数据,必须删除,否则添加失败。删除从节点在redis.conf中配置的文件目录对应位置的文件。
4.添加完后没有槽位,需要手动分配槽位:
/usr/local/myredis/redis-5.0.2/src/redis-cli --cluster reshard 集群中任意一个IP:端口
执行完上述命令后按以下步骤执行 分配多少槽位 -》接收节点ID -》all/done,其中: all:表示从已分配好槽位集群中平均拿出指定槽位,如500个,之前有3个主节点,则每个分 配 500/3 done:指定主节点IP均拿出指定槽位,如500个,指定已有槽位的2个主节点,则每个分配 500/2
5.示例
主:
/usr/local/myredis/redis-5.0.2/src/redis-cli --cluster add-node 10.211.55.15:7000 10.211.55.12:7000
从:
/usr/local/myredis/redis-5.0.2/src/redis-cli --cluster add-node 10.211.55.15:7001 10.211.55.12:7000 --cluster-master-id 61e034d4a7b592c96db3aff8d1e4751b3105ee0b
分配槽位: 其它命令:
从集群中删除从节点,后面为从节点的id。
/usr/local/myredis/redis-5.0.2/src/redis-cli --cluster del-node 192.168.1.172:6380 b97cde23f3c1a1b13e42728562180355b985831a
删除主节点,
先要把主节点的槽移到其他节点去 要迁移槽的主节点
/usr/local/myredis/redis-5.0.2/src/redis-cli --cluster reshard 192.168.1.172:6379
将槽均衡到其他节点
/usr/local/myredis/redis-5.0.2/src/redis-cli --cluster rebalance --cluster-threshold 1 192.168.1.172:6379
将集群外部redis实例中的数据导入到集群中去
/usr/local/myredis/redis-5.0.2/src/redis-cli --cluster import 192.168.1.172:6379 --cluster-from 192.168.1.172:6382 --cluster-copy
Cluster-from后面跟外部redis的ip和port
如果集群中已有同样的key,如果需要替换,可以cluster-copy和cluster-replace联用,这样集群中的key就会被替换为外部的