03-Redis主从搭建,哨兵搭建,Cluster集群搭建

搭建提示

  • 模拟环境情况下关闭防火墙。减少问题的发生
	systemctl stop firewalld # 临时关闭防火墙
	systemctl disable firewalld # 禁止开机启动

主从搭建 一主二从测试

在这里插入图片描述

6379端口master主节点配置

port 6379
protected-mode no
# bind注释
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "6379.log"
dir /usr/local/redis‐cyz/data/6379

6380端口slave从节点配置

port 6380
protected-mode no
daemonize yes
# bind注释
pidfile /var/run/redis_6380.pid
logfile "6380.log"
dir /usr/local/redis‐cyz/data/6380
replicaof 127.0.0.1 6379 # 配置的主节点
replica‐read‐only yes # 只读

6381端口slave从节点配置

port 6381
protected-mode no
daemonize yes
# bind注释
pidfile /var/run/redis_6381.pid
logfile "6381.log"
dir /usr/local/redis‐cyz/data/6381
replicaof 127.0.0.1 6379 # 配置的主节点
replica‐read‐only yes # 只读

依次启动即可

redis-server redis-6379.conf 
redis-server redis-6380.conf 
redis-server redis-6381.conf 

主节点中可以通过info看到从节点的信息
在这里插入图片描述
在这里插入图片描述
从节点中info也能看到对应的主节点信息
在这里插入图片描述

哨兵模式的搭建

在上方主从的基础上多进行三个哨兵的配置。
在这里插入图片描述

redis目录下还有一个sentinel.conf文件,即为哨兵配置的文件
哨兵26379配置

port 26379
daemonize yes
pidfile "/var/run/redis‐sentinel‐26379.pid"
logfile "26379.log"
dir "/usr/local/redis‐cyz/data"
# 重点是这个 sentinel monitor + 名称(随便起)客户端调用会用到 + 数量时(值一般为:sentinel总数/2 + 1) 即为当选举时多少个哨兵同意才决定master失效
sentinel monitor mymaster 127.0.0.1 6379 2

哨兵26380配置

port 26380
daemonize yes
pidfile "/var/run/redis‐sentinel‐26380.pid"
logfile "26380.log"
dir "/usr/local/redis‐cyz/data"
# 重点是这个 sentinel monitor + 名称(随便起)客户端调用会用到 + 数量时(值一般为:sentinel总数/2 + 1) 即为当选举时多少个哨兵同意才决定master失效
sentinel monitor mymaster 127.0.0.1 6379 2

哨兵26381配置

port 26381
daemonize yes
pidfile "/var/run/redis‐sentinel‐26381.pid"
logfile "26381.log"
dir "/usr/local/redis‐cyz/data"
# 重点是这个 sentinel monitor + 名称(随便起)客户端调用会用到 + 数量时(值一般为:sentinel总数/2 + 1) 即为当选举时多少个哨兵同意才决定master失效
sentinel monitor mymaster 127.0.0.1 6379 2

启动哨兵

redis‐sentinel sentinel‐26379.conf
redis‐sentinel sentinel‐26380.conf
redis‐sentinel sentinel‐26381.conf

进入哨兵中info即可看到对应的信息
在这里插入图片描述
在这里插入图片描述
此时在打开哨兵的conf文件中会看到
在这里插入图片描述
6380,6380 感知到的两个从节点 26380 26381即为感受到的其他的哨兵,如果选举后主节点改变这个地方的配置也将会改变。且
在这里插入图片描述
也会变为对应新的主节点的地址

Cluster集群

三个一主一从的构成一个集群(大概架构如,具体端口可能不同)

在这里插入图片描述

8001~8006的配置文件 其中不同的只要数字就该即可

daemonize yes
port 8001
pidfile /var/run/redis_8001.pid
dir /usr/local/redis‐cluster/8001/
cluster‐enabled yes #以集群方式启动
cluster‐config‐file nodes‐8001.conf #(集群节点信息文件,这里800x最好和port对应上)
cluster‐node‐timeout 10000 #断线等待的时间 不要设置太少 不然微微波动都要选举
protected‐mode no
appendonly yes
requirepass zhuge #(设置redis访问密码)
masterauth zhuge #(设置集群节点间访问密码,跟上面一致)

接下来启动这6个节点,可以看到是以cluster启动的

redis-server redis-800x.conf

在这里插入图片描述
执行脚本构建命令(关键)

redis-cli -a chenke --cluster create --cluster-replicas 1 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 127.0.0.1:8004 127.0.0.1:8005 127.0.0.1:8006
  • -a 配置文件中设置的集群互相访问的密码
  • –cluster create --cluster-replicas 1 1代表为每个创建的主服务器节点创建一个从服务器节点
  • 后面的ip 默认排在前面会作为master
  • 如果启动后关机了再想启动节点 直接运行每个节点即可。配置文件中已有记录

执行后
在这里插入图片描述
有一个分段0~16383,会把平均分给每一个主从结构。在存入key的时候,会根据根据key进行hash判断存放在哪个主从redis中。下面的M : 代表master S:代表slaves 可以根据id看谁是谁的从机。正常情况下好多个机器,主从一般不会在同一个服务器。不然一个服务器挂了这个主从全挂了。输入yes集群创建成功

向集群中存储数据

#以集群的方法访问客户端 -a 密码 - c 表示集群模式 随便反问一个主节点都可以
redis-cli -a chenke -c -h 127.0.0.1 -p 8001

在这里插入图片描述
随便存储一个key 如果key不在当前的节点,存储后会自动跳转那个节点。这里就从8001跳到8002

查看集群的信息

cluster info(查看集群信息)、cluster nodes(查看节点列表)

在这里插入图片描述
关闭集群

redis‐cli ‐a chenke ‐c ‐h 127.0.0.1 ‐p 800* shutdown

或者直接kill -9 也行

Cluster集群的水平的扩容和缩容

扩容

1. 先创建两个redis服务8007和8008

daemonize yes
port 800*
pidfile /var/run/redis_800*.pid
dir /usr/local/redis‐cluster/800*/
cluster‐enabled yes #以集群方式启动
cluster‐config‐file nodes‐800*.conf #(集群节点信息文件,这里800x最好和port对应上)
cluster‐node‐timeout 10000 #断线等待的时间 不要设置太少 不然微微波动都要选举
protected‐mode no
appendonly yes
requirepass zhuge #(设置redis访问密码)
masterauth zhuge #(设置集群节点间访问密码,跟上面一致)

2. 启动服务

redis-server redis-800*.conf

3. 执行脚本先将8007添加到集群中

# -a 密码 8007将要添加进集群的端口 后面加上任意一个在集群中的端口
redis-cli -a chenke --cluster add-node 127.0.0.1:8007 127.0.0.1:8001

在这里插入图片描述
虽然加入到了集群却没有分配空间

4. 重新分配空间给新节点

# 找到任意一个集群中的主节点 进行分片
redis-cli -a chenke --cluster reshard 127.0.0.1:8001

将会提示以下信息 根据需求输入

How many slots do you want to move (from 1 to 16384)?   1000
(ps:需要多少个槽移动到新的节点上,自己设置,比如1000个hash槽)
What is the receiving node ID?    78f7e61a84d449587fd7a7ed92c1597619599e79
(ps:把这600个hash槽移动到哪个节点上去,需要指定节点id)
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node 1:all
(ps:输入all为从所有主节点(8001,8002,8003)中分别抽取相应的槽数指定到新节点中,抽取的总槽数为600个)
Do you want to proceed with the proposed reshard plan (yes/no)? yes
(ps:输入yes确认开始执行分片任务)

在这里插入图片描述
执行后发现已经有分片了。这个分片内的数据也会直接转移到新节点中

5. 将8008服务也添加到节点中

redis-cli ‐a chenke ‐‐cluster add‐node 127.0.0.1:8008 127.0.0.1:8001

在这里插入图片描述
发现第一次添加进来的8008也是主节点

6. 将8008设置为8007的主节点

# 先进入8008客户端执行
CLUSTER REPLICATE 78f7e61a84d449587fd7a7ed92c1597619599e79 #8007的节点id

在这里插入图片描述
完成集群的扩容

缩容

1. 先删除从节点8008

# 后面加上ip端口 以及对应的id
redis-cli -a chenke --cluster del-node 127.0.0.1:8008 c1873771acb88f98d4ba5d2c960f0dfb14c9ec5c

在这里插入图片描述
发现8008以及移除,且服务停止

2. 删除节点8007
因为是8007是主节点,直接删除会造成数据丢失,要先转移数据

# 这里要加上8007
redis-cli -a chenke --cluster reshard 127.0.0.1:8007
How many slots do you want to move (from 1 to 16384)? 1000
What is the receiving node ID? 7929edbc7f2c04dca5135d6c92252ca1cc836784
(ps:这里是需要把数据移动到哪?8001的主节点id)
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node 1:78f7e61a84d449587fd7a7ed92c1597619599e79
(ps:这里是需要数据源,也就是我们的8007节点id)
Source node 2:done
(ps:这里直接输入done 开始生成迁移计划)
... ...
Do you want to proceed with the proposed reshard plan (yes/no)? Yes
(ps:这里输入yes开始迁移)

迁移后再删除8007节点即可

redis-cli -a chenke --cluster del-node 127.0.0.1:8007 78f7e61a84d449587fd7a7ed92c1597619599e79

集群原理分析

主从复制原理(完整)

在这里插入图片描述
如果你为master配置了一个slave,不管这个slave是否是第一次连接上Master,它都会发送一个PSYNC
命令给master请求复制数据。master收到PSYNC命令后,会在后台进行数据持久化通过bgsave生成最新的rdb快照文件,就算master没有开启rdb,在主从同步数据的时候也会自动调用bgsave命令。持久化期间,master会继续接收客户端的请求,它会把这些可能修改数据集的请求缓存在内存中。当持久化进行完毕以后,master会把这份rdb文件数据集发送给slave,slave会把接收到的数据进行持久化生成rdb,然后再加载到内存中。然后,master再将之前缓存在内存中的命令发送给slave。当master与slave之间的连接由于某些原因而断开时,slave能够自动重连Master,如果master收到了多个slave并发连接请求,它只会进行一次持久化,而不是一个连接一次,然后再把这一份持久化的数据发送给多个并发连接的slave。

主从复制原理(断点)

在这里插入图片描述
当master和slave断开重连后,一般都会对整份数据进行复制。但从redis2.8版本开始,redis改用可以支
持部分数据复制的命令PSYNC去master同步数据,slave与master能够在网络连接断开重连后只进行部分
数据复制(断点续传)。master会在其内存中创建一个复制数据用的缓存队列,缓存最近一段时间的数据,master和它所有的slave都维护了复制的数据下标offset和master的进程id,因此,当网络连接断开后,slave会请求master继续进行未完成的复制,从所记录的数据下标开始。如果master进程id变化了,或者从节点数据下标offset太旧,已经不在master的缓存队列里了,那么将会进行一次全量数据的复制。如下图对应上图的第五步逻辑
在这里插入图片描述

主从复制风暴

一个主节点如果有太多的从节点,每次同步数据实际上都是和主节点连接。会导致压力太大。可以优化
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值