准备工作
5.0之前的版本的集群管理是通过redis-trib.rb,需要依赖ruby;4.0的版本下面测试出了集群管理的bug,经过排查,也得到了官方的证实;如果新搭建的集群,建议使用5.0 的版本;5.0之后的版本,集群管理工具整合到redis-cli,就不需要依赖其他的资源;
- 安装ruby(5.0 的版本不用安装)
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;然后其他机器就配置就好了
- 目录创建
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配置文件
cp /usr/local/redis-4.0.1/redis.conf /etc/redis-cluster/7001.conf
- 配置7001配置文件
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的配置文件
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启动文件
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的启动文件
cp redis_7001 redis_7002
sed -i "s/7001/7002/g" redis_7002
- 启动7001、7002
// 启动redis
cd /etc/init.d/
./redis_7001 start
./redis_7002 start
其他机器配置
- 分别在cache0001和cache0002上面创建目录
// 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机器上往其他两台机器拷贝配置文件
// 在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配置
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配置
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
- 集群的操作指令
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
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
- 将节点添加到集群
CLUSTER MEET 192.168.1.143 7007
- 集群平衡报错
核实貌似是redis的bug: https://github.com/antirez/redis/issues/5029
5.0之后的集群管理
- 集群管理API
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.
- 构建集群
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
- 简单操作测试
[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>