| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 部署Redis高可用集群 -> 正文阅读 |
|
[大数据]部署Redis高可用集群 |
目录 部署Redis高可用集群? Redis集群环境拓扑结构
IP地址
环境准备
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
工作原理
—— 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.rb脚本
—— ]# redis-trib <command> <options> <arguments ...>
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 管理主机创建集群
—— 创建集群 —— 查看集群信息 —— 检测集群 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说明集群创建成功。 查看集群信息
—— 命令格式: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个变量(即无数据)
[root@host57 ~]# redis-trib.rb check 192.168.159.51:6351? ? ?? //检查集群主机角色 //如图所示,显示[OK]表示检测没有问题。 主库:该库的ID号 该库的IP地址:端口号 分配的哈希槽范围:0-5460(共5461个槽)主服务器 从库:该库的ID号 该库的IP地址:端口号 没有分配哈希槽(0个槽) 从服务器 同步数据 主库的ID号
—— 以下使用主机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、在管理主机上再次执行创建集群命令 访问集群
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宕机后对应的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" 添加服务器添加master服务器
—— 运行服务并启用集群配置 —— 目的:为了扩大存储空间 ? ? ? ? ? ? ? ? ?? 减轻已有主服务器的访问压力
—— 添加master主机 —— 分配hash槽(slots)
—— 添加时不指定主机角色,默认新主机被选为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 添加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服务器已经关闭 移除master服务器
—— 释放占用的hash槽 —— 移除主机 —— ]# redis-trib.rb reshard 192.168.159.51:6351 //重新分片 —— ]# redis-trib.rb del-node 192.168.159.51:6351 master主机id值
—— 指定移出 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 //如图所示,各主库的槽的个数已被平均分配。 将移除的redis服务器添加到集群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有两个从服务器。 解散redis集群把集群中的机器恢复为独立的redis服务器除管理主机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 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 11:41:21- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |