3. Redis集群部署
集群环境搭建
-
集群拓扑图

-
Redis服务器IP地址及端口规划
# 也可以不修改Redis服务的端口,这里为了区分 - client 192.168.4.10 无 - MGM(admin) 192.168.4.9 无 - redisA 192.168.4.11 6301 - redisB 192.168.4.12 6302 - redisC 192.168.4.13 6303 - redisD 192.168.4.14 6304 - redisE 192.168.4.15 6305 - redisF 192.168.4.16 6306 -
安装配置Redis服务(这里以一台为例)
[root@node1 ~]# rpm -q gcc || yum -y install gcc [root@node1 ~]# tar -xf redis-4.0.8.tar.gz [root@node1 ~]# cd redis-4.0.8/ [root@node1 redis-4.0.8]# make && make install [root@node1 redis-4.0.8]# ./utils/install_server.sh [root@node1 redis-4.0.8]# /etc/init.d/redis_6379 stop [root@node1 redis-4.0.8]# vim /etc/redis/6379.conf 70 bind 192.168.4.11 93 port 6301 [root@node1 redis-4.0.8]# /etc/init.d/redis_6379 start [root@node1 redis-4.0.8]# /etc/init.d/redis_6379 stop [root@node1 redis-4.0.8]# ss -ntulp | grep :6303 [root@node1 redis-4.0.8]# redis-cli -h 192.168.4.13 -p 6303 -
测试
# 有数据的Redis服务器,需要清空所有数据后才能配置集群(配置Redis集群时,服务器上不能有数据) - flushall - save [root@node1 ~]# redis-cli -h 192.168.4.11 -p 6301 # 防止意外,对每台服务器进行连接,进行检查 192.168.4.11:6301> keys * 192.168.4.11:6301> flushall 192.168.4.11:6301> save
创建Redis集群
-
在所有集群主机上运行Redis服务
# 略 -
在所有主机上启用集群功能
-
启用集群功能(这里以其中一台
node1为例,手动开启所有的节点的集群功能)[root@node1 ~]# redis-cli -h 192.168.4.11 -p 6301 shutdown [root@node1 ~]# vim /etc/redis/6379.conf # 分别在815 823 829行 cluster-enabled yes cluster-config-file nodes-6379.conf cluster-node-timeout 5000 [root@node1 ~]# /etc/init.d/redis_6379 start -
查看服务信息
# 查看端口信息,集群的通信端口号是Redis服务端口号+10000 [root@node1 ~]# ss -ntulp | grep redis-server tcp LISTEN 0 128 192.168.4.11:6301 *:* users:(("redis-server",pid=59905,fd=6)) tcp LISTEN 0 128 192.168.4.11:16301 *:* users:(("redis-server",pid=59905,fd=8)) [root@node1 ~]# redis-cli -h 192.168.4.11 -p 6301 192.168.4.11:6301> cluster info # 查看集群信息 [root@node1 ~]# cat /var/lib/redis/6379/nodes-6379.conf
-
-
配置管理主机
Redis管理主机可以部署在任意一台Redis服务器上,也可以单独部署在一台服务器上 redis集群管理脚本在Redis软件包源码中 - ./redis-4.0.8/src/redis-trib.rb [root@admin ~]# ls redis-3.2.1.gem redis-4.0.8.tar.gz # redis-3.2.1.gem 是实现ruby语言和Redis通信的一个第三方组件-
部署Ruby脚本运行环境
[root@admin ~]# yum -y install ruby [root@admin ~]# which gem /usr/bin/gem # gem指令由rubygems包提供,没有的话,需要手动安装 [root@admin ~]# gem install redis-3.2.1.gem -
创建管理集群脚本
[root@admin ~]# tar -xf redis-4.0.8.tar.gz [root@admin ~]# cd redis-4.0.8/src/ [root@admin src]# ls *.rb redis-trib.rb # 将脚本文件拷贝到bin目录下,方便操作 [root@admin ~]# mkdir /root/bin [root@admin ~]# cp ./redis-4.0.8/src/redis-trib.rb /root/bin/ [root@admin ~]# redis-trib.rb help
-
-
创建集群
-
创建集群
redis-trib.rb <command> <options> <arguments ...> - create # 创建集群 - check # 检查集群 - info # 查看集群信息 - reshard # 重新分片 - del-node # 删除主机 - add-node # 添加master主机 - add-node --slave # 添加slave主机 - rebalance # 平均分配hash slots[root@admin ~]# redis-trib.rb create --replicas 1 192.168.4.11:6301 192.168.4.12:6302 192.168.4.13:6303 192.168.4.14:6304 192.168.4.15:6305 192.168.4.16:6306 [OK] All nodes agree about slots configuration. [OK] All 16384 slots covered. # --replicas 1 定义每天主库从库的个数;为1的话 1主一从,需要6台,为2,一主2从,需要九台 # 默认集群有3个主库,只有主库最少为3时,才能达到高可用 -
查看集群信息
-
在管理主机上查看集群信息
[root@admin ~]# redis-trib.rb info 192.168.4.11:6301 192.168.4.11:6301 (badb9cd8...) -> 0 keys | 5461 slots | 1 slaves. 192.168.4.12:6302 (5846e7fa...) -> 0 keys | 5462 slots | 1 slaves. 192.168.4.13:6303 (88f25945...) -> 0 keys | 5461 slots | 1 slaves. [OK] 0 keys in 3 masters. # 可以查看到,3个主节点(11,12,13) 0条数据,5461个hash槽,1个slave服务器 -
在Redis服务器上查看集群信息
[root@node1 ~]# redis-cli -h 192.168.4.11 -p 6301 192.168.4.11:6301> cluster info # 查看集群信息 192.168.4.11:6301> cluster nodes # 查看集群节点信息
-
-
检测集群
[root@admin ~]# redis-trib.rb check 192.168.4.11:6301 >>> Performing Cluster Check (using node 192.168.4.11:6301) M: badb9cd848cf7954d4804518a2dd9427dda4451a 192.168.4.11:6301 slots:0-5460 (5461 slots) master # 槽位 0-5460 1 additional replica(s) S: bdc7713c2332cf0110fccaa994110f3c473f644c 192.168.4.15:6305 slots: (0 slots) slave replicates badb9cd848cf7954d4804518a2dd9427dda4451a # replicates: 指向主服务器的ID值 ......
-
-
排错
1. 检查数据是否清空 2. 检查Redis服务器集群功能是否启用 出错之后再次创建,需要删掉每一台机子产生的集群配置文件信息 - /var/lib/redis/6379/nodes-6379.conf - 删除配置文件之后需要重新启动Redis服务 - 最后在管理主机执行创建集群指令 -
访问集群存/取数据
在客户端可以连接集群中任意一台Redis服务器 选项 -c 集群模式 访问集群 必须携带'-c' , 不然,不能连接集群节点,只是主机节点 [root@node1 ~]# redis-cli -c -h 192.168.4.11 -p 6301 192.168.4.11:6301> set name nayue -> Redirected to slot [5798] located at 192.168.4.12:6302 # 可以查看到 槽(5798) 数据存储到了12节点 OK [root@node5 ~]# redis-cli -c -h 192.168.4.15 -p 6305 192.168.4.15:6305> get name -> Redirected to slot [5798] located at 192.168.4.12:6302 # 可以看到 槽(5798) 从12节点获取数据 "nayue" -
集群的工作原理
Redis的集群是一个高可用的分布式集群,存储的时候,调用一个CRC16算法,做hash计算 - 为每个节点获得一个编号(槽)范围 - 变量名与CRC16算法做hash,把计算的结果,与16384做求模运算, - 使用最后的值与插槽范围做对比,在哪个插槽的范围,就存放在哪个节点(插槽) - Redis一共有16384个槽位
管理集群
-
测试集群功能
-
故障切换测试
停止master主机的Redis服务 - master宕机后对应的slave自动被选举为master - 原master启动后,会自动配置为当前master的slave [root@node1 ~]# redis-cli -h 192.168.4.11 -p 6301 shutdown 检测集群 在管理主机查看信息 [root@admin ~]# redis-trib.rb check 192.168.4.12:6302 [root@admin ~]# redis-trib.rb info 192.168.4.12:6302 [root@node1 ~]# /etc/init.d/redis_6379 start [root@admin ~]# redis-trib.rb check 192.168.4.12:6302
-
-
添加服务器
-
添加master角色服务器
1. 克隆新的系统镜像 ip 192.168.4.17 2. 运行Redis服务并启用集群功能 3. 在管理主机,向集群添加master角色的Redis服务器 4. 给新添加的master角色的Redis服务器分配hash槽 5. 查看集群信息 6. 访问新添加的master角色redis服务器存取数据 # 省略初始配置相关,从第三步开始-
添加Master主机
添加master主机 - 添加时不指定主机角色,默认新主机被选为master - 添加的master主机,需要手动分析hash槽 - 语法: "redis-trib.rb add-node 添加的Master主机:端口 集群中任意一个节点:端口" [root@admin ~]# redis-trib.rb add-node 192.168.4.17:6307 192.168.4.11:6301 .... [OK] New node added correctly. [root@admin ~]# redis-trib.rb info 192.168.4.12:6302 192.168.4.17:6307 (0fdf2ecf...) -> 0 keys | 0 slots | 0 slaves. # 查看信息 新的Master主机槽位为零(不存任何数据) -
分配hash槽位(重新分片)
重新分片 - 移出hash槽个数 - 接收hash槽主机ID - 移出hash槽主机ID - 16384/4=4096 为了平均,每个master占用4096个槽位 [root@admin ~]# redis-trib.rb reshard 192.168.4.11:6301 How many slots do you want to move (from 1 to 16384)? 4096 # 接收槽位的数量 What is the receiving node ID? 0fdf2ecffa517c6de9c01c3005ff2dd14355821b # 接收槽位的主机ID(Master) Source node #1: all # 从哪里获取槽位 这里选择所有 Do you want to proceed with the proposed reshard plan (yes/no)? yes # yes 同意 -
查看集群信息
[root@admin ~]# redis-trib.rb info 192.168.4.11:6301 192.168.4.12:6302 (5846e7fa...) -> 0 keys | 4096 slots | 1 slaves. 192.168.4.14:6304 (b4b36360...) -> 0 keys | 4096 slots | 1 slaves. 192.168.4.17:6307 (0fdf2ecf...) -> 1 keys | 4096 slots | 0 slaves. # 可以查看 槽位分配正常 但是没有slave 192.168.4.15:6305 (bdc7713c...) -> 0 keys | 4096 slots | 1 slaves.
-
-
添加slave角色服务器
1. 克隆新的系统镜像 ip 192.168.4.18 2. 运行Redis服务并启用集群功能 3. 把'192.168.4.18'redis服务添加到集群里角色是'192.168.4.17'的slave 4. 查看集群信息 # 这里只演示第三步-
添加slave主机
部署一台新的Redis服务器 - 运行服务并启用集群配置 添加master主机 'redis-trib.rb add-node --slave [ --master-id id值 ] ip地址:端口 集群任意节点ip地址:端口' - 如果不指定master-id 自动寻找slave最少的节点,slave都相同的话 则随机添加 - Redis的slave会自动同步Master的数据[root@admin ~]# redis-trib.rb add-node --slave --master-id 0fdf2ecffa517c6de9c01c3005ff2dd14355821b 192.168.4.18:6308 192.168.4.11:6301 -
查看集群信息
[root@admin ~]# redis-trib.rb info 192.168.4.11:6301 192.168.4.12:6302 (5846e7fa...) -> 2 keys | 4096 slots | 1 slaves. 192.168.4.14:6304 (b4b36360...) -> 1 keys | 4096 slots | 1 slaves. 192.168.4.17:6307 (0fdf2ecf...) -> 2 keys | 4096 slots | 1 slaves. 192.168.4.15:6305 (bdc7713c...) -> 1 keys | 4096 slots | 1 slaves.
-
-
-
移除服务器
-
删除slave角色服务器
移除slave主机 - 从服务器没有hash槽,直接移除即可 - 移出时指定从服务器的ID值 - 移除时,会自动停止该节点的Redis服务 - 'redis-trib.rb del-node ip地址:端口 从服务器id值' [root@admin ~]# redis-trib.rb check 192.168.4.12:6302 # 查看一下要移除的从服务器的ID值 [root@admin ~]# redis-trib.rb del-node 192.168.4.11:6301 9374b3bab7ef716ea73eb7d66cf424a25888d9b5 [root@admin ~]# redis-trib.rb info 192.168.4.12:6302 192.168.4.17:6307 (0fdf2ecf...) -> 2 keys | 4096 slots | 0 slaves. [root@node8 ~]# ss -ntulp | grep redis -
删除master服务器
1. 释放占用的hash槽 2. 移除Master主机 3. 查看集群信息 # 释放占用的hash槽时,根据hash槽位存储的信息也会转移到目标服务器-
释放占用的slots
这里我们移出'192.168.4.17' - 指定移出的slots个数 - 指定接收slots主机ID - 指定移出slots主机ID [root@admin ~]# redis-trib.rb reshard 192.168.4.11:6301 How many slots do you want to move (from 1 to 16384)? 4096 # '192.168.4.17'的槽位是4096个 What is the receiving node ID?5846e7fadcae26fafd8aca87d9e6825d92d4bce3 # 接收槽位的主机(将17的槽位赋予其他主节点) Source node #1:0fdf2ecffa517c6de9c01c3005ff2dd14355821b # 这里指定17 Source node #2:done Do you want to proceed with the proposed reshard plan (yes/no)? yes [root@admin ~]# redis-trib.rb info 192.168.4.11:6301 192.168.4.17:6307 (0fdf2ecf...) -> 0 keys | 0 slots | 0 slaves. # 可以查看到 17主节点的slots为0了 -
移出Master主机
[root@admin ~]# redis-trib.rb del-node 192.168.4.11:6301 0fdf2ecffa517c6de9c01c3005ff2dd14355821b -
查看集群信息
[root@admin ~]# redis-trib.rb info 192.168.4.11:6301 192.168.4.12:6302 (5846e7fa...) -> 4 keys | 8192 slots | 1 slaves. # 之前把17的槽位给了12,所以数据也给了12 192.168.4.14:6304 (b4b36360...) -> 1 keys | 4096 slots | 1 slaves. 192.168.4.15:6305 (bdc7713c...) -> 1 keys | 4096 slots | 1 slaves. [OK] 6 keys in 3 masters.
-
-
-
扩展
经过我们一系列操作,现在槽位不平衡,所以12压力更大,我们可以使用命令平均分配一下槽位 - rebalance # 平均分配槽位 [root@admin ~]# redis-trib.rb rebalance 192.168.4.11:6301 [root@admin ~]# redis-trib.rb info 192.168.4.11:6301 192.168.4.12:6302 (5846e7fa...) -> 2 keys | 5461 slots | 1 slaves. 192.168.4.14:6304 (b4b36360...) -> 2 keys | 5462 slots | 1 slaves. 192.168.4.15:6305 (bdc7713c...) -> 2 keys | 5461 slots | 1 slaves. -
将移出集群的设备添加回集群
# 先在node8主机上开启Redis服务 [root@node8 ~]# /etc/init.d/redis_6379 start # 在管理主机上添加集群几点会报错 [root@admin ~]# redis-trib.rb add-node --slave 192.168.4.18:6308 192.168.4.11:6301 Automatically selected master 192.168.4.12:6302 [ERR] Node 192.168.4.18:6308 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0. # 我们去该集群主机上查看集群信息 [root@node8 ~]# ls /var/lib/redis/6379/ dump.rdb nodes-6379.conf [root@node8 ~]# redis-cli -h 192.168.4.18 -p 6308 192.168.4.18:6308> cluster info cluster_state:ok # 清理集群信息 [root@node8 ~]# redis-cli -h 192.168.4.18 -p 6308 192.168.4.18:6308> cluster reset # 重置集群信息 192.168.4.18:6308> flushall # 集群中的数据也需要清除 192.168.4.18:6308> save 192.168.4.18:6308> cluster info # 清除之后,查看集群状态,已经恢复正常 cluster_state:fail # 再次在管理主机尝试添加主机 [root@admin ~]# redis-trib.rb add-node --slave 192.168.4.18:6308 192.168.4.11:6301 [OK] New node added correctly. # 添加成功 # 查看集群信息 [root@admin ~]# redis-trib.rb info 192.168.4.11:6301 192.168.4.12:6302 (5846e7fa...) -> 2 keys | 5461 slots | 2 slaves. # 可以查看到 12节点变成两个从库了
Redis集群解散
这里以
192.168.4.11主机为例
-
停止服务
[root@node1 ~]# redis-cli -c -h 192.168.4.11 -p 6301 -
删除数据库目录下的所有文件
[root@node1 ~]# rm -rf /var/lib/redis/6379/* -
禁用集群功能
[root@node1 ~]# vim +815 /etc/redis/6379.conf # cluster-enabled yes # 注释掉该功能 -
启动服务
[root@node1 ~]# /etc/init.d/redis_6379 start Starting Redis server... -
连接服务,查看集群信息,不支持为成功
[root@node1 ~]# redis-cli -h 192.168.4.11 -p 6301 192.168.4.11:6301> keys * (empty list or set) 192.168.4.11:6301> cluster info ERR This instance has cluster support disabled

浙公网安备 33010602011771号