redis的集群、主从复制、CAP、paxos

redis单机、单节点、单实例

问题:

1.单点故障

2.容量有限

3.压力

 

 

 看图复习

 

解决办法:AKF

X: 全量、镜像

Y: 业务、功能

Z: 优先级、逻辑再拆分

x: x轴解决压力问题,x轴增加多台主从机器,主机写,从机读取,环节了压力
Y: y轴解决容量问题,相当于微服务分库,按照业务进行拆分
z: Z轴是数据无法在进行拆分时,那么就进行数据范围拆分,比如1-1000万一个redis,一千万到两千万一个reids,以此类推等等

 

 

 

一变多会遇到的问题?

1.数据一致性问题
    a.所有节点阻塞直到数据一致、强一致性、破坏可用性
    b.本来一边多的目的就是解决可用性,为了数据一致性又破坏可用性,矛盾
    c.容忍数据丢失一部分
    d.异步发送、第一个redis发送kafka(可靠、集群、响应速度快)、当地一个挂掉、另外备用的顶上去、数据从kafka中拿(最终数据一致性)

主备和主从概念:
https://www.cnblogs.com/tankblog/p/11190598.html

 

 

 

 

通过AKF、一变多(主备)

问题:怎么保持数据一致性?

强一致性破坏可用性。原:为什么一变多,解决可用性。(矛盾)

1.容忍数据丢失一部分

2.异步发送、第一个redis发送kafka(可靠、集群、响应速度快)、当第一个挂掉、另外备用的顶上去,数据从kafka中拿

 

 

 

redis一般使用主从、那么主又有单点故障、所以需要对主做HA(高可用)

主:并不是不允许挂掉、而是当主挂掉、来一个服务顶掉挂掉的主,对外是一种没有挂掉的感觉。

 

所以主需要一个程序监控。

 

一个程序:也有单点故障的问题。

 

监控:只需要一部分决策成功即可(弱一致性 1或2个) 1:统计不准确,比如网络不通、出现脑裂现象,因为一个决策,一说ok,一个说不ok,第三个已经不重要了

2:解决脑裂问题、

 

集群配置

条件:在utils目录下执行 ./install_server.sh

第一次: 选择默认6379
第二次: 输入6380
第三次: 输入6381

目录:/etc/redis 生成三个配置文件:6379.conf、6380.conf、6381.conf

为了查看日志方便修改: 1.daemonize no 2.禁止日志路径


启动:
redis-server ./6379.conf
redis-server ./6380.conf
redis-server ./6381.conf

人工选主:redis-cli -p 6379、6380、6381 进入三台redis
5.0以前是:slaveof 127.0.0.1 6379
5.0以后是:replicaof 1270.0.1 6379

现象:
1. 6380和6381的redis内容和6379内容一致
2. 6380和6381的redis启动日志 a.flush本地内容、b.生成唯一id c.copy on write数据

当主6380挂掉

6381和6382一直循环出现: Connecting to MASTER 127.0.0.1:6380 MASTER <-> REPLICA sync started Error condition on socket for SYNC: Connection refused

so:需要哨兵进行维护

 

其他: 

replica-serve-stale-data yes 数据同步完才可以处理
replica-read-only yes 同步后,从机仅读取数据
repl-diskless-sync no 数据同步走网络IO,还是磁盘IO(网络IO直接通过网络发送,磁盘IO是先写到rdb文件,在通过网络IO发送)
repl-backlog-size 1mb  每次复制数据的大小
#增量复制

min-replicas-to-write 3
min-replicas-max-lag 10 最少3台写成功、最多10台写成功(默认注掉的,这个配置项数据一致性靠拢)

  

 

 

哨兵自动选主

哨兵1: 26379.conf
port 26379
sentinel monitor mymaster 127.0.0.1 6379 1

哨兵2: 26380.conf
port 26380
sentinel monitor mymaster 127.0.0.1 6380 2

哨兵3: 26381.conf
port 26381
sentinel monitor mymaster 127.0.0.1 6381 3


开启主从集群:
1.redis-server ./6379.conf
2.redis-server ./6380.conf --replicaof 127.0.0.1 6380
3.redis-server ./6381.conf --replicaof 127.0.0.1 6381


开启监控:
redis-server ./26379.conf --sentinel
redis-server ./26380.conf --sentinel
redis-server ./26381.conf --sentinel

结论:
1.哨兵监控到了6379、6380、6381
2.也监控到了其他哨兵
3.哨兵会动配置文件,往26379、26380、26381配置文件加入监控到的其他哨兵信息
4.通过发布订阅发现其他哨兵( PSUBSCRIBE *可以查看)
"127.0.0.1,26381,e48a67a20bb64588c9bbc98826cae61dd2906b3e,6,mymaster,127.0.0.1,6381,0"
1) "pmessage"
2) "*"
3) "__sentinel__:hello"
4) "127.0.0.1,26380,ec6e1806cf9c782acec81397aa65b3870b7900f6,6,mymaster,127.0.0.1,6380,0"
1) "pmessage"
2) "*"
3) "__sentinel__:hello"
一直在相互发送信息hello

  

原文地址:https://www.cnblogs.com/bigdata-familyMeals/p/14295927.html