搭建集群
介绍完Redis集群分区规则之后,下面我们开始搭建Redis集群。搭建集群有几种方式:
1)依照Redis 协议手工搭建,使用cluster meet、cluster addslots、cluster replicate命令。
2)5.0之前使用由ruby语言编写的redis-trib.rb,在使用前需要安装ruby语言环境。
3)5.0及其之后redis摒弃了redis-trib.rb,将搭建集群的功能合并到了redis-cli。
我们简单点,采用第三种方式搭建。集群中至少应该有奇数个节点,所以至少有三个节点,官方推荐三主三从的配置方式,我们就来搭建一个三主三从的集群。
节点配置
我们现在规定,主节点的端口为6900、6901、6902,从节点的端口为6930、6931、6932。
首先需要配置节点的conf文件,这个比较统一,所有的节点的配置文件都是类似的,我们以端口为6900的节点举例:
port 6900
daemonize yes
pidfile /var/run/redis_6900.pid
logfile "/root/redis-6.2.4/log/6900.log"
dbfilename dump-6900.rdb
dir "/root/redis-6.2.4/data/"
cluster-enabled yes
cluster-config-file nodes-6900.conf
cluster-node-timeout 15000
appendonly yes
appendfilename "appendonly-6900.aof"
注意创建log和data文件夹
# 对应位置创建
mkdir log
mkdir data
技巧:
可以通过脚本统一替换
./cp-redis-config.sh 6901 6902
[root@localhost redis-6.2.6]# cat cp-redis-config.sh echo 当前程序名称 $0 echo 参数总数 $# echo 是否正常退出 1:0 $? echo 字符串参数列表 $* echo 数组参数列表 $@ echo pid $$ echo pre pid $? echo $! echo 源端端口 $1 echo 目标端口 $2 echo 主从 m:s $3 # 判断变量是否存在 if [ ! -n "$1" ]; then echo 源端端口不存在 exit fi if [ ! -n "$2" ]; then echo 目标端口不存在 exit fi mode=$3 echo mode = $mode if [ ! -n "$mode" ]; then echo '$3默认设置m' mode=m fi echo mode = $mode # 源端文件是否存在 echo 源文件 cluster_m_"$1".conf if [ ! -f "cluster_m_"$1".conf" ]; then echo 源文件不存在 exit fi if [ ! -f "cluster_"$mode"_"$2".conf" ]; then echo 创建文件: "cluster_"$mode"_"$2".conf" cp "cluster_m_"$1".conf" "cluster_"$mode"_"$2".conf" else echo 清空文件 rm "cluster_"$mode"_"$2".conf" cp "cluster_m_"$1".conf" "cluster_"$mode"_"$2".conf" fi echo 目标文件 cluster_"$mode"_"$2".conf echo 替换变量 sed -i "s/$1/$2/g" "cluster_"$mode"_"$2".conf"
在上述配置中:
cluster-enabled yes # 是否启动集群模式(集群需要修改为yes)
cluster-node-timeout 15000 指定集群节点超时时间(打开注释即可)
cluster-config-file nodes-6900.conf 指定集群节点的配置文件(打开注释即可),这个文件不需要手工编辑,它由Redis节点创建和更新.每个Redis群集节点都需要不同的群集配置文件.确保在同一系统中运行的实例没有重叠群集配置文件名
appendonly yes 指定redis集群持久化方式(默认rdb,建议使用aof方式,此处是否修改不影响集群的搭建)
启动节点
分别执行
./redis-server ../conf/cluster_m_6900.conf
./redis-server ../conf/cluster_m_6901.conf
./redis-server ../conf/cluster_m_6902.conf
./redis-server ../conf/cluster_s_6930.conf
./redis-server ../conf/cluster_s_6931.conf
./redis-server ../conf/cluster_s_6932.conf
集群创建
创建集群主从节点
./redis-cli --cluster create 127.0.0.1:6900 127.0.0.1:6901 127.0.0.1:6902 127.0.0.1:6930 127.0.0.1:6931 127.0.0.1:6932 --cluster-replicas 1
说明:–cluster-replicas 参数为数字,1表示每个主节点需要1个从节点。
为了方便在同一台机器配置, 正常生产需要部署在多台机器上, 例如三台机器, 主从错开(1m-3s, 2m-1s, 3m-2s: 其中1m->1s,其他类似)
通过该方式创建的带有从节点的机器不能够自己手动指定主节点,不符合我们的要求。所以如果需要指定的话,需要自己手动指定,先创建好主节点后,再添加从节点。
指定主从节点
创建集群主节点
命令类似:
# 默认是主节点
./redis-cli --cluster create localhost:6900 localhost:6901 localhost:6902
注意:
1、请记录下每个M后形如“7353cda9e84f6d85c0b6e41bb03d9c4bd2545c07”的字符串,在后面添加从节点时有用;
2、如果服务器存在着防火墙,那么在进行安全设置的时候,除了redis服务器本身的端口,比如6900 要加入允许列表之外,Redis服务在集群中还有一个叫集群总线端口,其端口为客户端连接端口加上10000,即 6900 + 10000 = 16900 。所以开放每个集群节点的客户端端口和集群总线端口才能成功创建集群!
添加集群从节点
命令类似:
redis-cli --cluster add-node localhost:6930 localhost:6900 --cluster-slave --cluster-master-id 224c042651ff55e9bbf67c8ff9ce6edc4cdae63d
说明:上述命令把6930节点加入到6900节点的集群中,并且当做node_id为 117457eab5071954faab5e81c3170600d5192270 的从节点。如果不指定 --cluster-master-id 会随机分配到任意一个主节点。
有三个从节点,自然就要执行三次类似的命令。
./redis-cli --cluster add-nodelocalhost:6930 localhost:6900 --cluster-slave --cluster-master-id 224c042651ff55e9bbf67c8ff9ce6edc4cdae63d
./redis-cli --cluster add-node localhost:6931 localhost:6901 --cluster-slave --cluster-master-id fa2199a4049ef681a0f4c683bd13631dbbd52551
./redis-cli --cluster add-node localhost:6932 localhost:6902 --cluster-slave --cluster-master-id 6497602a2780465ecc48e7b7744ad8e560702a76
集群管理
检查集群
./redis-cli --cluster check localhost:6900 --cluster-search-multiple-owners
说明:任意连接一个集群节点,进行集群状态检查
集群信息查看
./redis-cli --cluster info localhost:6900
说明:检查key、slots、从节点个数的分配情况
报错
[ERR] Not all 16384 slots are covered by nodes.
关闭集群,重新启动
修复集群
redis-cli --cluster fix localhost:6900 --cluster-search-multiple-owners
说明:修复集群和槽的重复分配问题
设置集群的超时时间
redis-cli --cluster set-timeout localhost:6900 10000
说明:连接到集群的任意一节点来设置集群的超时时间参数cluster-node-timeout
集群配置
# 主节点设置密码
redis-cli --cluster call localhost:6900 config set requirepass cc
# 从节点复制时候使用的密码
redis-cli --cluster call localhost:6900 config set masterauth cc -a cc
# Redis Config rewrite 命令对启动 Redis 服务器时所指定的 redis.conf 配置文件进行改写。
redis-cli --cluster call localhost:6900 config rewrite -a cc
说明:连接到集群的任意一节点来对整个集群的所有节点进行设置。
redis-cli –cluster 参数参考
redis-cli --cluster help
Cluster Manager Commands:
create host1:port1 … hostN:portN #创建集群
--cluster-replicas #从节点个数
check host:port #检查集群
--cluster-search-multiple-owners #检查是否有槽同时被分配给了多个节点
info host:port #查看集群状态
fix host:port #修复集群
--cluster-search-multiple-owners #修复槽的重复分配问题
reshard host:port #指定集群的任意一节点进行迁移slot,重新分slots
--cluster-from #需要从哪些源节点上迁移slot,可从多个源节点完成迁移,以逗号隔开,传递的是节点的node id,还可以直接传递–from all,这样源节点就是集群的所有节点,不传递该参数的话,则会在迁移过程中提示用户输入
--cluster-to #slot需要迁移的目的节点的node id,目的节点只能填写一个,不传递该参数的话,则会在迁移过程中提示用户输入
--cluster-slots #需要迁移的slot数量,不传递该参数的话,则会在迁移过程中提示用户输入。
--cluster-yes #指定迁移时的确认输入
--cluster-timeout #设置migrate命令的超时时间
--cluster-pipeline #定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10
--cluster-replace #是否直接replace到目标节点
rebalance host:port #指定集群的任意一节点进行平衡集群节点slot数量
--cluster-weight <node1=w1…nodeN=wN> #指定集群节点的权重
--cluster-use-empty-masters #设置可以让没有分配slot的主节点参与,默认不允许
--cluster-timeout #设置migrate命令的超时时间
--cluster-simulate #模拟rebalance操作,不会真正执行迁移操作
--cluster-pipeline #定义cluster getkeysinslot命令一次取出的key数量,默认值为10
--cluster-threshold #迁移的slot阈值超过threshold,执行rebalance操作
--cluster-replace #是否直接replace到目标节点
add-node new_host:new_port existing_host:existing_port #添加节点,把新节点加入到指定的集群,默认添加主节点
--cluster-slave #新节点作为从节点,默认随机一个主节点
--cluster-master-id #给新节点指定主节点
del-node host:port node_id #删除给定的一个节点,成功后关闭该节点服务
call host:port command arg arg … arg #在集群的所有节点执行相关命令
set-timeout host:port milliseconds #设置cluster-node-timeout
import host:port #将外部redis数据导入集群
--cluster-from #将指定实例的数据导入到集群
--cluster-copy #migrate时指定copy
--cluster-replace #migrate时指定replace
关闭集群
./redis-cli -p 6900 shutdown
./redis-cli -p 6901 shutdown
./redis-cli -p 6902 shutdown
./redis-cli -p 6930 shutdown
./redis-cli -p 6931 shutdown
./redis-cli -p 6932 shutdown