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 #指定主备

实验步骤:
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

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();
?>

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: [确定]

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

redis中有产生数据
[root@localhost www]# redis-cli
127.0.0.1:6379> keys *
1) "1"
2) "4"
3) "3"
4) "2"
5) "5"
浏览器再次访问,数据来源与redis
