一只小开发仔...

Docker搭建Redis集群(主从+哨兵)

288 2021-03-21 07:22:08

Redis主从

1.先拉去redis镜像

dcoker pull redis

2.编写redis配置文件

这里采取一主二从,一个主节点,两个从节点。

master-6380.conf主节点配置文件

port 6380

# logfile "redis-6381.log"
# dir /data
# appendonly yes
# appendfilename appendonly.aof

masterauth 123456
requirepass 123456

slave-6381.conf 从节点配置文件

port 6381

# logfile "redis-6381.log"
# dir /data
# appendonly yes
# appendfilename appendonly.aof

slaveof 192.168.31.154 6380

masterauth 123456
requirepass 123456

slave-6382.conf 从节点配置文件

port 6382

# logfile "redis-6382.log"
# dir /data
# appendonly yes
# appendfilename appendonly.aof

slaveof 192.168.31.154 6380

masterauth 123456
requirepass 123456

3.启动主从节点机器

docker run -d -p 6380:6380 --restart=always -v /mnt/d/Dev/redis/master-6380.conf:/etc/redis/redis.conf --name redis-6380 redis redis-server /etc/redis/redis.conf
docker run -d -p 6381:6381 --restart=always -v /mnt/d/Dev/redis/slave-6381.conf:/etc/redis/redis.conf --name redis-6381 redis redis-server /etc/redis/redis.conf
docker run -d -p 6382:6382 --restart=always -v /mnt/d/Dev/redis/slave-6382.conf:/etc/redis/redis.conf --name redis-6382 redis redis-server /etc/redis/redis.conf

4.使用Redsi Desktop Manager连接三台机器

查看主节点信息,可以看到关联了两台从节点信息slave0和slave1.

查看从节点信息,可以看到都分别关联了主节点信息master_host和master_port

5.测试下主从同步复制

主节点设置一个数据

分别在两个从节点获取

  

可以看到两个从节点都可以读取主节点设置的数据,说明Redis主从服务搭建成功。

6.Redis主从的相关知识

一般redis集群采用一主多从架构,基本能够满足大部分场景(PS:当然也有多主多从架构),即一个主节点拥有多个从节点,从节点同步复制主节点数据,一般主节点负责写数据,从节点负责读取数据。

主从同步一般分为全量同步和部分同步。

初次全量同步:

  • slave服务器向master发送psync命令(此时发送的是psync ? -1),告诉master我需要同步数据了。

  • master接收到psync命令后会进行BGSAVE命令生成RDB文件快照。

  • 生成完后,会将RDB文件发送给slave。

  • slave接收到文件会载入RDB快照,并且将数据库状态变更为master在执行BGSAVE时的状态一致。

  • master会发送保存在缓冲区里的所有写命令,告诉slave可以进行同步了

  • slave执行这些写命令。

命令复制:slave已经同步过master了,master后续操作命令执行后,会发送给slave,slave执行master发送过来的命令,最终达成数据一致性。

重新复制:当slave断开重连后进行再次同步,这包括全量同步和部分同步。

  • 全量同步:slave记录的runid与当前master不一致或runid一致但是主从偏移量不一致且偏移量之后的数据不存在缓冲区时,会进行全量同步。

  • 部分同步:主从偏移量不一致且偏移量之后的数据存在缓冲区,会进行部分同步。

Redis哨兵

哨兵,英文名 Sentinel,是一个分布式系统,用于对主从结构中的每一台服务器进行监控,当主节点出现故障后通过投票机制来挑选新的主节点,并且将所有的从节点连接到新的主节点上。

哨兵也是一台 Redis 服务器,只是不对外提供任何服务。配置哨兵时配置为单数。

哨兵的三个作用:

  • 监控:监控谁支持主从结构的工作一个是主节点一个是从节点,那肯定就是监控这俩个了。监控主节点和从节点是否正常运行;检测主节点是否存活,主节点和从节点运行情况。

  • 通知:哨兵检测的服务器出现问题时,会向其他的哨兵发送通知。

  • 自动转移故障:当检测到主节点宕机后,断开与宕机主节点连接的所有从节点,在从节点中选取一个作为主节点,然后将其他的从节点连接到这个最新主节点的上。并且告知客户端最新的服务器地址。

  • 统一的配置管理:连接者询问sentinel取得主从的地址。

1.编写三个哨兵redsi配置文件

sentinel-26380.conf,sentinel-26381.conf,sentinel-26382.conf,其他内容一样,端口换成对应的。

port 26380
# 存储哨兵工作信息目录
dir /tmp
# 监控的是谁,名字可以自定义,后边的 2 代表的是,如果有俩个哨兵判断这个主节点挂了那这个主节点就挂了,通常设置为哨兵个数一半加一
sentinel monitor master-test 193.168.31.154 6380 2
# 连接主节点的密码
sentinel auth-pass master-test 123456
# 哨兵连接主节点多长时间没有响应就代表挂了。后边 30000 是毫秒,也就是 30 秒
sentinel down-after-milliseconds master-test 30000
# 这个配置项是指在故障转移时,最多有多少个从节点对新的主节点进行同步,值越小完成故障转移的时间长,因为进行同步期间从节点不能处理命令。
sentinel parallel-syncs master-test 1
# 在进行同步的过程中,多长时间完成算有效,系统默认值是 3 分钟
sentinel failover-timeout master-test 180000

2.启动三个哨兵服务

进入其中一个哨兵,查看信息,可以看到master0,status状态OK,slaves从节点2个,sentinel哨兵3个。

3.测试哨兵

将现在的主节点6380关掉,查看哨兵信息。

docker stop redis-6380

可以看到主节点已经变更为6382了,证明哨兵已经正常工作。

再启动刚才关闭的6380节点,看看主从同步复制状态,很明显主从切换后,主从数据同步仍然正常。