并发(四)之Redis:Redis集群(cluster)搭建
准备工作
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
-
ruby版本过低的问题并更新
ERROR: Error installing redis: redis requires Ruby version >= 2.3.0.
-
安装curl
yum -y install curl
-
安装rvm
gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3 curl -L get.rvm.io | bash -s stable
-
如果报以上错,按上面的指令执行
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 -
-
查询安装rvm
curl -L get.rvm.io | bash -s stable
-
刷新环境变量
source /etc/profile.d/rvm.sh
-
查找并安装更新的版本
rvm list known rvm install 2.3.3
-
使用并卸载老版本
// 使用新安装的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
-
重新安装
gem install redis
-
基础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的集群工具会将主从节点自动分散在不同的节点,来实现节点的高可用
// 为了方便后续的操作,这里都执行一下一下指令
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>