1.Redis搭建准备
建立三台真实虚拟机然后创建配置目录mkdir -p /myredis/cluster
三台虚拟机模拟六个独立的Redis实例服务
- 172.16.42.168端口6381/6382
- 配置文件
vim /myredis/cluster/redisCluster6381.conf
- 配置文件
vim /myredis/cluster/redisCluster6382.conf
- 配置文件
- 172.16.42.169端口6383/6384
- 配置文件
vim /myredis/cluster/redisCluster6383.conf
- 配置文件
vim /myredis/cluster/redisCluster6384.conf
- 配置文件
- 172.16.42.170端口6385/6386
- 配置文件
vim /myredis/cluster/redisCluster6385.conf
- 配置文件
vim /myredis/cluster/redisCluster6386.conf
- 配置文件
配置文件以redisCluster6381.conf
为例只写出来一个其他需微调端口号
bind 0.0.0.0
#是否要用守护线程的方式启动
daemonize yes
#保护模式
protected-mode no
#启动端口
port 6381
#日志目录
logfile "/myredis/cluster/cluster6381.log"
#pid文件中存放的是进程的ID
pidfile /myredis/cluster6381.pid
#rdb和aof的存放目录
dir /myredis/cluster
dbfilename dump6381.rdb
#开启aof
appendonly yes
#dir+appendfilename=aof存放目录
appendfilename "appendonly6381.aof"
#redis密码
requirepass 111111
#master的密码 当是slave时要用
masterauth 111111
#开启集群功能
cluster-enabled yes
#指定了集群配置文件
cluster-config-file nodes-6381.conf
#集群不可用最大时间
cluster-node-timeout 5000
启动6台Redis主机实例
redis-server /myredis/cluster/redisCluster6381.conf
redis-server /myredis/cluster/redisCluster6382.conf
...
redis-server /myredis/cluster/redisCluster6386.conf
2.构建集群关系
构建集群命令
111111需要替换成你的密码
cluster-replicas 1 中代表的是1代表的是一个master有一个slave;前三个ip是master,后三个ip是对应的slave。
redis-cli -a 111111 --cluster create --cluster-replicas 1 172.16.42.168:6381 172.16.42.168:6382 172.16.42.169:6383 172.16.42.169:6384 172.16.42.170:6385 172.16.42.170:6386
注意
- 使用自己的密码、IP、端口
- 用到的端口要放开
- 使用到6379端口不仅要打开6379也要打开6379+10000端口(16379)
结果和下面即为构建集群成功
启动时可能遇到的错误
错误1
如果一直卡在
Waiting for the cluster to join...
这说明集群通信的端口没有开放开放Redis服务的两个TCP端口。譬如Redis客户端连接端口为6379,而Redis服务在集群中还有一个叫集群总线端口,其端口为客户端连接端口加上10000,即 6379 + 10000 = 16379。所以开放每个集群节点的客户端端口和集群总线端口才能成功创建集群!
错误2
配置集群中断再次配置会出现的问题
[ERR] Node 172.168.63.202:7001 is not empty. Either the nodealready knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
解决方法:
- 删除每个节点对应的
nodes-xxx.conf
配置文件- 删除每个节点下的
aof、rdb文件
- 关掉redis集群各个实例的进程,重新启动
连接进入6381作为切入点检查集群状态
redis-cli -a 111111 -p 6381
-
info replication
-
cluster info
-
cluster nodes 查看集群信息
3. 集群读写
防止路由失效需要加入-c
参数,否则读写会出错
redis-cli -a 密码 -p 端口号 -c
4. 集群容错切换
- master节点挂掉后slaver节点会成为master节点,老master节点重新恢复后会自动变成slaver节点挂载
- 如果想恢复成为master节点需要输入指令
cluster failover
5. 集群扩容
新建6387和6388两个服务实例并启动
172.16.42.170端口6387/6388
- 配置文件
vim /myredis/cluster/redisCluster6387.conf
- 配置文件
vim /myredis/cluster/redisCluster6388.conf
启动两个新实例此时他们都是master
redis-server /myredis/cluster/redisCluster6387.conf
redis-server /myredis/cluster/redisCluster6388.conf
将新增的6387作为master节点加入原有集群
redis-cli -a 111111 --cluster add-node 172.16.42.170:6387 172.16.42.168:6381
redis-cli -a 密码 --cluster add-node 自己实际IP地址:6387 自己实际IP地址:6381
6387 就是将要作为master新增节点
6381 就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群
第一次检查集群情况
redis-cli -a 111111 --cluster check 172.16.42.168:6381
重新分配槽号
redis-cli -a 111111 --cluster reshard 172.16.42.168:6381
第二次检查集群情况
槽号已分配
为主节点6387分配从节点6388
redis-cli -a 111111 --cluster add-node 172.16.42.170:6388 172.16.42.170:6387 --cluster-slave --cluster-master-id 5d61b832af7352d41f51c34adebe617abf1229a1
命令:
redis-cli -a 密码 --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID
redis-cli -a 111111 --cluster add-node 192.168.111.174:6388 192.168.111.174:6387 --cluster-slave --cluster-master-id 4feb6a7ee0ed2b39ff86474cf4189ab2a554a40f
-------这个是6387的编号,按照自己实际情况
第三次检查集群情况
6. 集群缩容
目的6387和6388下线
①第一次检查集群情况
redis-cli -a 111111 --cluster check 172.16.42.168:6381
先获取从节点的节点ID记录下来(每个人的不一样)
②从集群中删除4号从节点6388
redis-cli -a 111111 --cluster del-node 172.16.42.170:6388 9ec62d20dd98d67d0fdc20654a5e0c8cbb211a53
命令:redis-cli -a 密码 --cluster del-node ip:从机端口 从机6388节点ID
③将4号主节点槽号清空
重新分配槽号,本例子将清出来的都给6381简化操作
redis-cli -a 111111 --cluster reshard 172.16.42.168:6381
4096个槽位都指给6381,它变成了8192个槽位,相当于全部都给6381了,不然要输入3次,一锅端
④第二次检查集群情况
redis-cli -a 111111 --cluster check 172.16.42.168:6381
发现槽号全部都给了6381服务 自己成为slaver
⑤删除4号6387主节点
命令:
redis-cli -a 密码 --cluster del-node ip:端口 6387节点ID
第三次检查集群情况
6387和6388节点彻底去除就剩三主三从
7.集群重启
①保留原有集群的重启
- 不需要再执行(cluster create)集群生成指令。
- 第一步:先关闭各个Redis节点。
- 第二步:再启动各个Redis节点即可。(注意:启动redis服务时请在上次成功启动服务的目录启动,即已经生成rdb,conf的目录,否则该节点加入不了集群)
②不保留原有集群的重启
说明:此方式相当于重置到刚刚创建集群的时候了,所以需要删除节点配置文件nodes.conf、还需要删除数据存储文件dump.rdb
- 需要再执行(cluster create )集群生成指令。
- 第一步:先关闭各个Redis节点。
- 第二步:删除各个Redis安装目录下的节点配置文件nodes.conf、数据文件dump.rdb等只保留redis启动的配置文件redis.conf。
- 第三步:再启动各个Redis节点。
- 第四步:(在集群中的任意一个节点)执行集群搭建指令。
redis-cli -a 111111 --cluster create --cluster-replicas 1 172.16.42.168:6381 172.16.42.168:6382 172.16.42.169:6383 172.16.42.169:6384 172.16.42.170:6385 172.16.42.170:6386
111111需要替换成你的密码
cluster-replicas 1 中代表的是1代表的是一个master有一个slave;前三个ip是master,后三个ip是对应的slave。
常用指令
- cluster nodes 查看集群信息
- cluster info 查看集群状态
- cluster help 查看相关指令