目录
部署Redis高可用集群
Redis集群环境
拓扑结构
IP地址
环境准备
工作原理
创建Redis集群
部署管理主机
redis-trib.rb脚本
redis服务器开启集群功能
管理主机创建集群
查看集群信息
错误排查
访问集群
管理集群(测试高可用)
测试集群功能
故障切换测试
添加服务器
添加master服务器
添加slave服务器
移除集群中的服务器
移除slave服务器
移除master服务器
将移除的redis服务器添加到集群
解散redis集群
把集群中的机器恢复为独立的redis服务器
Redis服务器:6台
管理主机:1台
客户端:1台
redis服务器IP地址及端口规划
主机名 |
IP地址 |
端口号 |
client50 |
192.168.159.50 |
无 |
redis51 |
192.168.159.51 |
6351 |
redis52 |
192.168.159.52 |
6352 |
redis53 |
192.168.159.53 |
6353 |
redis54 |
192.168.159.54 |
6354 |
redis55 |
192.168.159.55 |
6355 |
redis56 |
192.168.159.56 |
6356 |
host57 |
192.168.159.57 |
无 |
在所有集群主机(主机51~56)上运行redis服务
1、安装redis服务
Redis-4.0.11下载地址:http://www.redis.cn/download.html
以主机51为例,主机51~56都要进行以下操作
将下载好的软件包上传到51~56操作系统中:
[root@redis51 ~]# ls /root
[root@redis51 ~]# rpm -q gcc //源码安装需要使用编译软件gcc
gcc-4.8.5-44.el7.x86_64
[root@redis51 ~]# yum -y install gcc //若没有安装gcc,请安装gcc
[root@redis51 ~]# tar -zxvf redis-4.0.11.tar.gz
[root@redis51 ~]# cd redis-4.0.11
[root@redis51 redis-4.0.11]# make
[root@redis51 redis-4.0.11]# make install
2、检查redis服务
[root@redis51 redis-4.0.11]# ./utils/install_server.sh //使用默认初始化配置,全部选项都按回车
[root@redis51 redis-4.0.11]# netstat -lntup | grep 6379 //查看服务是否运行
[root@redis51 ~]# /etc/init.d/redis_6379 stop //停止服务
修改配置文件
1、设置ip地址、端口:
[root@redis51 ~]# vim /etc/redis/6379.conf
70 bind 192.168.159.51 //修改配置文件第70行,修改允许连接redis服务的ip地址
93 port 6351 // 修改配置文件第93行,修改redis服务的端口号
[root@redis51 ~]# /etc/init.d/redis_6379 start //重启服务,使修改的配置生效
[root@redis51 ~]# netstat -lntup | grep 6351 //查看监听端口号和允许连接的ip地址
tcp 0 0 192.168.159.51:6351 0.0.0.0:* LISTEN 23482/redis-server
2、验证6台主机的配置
主机192.168.159.51:
[root@redis51 ~]# netstat -lntup | grep 6351
tcp 0 0 192.168.159.51:6351 0.0.0.0:* LISTEN 27860/redis-server
主机192.168.159.52:
[root@redis52 ~]# netstat -lntup | grep 6352
tcp 0 0 192.168.159.52:6352 0.0.0.0:* LISTEN 16420/redis-server
主机192.168.159.53:
[root@redis53 ~]# netstat -lntup | grep 6353
tcp 0 0 192.168.159.53:6353 0.0.0.0:* LISTEN 80097/redis-server
主机192.168.159.54:
[root@redis54 ~]# netstat -lntup | grep 6354
tcp 0 0 192.168.159.54:6354 0.0.0.0:* LISTEN 14205/redis-server
主机192.168.159.55:
[root@redis55 ~]# netstat -lntup | grep 6355
tcp 0 0 192.168.159.55:6355 0.0.0.0:* LISTEN 14126/redis-server
主机192.168.159.56:
[root@redis56 ~]# netstat -lntup | grep 6356
tcp 0 0 192.168.159.56:6356 0.0.0.0:* LISTEN 82620/redis-server
环境确认
主机50~57的防火墙和SELinux处于关闭状态
]# systemctl stop firewalld //如果防火墙没关执行此操作,关闭防火墙
]# setenforce 0 //如果SELinux没关执行此操作,关闭SELinux
redis服务器51~56内不能有数据
> flushall //如果有数据执行此操作,清除所有数据
> save //清除完数据,保存
工作原理
—— Redis集群是一个分布式存储高可用集群。
—— 分布式:数据存储在不同地点的服务器上,即数据存储在不同地点的不同服务器上。
—— 存取规则:通过获取存储数据的变量名,用算法CRC16做hash计算,计算结果会得到一个数字,将数字与16384进行求模运算,根据余数决定将变量与值,存放在集群的哪台服务器上。当我们创建集群的时候,会分配给每个主机占用编号的范围,这个范围叫哈希槽范围,判断取余与每个主机的哈希槽范围(编号范围)作对比,最终存放在余数所在哈希槽范围内的服务器上。
也可部署在任意一台redis服务器上
—— 在生产环境中,我们也可以将管理服务部署在某一台redis服务器上面。
优点:节省硬件资源,节约成本。
缺点:当该服务器宕机时,管理主机也就宕机了,导致集群瘫痪。
—— 部署ruby脚本运行环境
—— 创建管理集群脚本
1、部署ruby脚本运行环境
1)安装ruby脚本依赖包
[root@host57 ~]# yum -y install ruby
[root@host57 ~]# rpm -q ruby
ruby-2.0.0.648-36.el7.x86_64
2)安装第三方扩展程序
由于ruby脚本无法和redis通信,所以我们需要安装第三方扩展功能软件redis-3.2.1.gem来解决这个问题。
redis-3.2.1.gem下载地址:https://rubygems.org/gems/redis/versions/3.2.1
将软件redis-3.2.1.gem上传到主机192.168.159.57上:
[root@host57 ~]# ls
//如图所示,redis.3.2.1.gem软件包需要使用gem命令进行安装
[root@host57 ~]# which gem //查看系统是否有gem命令
/usr/bin/gem
[root@host57 ~]# rpm -qf /usr/bin/gem //查看提供gem命令的软件包
rubygems-2.0.14.1-36.el7.noarch //在安装ruby脚本依赖包时,已经自动安装这个依赖包了。如果没有gem命令,就使用yum安装这个软件。
[root@host57 ~]# gem install redis-3.2.1.gem //用命令gem来安装软件包redis.3.2.1.gem
//如图所示,安装成功。
2、创建管理集群脚本
1)在源码包redis-4.0.11.tar.gz中找到管理集群脚本
将源码包redis-4.0.11.tar.gz上传到主机192.168.159.57目录/root中
[root@host57 ~]# ls
[root@host57 ~]# tar -zxf redis-4.0.11.tar.gz
[root@host57 ~]# cd redis-4.0.11/
[root@host57 redis-4.0.11]# cd src/
[root@host57 src]# ls *.rb
redis-trib.rb
2)将脚本拷贝到系统命令所在的路径下
[root@host57 src]# echo $PATH //查看系统命令所在的路径下
/root/perl5/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin
[root@host57 src]# mkdir /root/bin //创建命令检索目录
[root@host57 src]# cp redis-trib.rb /root/bin //创建管理集群脚本
[root@host57 src]# ls /root/bin
redis-trib.rb
[root@host57 src]# ls -l /root/bin/ //查看是否有执行权限,脚本必须要有执行权限
total 68
-rwxr-xr-x. 1 root root 65991 Jan 18 03:08 redis-trib.rb
[root@host57 src]# redis-trib.rb help //查看命令帮助,此时能输出帮助信息,说明管理集群脚本创建成功
注意:如果在执行 redis-trib.rb help 出现如下图所示错误,说明没有安装第三方插件redis-3.2.1.gem。
用法格式
—— ]# redis-trib
命令 |
描述 |
create |
创建集群 |
check |
检查集群 |
info |
查看集群信息 |
reshard |
重新分片 |
del-node |
删除主机 |
add-node --slave |
添加slave主机 |
add-node |
添加master主机 |
rebalance |
平均分配hash slots |
配置6台redis服务器
—— 启用集群功能
—— 查看服务信息
主机redis51~56都要进行下面三步操作,以下以51为例进行示范:
1、查看是否开启集群功能
[root@redis51 ~]# redis-cli -h 192.168.159.51 -p 6351
192.168.159.51:6351> cluster info //查看本机在集群里的信息
ERR This instance has cluster support disabled //报错显示禁用集群支持,因为主机redis51没有开启集群功能
2、6台redis服务器启用集群功能
1)修改配置文件启用集群功能
[root@redis51 ~]# vim /etc/redis/6379.conf
815 cluster-enabled yes //配置文件第815行去掉注释。启用集群功能
823 cluster-config-file nodes-6379.conf //配置文件第823行去掉注释。定义存储集群信息的文件,使用默认文件,集群创建完毕后,文件 nodes-6379.conf 会自动创建在数据库目录下。
829 cluster-node-timeout 5000 //配置文件第829行去掉注释,将超时时间修改为5000毫秒。连接超时时间(单位毫秒),即redis服务器51如果在5000毫秒之内没有连接上另外5台redis服务器,说明对方的机器宕机了。
//如图所示,红圈圈起来的地方是配置文件中需要修改的地方。
[root@redis51 ~]# redis-cli -h 192.168.159.51 -p 6351 shutdown //关闭redis服务
[root@redis51 ~]# /etc/init.d/redis_6379 start //重启redis服务,使修改的配置文件生效
Starting Redis server...
[root@redis51 ~]# netstat -lntup | grep redis-server //查看服务是否运行
//如图所示,端口6351是redis服务的端口;端口16351是集群通信端口,集群通信端口是redis服务端口+10000。
3、查看本机服务的集群信息
[root@redis51 ~]# redis-cli -h 192.168.159.51 -p 6351
192.168.159.51:6351> cluster info //查看本机在集群里的信息
//如图所示,cluster_state:fail 集群的状态是失败的,因为还没有创建集群,所以当前的机器还没有在集群中。
4、验证6台主机的配置
主机192.168.159.51:
[root@redis51 ~]# netstat -lntup | grep redis
主机192.168.159.52:
[root@redis51 ~]# netstat -lntup | grep redis
主机192.168.159.53:
[root@redis51 ~]# netstat -lntup | grep redis
主机192.168.159.54:
[root@redis51 ~]# netstat -lntup | grep redis
主机192.168.159.55:
[root@redis51 ~]# netstat -lntup | grep redis
主机192.168.159.56:
[root@redis51 ~]# netstat -lntup | grep redis
管理主机host57创建集群
—— 创建集群
—— 查看集群信息
—— 检测集群
1、在管理主机host57上创建集群
[root@host57 ~]# redis-trib.rb create --replicas 1 \
192.168.159.51:6351 192.168.159.52:6352 \
192.168.159.53:6353 192.168.159.54:6354 \
192.168.159.55:6355 192.168.159.56:6356
//选项 --replicas 1 是定义每台主库的从库个数,即每台主库分配1台从库。--replicas 2 就是每台主库分配2台从库,即一共就需要9台服务器,以此类推。
//如图所示,输出信息显示正在创建集群,正在为6个节点分配哈希槽。
选出了三个主服务器分别是:192.168.159.51:6351、192.168.159.52:6352、192.168.159.53:6353
给主服务器192.168.159.51:6351添加从服务器192.168.159.55:6355
给主服务器192.168.159.51:6352添加从服务器192.168.159.55:6356
给主服务器192.168.159.51:6353添加从服务器192.168.159.55:6354
M : 是指主服务器;S : 是指从服务器。
主服务器192.168.159.51:6351的哈希槽范围是0-5460(共5461个槽)
主服务器192.168.159.52:6352的哈希槽范围是5461-10922(共5461个槽)
主服务器192.168.159.53:6353的哈希槽范围是10923-16383(共5461个槽)
由于从服务器是同步主服务器的数据,所以从服务器不需要分配哈希槽。
//如图所示,输入yes就按照系统分配的创建集群。红圈圈起来的地方的意思是所有的槽都已经分配完了;一共16384个槽都已全部分配。显示的这两行都是OK说明集群创建成功。
在管理主机host57上查看集群信息
—— 命令格式:redis-trib.rb info redis服务器IP:对应端口号
[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351 //输入6台redis服务器中任意一台的IP和端口号,即可获得相同的输出信息(进群信息)
//如图所示,主库IP地址:端口号(主库ID号) -> 里面有0个变量(即无数据) | 分配了5461个槽 | 分配了一个从库
三个主库里面有0个变量(即无数据)
在管理主机host57上检测集群
[root@host57 ~]# redis-trib.rb check 192.168.159.51:6351 //检查集群主机角色
//如图所示,显示[OK]表示检测没有问题。
主库:该库的ID号 该库的IP地址:端口号 分配的哈希槽范围:0-5460(共5461个槽)主服务器
从库:该库的ID号 该库的IP地址:端口号 没有分配哈希槽(0个槽) 从服务器 同步数据 主库的ID号
在每一台redis服务器本机查看集群信息
—— 以下使用主机51和52为示例
主机192.168159.51:
[root@redis51 ~]# redis-cli -h 192.168.159.51 -p 6351
192.168.159.51:6351> cluster info //查看你集群信息
192.168.159.51:6351> cluster nodes //查看集群节点信息
//如图所示,可以看见redis服务器对应的ip地址和端口号,以及该redis服务器是主服务器还是从服务器,myself是指当前查看信息的服务器
主机192.168.159.52:
[root@redis52 ~]# redis-cli -h 192.168.159.52 -p 6352
192.168.159.52:6352> cluster info //查看你集群信息
192.168.159.52:6352> cluster nodes //查看集群节点信息
如果出现以下错误,可以参考下面的解决思路,如果没有出现错误,可忽略此步骤。
创建集群时可能出现的错误原因
—— 数据库服务器的数据没有清空
—— redis服务器没有启用集群功能
出现以上两种错误,需要删除配置文件/var/lib/redis/6379/node-6379.conf 并重启服务(每一台机器都要进行此操作),然后再进行集群的创建。因为无论集群创建成功还是失败,集群的信息都会存储在文件 /var/lib/redis/6379/node-6379.conf 中。如果修改完后,没有重启服务就会出现错误,提示集群已经创建
解决思路
—— 主机51~56都要进行以下步骤
1、rm -rf /var/lib/redis/6379/nodes-6379.conf
2、重启动 redis 服务
3、在管理主机上再次执行创建集群命令
在客户端可以连接集群中任意一台redis服务器
命令:]# redis-cli -c -h ip地址 -p 端口号
选项 -c 集群模式。如果不加选项 -c ,将不会以集群的工作方式存储数据。
1、在主机192.168.159.50访问集群,并进行存储
1)安装redis服务,提供redis命令
[root@client50 ~]# redis-cli -c -h 192.168.159.51 -p 6351
bash: redis-cli: command not found...
[root@client50 ~]# ls //上传redis软件包
[root@client50 ~]# tar -zxf redis-4.0.11.tar.gz
[root@client50 ~]# cd redis-4.0.11/
[root@client50 redis-4.0.11]# make
[root@client50 redis-4.0.11]# make install
[root@client50 redis-4.0.11]# ./utils/install_server.sh //使用默认初始化配置,全部选项都按回车
[root@client50 redis-4.0.11]# /etc/init.d/redis_6379 stop
Stopping ...
Redis stopped
2)连接redis服务器进行数据存储
[root@client50 ~]# redis-cli -c -h 192.168.159.51 -p 6351 //选项 -c 以集群的方式访问数据库服务器51
192.168.159.51:6351> keys * //此时的数据库服务器是没有数据的
(empty list or set)
192.168.159.51:6351> set name bob //插入数据
-> Redirected to slot [5798] located at 192.168.159.52:6352 //因为值5798在主机52的槽的范围内,所以数据存储到了主机192.168.159.52上
OK
192.168.159.52:6352> keys *
1) "name"
2、检查数据是否存入
主机192.168.159.51:
[root@redis51 ~]# redis-cli -h 192.168.159.51 -p 6351
192.168.159.51:6351> keys * //发现没有数据,所以数据没有存储到主机51上
(empty list or set)
主机192.168.159.52:
[root@redis52 ~]# redis-cli -h 192.168.159.52 -p 6352
192.168.159.52:6352> keys * //数据存入到数据库服务器52上
1) "name"
3、查看主从同步配置
1)在数据库服务器52上查看主从信息
主机192.168.159.52:
192.168.159.52:6352> cluster nodes
//如图所示,本主机192.168.159.52是主服务器,可以通过主机52的id号,看到主机56是主机52的从服务器
2)在从服务器上查看同步的数据
主机192168.159.56:
[root@redis56 ~]# redis-cli -h 192.168.159.56 -p 6356
192.168.159.56:6356> keys * //看见从服务器的数据已经同步
1) "name"
4、再次存入数据并进行查看
1)客户端连接主机51进行数据存入
192.168.159.51:6351> set age 19
OK
192.168.159.51:6351> keys *
1) "age"
2)在主机51上查看数据
[root@redis51 ~]# redis-cli -h 192.168.159.51 -p 6351
192.168.159.51:6351> keys *
1) "age"
3)查看主从信息
192.168.159.51:6351> cluster nodes
//如图所示,主机51是主服务器,主机55是主机51的从服务器
4)在从服务器上查看数据是否同步
主机192.168.159.55:
[root@redis55 ~]# redis-cli -h 192.168.159.55 -p 6355
192.168.159.55:6355> keys * //从服务器数据同步成功
1) "age"
综上所示:当客户端连接到集群后存入数据,数据存储到哪个数据库服务器上,取决于经过算法发出的槽值,在哪个主库的槽范围内。
停止 master 主机的 redis 服务
—— master宕机后对应的slave自动被选举为master
—— 原master启动后,会自动配置为当前master的slave
检测集群
—— 在管理主机查看信息
—— ]# redis-trib.rb check 192.168.159.51:6351
—— ]# redis-trib.rb info 192.168.159.51:6351
示例
1、在管理主机57上查看集群信息
[root@host57 ~]# redis-trib.rb check 192.168.159.51:6351
//如图所示,显示ok说明集群正常
[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351
//如图所示,我们可以看出主服务器为51、52和53
2、停止主服务器51的redis服务,模拟主服务器宕机
主机192.168.159.51:
[root@redis51 ~]# redis-cli -h 192.168.159.51 -p 6351 shutdown
[root@redis51 ~]# netstat -lntup | grep redis-server //没有输出结果表示服务已经停止
之前配置文件中我们设置了超时时间为5000毫秒,5000毫秒后主机51还没有恢复正常,那么主机51的从服务器55就会变为主服务器。
3、查看主从信息
[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351 //主机51的redis服务关闭后,就不能通过主机51的IP查询主从信息了
[ERR] Sorry, can't connect to node 192.168.159.51:6351
[root@host57 ~]# redis-trib.rb info 192.168.159.52:6352 //查看主从信息
//如图所示,主机52、53和55为主服务器,因为主机55是主机51的从服务器,所以当主机51宕机时,从服务器55自动变为主服务器。由于是一主一从结构,所以此时主服务器55没有从服务器了。
4、模拟主机51宕机期间存入数据
[root@client50 ~]# redis-cli -c -h 192.168.159.52 -p 6352
192.168.159.52:6352> set name bob //这条数据存入到了主机52上,数据存入到哪个服务器是根据算法决定的,存入的数据不一定存入到主机55
OK
192.168.159.52:6352> set num 16
-> Redirected to slot [2765] located at 192.168.159.55:6355 //这条数据存入到主机55
OK
192.168.159.55:6355> keys * //查看主机55的数据
1) "num"
2) "age"
5、恢复服务器51
主机192.168.159.51:
[root@redis51 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@redis51 ~]# netstat -lntup | grep redis-server
6、恢复后查看集群信息
主机192.168.159.57:
[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351
//如图所示,主机55本来没有从服务器,恢复主机51后,主机51自动变为主机55的从服务器。
[root@host57 ~]# redis-trib.rb check 192.168.159.51:6351
//如图所示,主机51是主服务器55的从服务器。
7、查看恢复后数据是否自动同步
主机192.168.159.50:
使用客户端访问集群
[root@client50 ~]# redis-cli -c -h 192.168.159.51 -p 6351
192.168.159.51:6351> keys * //此时主机51 为从服务器,且已经自动同步了宕机期间的数据
1) "num"
2) "age"
部署一台新的redis服务器
—— 运行服务并启用集群配置
—— 目的:为了扩大存储空间
减轻已有主服务器的访问压力
添加master主机步骤
—— 添加master主机
—— 分配hash槽(slots)
添加master主机
—— 添加时不指定主机角色,默认新主机被选为master
—— 添加的master主机,需手动分配hash槽
—— ]# redis-trib.rb add-node 192.168.159.58:6358 192.168.159.51:6351
]# redis-trib.rb add-node 要添加新机器的IP和端口 集群中任意一台机器的IP和端口
输出结果显示 [OK] New node added correctly 表示添加成功
重新分片
—— 移除hash槽个数
—— 接收hash槽主机ID
—— 移出hash槽主机ID
—— ]# redis-trib.rb reshard 192.168.159.51:6351 //重新分片
示例
1、添加一台新的redis服务器58
[root@redis58 ~]# ip a | grep ens33
[root@redis58 ~]# systemctl stop firewalld
[root@redis58 ~]# setenforce 0
[root@redis58 ~]# getenforce
Permissive
2、运行redis服务,并启动集群功能
1)安装redis服务
将下载好的软件包上传到主机58上:
[root@redis58 ~]# tar -zxvf redis-4.0.11.tar.gz
[root@redis58 ~]# cd redis-4.0.11
[root@redis58 redis-4.0.11]# make
[root@redis58 redis-4.0.11]# make install
[root@redis58 redis-4.0.11]# ./utils/install_server.sh //使用默认初始化配置,全部选项都按回车
[root@redis58 redis-4.0.11]# netstat -lntup | grep 6379 //查看服务是否运行
[root@redis58 ~]# /etc/init.d/redis_6379 stop //停止服务
2)设置ip地址、端口:
[root@redis58 ~]# vim /etc/redis/6379.conf
70 bind 192.168.159.58 //修改配置文件第70行,修改允许连接redis服务的ip地址
93 port 6358 // 修改配置文件第93行,修改redis服务的端口号
[root@redis58 ~]# /etc/init.d/redis_6379 start //重启服务,使修改的配置生效
[root@redis58 ~]# netstat -lntup | grep 6358 //查看监听端口号和允许连接的ip地址
tcp 0 0 192.168.159.58:6358 0.0.0.0:* LISTEN 57591/redis-server
3)启用主机reds58的集群功能
①修改配置文件启用集群功能
[root@redis58 ~]# vim /etc/redis/6379.conf
815 cluster-enabled yes //配置文件第815行去掉注释。启用集群功能
823 cluster-config-file nodes-6379.conf //配置文件第823行去掉注释。定义存储集群信息的文件,使用默认文件,集群创建完毕后,文件 nodes-6379.conf 会自动创建在数据库目录下。
829 cluster-node-timeout 5000 //配置文件第829行去掉注释,将超时时间修改为5000毫秒。连接超时时间(单位毫秒),即redis服务器51如果在5000毫秒之内没有连接上另外5台redis服务器,说明对方的机器宕机了。
②重启服务使配置生效
[root@redis58 ~]# redis-cli -h 192.168.159.58 -p 6358 shutdown //关闭redis服务
[root@redis58 ~]# /etc/init.d/redis_6379 start //重启redis服务,使修改的配置文件生效
Starting Redis server...
[root@redis58 ~]# netstat -lntup | grep redis-server //查看服务是否运行
③查看本机服务的集群信息
[root@redis58 ~]# redis-cli -h 192.168.159.58 -p 6358
192.168.159.51:6358> cluster info //查看本机在集群里的信息
//如图所示,cluster_state:fail 集群的状态是失败的,因为当前的机器还没有在集群中。
3、在管理主机57,向集群添加master角色的redis服务器
[root@host57 ~]# redis-trib.rb add-node 192.168.159.58:6358 192.168.159.51:6351
[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351 //查看集群信息
//如图所示,redis服务器58,已经成功添加到集群中。我们可以看见redis服务器58上有0个hash槽,说明数据永远不会存储到redis服务器58上,所以我们需要重新分配hash槽。
4、给新添加的master角色的redis服务器分配hash槽
[root@host57 ~]# redis-trib.rb reshard 192.168.159.51:6351
//如图所示,How many slots do you want to move (from 1 to 16384)? 4096
意思是你想要移除多少个槽,移除4096个槽。因为一共16384个槽,共四个主服务器,所以每个服务器应该分配4096个槽。
What is the receiving node ID? b822e189c8cfdf4b78aa93b203916e3f14e6ce30
意思是接收4096个槽的主机ID是多少,b822e189c8cf...是主机192.168.159.58的ID
Source node #1:all
意思是从哪移出槽,all就是从当前所有主机上总共移出4096个槽
Do you want to proceed with the proposed reshard plan (yes/no)? yes
意思是你同意这样的设置么,yes就是同意,然后开始分配槽。
5、查看集群信息
[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351
//此时主机192.168.159.58有4096个槽,每个主服务器上都有4096个槽。
6、访问新添加的master角色的redis服务器存取数据
主机192.168.159.50:
[root@client50 ~]# redis-cli -c -h 192.168.159.58 -p 6358
192.168.159.58:6358> keys *
1) "age"
2) "name"
192.168.159.58:6358> set v1 1
OK
192.168.159.58:6358> set v2 2
-> Redirected to slot [13550] located at 192.168.159.53:6353
OK
192.168.159.53:6353> set v3 3
-> Redirected to slot [9423] located at 192.168.159.52:6352
OK
192.168.159.52:6352> set v4 4
-> Redirected to slot [5160] located at 192.168.159.55:6355
OK
部署一台新的redis服务器
—— 运行服务并启用集群配置
添加slave主机
—— ]# redis-trib add-node --slave [ --master-id id值 ] IP地址:端口 192.168.159.51:6351
如果不指定主节点的 id 的话,会把新节点随机添加为从节点最少的主库
示例
1、添加一台新的redis服务器59
[root@redis59 ~]# ip a | grep ens33
[root@redis59 ~]# systemctl stop firewalld
[root@redis59 ~]# setenforce 0
[root@redis59 ~]# getenforce
Permissive
2、运行redis服务,并启动集群功能
1)安装redis服务
将下载好的软件包上传到主机59上:
[root@redis59 ~]# tar -zxvf redis-4.0.11.tar.gz
[root@redis59 ~]# cd redis-4.0.11
[root@redis59 redis-4.0.11]# make
[root@redis59 redis-4.0.11]# make install
[root@redis59 redis-4.0.11]# ./utils/install_server.sh //使用默认初始化配置,全部选项都按回车
[root@redis59 redis-4.0.11]# netstat -lntup | grep 6379 //查看服务是否运行
[root@redis59 ~]# /etc/init.d/redis_6379 stop //停止服务
2)设置ip地址、端口:
[root@redis59 ~]# vim /etc/redis/6379.conf
70 bind 192.168.159.59 //修改配置文件第70行,修改允许连接redis服务的ip地址
93 port 6359 // 修改配置文件第93行,修改redis服务的端口号
[root@redis59 ~]# /etc/init.d/redis_6379 start //重启服务,使修改的配置生效
[root@redis59 ~]# netstat -lntup | grep 6359 //查看监听端口号和允许连接的ip地址
tcp 0 0 192.168.159.59:6359 0.0.0.0:* LISTEN 7144/redis-server 1
3)启用主机reds59的集群功能
①修改配置文件启用集群功能
[root@redis59 ~]# vim /etc/redis/6379.conf
815 cluster-enabled yes //配置文件第815行去掉注释。启用集群功能
823 cluster-config-file nodes-6379.conf //配置文件第823行去掉注释。定义存储集群信息的文件,使用默认文件,集群创建完毕后,文件 nodes-6379.conf 会自动创建在数据库目录下。
829 cluster-node-timeout 5000 //配置文件第829行去掉注释,将超时时间修改为5000毫秒。连接超时时间(单位毫秒),即redis服务器51如果在5000毫秒之内没有连接上另外5台redis服务器,说明对方的机器宕机了。
②重启服务使配置生效
[root@redis59 ~]# redis-cli -h 192.168.159.59 -p 6359 shutdown //关闭redis服务
[root@redis59~]# /etc/init.d/redis_6379 start //重启redis服务,使修改的配置文件生效
Starting Redis server...
[root@redis59 ~]# netstat -lntup | grep redis-server //查看服务是否运行
③查看本机服务的集群信息
[root@redis59 ~]# redis-cli -h 192.168.159.59 -p 6359
192.168.159.51:6359> cluster info //查看本机在集群里的信息
//如图所示,cluster_state:fail 集群的状态是失败的,因为当前的机器还没有在集群中。
3、在管理主机57,向集群添加slave角色的redis服务器
[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351 //查看集群信息
//如图所示,注意此时主服务器192.168.159.58没有从服务器
[root@host57 ~]# redis-trib.rb add-node --slave 192.168.159.59:6359 192.168.159.51:6351 //向集群添加从服务器59。注意:如果不使用选项 --master-id 指定主节点的 id 的话,会把新节点随机添加为从节点最少的主库,由于主库58没有从服务器,所以此处可以不指定。如果主库从服务器的个数相等的话,就会将从服务器随机添加给任意一个主库。
//如图所示,[OK] New node added correctly. 表示添加成功
4、查看集群信息
[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351 //查看集群信息
//如图所示,此时主库192.168.159.58有一个从服务器。
[root@host57 ~]# redis-trib.rb check 192.168.159.51:6351 //检查集群状态
//如图所示,主机192.168.159.59是从服务器,从id为b822e189c8...的服务器复制数据,id为b822e189c8...的服务器是主服务器192.168.159.58,所以数据库192.168.159.59是主库192.168.159.58的从库。
5、访问新添加的slave角色的redis服务器存取数据
主机192.168.159.50:
[root@client50 ~]# redis-cli -c -h 192.168.159.59 -p 6359
192.168.159.59:6359> keys *
1) "v1"
2) "name"
3) "age"
192.168.159.59:6359> set v10 10
-> Redirected to slot [10847] located at 192.168.159.52:6352
OK
移除slave主机
—— 从服务器没有hash槽,直接移除即可
—— 移除时指定从服务器id值
—— ]# redis-trib.rb del-node 192.168.159.51:6351 949e7793cfed1c859ef91e141f9395c686552ec4
]# redis-trib.rb del-node 集群中任意主机IP和端口号 要删除从服务器的ID值
示例
1、在管理主机上删除从服务器59
主机192.168.159.57:
[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351
//如图所示,主库192.168.159.58有一个从服务器
[root@host57 ~]# redis-trib.rb del-node 192.168.159.51:6351 949e7793cfed1c859ef91e141f9395c686552ec4
//如图所示,移除时会自动停止该节点上的服务,即停止主机59上的redis服务
2、查看集群信息,并在主机59上查看服务是否停止
主机192.168.159.57:
[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351
//如图所示,此时主服务器192.168.159.58没有从服务器
主机192.168.159.59:
[root@redis59 ~]# netstat -lntup | grep redis-server //没有输出结果,表示redis服务器已经关闭
配置步骤
—— 释放占用的hash槽
—— 移除主机
—— ]# redis-trib.rb reshard 192.168.159.51:6351 //重新分片
—— ]# redis-trib.rb del-node 192.168.159.51:6351 master主机id值
释放占用的slots
—— 指定移出 slots 个数
—— 指定接收 slots 主机ID
—— 指定移出 slots 主机ID
示例
1、释放占用的hash槽
注意:之前占用hash槽存储的数据,会自动存储到迁移。即主库192.168.159.58占用的hash槽移给了目标服务器,先前根据移除的hash槽范围存储的数据,也会移动到对应的服务器上。
[root@host57 ~]# redis-trib.rb reshard 192.168.159.51:6351
//如图所示:How many slots do you want to move (from 1 to 16384)? 4096
意思是你想要移除多少个槽,移除4096个槽。因为主库192.168.159.58一共分配了4096个槽。
What is the receiving node ID? af9b6fc5f07683a044f21c700a9f92a8eeb2581b
意思是接收4096个槽的主机ID是多少,af9b6fc5f...是主机192.168.159.52的ID,意思是将移除的4096个槽分配给主机主机192.168.159.52。
Source node #1:b822e189c8cfdf4b78aa93b203916e3f14e6ce30
意思是从哪移出槽,b822e189c...是主机192.168.159.58的ID,即从主机192.168.159.58中移出。
Source node #2:done
意思是还要从哪个主机上移出槽,done是不在添加,即从主机192.168.159.58中移出4096个槽。
Do you want to proceed with the proposed reshard plan (yes/no)? yes
意思是你同意这样的设置么,yes就是同意,然后开始分配槽。
2、查看集群信息,查看数据是否迁移
[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351
[root@client50 ~]# redis-cli -c -h 192.168.159.52 -p 6352
192.168.159.52:6352> keys * //主机58的数据已经被迁移到主机52上了
1) "v3"
2) "age"
3) "number"
4) "v10"
5) "name"
6) "v1"
3、在管理主机57上删除主机
[root@host57 ~]# redis-trib.rb del-node 192.168.159.51:6351 b822e189c8cfdf4b78aa93b203916e3f14e6ce30 //从集群中删除主机58
//如图所示,删除成功,主机58上的redis服务已经关闭。
主机192.168.159.58:
[root@redis58 ~]# netstat -lntup | grep redis-server //没有输出结果,说明主机58上的redis服务已经关闭
4、查看集群信息
[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351 //查看集群信息
//如图所示,主机192.168.159.58已被删除。
5、平均分配槽的个数
[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351 //查看集群信息
//如图所示,我们可以看出主机192.168.159.52占的槽的个数最多,那么就会导致主机52被访问的次数要比别的数据库多,所以我们将所有槽平均分给三个主库。
[root@host57 ~]# redis-trib.rb rebalance 192.168.159.51:6351 //将槽的个数平均分配
[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351
//如图所示,各主库的槽的个数已被平均分配。
1、启动服务,重置集群信息
[root@redis59 ~]# netstat -lntup | grep redis-server
[root@redis59 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@redis59 ~]# netstat -lntup | grep redis-server
[root@redis59 ~]# redis-cli -h 192.168.159.59 -p 6359
192.168.159.59:6359> cluster info //此时查看集群信息,主机59还在集群中
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:8
cluster_size:3
cluster_current_epoch:15
cluster_my_epoch:14
cluster_stats_messages_ping_sent:265
cluster_stats_messages_sent:265
cluster_stats_messages_pong_received:52
cluster_stats_messages_received:52
192.168.159.59:6359> cluster reset //重置集群信息
OK
192.168.159.59:6359> flushall //确保主机59中没有数据
OK
192.168.159.59:6359> save //保存
OK
192.168.159.59:6359> exit
2、添加主机59,做主机52的从库
[root@host57 ~]# redis-trib.rb check 192.168.159.51:6351
//查看主库192.168.159.52的id值
[root@host57 ~]# redis-trib.rb add-node --slave --master-id af9b6fc5f07683a044f21c700a9f92a8eeb2581b 192.168.159.59:6359 192.168.159.51:6351 //add-node添加节点,--slave添加的节点为从库,--master-id指定主库的id(即指定添加的节点为主库52的从库),192.168.159.59:6359是添加节点IP地址,192.168.159.51:6351连接集群(可为集群中任意一台主机的ip和端口)。
[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351
//如图所示,主库52有两个从服务器。
除管理主机57外,所有主机(51-59)都要执行以下五个步骤
1、停止服务
[root@redis51 ~]# redis-cli -h 192.168.159.51 -p 6351 shutdown
2、删除数据库目录下的所有文件
[root@redis51 ~]# rm -rf /var/lib/redis/6379/*
3、禁用集群功能
[root@redis51 ~]# vim +815 /etc/redis/6379.conf
815 # cluster-enabled yes //注释第815行
823 # cluster-config-file nodes-6379.conf //注释第823行
829 # cluster-node-timeout 5000 //注释第829行
4、启动服务
[root@redis51 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
5、连接服务,查看集群信息
[root@redis51 ~]# redis-cli -h 192.168.159.51 -p 6351
192.168.159.51:6351> keys *
(empty list or set)
192.168.159.51:6351> cluster info
ERR This instance has cluster support disabled