Skip to content

19 redis集群

19 redis集群

一、哨兵实验

1.哨兵:

在主从的基础上,自动完成故障监听、故障转移

​ 故障转移:将某台从服务器提权为主服务器

​ 转移过程:主故障、选择一个从作为主、其他的从指向新的主

2.技术

对于运维来说有以下几点需要精通:

  • 持久化:数据存储在硬盘上,内存清空后仍有完整数据

  • 复制:高可用的基础,能实现:多机备份、读写分离、负载均衡,但缺陷就是无法自动故障解决

  • 哨兵:实现了自动化的故障转移方案,让高可用更加完善

  • 集群:在主从复制上,解决读写负载问题的方案,更加完善了redis的高可用

3.哨兵注意事项:

(redis节点、普通主从、自动发现、会改文件、可多节点监控)

  • 哨兵节点本质上是redis节点
  • 哨兵的主从节点也是普通的主从节点,故障发现和转移是由哨兵节点控制和完成
  • 每个哨兵节点,只需要配置监控主节点,便可以自动发现其他的哨兵节点和从节点
  • 故障转移后,每个阶段都会修改配置文件
  • 一个哨兵可以监控多个主节点,通过配置多条sentinel monitor即可实现

4.拓展

主观下线判断:先发现故障的节点

客观下线判断:被通知故障的节点

多长时间故障判断为故障: 30秒

sentinel down-after-milliseconds <master-name> 30000
#3万毫秒=30秒

哨兵选主服务器的规则:slave-priority 优先级、复制偏移量最大的、runid(每次运行时产生的身份码,随机)

5.哨兵实验

1)搭建主从从

防止干扰,删除之前的 data、logs目录下的所有

​ 1.生成配置文件:(需要修改:端口、bind、daemonize、pid、logfile、dir、dbfile、appendfilename)

​ redis-6380.conf

​ redis-6381.conf

​ redis-6382.conf

[root@localhost conf]# cp -a redis.conf redis-6380.conf
[root@localhost conf]# vim redis-6380.conf
bind 0.0.0.0
port 6380
daemonize yes
pidfile "/usr/local/redis/logs/redis-6380.pid"
logfile "/usr/local/redis/logs/redis-6380.log"
dbfilename "redis-6380.rdb"
dir "/usr/local/redis/data/"
appendonly yes
appendfilename "redis-6380.aof"

[root@localhost conf]# cp -a redis-6380.conf redis-6381.conf 
[root@localhost conf]# vim redis-6381.conf          #利用vim的末行模式进行替换  :%s /6380/6381/c
bind 0.0.0.0
port 6381
daemonize yes
pidfile "/usr/local/redis/logs/redis-6381.pid"
logfile "/usr/local/redis/logs/redis-6381.log"
dbfilename "redis-6381.rdb"
dir "/usr/local/redis/data/"
appendfilename "redis-6381.aof"

[root@localhost conf]# cp -a redis-6380.conf redis-6382.conf
[root@localhost conf]# vim redis-6382.conf          #利用vim的末行模式进行替换  :%s /6380/6381/c
bind 0.0.0.0
port 6382
daemonize yes
pidfile "/usr/local/redis/logs/redis-6382.pid"
logfile "/usr/local/redis/logs/redis-6382.log"
dbfilename "redis-6382.rdb"
dir "/usr/local/redis/data/"
appendfilename "redis-6382.aof"

​ 2.用以上配置文件,分别启动redis

[root@localhost conf]# redis-server /usr/local/redis/conf/redis-6380.conf 
[root@localhost conf]# redis-server /usr/local/redis/conf/redis-6381.conf 
[root@localhost conf]# redis-server /usr/local/redis/conf/redis-6382.conf      
[root@localhost conf]# netstat -anpt|grep redis-server
[root@localhost conf]# netstat -anpt |grep redis-server
tcp        0      0 0.0.0.0:6380            0.0.0.0:*               LISTEN      11824/redis-server  
tcp        0      0 0.0.0.0:6381            0.0.0.0:*               LISTEN      11832/redis-server  
tcp        0      0 0.0.0.0:6382            0.0.0.0:*               LISTEN      11842/redis-server  
tcp        0      0 192.168.18.202:6380     192.168.18.202:40095    ESTABLISHED 11824/redis-server  
tcp        0      0 192.168.18.202:6380     192.168.18.202:39043    ESTABLISHED 11824/redis-server  
tcp        0      0 192.168.18.202:40095    192.168.18.202:6380     ESTABLISHED 11832/redis-server  
tcp        0      0 192.168.18.202:39043    192.168.18.202:6380     ESTABLISHED 11842/redis-server

​ 3.配置两个从服务器,并重启从服务器:

​ 修改redis-6381.conf、redis-6382.conf配置文件:(配置replicaof选项)

[root@localhost conf]# vim /usr/local/redis/conf/redis-6381.conf
replicaof 192.168.18.202 6380
[root@localhost conf]# vim /usr/local/redis/conf/redis-6382.conf
replicaof 192.168.18.202 6380
[root@localhost conf]# redis-cli -p 6381 shutdown
[root@localhost conf]# redis-cli -p 6382 shutdown
[root@localhost conf]# redis-server /usr/local/redis/conf/redis-6381.conf 
[root@localhost conf]# redis-server /usr/local/redis/conf/redis-6382.conf 

​ 4.测试:检查4个监听端口、主从从的replication信息、测试数据同步(主创建数据、从查看)

#4个监听: 81<-->80 82<-->80     
[root@localhost conf]# netstat -anpt|grep redis-server |grep ESTABLISHED
tcp        0      0 192.168.18.202:45919    192.168.18.202:6380     ESTABLISHED 42757/redis-server  
tcp        0      0 192.168.18.202:6380     192.168.18.202:45919    ESTABLISHED 42631/redis-server  
tcp        0      0 192.168.18.202:34934    192.168.18.202:6380     ESTABLISHED 42767/redis-server  
tcp        0      0 192.168.18.202:6380     192.168.18.202:34934    ESTABLISHED 42631/redis-server 
[root@localhost conf]# redis-cli -p 6380 info replication               #查看主的replication信息
# Replication
role:master                 #6380端口为主
connected_slaves:2          #有两个从服务器
slave0:ip=192.168.18.202,port=6381,state=online,offset=294,lag=1        #两个从服务器的信息
slave1:ip=192.168.18.202,port=6382,state=online,offset=294,lag=1

[root@localhost conf]# redis-cli -p 6381 info replication               #查看从1的replication信息

role:slave
master_host:192.168.18.202
master_port:6380

[root@localhost conf]# redis-cli -p 6382 info replication               #查看从2的replication信息

role:slave
master_host:192.168.18.202
master_port:6380

[root@localhost conf]# redis-cli -p 6380                #进入主创建键值对
127.0.0.1:6380> set name zhangsan
OK
127.0.0.1:6380> keys *
1) "name"
127.0.0.1:6380> 
[root@localhost conf]# redis-cli -p 6381                #从1查看,同步成功
127.0.0.1:6381> keys *
1) "name"
127.0.0.1:6381> 
[root@localhost conf]# redis-cli -p 6382                #从2查看,同步成功
127.0.0.1:6382> keys *
1) "name"
127.0.0.1:6382> 

2)搭建哨兵:

​ 1.利用sentinel.conf模板生成哨兵配置文件:(需要修改:端口、允许后台、pidfile、logfile、sentinel monitor 选项)

​ sentinel-26380.conf

​ sentinel-26381.conf

​ sentinel-26382.conf

sentinel monitor mymaster 127.0.0.1 6380 2
#mymaster           域名
#127.0.0.1          监听的网卡,由于此处主和哨兵在一起,本地回环ip即可
#6380               监听的端口
#2                  有两个哨兵节点判断主为故障时,则判定主为故障
[root@localhost ~]# cp -a /root/redis-6.2.7/sentinel.conf /usr/local/redis/conf/
[root@localhost ~]# cd /usr/local/redis/conf/
[root@localhost conf]# cp -a sentinel.conf sentinel-26380.conf          #将源码包中的sentinel.conf 模板复制到conf目录下
[root@localhost conf]# vim sentinel-26380.conf                      #修改26380的哨兵配置文件(端口、后台、pid、log、shentinel monitor)
port 26380
daemonize yes
pidfile "/usr/local/redis/logs/redis-26380.pid"
logfile "/usr/local/redis/logs/redis-26380.log"
sentinel monitor mymaster 127.0.0.1 6380 2

[root@localhost conf]# cp -a sentinel-26380.conf sentinel-26381.conf
[root@localhost conf]# vim sentinel-26381.conf                      #修改26381的哨兵配置文件(端口、后台、pid、log、shentinel monitor)
port 26381
daemonize yes
pidfile "/usr/local/redis/logs/redis-26381.pid"
logfile "/usr/local/redis/logs/redis-26381.log"
sentinel monitor mymaster 127.0.0.1 6380 2

[root@localhost conf]# cp -a sentinel-26380.conf sentinel-26382.conf
[root@localhost conf]# vim sentinel-26382.conf                      #修改26382的哨兵配置文件(端口、后台、pid、log、shentinel monitor)
port 26382
daemonize yes
pidfile "/usr/local/redis/logs/redis-26382.pid"
logfile "/usr/local/redis/logs/redis-26382.log"
sentinel monitor mymaster 127.0.0.1 6380 2

​ 2.启动哨兵

[root@localhost conf]# redis-sentinel /usr/local/redis/conf/sentinel-26380.conf 
[root@localhost conf]# redis-sentinel /usr/local/redis/conf/sentinel-26381.conf 
[root@localhost conf]# redis-sentinel /usr/local/redis/conf/sentinel-26382.conf 

​ 3.检查端口、info信息

[root@localhost conf]# netstat -anpt |grep redis-sentine

[root@localhost conf]# redis-cli -p 26380 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6380,slaves=2,sentinels=3
[root@localhost conf]# redis-cli -p 26381 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6380,slaves=2,sentinels=3
[root@localhost conf]# redis-cli -p 26382 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6380,slaves=2,sentinels=3

3)测试

kill杀死6380的主服务器进程,等待哨兵判定、转移后,查看两个从的身份(其中一个变成了主),查看哨兵配置文件信息

[root@localhost conf]# redis-cli -p 6380 info replication
。。。。
role:master
connected_slaves:2
。。。。

测试1:杀死6380,观察6381,6382replication信息

[root@localhost conf]# netstat -anpt |grep LISTEN |grep :6380
tcp        0      0 0.0.0.0:6380            0.0.0.0:*               LISTEN      11991/redis-server 
[root@localhost conf]# kill 11991
[root@localhost conf]# netstat -anpt |grep LISTEN |grep :6380
[root@localhost conf]# redis-cli -p 6381 info replication           #检查6381端口的服务为从
# Replication
role:slave
master_host:192.168.18.202
master_port:6382
[root@localhost conf]# redis-cli -p 6382 info replication           #检查到6382端口的服务为主,有一个从连接
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.18.202,port=6381,state=online,offset=25583,lag=0

测试2:修复6380,观察6381,6382replication信息

[root@localhost conf]# redis-server /usr/local/redis/conf/redis-6380.conf   #修复6380端口的服务
[root@localhost conf]# netstat -anpt |grep LISTEN |grep :6380
tcp        0      0 0.0.0.0:6380            0.0.0.0:*               LISTEN      12191/redis-server  
[root@localhost conf]# redis-cli -p 6380 info replication                   #检查到6380端口的服务为从
# Replication
role:slave
master_host:192.168.18.202
master_port:6382
[root@localhost conf]# redis-cli -p 6382 info replication                   #检查到6382的主的从有两个
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.18.202,port=6381,state=online,offset=80882,lag=1
slave1:ip=192.168.18.202,port=6380,state=online,offset=81025,lag=0

测试3:杀死6382,观察6380,6381的replication信息

[root@localhost conf]# netstat -anpt |grep LISTEN |grep :6382               #杀死6382主
tcp        0      0 0.0.0.0:6382            0.0.0.0:*               LISTEN      12009/redis-server  
[root@localhost conf]# kill 12009
[root@localhost conf]# redis-cli -p 6380 info replication                   #6380为从
# Replication
role:slave
master_host:192.168.18.202
master_port:6381
[root@localhost conf]# redis-cli -p 6381 info replication                   #6381为主
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.18.202,port=6380,state=online,offset=160917,lag=1

检查主从从、三个哨兵的配置文件:

​ 主从从配置文件:从的自动指向了新的主,主的replicaof选项自动删除了

[root@localhost conf]# redis-cli -p 6381 info replication
# Replication
role:master
[root@localhost conf]# tail -n 1 /usr/local/redis/conf/redis-6380.conf
replicaof 192.168.18.202 6381
[root@localhost conf]# tail -n 1 /usr/local/redis/conf/redis-6382.conf 
replicaof 192.168.18.202 6381

​ 哨兵的配置文件:主的监听修改了,修复次数,所有主从信息,其他哨兵信息

[root@localhost conf]# tail -n 10 /usr/local/redis/conf/sentinel-26380.conf
user default on nopass ~* &* +@all
sentinel myid 6f94fe1410ded154106cd74532a1880d0bc5a773
sentinel config-epoch mymaster 2                        #修复次数
sentinel leader-epoch mymaster 2
sentinel current-epoch 2
sentinel known-replica mymaster 192.168.18.202 6382     #其他从服务器1
sentinel known-replica mymaster 127.0.0.1 6380          #其他从服务器2
sentinel known-sentinel mymaster 192.168.18.202 26381 254f2c9c362407a8af6ae8759dfe4eff7e565d8f      #其他哨兵1
sentinel known-sentinel mymaster 192.168.18.202 26382 544f9bdddc0d1cfc0ce8997eb4132783efa77be6      #其他哨兵2
sentinel known-replica mymaster 192.168.18.202 6380

二、redis集群

主节点之间存储数据不同,但是可以连接,解决了读写的负载

备用节点:
        备份每个节点的数据
        主备之间也可以用哨兵

主节点中有16384个槽(额度),分配给每个主节点,根据槽数量不同来存储数据量(必须将槽用完)

实验:redis集群

环境:6.2.7版本redis,一台机器实现

命令:

cluster info            #查看集群信息
cluster nodes           #查看nodes信息
cluster meet            #节点握手
cluster addslots        #分配槽
cluster delslots        #取消槽
cluster replicate       #指定主备

image-20221123135655040

实验步骤:

1 配置六个节点集群服务

1)解压进入、编译安装、创建目录、生成配置文件

[root@localhost ~]# ls
anaconda-ks.cfg  ifcfg-ens33  redis-6.2.7.tar.gz
[root@localhost ~]# tar -xf redis-6.2.7.tar.gz 
[root@localhost ~]# cd redis-6.2.7/
[root@localhost redis-6.2.7]# ls
00-RELEASENOTES  CONDUCT       COPYING  INSTALL   MANIFESTO  redis.conf  runtest-cluster    runtest-sentinel  src    TLS.md
BUGS             CONTRIBUTING  deps     Makefile  README.md  runtest     runtest-moduleapi  sentinel.conf     tests  utils
[root@localhost redis-6.2.7]# make && make PREFIX=/usr/local/redis/ install
[root@localhost redis-6.2.7]# cd /usr/local/redis/
[root@localhost redis]# mkdir data conf logs
[root@localhost redis]# cp -a /root/redis-6.2.7/redis.conf /usr/local/redis/conf/
2)修改主配置文件
                    (地址、端口、后台、pidfile、logfile、rdb、dir、aof、开启集群并指向配置文件存放位置)
            并生成每个端口的配置文件

[root@localhost redis]# cp -a /root/redis-6.2.7/redis.conf /usr/local/redis/conf/redis-6380.conf    #修改主配置文件
bind 0.0.0.0
port 6380
daemonize yes
pidfile "/usr/local/redis/logs/redis-6380.pid"
logfile "/usr/local/redis/logs/redis-6380.log"
dbfilename "redis-6380.rdb"
dir "/usr/local/redis/data/"
appendonly yes
appendfilename "redis-6380.aof"
cluster-enabled yes
cluster-config-file "/usr/local/redis/conf/nodes-6380.conf"

[root@localhost redis]# cd /usr/local/redis/conf/
[root@localhost conf]# ls
redis-6380.conf
[root@localhost conf]# cp -a redis-6380.conf redis-6381.conf                    #生成其他节点的配置文件
[root@localhost conf]# cp -a redis-6380.conf redis-6382.conf 
[root@localhost conf]# cp -a redis-6380.conf redis-6383.conf 
[root@localhost conf]# cp -a redis-6380.conf redis-6384.conf 
[root@localhost conf]# cp -a redis-6380.conf redis-6385.conf
[root@localhost conf]# vim redis-6381.conf
:%s /6380/6381/c                                #vim 末行模式执行(6次替换)
[root@localhost conf]# vim redis-6382.conf
:%s /6380/6382/c                                #vim 末行模式执行(6次替换)
[root@localhost conf]# vim redis-6383.conf
:%s /6380/6383/c                                #vim 末行模式执行(6次替换)
[root@localhost conf]# vim redis-6384.conf
:%s /6380/6384/c                                #vim 末行模式执行(6次替换)
[root@localhost conf]# vim redis-6385.conf 
:%s /6380/6385/c                                #vim 末行模式执行(6次替换)
3)启动每个节点,并检查server信息
                        redis_mode:cluster          #集群模式
                        redis_mode:standalone   #单机模式

[root@localhost conf]# ln -s /usr/local/redis/bin/* /usr/local/bin/
[root@localhost conf]# redis-server /usr/local/redis/conf/redis-6380.conf               #启动六个节点的redis
[root@localhost conf]# redis-server /usr/local/redis/conf/redis-6381.conf 
[root@localhost conf]# redis-server /usr/local/redis/conf/redis-6382.conf 
[root@localhost conf]# redis-server /usr/local/redis/conf/redis-6383.conf 
[root@localhost conf]# redis-server /usr/local/redis/conf/redis-6384.conf 
[root@localhost conf]# redis-server /usr/local/redis/conf/redis-6385.conf 
[root@localhost conf]# redis-cli -p 6380 info server |grep cluster                      #六个节点都是集群模式
redis_mode:cluster
[root@localhost conf]# redis-cli -p 6381 info server |grep cluster
redis_mode:cluster
[root@localhost conf]# redis-cli -p 6382 info server |grep cluster
redis_mode:cluster
[root@localhost conf]# redis-cli -p 6383 info server |grep cluster
redis_mode:cluster
[root@localhost conf]# redis-cli -p 6384 info server |grep cluster
redis_mode:cluster
[root@localhost conf]# redis-cli -p 6385 info server |grep cluster
redis_mode:cluster

2 节点握手

注意:IP为网卡地址,不能用localhost或本地回环地址(127.0.0.1)

    握手完成后:检查nodes配置文件(存在其他nodes的id信息)
                    cluster nodes  检查所有nodes信息(查看时,六个节点的都能看到所有的信息)

[root@localhost conf]# redis-cli -p 6380 cluster meet 192.168.18.201 6381
OK
[root@localhost conf]# redis-cli -p 6380 cluster meet 192.168.18.201 6382
OK
[root@localhost conf]# redis-cli -p 6380 cluster meet 192.168.18.201 6383
OK
[root@localhost conf]# redis-cli -p 6380 cluster meet 192.168.18.201 6384
OK
[root@localhost conf]# redis-cli -p 6380 cluster meet 192.168.18.201 6385
OK
[root@localhost conf]# ls /usr/local/redis/conf/
nodes-6380.conf  nodes-6382.conf  nodes-6384.conf  redis-6380.conf  redis-6382.conf  redis-6384.conf
nodes-6381.conf  nodes-6383.conf  nodes-6385.conf  redis-6381.conf  redis-6383.conf  redis-6385.conf
[root@localhost conf]# cat /usr/local/redis/conf/nodes-6380.conf                                    #启动服务后生成了nodes配置文件
f38603eff8cbf408f3e9887fa1f97d647a6fa7da 192.168.18.201:6384@16384 master - 0 1669184847000 3 connected
2a7fcc4f117d722acf465819e209b24f773d2d54 192.168.18.201:6382@16382 master - 0 1669184848196 2 connected
a27ad18beb252fcb03b6f55009d31ef1948712c0 192.168.18.201:6383@16383 master - 0 1669184847000 4 connected
fe75294b142f46d389d316319e19d7b7a88ad5c2 192.168.18.201:6380@16380 myself,master - 0 1669184846000 0 connected
a1e8ba65273f2b2fa2ecad2126ec518958694fce 192.168.18.201:6385@16385 master - 0 1669184846000 5 connected
1f4fa08f2d35109c28ca19344ab69989138c178b 192.168.18.201:6381@16381 master - 0 1669184847178 1 connected
vars currentEpoch 5 lastVoteEpoch 0

[root@localhost conf]# redis-cli -p 6380 cluster nodes                                              #所有nodes信息
f38603eff8cbf408f3e9887fa1f97d647a6fa7da 192.168.18.201:6384@16384 master - 0 1669185018626 3 connected
2a7fcc4f117d722acf465819e209b24f773d2d54 192.168.18.201:6382@16382 master - 0 1669185017000 2 connected
a27ad18beb252fcb03b6f55009d31ef1948712c0 192.168.18.201:6383@16383 master - 0 1669185015600 4 connected
fe75294b142f46d389d316319e19d7b7a88ad5c2 192.168.18.201:6380@16380 myself,master - 0 1669185016000 0 connected
a1e8ba65273f2b2fa2ecad2126ec518958694fce 192.168.18.201:6385@16385 master - 0 1669185017617 5 connected
1f4fa08f2d35109c28ca19344ab69989138c178b 192.168.18.201:6381@16381 master - 0 1669185016000 1 connected

3 分配槽

​ 给6380、6381、6382作为主节点

cluster addslots:分配

cluster delslots:删除

[root@localhost conf]# redis-cli -p 6380 cluster addslots {0..5461}
OK
[root@localhost conf]# redis-cli -p 6381 cluster addslots {5462..10922}
OK
[root@localhost conf]# redis-cli -p 6382 cluster addslots {10923..16383}
OK
[root@localhost conf]# redis-cli -p 6380 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:5
cluster_my_epoch:0
cluster_stats_messages_ping_sent:517
cluster_stats_messages_pong_sent:543
cluster_stats_messages_meet_sent:5
cluster_stats_messages_sent:1065
cluster_stats_messages_ping_received:543
cluster_stats_messages_pong_received:522
cluster_stats_messages_received:1065

4 指定主备(从)关系

​ 给6383、6384、6385作为备份节点

cluster replicate: 将后者的id作为前者端口的主

#查看nodes信息只有主
[root@localhost conf]# redis-cli -p 6380 cluster nodes
f38603eff8cbf408f3e9887fa1f97d647a6fa7da 192.168.18.201:6384@16384 master - 0 1669185513000 3 connected
2a7fcc4f117d722acf465819e209b24f773d2d54 192.168.18.201:6382@16382 master - 0 1669185515000 2 connected 10923-16383
a27ad18beb252fcb03b6f55009d31ef1948712c0 192.168.18.201:6383@16383 master - 0 1669185516000 4 connected
fe75294b142f46d389d316319e19d7b7a88ad5c2 192.168.18.201:6380@16380 myself,master - 0 1669185515000 0 connected 0-5461
a1e8ba65273f2b2fa2ecad2126ec518958694fce 192.168.18.201:6385@16385 master - 0 1669185516880 5 connected
1f4fa08f2d35109c28ca19344ab69989138c178b 192.168.18.201:6381@16381 master - 0 1669185515871 1 connected 5462-10922

#指定主备关系
[root@localhost conf]# redis-cli -p 6383 cluster replicate fe75294b142f46d389d316319e19d7b7a88ad5c2
OK
[root@localhost conf]# redis-cli -p 6384 cluster replicate 1f4fa08f2d35109c28ca19344ab69989138c178b
OK
[root@localhost conf]# redis-cli -p 6385 cluster replicate 2a7fcc4f117d722acf465819e209b24f773d2d54
OK

#再次查看nodes信息,出现主备信息
[root@localhost conf]# redis-cli -p 6380 cluster nodes
f38603eff8cbf408f3e9887fa1f97d647a6fa7da 192.168.18.201:6384@16384 slave 1f4fa08f2d35109c28ca19344ab69989138c178b 0 1669185778272 1 connected
2a7fcc4f117d722acf465819e209b24f773d2d54 192.168.18.201:6382@16382 master - 0 1669185779280 2 connected 10923-16383
a27ad18beb252fcb03b6f55009d31ef1948712c0 192.168.18.201:6383@16383 slave fe75294b142f46d389d316319e19d7b7a88ad5c2 0 1669185777263 0 connected
fe75294b142f46d389d316319e19d7b7a88ad5c2 192.168.18.201:6380@16380 myself,master - 0 1669185778000 0 connected 0-5461
a1e8ba65273f2b2fa2ecad2126ec518958694fce 192.168.18.201:6385@16385 slave 2a7fcc4f117d722acf465819e209b24f773d2d54 0 1669185777000 2 connected
1f4fa08f2d35109c28ca19344ab69989138c178b 192.168.18.201:6381@16381 master - 0 1669185777000 1 connected 5462-10922

5 测试

测试1:进入redis集群(redis-cli -c 端口),检测读写的负载

[root@localhost conf]# redis-cli -c -p 6380
127.0.0.1:6380> keys *
(empty array)
127.0.0.1:6380> set user1 zhangsan                              #创建键值对实现了写的负载
-> Redirected to slot [8106] located at 192.168.18.201:6381
OK
192.168.18.201:6381> set user2 lisi
-> Redirected to slot [12233] located at 192.168.18.201:6382
OK
192.168.18.201:6382> set user3 laowang
OK
192.168.18.201:6382> set user4 laosong
-> Redirected to slot [3855] located at 192.168.18.201:6380
OK
192.168.18.201:6380> 

#不使用集群方式进入redis,查看端口redis的数据,实现了读负载
[root@localhost conf]# redis-cli -p 6380
127.0.0.1:6380> keys *
1) "user4"
[root@localhost conf]# redis-cli -p 6382
127.0.0.1:6382> keys *
1) "user3"
2) "user2"
[root@localhost conf]# redis-cli -p 6385
127.0.0.1:6385> keys *
1) "user3"
2) "user2"
测试2:故障转移,6383—》6380(备用节点在主节点故障时转为主节点)

[root@localhost conf]# netstat -anpt |grep LISTEN |grep :6380
tcp        0      0 0.0.0.0:6380            0.0.0.0:*               LISTEN      11804/redis-server  
[root@localhost conf]# kill 11804
[root@localhost conf]# netstat -anpt |grep LISTEN |grep :6380
[root@localhost conf]# redis-cli -p 6383 cluster nodes |grep :6380        #6380主节点故障
fe75294b142f46d389d316319e19d7b7a88ad5c2 192.168.18.201:6380@16380 master,fail - 1669186538391 1669186534000 0 disconnected
[root@localhost conf]# redis-cli -p 6383 cluster nodes |grep :6383        #6383替代6380成为了主节点
a27ad18beb252fcb03b6f55009d31ef1948712c0 192.168.18.201:6383@16383 myself,master - 0 1669186629000 6 connected 0-5461

#修复6380节点
[root@localhost conf]# redis-server /usr/local/redis/conf/redis-6380.conf 
[root@localhost conf]# redis-cli -p 6383 cluster nodes |grep :6380      #6380成为了6383的备用节点
fe75294b142f46d389d316319e19d7b7a88ad5c2 192.168.18.201:6380@16380 slave a27ad18beb252fcb03b6f55009d31ef1948712c0 0 1669186757000 6 connected
[root@localhost conf]# redis-cli -p 6383 cluster nodes |grep :6383      #6383任然为主节点
a27ad18beb252fcb03b6f55009d31ef1948712c0 192.168.18.201:6383@16383 myself,master - 0 1669186818000 6 connected 0-5461

注意:

集群的故障转移指挥对主节点进入故障判断,主节点故障,备用节点转移成直接点
                                  备用节点故障,只会下线处理

故障转移的时间选项(配置文件中): cluster-node-timeout  (默认值为15000ms,即15s)
        故障转移时间(毫秒) < = 1.5* cluster-node-timeout +1000

三、Mysql+Redis

redis做关系型数据库的缓存:
            降低了关系型数据库的访问压力、提高了客户端响应效率(因为redis是内存机制)

实验步骤:

准备: 6版本的Centos做实验(192.168.18.10):
    需要的素材:
            redis-mysql.php
            redis-mysql.zip

image-20221123151326369

1) 上传、解压、进入

​ 将phpredis和redis压缩包放到 /root/目录下,安装剩下的所有rpm包

    解压phpredis、redis压缩包
[root@localhost ~]# ls
anaconda-ks.cfg  ifcfg-ens33  redis-mysql.zip
[root@localhost ~]# unzip redis-mysql.zip
[root@localhost ~]# cd redis-mysql
[root@localhost redis-mysql]# mv phpredis-master.zip /root/
[root@localhost redis-mysql]# mv redis-2.8.19.tar.gz /root/
[root@localhost redis-mysql]# ls |wc -l             #检查剩下的所有都是 rpm包
49
[root@localhost redis-mysql]# ls *.rpm |wc -l
49
[root@localhost redis-mysql]# yum -y install *
[root@localhost ~]# ls
anaconda-ks.cfg  install.log  install.log.syslog  phpredis-master.zip  redis-2.8.19.tar.gz  redis-mysql  redis-mysql.zip
[root@localhost ~]# unzip phpredis-master.zip
[root@localhost ~]# tar -xf redis-2.8.19.tar.gz

2)修改配置文件

​ nginx、php-fpm(主配置文件调用了子配置文件,主配置文件默认就好)

a、nginx子配置文件:
    (域名、开启日志(指向已经存在的目录)、网页主目录,支持index.php网页主文件、php解析配置)

[root@localhost ~]# vim /etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  www.yq.com;                                #域名
    access_log  /var/log/nginx/host.access.log  main;       #开启日志(指向已经存在的目录)
    location / {
        root   /www/;                                       #网页主目录
        index  index.html index.php index.htm;              #网页主文件支持index.php
    }
。。。
    location ~ \.php$ {                                     #php解析配置
        root           /www/;                                       #网页主目录
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /www$fastcgi_script_name;   #规则
        include        fastcgi_params;
    }
}
[root@localhost ~]# mkdir /www                  #创建nginx的网页主目录


b、php-fpm子配置文件
[root@localhost ~]# vim /etc/php-fpm.d/www.conf
user = nginx
group = nginx

3)启动服务

​ 启动php-fpm、nginx、mysqld

[root@localhost ~]# service php-fpm start
正在启动 php-fpm:                                         [确定]
[root@localhost ~]# service nginx start
正在启动 nginx:                                           [确定]
[root@localhost ~]# service mysqld start
正在启动 mysqld:                                          [确定]
[root@localhost ~]# netstat -anpt |egrep ":80|:9000|:3306"
tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      1982/php-fpm        
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      2168/mysqld         
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      2022/nginx

4)设置mysql的root密码,写info.php文件

[root@localhost ~]# mysqladmin -uroot password '123456'
[root@localhost ~]# cd /www/
[root@localhost www]# vim info.php
<?php
    phpinfo();
?>

image-20221123154208071

5)安装redis

​ 进入redis安装目录,编译、安装redis

​ 生成redis目录,配置文件、并修改

​ 启动redis

[root@localhost www]# cd /root/redis-2.8.19                                             #进入redis安装目录,编译、安装redis
[root@localhost redis-2.8.19]# make && make PREFIX=/usr/local/redis/ install
[root@localhost redis-2.8.19]# cd /usr/local/redis/                                     #生成redis目录,配置文件、并修改
[root@localhost redis]# mkdir data logs conf
[root@localhost redis]# cp -a /root/redis-2.8.19/redis.conf /usr/local/redis/conf/
[root@localhost redis]# vim ./conf/redis.conf
daemonize yes
pidfile "/usr/local/redis/logs/redis.pid"
logfile "/usr/local/redis/logs/redis.log"
dbfilename "redis.rdb"
dir "/usr/local/redis/data/"
appendonly yes
appendfilename "redis.aof"
[root@localhost redis]# ln -s /usr/local/redis/bin/* /usr/local/bin/                    #创建软链接、启动redis、检查端口
[root@localhost redis]# redis-server /usr/local/redis/conf/redis.conf 
[root@localhost redis]# netstat -anpt |grep :6379
tcp        0      0 0.0.0.0:6379                0.0.0.0:*                   LISTEN      5072/redis-server * 
tcp        0      0 :::6379                     :::*                        LISTEN      5072/redis-server *

6)安装phpredis

​ 没有configure脚本,需要执行phpize生成

​ 再检查、编译、安装

​ 再让php支持redis

[root@localhost redis]# cd /root/phpredis-master
[root@localhost phpredis-master]# phpize                                                #执行phpize生成configure
Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626
[root@localhost phpredis-master]# ./configure --with-php-config=/usr/bin/php-config     #检查、编译、安装
[root@localhost phpredis-master]# make && make install
[root@localhost phpredis-master]# ls /usr/lib64/php/modules/ |grep redis.so
redis.so
[root@localhost phpredis-master]# vim /etc/php.ini                                      #让php支持redis 
extension=redis.so

7)重启服务

​ 重启php-fpm、nginx,进入php网页检查redis模块存在

[root@localhost phpredis-master]# service php-fpm restart
停止 php-fpm:                                             [确定]
正在启动 php-fpm:                                         [确定]
[root@localhost phpredis-master]# service nginx restart
停止 nginx:                                               [确定]
正在启动 nginx:                                           [确定]

image-20221123160749076

8)进入mysql创建数据

​ 创建mytest库,test表,并插图数据

(因为后续会使用给定的php网页文件,库,表,字段,类型以及密码等都是固定的)

[root@localhost ~]# mysql -uroot -p123456
mysql> create database mytest;
mysql> create table mytest.test (id int,name char(30));
mysql> insert into mytest.test values (1,'zhangsan'),(2,'lisi'),(3,'laowang'),(4,'laosong'),(5,'xiaoming');
mysql> select * from mytest.test;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | lisi     |
|    3 | laowang  |
|    4 | laosong  |
|    5 | xiaoming |
+------+----------+

测试:

​ 进入redis查看,没有数据

[root@localhost ~]# redis-cli
127.0.0.1:6379> keys *
(empty list or set)

​ 写入网页文件 /www/index.php

[root@localhost ~]# cd /www/
[root@localhost www]# vim index.php

​ 浏览器访问,数据库来源mysql

image-20221123162105213

​ redis中有产生数据

[root@localhost www]# redis-cli
127.0.0.1:6379> keys *
1) "1"
2) "4"
3) "3"
4) "2"
5) "5"

​ 浏览器再次访问,数据来源与redis

image-20221123162043714