ubuntu redis 集群配置

1.下载并编译redis

去http://download.redis.io/releases/查看自己想要下载的redis,右键复制一下链接
我的原始目录:/root

wget http://download.redis.io/releases/redis-7.0.4.tar.gz
tar zxvf redis-7.0.4.tar.gz
cd  redis-7.0.4
sudo apt-get install gcc automake autoconf libtool make # 如下面那句话执行不成功就执行这一句,安装编译环境 
make && make PREFIX=/usr/local/redis install

2.配置redis集群节点

cd /usr/local/redis
mkdir cluster && cd cluster
mkdir 7000 7001 7002 7003 7004 7005
cp /root/redis-7.0.4/redis.conf /usr/local/redis/cluster/7000
cp /root/redis-7.0.4/redis.conf /usr/local/redis/cluster/7001
cp /root/redis-7.0.4/redis.conf /usr/local/redis/cluster/7002
cp /root/redis-7.0.4/redis.conf /usr/local/redis/cluster/7003
cp /root/redis-7.0.4/redis.conf /usr/local/redis/cluster/7004
cp /root/redis-7.0.4/redis.conf /usr/local/redis/cluster/7005
sudo vim /usr/local/redis/cluster/7000/redis.conf # 7001 7002 7003 7004 7005

下面是redis.conf内容 7001 7002 7003 7004 7005的类似,需要将对应的部分做一下修改

# 端口号
port 7000
# 后台启动
daemonize yes
# 开启集群
cluster-enabled yes
#集群节点配置文件
cluster-config-file nodes-7000.conf
# 集群连接超时时间
cluster-node-timeout 5000
# 进程pid的文件位置
pidfile /var/run/redis-7000.pid
# 开启aof
appendonly yes
# aof文件路径
appendfilename "appendonly-7000.aof"
# rdb文件路径
dbfilename dump-7000.rdb

3.启动redis

在/usr/local/redis目录下创建一个start.sh

#!/bin/bash
bin/redis-server cluster/7000/redis.conf
bin/redis-server cluster/7001/redis.conf
bin/redis-server cluster/7002/redis.conf
bin/redis-server cluster/7003/redis.conf
bin/redis-server cluster/7004/redis.conf
bin/redis-server cluster/7005/redis.conf
# 执行
sudo chmod -R 777 start.sh
./start.sh
ps -ef | grep redis

4.开启集群

sudo apt-get install ruby
# 同理,rubygems也需要去https://rubygems.org/pages/download找到最新的版本,对应的
wget https://rubygems.org/rubygems/rubygems-3.3.21.tgz
tar -zxvf  rubygems-3.3.21.tgz
cd rubygems-3.3.21
ruby setup.rb
gem install redis
# 需要注意的是,在redis 5.0之后不使用redis-trib进行集群创建,而使用redis-cli
cp /root/redis-7.0.4/src/redis-trib.rb /usr/local/redis/bin/redis-trib # redis 5.0版本之后需要进行复制,因为我是在/root下面安装的redis,所以目录在/root

如果没有注意版本,还是进行了复制操作,在执行redis-trib时,将会给出对应的正确操作,例如

# --cluster-replicas 1 或者 --replicas 1 的意思是一个master节点可以有多少个slave节点
# 如果是在多个机器的,那么就可以将IP地址更换成对应节点所在的ip即可
cd /usr/local/redis
bin/redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
或者
bin/redis-trib create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

5.常用命令

cd /usr/local/redis
ps -ef | grep redis # 列出redis进程
kill xxxx # 杀死某个进程 要注意的是,如果相同slots的master和slave,不要同时kill,不然就需要手动去分配slots
# 如果被杀死的是master节点,那么将会在slave节点中重新选举出来一个master节点,之前的主节点重新启动之后,变成了一个slave节点
  • 连接到节点的redis
bin/redis-cli -c -p 7000 # 连接到7000的redis,端口可以随意更改,如果没有对应端口,则提示not connected,端口默认6379
# 当进行set时,将会根据CRC16算法,进行集群内部分配,所以,保持集群不变的情况下,就算你连的是7000的redis,实际分配的保存位置也不一定就会是7000
# 此时,写入和读取,就相当于是一个redis的操作,实际位置开发者基本不需要关心,真正需要关心的是运维人员

# 查看单独节点
bin/redis-cli -c -p 7008 cluster nodes |grep efc3131fbdc6cf929720e0e0f7136cae85657481 # 这个node id是master节点的id
  • 启动某个redis节点
bin/redis-server cluster/7000/redis.conf
  • 移除一个节点
bin/redis-cli --cluster del-node 127.0.0.1:7000 <node-id>
或
bin/redis-trib del-node 127.0.0.1:7000 <node-id>
# 当移除的是master节点时:
# 移除节点时将会进行重新分配slots,重新分配之后当前节点中无slots,再执行移除节点的命令即可,被移除的master节点的slave节点将会被分配到其他的master节点作为slave节点
# 当移除的是slave节点时将会直接进行移除,因为slots插槽是与master节点进行绑定,slave节点只是一个映射
  • 新增一个节点
# 添加的新节点,需要先启动起来
# 如果自己新增了一个7006,那么将7006加入7000这样操作 ,新增的节点需要查看是否分配了slots,如果未分配需要手动分配
bin/redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 
或 
bin/redis-trib add-node 127.0.0.1:7006 127.0.0.1:7000

# 按照--cluster-replicas 1 或者 --replicas 1,如果当前新增的节点之前,节点已经满足了1个master对应一个slave,那么本次新增的节点就是一个master节点
# 如果当前新增的节点之前,节点不满足了1个master对应一个slave,那么本次新增的节点就是之前没有slave节点的master节点的slave节点
# 如果指定了master节点的id,那么就可以做到1个master节点对应多个slave节点
bin/redis-cli --cluster add-node --slave --master-id efc3131fbdc6cf929720e0e0f7136cae85657481 127.0.0.1:7008 127.0.0.1:7000
或 
bin/redis-trib add-node --slave --master-id efc3131fbdc6cf929720e0e0f7136cae85657481 127.0.0.1:7006 127.0.0.1:7000(未测试)
  • 分配slots
bin/redis-cli --cluster reshard 127.0.0.1:7000 
或 
/bin/redis-trib reshard 127.0.0.1:7000
# 将会出现How many slots do you want to move (from 1 to 16384)?
# 可以输入自己计算的一个平衡值
# 平衡值的计算方法是16384/n ,n是master节点的个数,现在新增了一个7006,那么master就有4个了,所以值大概是4096
# 下一步出现What is the receiving node ID? node ID可以在上面的输出中找到7006的node id,直接复制输入即可
# 下一步出现Please enter all the source node IDs.
     Type 'all' to use all the nodes as source nodes for the hash slots.
     Type 'done' once you entered all the source nodes IDs.
   Source node #1: # 意思就是从之前的三个master node节点中分别取多少个slots给7006,输入all的话,将会自动将之前的三个master节点的slots都分配一点给7006,也可以进行手动分配,自己凑够4096个即可
# 回车之后,一顿输出,我们执行检查节点信息的方法查看,可以看到
M: d2358a82392c2c4d7a6e4d6f37da924e340c154d 127.0.0.1:7006
   slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master


  • 检查节点信息
bin/redis-cli --cluster check 127.0.0.1:7000 # 或bin/redis-trib check 127.0.0.1:7000  # 将会输出现在redis的信息,哪个是master,哪个是slave,以及对应的slots信息

  • 基准测试
bin/redis-benchmark --help # 查看输出中是否有--cluster选项,如果有,那么说明当前版本支持集群基准测试
bin/redis-benchmark --cluster -q -n 100000  -p 7000 # 集群基准测试,如果不加--cluster,则只对于7000以及下属的slave节点进行基准测试

# 流水线测试
bin/redis-benchmark --cluster -n 1000000 -t set,get -P 16 -q -p 7000 # 流水线测试,如果不加--cluster,则只对于7000以及下属的slave节点进行基准测试

参考文章

https://zhuanlan.zhihu.com/p/391762630
https://xie.infoq.cn/article/176a69d28ad007e338a07ae15
https://cloud.tencent.com/developer/article/1752546

posted @ 2022-09-01 15:21  spatxos  阅读(259)  评论(0编辑  收藏  举报