redis-cluster集群
准备环境
准备3台机器,关闭防火墙和selinux
1 2 3 4 5 6 7 8 9 10 11 12 13 # 注:规划架构两种方案,一种是单机多实例,这里我们采用多机器部署: 三台机器,每台机器上面两个redis实例,一个master一个slave,第一列做主库,第二列做备库# 记得选出控制节点 [root@localhost ~]# vim /etc/hosts redis-cluster1 192.168.116.111 7000 7001 redis-cluster2 192.168.116.131 7002 7003 redis-cluster3 192.168.116.132 7004 7005# 修改主机名 [root@localhost ~]# hostnamectl set-hostname redis-cluster1 [root@localhost ~]# hostnamectl set-hostname redis-cluster2 [root@localhost ~]# hostnamectl set-hostname redis-cluster3
三台机器相同的操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # 安装redis依赖环境 [root@redis-cluster1 ~]# yum -y install gcc automake autoconf libtool make# 官方下载redis,这里用的是6.2的版本 [root@redis-cluster1 ~]# wget https://download.redis.io/releases/redis-6.2.0.tar.gz# 创建目录、并指定路径解压软件包 [root@redis-cluster1 ~]# mkdir /data [root@redis-cluster1 ~]# tar xzvf redis-6.2.0.tar.gz -C /data/# 切换目录 [root@redis-cluster1 ~]# cd /data/# 修改目录名 [root@redis-cluster1 data]# mv redis-6.2.0/ redis# 进入redis目录 [root@redis-cluster1 data]# cd redis/# 编译 [root@redis-cluster1 redis]# make# 创建存放数据的目录 [root@redis-cluster1 redis]# mkdir /data/redis/data
创建节点目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # 创建节点目录:按照规划在每台redis节点的安装目录中创建对应的目录(以端口号命名) # redis-cluster1 [root@redis-cluster1 redis]# pwd /data/redis [root@redis-cluster1 redis]# mkdir cluster #创建集群目录 [root@redis-cluster1 redis]# cd cluster/ [root@redis-cluster1 cluster]# mkdir 7000 7001 #创建节点目录# redis-cluster2 [root@redis-cluster2 redis]# mkdir cluster [root@redis-cluster2 redis]# cd cluster/ [root@redis-cluster2 cluster]# mkdir 7002 7003# redis-cluster3 [root@redis-cluster3 redis]# mkdir cluster [root@redis-cluster3 redis]# cd cluster/ [root@redis-cluster3 cluster]# mkdir 7004 7005
修改集群每个redis配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 # redis-cluster1 [root@redis-cluster1 cluster]# cp /data/reids/redis.conf ./7000 [root@redis-cluster1 cluster]# ls 7000 7001 [root@redis-cluster1 cluster]# vim ./7000/redis.conf [root@redis-cluster1 cluster]# cp ./7000/redis.conf ./7001/ [root@redis-cluster1 cluster]# vim ./7001/redis.conf# 修改内容如下 bind 192.168.116.172 #每个实例的配置文件修改为对应节点的ip地址 protected-mode no #关闭密码服务 port 7000 #监听端口,运行多个实例时,需要指定规划的每个实例不同的端口号 daemonize yes #redis后台运行 pidfile /var/run/redis_7000.pid #pid文件,运行多个实例时,需要指定不同的pid文件 logfile /var/log/redis_7000.log #日志文件位置,运行多实例时,需要将文件修改的不同。 dir /data/redis/data #存放数据的目录 appendonly yes #开启AOF持久化,redis会把所接收到的每一次写操作请求都追加到appendonly.aof文件中,当redis重新启动时,会从该文件恢复出之前的状态。 appendfilename "appendonly.aof" #AOF文件名称 appendfsync everysec #表示对写操作进行累积,每秒同步一次 以下为打开注释并修改 cluster-enabled yes #启用集群 cluster-config-file nodes-7000.conf #集群配置文件,由redis自动更新,不需要手动配置,运行多实例时请注修改为对应端口 cluster-node-timeout 5000 #单位毫秒。集群节点超时时间,即集群中主从节点断开连接时间阈值,超过该值则认为主节点不可以,从节点将有可能转为master cluster-replica-validity-factor 10 #在进行故障转移的时候全部slave都会请求申请为master,但是有些slave可能与master断开连接一段时间了导致数据过于陈旧,不应该被提升为master。该参数就是用来判断slave节点与master断线的时间是否过长。 cluster-migration-barrier 1 #一个主机将保持连接的最小数量的从机,以便另一个从机迁移到不再被任何从机覆盖的主机 cluster-require-full-coverage yes #集群中的所有slot(16384个)全部覆盖,才能提供服务# 注: 所有节点配置文件全部修改切记需要修改的ip、端口、pid文件...避免冲突。确保所有机器都修改。
redis-cluster2—-redis-cluster3
1 2 redis-cluster2----redis-cluster3 重复redis-cluster1步骤操作
启动三台机器上面的每个节点(三台机器相同操作)
1 2 3 4 5 6 7 8 9 10 11 12 13 [root@redis-cluster1 ~]# cd /data/redis/src/ [root@redis-cluster1 src]# ./redis-server ../cluster/7000/redis.conf [root@redis-cluster1 src]# ./redis-server ../cluster/7001/redis.conf [root@redis-cluster2 7003]# cd /data/redis/src/ [root@redis-cluster2 src]# ./redis-server ../cluster/7002/redis.conf [root@redis-cluster2 src]# ./redis-server ../cluster/7003/redis.conf [root@redis-cluster3 7005]# cd /data/redis/src/ [root@redis-cluster3 src]# ./redis-server ../cluster/7004/redis.conf [root@redis-cluster3 src]# ./redis-server ../cluster/7005/redis.conf# 注意 如果没有报错,但是就是启动不了,看不到端口,把配置文件里的dir 路径写相对路径
查看端口
1 2 3 4 5 6 7 8 9 # 每个机器上都可以看下端口有没有起来 [root@redis-cluster1 reids]# netstat -lnpt Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 192.168.116.111:7000 0.0.0.0:* LISTEN 16191/src/redis-ser tcp 0 0 192.168.116.111:7001 0.0.0.0:* LISTEN 16197/src/redis-ser tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1137/master tcp 0 0 192.168.116.111:17000 0.0.0.0:* LISTEN 16191/src/redis-ser tcp 0 0 192.168.116.111:17001 0.0.0.0:* LISTEN 16197/src/redis-ser
创建集群:在其中一个节点操作就可以
1 2 3 4 5 6 7 8 9 10 redis节点搭建起来后,需要完成redis cluster集群搭建,搭建集群过程中,需要保证6个redis实例都是运行状态。 Redis是根据IP和Port的顺序,确定master和slave的,所以要排好序,再执行。 参数: --cluster-replicas 1:表示为集群中的每个主节点创建一个从节点.书写流程:主节点ip+port 对应一个从节点ip+port(正常是前面三个节点为主节点,后面的为从节点) [root@redis-cluster1 src]# cd /data/redis/src/ [root@redis-cluster1 src]# ./redis-cli --cluster create --cluster-replicas 1 192.168.116.111:7000 192.168.116.111:7001 192.168.116.131:7002 192.168.116.131:7003 192.168.116.132:7004 192.168.116.132:7005# Can I set the above configuration? (type 'yes' to accept): yes
查看集群状态可连接集群中的任一节点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 # 此处连接了集群中的节点--192.168.116.111 # 登录集群客户端,-c标识以集群方式登录 [root@redis-cluster1 src]# ./redis-cli -h 192.168.116.172 -c -p 7000 192.168.116.172:7000> ping PONG 192.168.116.173:7002> cluster info #查看集群信息 cluster_state:ok #集群状态 cluster_slots_assigned:16384 #分配的槽 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 #集群实例数 ...... 192.168.116.172:7000> cluster nodes #查看集群实例 参数解释: runid: 该行描述的节点的id。 ip:prot: 该行描述的节点的ip和port flags: 分隔的标记位,可能的值有: 1.master: 该行描述的节点是master 2.slave: 该行描述的节点是slave 3.fail?:该行描述的节点可能不可用 4.fail:该行描述的节点不可用(故障) master_runid: 该行描述的节点的master的id,如果本身是master则显示- ping-sent: 最近一次发送ping的Unix时间戳,0表示未发送过 pong-recv:最近一次收到pong的Unix时间戳,0表示未收到过 config-epoch: 主从切换的次数 link-state: 连接状态,connnected 和 disconnected hash slot: 该行描述的master中存储的key的hash的范围
查看redis-cluster1,和连通性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 [root@redis-cluster1 src]# ./redis-cli -h 192.168.116.132 -c -p 7004 192.168.116.132:7004> ping PONG 192.168.116.132:7004> cluster info cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:5 cluster_stats_messages_ping_sent:837 cluster_stats_messages_pong_sent:962 cluster_stats_messages_meet_sent:1 cluster_stats_messages_sent:1800 cluster_stats_messages_ping_received:962 cluster_stats_messages_pong_received:838 cluster_stats_messages_received:1800 192.168.116.132:7004> cluster nodes e1784e05bc7220db5155e80787b4cc6af12ab0c5 192.168.116.131:7003@17003 slave 462577d2fbc035e6584f9ce7177d9e0df72e3c16 0 1702369829000 1 connected bcbfcc14d0cad0d5d00738cd403a4aee52b446f9 192.168.116.132:7004@17004 myself,master - 0 1702369827000 5 connected 10923-16383 c81d083a6b36882c955e76ed026b3d90c5ac61eb 192.168.116.131:7002@17002 master - 0 1702369830266 3 connected 5461-10922 462577d2fbc035e6584f9ce7177d9e0df72e3c16 192.168.116.111:7000@17000 master - 0 1702369829262 1 connected 0-5460 4cbe431c64d21483dd004b18207f647145e0c6fb 192.168.116.132:7005@17005 slave c81d083a6b36882c955e76ed026b3d90c5ac61eb 0 1702369830000 3 connected 9c5e3e52773043d74a01b8ebbe7f2b63f56dd8b0 192.168.116.111:7001@17001 slave bcbfcc14d0cad0d5d00738cd403a4aee52b446f9 0 1702369829000 5 connected# 验证--查看 # 可以数据联通--属于集群操作 redis-cluster1 192.168.116.132:7004> set name qingfeng-> Redirected to slot [5798] located at 192.168.116.131:7002 OK 192.168.116.131:7002> redis-cluster3 192.168.116.111:7000> get name-> Redirected to slot [5798] located at 192.168.116.131:7002 "qingfeng" 192.168.116.131:7002>
主从切换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 测试:# 1.将节点cluster1的主节点7000端口的redis关掉 [root@redis-cluster1 src]# ./redis-cli -h 192.168.116.132 -c -p 7004 192.168.116.132:7004> cluster nodes #此时查看7000在线 e1784e05bc7220db5155e80787b4cc6af12ab0c5 192.168.116.131:7003@17003 slave 462577d2fb bcbfcc14d0cad0d5d00738cd403a4aee52b446f9 192.168.116.132:7004@17004 myself,master - c81d083a6b36882c955e76ed026b3d90c5ac61eb 192.168.116.131:7002@17002 master - 0 17023 462577d2fbc035e6584f9ce7177d9e0df72e3c16 192.168.116.111:7000@17000 master - 0 17023 4cbe431c64d21483dd004b18207f647145e0c6fb 192.168.116.132:7005@17005 slave c81d083a6b 9c5e3e52773043d74a01b8ebbe7f2b63f56dd8b0 192.168.116.111:7001@17001 slave bcbfcc14d0 192.168.116.132:7004> exit [root@redis-cluster1 src]# ps -ef |grep redis root 16191 1 0 15:50 ? 00:00:07 src/redis-server 192.168.116.111:7 root 16197 1 0 15:50 ? 00:00:07 src/redis-server 192.168.116.111:7 root 16246 1538 0 16:39 pts/0 00:00:00 grep --color=auto redis [root@redis-cluster1 src]# kill -9 16191 [root@redis-cluster1 src]# ps -ef |grep redis root 16197 1 0 15:50 ? 00:00:07 src/redis-server 192.168.116.111:7 root 16248 1538 0 16:39 pts/0 00:00:00 grep --color=auto redis [root@redis-cluster1 src]# netstat -lnpt #7000的端口关闭了,看不到 Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 192.168.116.111:7001 0.0.0.0:* LISTEN 16197/src/redis-ser tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1137/master tcp 0 0 192.168.116.111:17001 0.0.0.0:* LISTEN 16197/src/redis-ser tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 938/sshd tcp6 0 0 ::1:25 :::* LISTEN 1137/master tcp6 0 0 :::22 :::* LISTEN 938/sshd# 查看集群信息:--在132的机器上输入命令查看 192.168.116.131:7002> cluster nodes #此时查看7000显示fail,下线了 c81d083a6b36882c955e76ed026b3d90c5ac61eb 192.168.116.131:7002@17002 myself,master - 0 1702370394000 3 connected 5461-10922 462577d2fbc035e6584f9ce7177d9e0df72e3c16 192.168.116.111:7000@17000 master,fail - 1702370373573 1702370371564 1 disconnected #显示fail,下线了 e1784e05bc7220db5155e80787b4cc6af12ab0c5 192.168.116.131:7003@17003 master - 0 1702370394653 7 connected 0-5460 4cbe431c64d21483dd004b18207f647145e0c6fb 192.168.116.132:7005@17005 slave c81d083a6b36882c955e76ed026b3d90c5ac61eb 0 1702370395055 3 connected bcbfcc14d0cad0d5d00738cd403a4aee52b446f9 192.168.116.132:7004@17004 master - 0 1702370395657 5 connected 10923-16383 9c5e3e52773043d74a01b8ebbe7f2b63f56dd8b0 192.168.116.111:7001@17001 slave bcbfcc14d0cad0d5d00738cd403a4aee52b446f9 0 1702370395156 5 connected# 2.将该节点的7000端口redis启动在查看 [root@redis-cluster1 src]# cd .. [root@redis-cluster1 reids]# src/redis-server cluster/7000/redis.conf [root@redis-cluster1 reids]# netstat -lnpt #此时7000的端口正常运行 Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 192.168.116.111:7000 0.0.0.0:* LISTEN 16257/src/redis-ser tcp 0 0 192.168.116.111:7001 0.0.0.0:* LISTEN 16197/src/redis-ser tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1137/master tcp 0 0 192.168.116.111:17000 0.0.0.0:* LISTEN 16257/src/redis-ser tcp 0 0 192.168.116.111:17001 0.0.0.0:* LISTEN 16197/src/redis-ser tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 938/sshd tcp6 0 0 ::1:25 :::* LISTEN 1137/master tcp6 0 0 :::22 :::* LISTEN 938/sshd# 查看节点信息:-- 用132的机器查看,此时7000的状态恢复正常,但是变成了从节点 192.168.116.131:7002> cluster nodes c81d083a6b36882c955e76ed026b3d90c5ac61eb 192.168.116.131:7002@17002 myself,master - 0 1702370727000 3 connected 5461-10922 462577d2fbc035e6584f9ce7177d9e0df72e3c16 192.168.116.111:7000@17000 slave e1784e05bc7220db5155e80787b4cc6af12ab0c5 0 1702370728000 7 connected e1784e05bc7220db5155e80787b4cc6af12ab0c5 192.168.116.131:7003@17003 master - 0 1702370728580 7 connected 0-5460 4cbe431c64d21483dd004b18207f647145e0c6fb 192.168.116.132:7005@17005 slave c81d083a6b36882c955e76ed026b3d90c5ac61eb 0 1702370728000 3 connected bcbfcc14d0cad0d5d00738cd403a4aee52b446f9 192.168.116.132:7004@17004 master - 0 1702370727000 5 connected 10923-16383 9c5e3e52773043d74a01b8ebbe7f2b63f56dd8b0 192.168.116.111:7001@17001 slave bcbfcc14d0cad0d5d00738cd403a4aee52b446f9 0 1702370728581 5 connected
到此–主从切换完成