RedisCluter集群——集群配置详解
# 【持久化配置】
# 数据文件存放位
# redis运行临时文件位,pid 6374和port要对应
# redis集群节点文件位 pid 6374和port要对应
# redis集群存活心跳
appendfilename "9006_appendonly.aof"
dbfilename 9006_dump.rdb
dir /usr/local/redis-cluster/data/
pidfile /var/run/9006_redis.pid
cluster-config-file 9006_nodes.conf
cluster-node-timeout 15000
# 【服务接口配置】
# (1)绑定当前机器 IP,如果是内网用内网ip,这里是伪集群则随意
# (2)每个节点的端口号
bind 0.0.0.0
port 9006
# 【服务集群配置】
#(1)开启集群
#(2)开启后台模式,不退出
#(3)开启异步模式
daemonize yes
appendonly yes
logfile "/usr/local/redis-cluster/logs/9006_redis.log"
链接:https://pan.baidu.com/s/1UBtBmrZoN9dAkqWx93oSdw
提取码:1hhb
Redis集群至少需要3个主节点(也就是要副本的话至少6个),因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群;要保证集群的高可用,需要每个节点都有备份节点做主从,所以Redis集群至少需要6台服务器;(也可以让部份redis的访问可能并发太大,需要用主从来分担访问压力)
RedisCluter集群——升级GCC编译器
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash
#修改环境变量
echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
gcc -v
RedisCluter集群——伪集群搭建
伪集群的目的就是,在你没有多台机器的情况下在本地实验方便所建立的;就是一台机器开个多个端口来实现集群;
下载/解压/编译/复制文件:
cd /opt
&&wget http://download.redis.io/releases/redis6.0.5.tar.gz
&&tar -zxvf redis-6.0.5.tar.gz &&cd redis-6.0.5&&make install
PREFIX=/usr/local/redis-cluster/redis-source&&cp -i redis.conf
/usr/local/redis-cluster/redis-source/bin
替换配置文件
进入:cd /usr/local/redis-cluster/redis-source/bin
替换:我们事先上传好的文件;
复制:
cd /usr/local/redis-cluster&&cp -r redis-source/bin/ 9001&&cp -r redis-source/bin/ 9002 &&cp -r redis-source/bin/ 9003 &&cp -r redis-source/bin/ 9004 &&cp -r redis-source/bin/ 9005 &&cp -r redis-source/bin/ 9006
注意:修改每个配置文件中的端口号
配置启动脚本:
cat > ./start.sh <<EOF
cd /usr/local/redis-cluster/9001
./redis-server redis.conf
cd /usr/local/redis-cluster/9002
./redis-server redis.conf
cd /usr/local/redis-cluster/9003
./redis-server redis.conf
cd /usr/local/redis-cluster/9004
./bin/redis-server redis.conf
cd /usr/local/redis-cluster/9005
./redis-server redis.conf
cd /usr/local/redis-cluster/9006
./redis-server redis.conf
EOF
>1、上面全部复制,输入完enter一下,记得最后的EOF后面不要有空格
>2、设置编码::sed -i 's/\r//' start.sh(或者用notepadd++转Unix编码)
>3、 启动脚本:sh start.sh
>4、查看进程:ps aux|grep redis
集群脚本:
(1)安装ruby环境:yum install ruby
(2)安装redis-gem:
cd /opt(去网上下载redis-3.0.0.gem,放到这里https://pan.baidu.com/s/1IiKDQGxP4XU7wDEKxNoVkw 提取码ignv)
gem install redis-3.0.0.gem
cp /opt/redis-3.2.9/src/redis-trib.rb /usr/local/redis-cluster
(3)运行:
cd /usr/local/redis-cluster
./redis-trib.rb create --replicas 1 127.0.0.1:9001 127.0.0.1:9002 127.0.0.1:9003 127.0.0.1:9004 127.0.0.1:9005 127.0.0.1:9006
Ps:–replicas 1 表示主从复制比例为 1:1,即一个主节点对应一个从节点;然后,默认给我们分配好了每个主节点和对应从节点服务,以及 solt 的大小
客户端测试
9001/redis-cli -p 9001 -c
进入后就可以输入下面的指令:
cluster info
cluster nodes
RedisCluter集群——真集群搭建
用这个操作可以几个窗口一起发指令;
下载/解压/编译/复制文件:
cd /opt
&&wget http://download.redis.io/releases/redis6.0.5.tar.gz
&&tar -zxvf redis-6.0.5.tar.gz &&cd redis-6.0.5&&make install
PREFIX=/usr/local/redis-cluster/redis-source&&cp -i redis.conf
/usr/local/redis-cluster/redis-source/bin
复制文件/建立目录:
cd /usr/local/redis-cluster&&cp -r redis-source/bin/ ./
/usr/local/redis-cluster/bin mkdir /usr/local/redis-cluster/data
建立和启动脚本:
创建文件:cat > ./start.sh <<EOF cd bin ./redis-server redis.conf EOF
设置编码:sed -i ‘s/\r//’ start.sh
启动脚本:sh start.sh
查看进程:ps aux|grep redis
集群脚本:
(1)安装ruby环境:yum install ruby
(2)安装redis-gem:
cd /opt(去网上下载redis-3.0.0.gem,放到这里https://pan.baidu.com/s/1IiKDQGxP4XU7wDEKxNoVkw 提取码ignv)
gem install redis-3.0.0.gem
cp /opt/redis-3.2.9/src/redis-trib.rb /usr/local/redis-cluster
(3)运行:
cd /usr/local/redis-cluster ./redis-trib.rb create --replicas 1 192.168.233.128:6374 192.168.233.129:6374 192.168.233.130:6374
192.168.233.131:6374 192.168.233.132:6374 192.168.233.133:6374
(只需在一台机器上执行)
RedisCluter集群——trib指令
- create:创建集群 --replicas可以指定从节点个数
- check:检查集群
- info:查看集群信息
- fix:修复集群
- reshard:在线迁移slot
- rebalance:平衡集群节点slot数量
- add-node:将新节点加入集群
- del-node:从集群中删除节点
- set-timeout:设置集群节点间心跳连接的超时时间
- call:在集群全部节点上执行命令
- import:将外部redis数据导入集群
主要命令
创建集群——建立集群关系(自动分配哈希槽):
redis-trib.rb create --replicas 1 192.168.233.128:6374 192.168.233.129:6374 192.168.233.130:6374 192.168.233.131:6374 192.168.233.132:6374 192.168.233.133:6374 (自动分配主从,replicas 是副本数量)
添加节点——新建主节点(不分配哈希槽):
redis-trib.rb add-node 127.0.0.1:9006 127.0.0.1:9000
添加副本——新加副本并绑定主从:
redis-trib.rb add-node --slave --master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127. 0.0.1:7006
127.0.0.1:7000
删除节点——删除节点并实现迁移: redis-trib.rb del-node 127.0.0.1:7000 d5f6d1d17426bd564a6e309f32d0f5b96962fe53
(host:port:从该节点获取集群信息。node_id:需要删除的节点id。
del-node只能删除没有分配slot的节点。删除命令传递两个参数)
升级节点——升级节点并重新分配 :redis-trib.rb reshard host:ip OR redis-trib.rb reshard --from host:port --to host:port --slots --yes(重新分片)
检查节点:redis-trib.rb check 127.0.0.1:7000
统一执行命令:redis-trib.rb call 192.168.10.199:6379 get key
设置节点超时:redis-trib.rb set-timeout 192.168.10.199:6379 30000
Ps:从上面过程可以看出,添加节点、分配槽、删除节点的过程,不用停止集群,不阻塞集群的其他操作
另外,redis-trib.rb还有fix修复命令、reshard在线迁移命令、rebalance平衡slot命令
可以参考这篇文章:https://www.cnblogs.com/kevingrace/p/9868366.html
迁移命令
主节点如果没有slots的话,存取数据就都不会被选中。 可以把分配的过程理解成打扑克牌,all表示大家重新洗牌;输入某个主节点的node
id,然后在输入done的话,就好比从某个节点,抽牌。
redis-trib.rb reshard 192.168.10.199:6379
--from all
--to 80b661ecca260c89e3d8ea9b98f77edaeef43dcd
--slots 11
redis-trib.rb reshard host:port 集群ip
--from <arg> 源节点id
--to <arg> 目标节点id
--slots <arg> 槽数量
--yes 是否打印
--timeout <arg> 超时时间
--pipeline <arg> 一次迁移的key数量,默认是10个
平衡命令
懒得手动分配,直接全部自动平衡,当然如果需要特殊分配内存大的机器才还需要手动精细调整
redis-trib.rb rebalance 192.168.10.199:6379
--threshold 1
--weight b31e3a2e=5
--weight 60b8e3a1=5
--use-empty-masters
--simulate
rebalance host:port
--weight <arg> 节点的权重,格式为node_id=weight
--auto-weights 自动权重
--threshold <arg> 只有节点需要迁移的slot阈值超过threshold,才会执行rebalance操作
--use-empty-masters 默认没有分配slot节点的master是不参与rebalance的
--timeout <arg> 设置migrate命令的超时时间
--simulate 设置该参数,可以模拟rebalance操作,提示用户会迁移哪些slots,而不会真正执行迁移操
--pipeline <arg> 与reshar的pipeline参数一样,,一次平衡的取出的key数量,越少安全性越高越频繁
修复命令
目前redis cluster集群的启动只能空节点启动,当节点有数据时会有err警告,但是只要进行fix就好了 redis-trib.rb
fix 用这个命令修复下就OK了。
RedisCluter集群——cluster指令
需要通过cli进入客户端命令好去操作
【集群操作】
cluster info 打印集群的信息
cluster nodes 打印节点详情信息。
cluster failover 手动故障转移,需要在转移的主节点的从节点上执行
【节点操作】
cluster meet 将指定的redis实例(ip+port指定)添加进集群中。
cluster forget <node_id> 从集群中移除 node_id 指定的节点。
cluster replicate <node_id> 降级从节点。
cluster replicate 627bf0d585fb84c2189d9f9a5dbcbcba85bf98b8 升级主节点。
cluster saveconfig 手动持久节点配置
【槽操作】
cluster addslots [slot …] 将一个或多个槽(slot)指派(assign)给当前节点。
cluster delslots [slot …] 移除一个或多个槽对当前节点的指派。
cluster flushslots 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
cluster setslot node <node_id> 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽,然后再进行指派。
cluster setslot migrating <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。
cluster setslot importing <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。
cluster setslot stable 取消对槽 slot 的导入(import)或者迁移(migrate)。
【键操作】
cluster keyslot 计算键 key 应该被放置在哪个槽上。
cluster countkeysinslot 返回槽 slot 目前包含的键值对数量。
cluster getkeysinslot 返回 count 个 slot 槽中的键。
【其他】
cluster myid 返回节点的ID
cluster slots 返回节点负责的slot
cluster reset 重置集群,慎用
cluster slaves 列出该slave节点的master节点
cluster set-config-epoch 强制设置configEpoch槽(slot)
RedisCluter集群——主备切换
使用cluster failover来触发一次手工故障转移主服务器,然后主机宕机,备机切换成主
1)Master下线后,其对应的Slaver节点会自动变为Master节点
2)原来的Master重启后变成Slaver节点,并是原来Master节点的Slaver节点
GodSchool 致力于简洁的知识工程,输出高质量的知识产出,我们一起努力 博主私人微信:supperlzf