前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >并发编程之Redis:Redis集群(cluster)搭建

并发编程之Redis:Redis集群(cluster)搭建

作者头像
一行Java
发布2022-04-06 16:19:42
3220
发布2022-04-06 16:19:42
举报
文章被收录于专栏:用户9257747的专栏
准备工作

5.0之前的版本的集群管理是通过redis-trib.rb,需要依赖ruby;4.0的版本下面测试出了集群管理的bug,经过排查,也得到了官方的证实;如果新搭建的集群,建议使用5.0+的版本;5.0之后的版本,集群管理工具整合到redis-cli,就不需要依赖其他的资源;

  • 安装ruby(5.0+的版本不用安装)
代码语言:javascript
复制
yum install -y ruby
yum install -y rubygems
gem install redis
//自带的集群工具依赖于ruby
图片
图片
  • 重新安装
代码语言:javascript
复制
gem install redis
代码语言:javascript
复制
ERROR:  Error installing redis:
  redis requires Ruby version >= 2.3.0.
代码语言:javascript
复制
yum -y install curl
代码语言:javascript
复制
gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
curl -L get.rvm.io | bash -s stable
代码语言:javascript
复制
gpg2 --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
command curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
command curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import -
代码语言:javascript
复制
curl -L get.rvm.io | bash -s stable
代码语言:javascript
复制
source /etc/profile.d/rvm.sh
代码语言:javascript
复制
rvm list known
rvm install 2.3.3
  • 使用并卸载老版本
代码语言:javascript
复制

// 使用新安装的2.3.3
rvm use 2.3.3
// 将2.3.3设置为默认
rvm use 2.3.3 --default
// 删除默认的2.0.0版本
rvm remove 2.0.0
// 查看版本
ruby --version
基础Redis安装

任何版本的Redis都差不多,按这个 《并发之Redis(一):单机环境的安装(仅仅用于学测试)》:https://lupf.cn/articles/2020/04/06/1586153137483.html 安装

集群环境配置
  • 集群结构 想要搭建集群,那么至少得需要3台机器,来实现3主(master)3从(slave)的高可用集群,如果出现了高并发或者更多的海量数据的情况,那么就横向扩展更多的master节点,来实现高可用、高并发、海量数据的集群
图片
图片
单机配置

优先从cache0000开始,部署7001和7002;然后其他机器就配置就好了

  • 目录创建
代码语言:javascript
复制
mkdir -p /etc/redis-cluster
mkdir -p /var/redis-cluster/data/7001
mkdir -p /var/redis-cluster/log/7001
mkdir -p /var/redis-cluster/data/7002
mkdir -p /var/redis-cluster/log/7002
  • 创建7001配置文件
代码语言:javascript
复制
cp /usr/local/redis-4.0.1/redis.conf /etc/redis-cluster/7001.conf
  • 配置7001配置文件
代码语言:javascript
复制
vim /etc/redis-cluster/7001.conf

// 修改以下配置
port 7001
cluster-enabled yes
cluster-config-file /etc/redis-cluster/node-7001.conf
cluster-node-timeout 15000
daemonize  yes
pidfile    /var/run/redis_7001.pid
dir     /var/redis-cluster/data/7001/
logfile /var/redis-cluster/log/7001/7001.log
bind 192.168.1.140  127.0.0.1
appendonly yes
  • 创建7002的配置文件
代码语言:javascript
复制
cp /etc/redis-cluster/7001.conf /etc/redis-cluster/7002.conf
// 将/etc/redis-cluster/7002.conf中的7001全部替换成7002
sed -i "s/7001/7002/g" /etc/redis-cluster/7002.conf
// 确认一下配置
vim /etc/redis-cluster/7002.conf
  • 创建可redis启动文件
代码语言:javascript
复制
cp /usr/local/redis-4.0.1/utils/redis_init_script /etc/init.d/redis_7001

// 修改配置文件
vim  /etc/init.d/redis_7001

// 将端口修改为7001
REDISPORT=7001

// 在顶部添加以下注释
# chkconfig:   2345 90 10
#
# description:  Redis  Start and Stop

// 修改配置文件的路径
CONF="/etc/redis-cluster/${REDISPORT}.conf"
  • 准备7002的启动文件
代码语言:javascript
复制
cp redis_7001 redis_7002
sed -i "s/7001/7002/g" redis_7002
  • 启动7001、7002
代码语言:javascript
复制
// 启动redis
cd /etc/init.d/
./redis_7001 start
./redis_7002 start
其他机器配置
  • 分别在cache0001和cache0002上面创建目录
代码语言:javascript
复制

// cache0001
mkdir -p /etc/redis-cluster
mkdir -p /var/redis-cluster/data/7003
mkdir -p /var/redis-cluster/log/7003
mkdir -p /var/redis-cluster/data/7004
mkdir -p /var/redis-cluster/log/7004

// cache0002
mkdir -p /etc/redis-cluster
mkdir -p /var/redis-cluster/data/7005
mkdir -p /var/redis-cluster/log/7005
mkdir -p /var/redis-cluster/data/7006
mkdir -p /var/redis-cluster/log/7006
  • 在cache0000机器上往其他两台机器拷贝配置文件
代码语言:javascript
复制

// 在cache0000上执行
// 拷贝到cache0001
scp -r /etc/redis-cluster/7001.conf root@cache0001:/etc/redis-cluster/
scp -r /etc/init.d/redis_7001 root@cache0001:/etc/init.d/

// 拷贝到cache0002
scp -r /etc/redis-cluster/7001.conf root@cache0002:/etc/redis-cluster/
scp -r /etc/init.d/redis_7001 root@cache0002:/etc/init.d/
  • cache0001配置
代码语言:javascript
复制

cp /etc/redis-cluster/7001.conf /etc/redis-cluster/7003.conf
cp /etc/redis-cluster/7001.conf /etc/redis-cluster/7004.conf
sed -i "s/7001/7003/g" /etc/redis-cluster/7003.conf
sed -i "s/7001/7004/g" /etc/redis-cluster/7004.conf
sed -i "s/192.168.1.140/192.168.1.141/g" /etc/redis-cluster/7003.conf
sed -i "s/192.168.1.140/192.168.1.141/g" /etc/redis-cluster/7004.conf
rm -rf /etc/redis-cluster/7001.conf

cp /etc/init.d/redis_7001 /etc/init.d/redis_7003
cp /etc/init.d/redis_7001 /etc/init.d/redis_7004
sed -i "s/7001/7003/g" /etc/init.d/redis_7003
sed -i "s/7001/7004/g" /etc/init.d/redis_7004
rm -rf /etc/init.d/redis_7001

// 启动redis
cd /etc/init.d/
./redis_7003 start
./redis_7004 start
图片
图片
  • cache0002配置
代码语言:javascript
复制

cp /etc/redis-cluster/7001.conf /etc/redis-cluster/7005.conf
cp /etc/redis-cluster/7001.conf /etc/redis-cluster/7006.conf
sed -i "s/7001/7005/g" /etc/redis-cluster/7005.conf
sed -i "s/7001/7006/g" /etc/redis-cluster/7006.conf
sed -i "s/192.168.1.140/192.168.1.142/g" /etc/redis-cluster/7005.conf
sed -i "s/192.168.1.140/192.168.1.142/g" /etc/redis-cluster/7006.conf
rm -rf /etc/redis-cluster/7001.conf

cp /etc/init.d/redis_7001 /etc/init.d/redis_7005
cp /etc/init.d/redis_7001 /etc/init.d/redis_7006
sed -i "s/7001/7005/g" /etc/init.d/redis_7005
sed -i "s/7001/7006/g" /etc/init.d/redis_7006
rm -rf /etc/init.d/redis_7001

// 启动redis
cd /etc/init.d/
./redis_7005 start
./redis_7006 start

5.0之前的构建集群

redis的集群工具会将主从节点自动分散在不同的节点,来实现节点的高可用

代码语言:javascript
复制
// 为了方便后续的操作,这里都执行一下一下指令
cp /usr/local/redis-4.0.1/src/redis-trib.rb /usr/local/bin

redis-trib.rb create --replicas 1 192.168.1.140:7001 192.168.1.140:7002 192.168.1.141:7003 192.168.1.141:7004 192.168.1.142:7005 192.168.1.142:7006
  • 集群的操作指令
代码语言:javascript
复制

CLUSTER INFO 打印集群的信息
CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。

//节点(node)
CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。
CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。
CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。

//槽(slot)
CLUSTER ADDSLOTS <slot> [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。
CLUSTER DELSLOTS <slot> [slot ...] 移除一个或多个槽对当前节点的指派。
CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
CLUSTER SETSLOT <slot> NODE <node_id> 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
CLUSTER SETSLOT <slot> MIGRATING <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。
CLUSTER SETSLOT <slot> IMPORTING <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。
CLUSTER SETSLOT <slot> STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。

//键 (key)
CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。
CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。
CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键。

图片
图片
集群添加从节点
  • 在cache0003新添加一个7007
代码语言:javascript
复制

mkdir -p /etc/redis-cluster
mkdir -p /var/redis-cluster/data/7007
mkdir -p /var/redis-cluster/log/7007

// 在chche0000上拷贝相关的配置
scp -r /etc/redis-cluster/7001.conf root@cache0003:/etc/redis-cluster/
scp -r /etc/init.d/redis_7001 root@cache0003:/etc/init.d/

cp /etc/redis-cluster/7001.conf /etc/redis-cluster/7007.conf
sed -i "s/7001/7007/g" /etc/redis-cluster/7007.conf
sed -i "s/192.168.1.140/192.168.1.143/g" /etc/redis-cluster/7007.conf
cp /etc/init.d/redis_7001 /etc/init.d/redis_7007
sed -i "s/7001/7007/g" /etc/init.d/redis_7007

// 删除无关配置
rm -rf /etc/init.d/redis_7001
rm -rf /etc/redis-cluster/7001.conf

cd /etc/init.d/
./redis_7007 start

  • 将节点添加到集群
代码语言:javascript
复制
CLUSTER MEET 192.168.1.143 7007
  • 集群平衡报错

核实貌似是redis的bug: https://github.com/antirez/redis/issues/5029

5.0之后的集群管理
  • 集群管理API
代码语言:javascript
复制

redis-cli --cluster help

[root@cache1000 redis-cluster]# redis-cli --cluster help
Cluster Manager Commands:
create         host1:port1 ... hostN:portN
               --cluster-replicas <arg>
check          host:port
               --cluster-search-multiple-owners
info           host:port
fix            host:port
               --cluster-search-multiple-owners
reshard        host:port
               --cluster-from <arg>
               --cluster-to <arg>
               --cluster-slots <arg>
               --cluster-yes
               --cluster-timeout <arg>
               --cluster-pipeline <arg>
               --cluster-replace
rebalance      host:port
               --cluster-weight <node1=w1...nodeN=wN>
               --cluster-use-empty-masters
               --cluster-timeout <arg>
               --cluster-simulate
               --cluster-pipeline <arg>
               --cluster-threshold <arg>
               --cluster-replace
add-node       new_host:new_port existing_host:existing_port
               --cluster-slave
               --cluster-master-id <arg>
del-node       host:port node_id
call           host:port command arg arg .. arg
set-timeout    host:port milliseconds
import         host:port
               --cluster-from <arg>
               --cluster-copy
               --cluster-replace
help

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
  • 构建集群
代码语言:javascript
复制
redis-cli --cluster create 192.168.1.160:7001 192.168.1.160:7002 192.168.1.161:7003 192.168.1.161:7004 192.168.1.162:7005 192.168.1.162:7006 --cluster-replicas 1
图片
图片
图片
图片
  • 简单操作测试
代码语言:javascript
复制

[root@cache1000 init.d]# redis-cli -h 192.168.1.160 -p 7001  // 没有-c参数,如果操作的槽位不在当前节点,就会提示MOVE到对应的节点
192.168.1.160:7001> get a
(error) MOVED 15495 192.168.1.162:7005
192.168.1.160:7001> get b
[root@cache1000 init.d]# redis-cli -h 192.168.1.160 -p 7001 -c   // 加了-c参数之后,会自动重定向
192.168.1.160:7001> get a
-> Redirected to slot [15495] located at 192.168.1.162:7005
(nil)
192.168.1.162:7005> set  a 1
OK
192.168.1.162:7005> get a
"1"
192.168.1.162:7005> get b
-> Redirected to slot [3300] located at 192.168.1.161:7004
"2"
192.168.1.161:7004>
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一行Java 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 准备工作
  • 基础Redis安装
  • 集群环境配置
    • 单机配置
      • 其他机器配置
      • 5.0之前的构建集群
        • 集群添加从节点
        • 5.0之后的集群管理
        相关产品与服务
        云数据库 Redis
        腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档