虚拟机的IP地址:192.168.244.128----------------------------本地地址:127.0.0.1
http://www.redis.cn/
https://www.cnblogs.com/leeSmall/p/8398401.html
https://www.cnblogs.com/51life/p/10233340.html
https://www.cnblogs.com/xichji/p/11286443.html
https://www.cnblogs.com/xrq730/p/11039384.html
https://www.cnblogs.com/Junsept/p/7459488.html
https://blog.csdn.net/ThinkWon/article/details/103522351?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5.channel_param
https://blog.csdn.net/mingyuli/article/details/120574316
Redis有三种集群方式:主从复制,哨兵模式和集群
一、Redis主从复制:主节点负责写数据,从节点负责读数据,主节点定期把数据同步到从节点保证数据的一致性
./redis-server /opt/redis/etc/redis.conf
1. 主从复制的相关操作
master配置修改端口:redis.conf
port 6379
requirepass 123456
masterauth 123456 (下次作为从服务器登录主服务器密码)
slave1修改配置: s1.conf vi redis6380.conf
port 6380
replicaof 192.168.174.132 6379 (5.x) | slaveof 192.168.174.132 6379
requirepass 123456
masterauth 123456
pidfile "/var/run/redis_6380.pid"
replica-read-only yes #从服务器默认只读,从服务写会造成主从不一致
slave2修改配置: s2.conf
port 6381
replicaof 127.0.0.1 6379|6380(slave1的从服务器)
requirepass 123456
masterauth 123456
pidfile "/var/run/redis_6381.pid"
requirepass是认证密码,之后要作主从切换,所以建议所有的密码都一致, masterauth是从机对主机验证时,所需的密码。(即主机的requirepass)
启动主机:
redis-server redis.conf
关闭机器: kill -9 PID
redis-cli -p 端口号 shutdown
启动从机:
redis-server s1.conf
redis-server s2.conf
验证主从复制:
master:
[root@localhost master]# redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> set test chenqm
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=2559,lag=0
slave1:ip=127.0.0.1,port=6381,state=online,offset=2559,lag=0
......
slave1:
[root@localhost slave2]# redis-cli -p 6380
127.0.0.1:6380> auth 123456
OK
127.0.0.1:6380> get test
"chenqm"
slave2:
[root@localhost slave2]# redis-cli -p 6381
127.0.0.1:6381> auth 123456
OK
127.0.0.1:6381> get test
"chenqm"
切换主从:80 81 82
主节点shutdown后,将从节点转换成为主节点
127.0.0.1:6380> slaveof no one (4.x版本) | replicaof no one (5.x版本)
将当前服务器转变为某一服务器的副本服务器
127.0.0.1:6381> slaveof 127.0.0.1 6380 (4.x版本)| replicaof 192.168.174.131 6380 | replicaof localhost 6380
2. Redis主从拓扑
a)一主一从:用于主节点故障转移从节点,当主节点的“写”命令并发高且需要持久化,可以只在从节点开启AOF(主节点不需要),这样即保证了数据的安全性,也避免持久化对主节点的影响
b)一主多从:针对“读”较多的场景,“读”由多个从节点来分担,但节点越多,主节点同步到多节点的次数也越多,影响带宽,也加重主节点的不稳定
c)树状主从:一主多从的缺点(主节点推送次数多压力大)可用些方案解决,主节点只推送一次数据到从节点B,再由从节点B推送到C,减轻主节点推送的压力。
3. 数据同步
redis 2.8版本以上使用psync命令完成同步,过程分“全量”与“部分”复制
全量复制:一般用于初次复制场景(第一次建立SLAVE后全量)
部分复制:网络出现问题,从节点再次连接主节点时,主节点补发缺少的数据,每次数据增量同步
心跳:主从有长连接心跳,主节点默认每10S向从节点发ping命令,repl-ping-slave-period控制发送频率
4. 主从的缺点
a)主从复制,若主节点出现问题,则不能提供服务,需要人工修改配置将从变主
b)主从复制主节点的写能力单机,能力有限
c)单机节点的存储能力也有限
5.主从故障如何故障转移
a)主节点(master)故障,从节点slave-1端执行 slaveof|replicaof no one后变成新主节点;
b)其它的节点成为新主节点的从节点,并从新节点复制数据;
c)需要人工干预,无法实现高可用。
二、哨兵模式:
万一主机挂了,redis提供了一个sentinel(哨兵),以此实现主从切换的功能,类似zookeeper
哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例
1、通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
2、当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。
3、一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。
配置sentinel:
vi sentinel.conf:
port 26379
sentinel monitor mymaster 192.168.174.131 6379 1
sentinel auth-pass mymaster 123456
daemonize yes
protected-mode no
#哨兵服务端口
port 26379
#哨兵监控的master,当集群中有超过一半以上及2个(quorum)sentinel认为master死了时,才能真正认为该master已经不可用了【注意这里ip不能写127.0.0.1,否则将来程序也会去找127.0.0.1】
sentinel monitor mymaster 192.168.174.131 6379 2 (quorum)
#设置master和slave验证密码(sentinel不能分别为master和slave设置不同的密码,因此master和slave的密码应该设置相同)
sentinel auth-pass mymaster 123456
#守护进程模式
daemonize yes
#关闭保护模式
protected-mode no
#master或slave多长时间(默认30秒)不能使用后标记为s_down状态。
sentinel down-after-milliseconds mymaster 30000
#从节点执行replicaof no one命令一直失败的话,当时间超过18S时则故障转移失败
sentinel failover-timeout mymaster 18000
1、启动sentinel服务(到对应的目录(src)执行相应的命令):
./redis-sentinel ../sentinel.conf
注意启动的顺序:首先主机服务,然后启动从机服务,最后启动哨兵服务
2、关闭master进程:kill -9 6379 (使用shutdown退出有时候不能修改配置文件)
3、查看客户端
master切换了,当6379端口的这个服务重启的时候,他会变成slave。
因为sentinel在切换master的时候,把对应的sentinel.conf和redis.conf文件的配置修改。
4、多哨兵模式下选举
http://www.sohu.com/a/318236060_100149956
这个选举的大体思路是:
每个哨兵节点通过向其他哨兵节点发送”sentinel is-master-down-by addr”命令来申请成为哨兵领导者。
而每个哨兵节点在收到一个”sentinel is-master-down-by addr”命令时,只允许给第一个节点投票,其他节点的该命令都会被拒绝。
如果一个哨兵节点收到了半数以上的同意票半且超过它配置的quorum的票数,则成为哨兵领导者。
哨兵模式的优缺点:
优点:
哨兵模式是基于主从模式的,所有主从的优点,哨兵模式都具有。
主从可以自动切换,系统更健壮,可用性更高。
缺点:
Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。
三、Redis-Cluster集群
https://blog.csdn.net/fst438060684/article/details/80712433
https://blog.csdn.net/qq_36514588/article/details/83856795
https://blog.csdn.net/weixin_42440345/article/details/95048739
redis的哨兵模式基本已经可以实现高可用,读写分离,但是在这种模式下每台redis服务器都存储相同的数据,浪费内存,
所以在Redis3.0上加入了cluster模式,实现的redis的分布式存储,也就是说每台redis节点上存储不同的内容。
搭建集群创建cluster目录,分别配置多个redis.conf,官方建议至少3主3从
先清空全部redis的原始数据
清理数据:redis-cli flushdb
redis.conf:
daemonize yes #redis后台运行
pidfile /var/run/redis_6000.pid #pidfile文件对应6000,6001,6002
port 6000 #端口6000,6001,6002
cluster-enabled yes #开启集群 把注释#去掉
cluster-config-file nodes_6000.conf #集群的配置 配置文件首次启动自动生成
cluster-node-timeout 5000 #请求超时 设置5秒够了
masterauth 123456
requirepass 123456
protected-mode no
#编写启动脚本 vi sb.sh
#!/bin/bash
./redis-server /opt/redis/etc/cluster/redis7000.conf
./redis-server /opt/redis/etc/cluster/redis7001.conf
./redis-server /opt/redis/etc/cluster/redis7002.conf
./redis-server /opt/redis/etc/cluster/redis7003.conf
./redis-server /opt/redis/etc/cluster/redis7004.conf
./redis-server /opt/redis/etc/cluster/redis7005.conf
Redis5.0开始不再使用ruby搭建集群,使用命令redis-cli:(注意不要写127.0.0.1)
#创建集群 先要删除redis的数据========>
redis-cli --cluster create 192.168.88.144:7000 192.168.88.144:7001 192.168.88.144:7002 192.168.88.144:7003 192.168.88.144:7004 192.168.88.144:7005 -a 123456 --cluster-replicas 1
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
replicas 1 表示我们希望为集群中的每个主节点创建一个从节点
./redis-cli --cluster create 192.168.88.149:7000 192.168.88.149:7001 192.168.88.149:7002 192.168.88.149:7003 192.168.88.149:7004 192.168.88.149:7005 --cluster-replicas 1
./redis-cli --cluster create 192.168.88.152:7000 192.168.88.152:7001 192.168.88.152:7002 192.168.88.152:7003 192.168.88.152:7004 192.168.88.152:7005 --cluster-replicas 1
./redis-cli --cluster create 192.168.88.155:7000 192.168.88.155:7001 192.168.88.155:7002 192.168.88.155:7003 192.168.88.155:7004 192.168.88.155:7005 --cluster-replicas 1
如果需要手动挂载从节点:
redis-cli --cluster add-node 192.168.174.131:6003 192.168.174.131:6000 --cluster-slave
创建集群出错:[ERR] Node xxxxx is not empty. Either the node already knows other nodes (check with CLUSTER NODES)
解决方法:
1)、停止所有redis进程,将需要新增的节点下aof、rdb等本地备份文件删除;
2)、同时将新Node的集群配置文件删除,即:删除你redis.conf里面cluster-config-file所在的文件,一般为nodes.conf;
3)、再次添加新节点如果还是报错,对数据库进行清除:
192.168.174.131:6000> flushdb
#添加端口
firewall-cmd --zone=public --add-port=6380/tcp --permanent (永久)
#查看所有打开的端口:
firewall-cmd --zone=public --list-ports
#重新载入
firewall-cmd --reload
vi openport.sh
#!/bin/bash
firewall-cmd --zone=public --add-port=7000/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --add-port=7001/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --add-port=7002/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --add-port=7003/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --add-port=7004/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --add-port=7005/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports
测试:
打开端口为6000的客户端 查看:
[root@localhost master]# redis-cli -c -p 6000 -a 123456
127.0.0.1:6000> cluster info
127.0.0.1:6000> set id 111
-> Redirected to slot [7568] located at 127.0.0.1:6002
OK
127.0.0.1:6002> get id
"122"
---------------获取数据
./redis-cli -c -h 192.168.88.151 -p 7000
https://blog.csdn.net/qq_41432730/article/details/121591008