主从哨兵模式含集群

虚拟机的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值