redis 主从及哨兵搭建

主从(replication)

Redis 中,主从复制是一种常用的高可用性和负载均衡机制。

主节点(Master):

    • 主节点是处理所有写操作的节点。
    • 它接收客户端的写入请求,并将这些请求的数据变更传播到从节点。
  1. 从节点(replica):
    • 从节点负责从主节点接收数据变更,并将这些变更应用到自己本地的数据。
    • 从节点可以处理读取请求,从而分担主节点的读负载。
主从搭建

这里以在同一台机器上起两个不同的redis服务来进行主从搭建演示。

在redis的安装目录src下找到redis.conf文件复制两份用于搭建主从测试

cp redis.conf redis_6380.conf
cp redis.conf redis_6381.conf

修改conf一些相关基础配置,这里就不多说了,详情参见前面的安装配置的文章,主要是修改端口,进程文件,数据文件,后台保护模式等待。这里注意下如果你是在两台机器上搭建主从,记得一定要修改

bind 0.0.0.0

默认是bind 127.0.0.1不允许远程访问,没办法进行远程复制。

6380和6381两个conf配置文件分别用vim打开,执行全局替换

%s/6379/6380/gc
%s/6379/6381/gc

主要修改绑定端口,进程文件和数据文件目录。

假设6380配置是主,6381是从,则在redis_6381.conf文件增加如下配置

replicaof 127.0.0.1 6380

replicaof 设置从节点需要连接的主节点的ip和端口信息。如果主节点需要密码认证可以使用masterauth 来设置主节点的密码。

分别启动主从服务

./src/redis-server redis_6380.conf
./src/redis-server redis_6381.conf

使用redis-cli分别连接主从服务查控replication信息

主节点6380:

> ./redis-cli -p 6380
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=238,lag=0
master_replid:bb06a9f49f3e3b6b5042194c7870c0fd7ae86cc7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:238
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:238

从节点6381:

> ./redis-cli  -p 6381
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:280
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:bb06a9f49f3e3b6b5042194c7870c0fd7ae86cc7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:280
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:280

可以看到6381已经是6380的从节点。

数据测试

主节点设置一个key

127.0.0.1:6380> set name repl
OK

从节点查看

#主节点设置前查看,库中无数据
127.0.0.1:6381> keys *
(empty list or set)
#主节点设置后查看,能同步获取到主节点设置的key数据信息
127.0.0.1:6381> keys *
1) "name"
127.0.0.1:6381> get name
"repl"

这里尝试下在从节点修改数据信息

127.0.0.1:6381> set name repl1
(error) READONLY You can't write against a read only replica.

报错,意思当前节点是一个只读的从节点,不能数据写入,只能从主节点同步。

这个配置可以使用replica-read-only参数进行配置,默认情况下是只读

replica-read-only yes
主从切换

先将从节点原来配置的主节点置空

127.0.0.1:6381> REPLICAOF no one
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:0
master_replid:76c0375f86e381d93677ab44cd731eb8f3aaa12c
master_replid2:bb06a9f49f3e3b6b5042194c7870c0fd7ae86cc7
master_repl_offset:29666
second_repl_offset:29667
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:29666

这时候查看当前从节点的角色变成了master。

将主节点切换为6382

127.0.0.1:6381> REPLICAOF 127.0.0.1 6382
OK
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6382
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:95a3db6df3919eee7f13af412802030f3ce25059
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14
127.0.0.1:6381> keys *
(empty list or set)

使用REPLICAOF命令将主节点切换为6382后,这时候查看当前节点又变为了从节点。原先从6380复制的数据信息也随之清空,因为6382现在是空库。

注意一点,使用REPLICAOF命令切换主从节点复制信息,不会保存到conf配置文件中,当前服务重启后还是按原来的conf配置进行服务主从的设定。

哨兵(Sentinel)

上面主从模式主从切换需要人工手动进行主从的切换,如果redis主节点出现故障,需要有对应的监控机制和人工处理,时间上可能也会造成服务一段时间不可用。redis还提供了一种哨兵模式用来检查主从中主节点的状态。Redis Sentinel 提供高可用性和自动故障转移功能。它能监控主节点和从节点的状态,自动检测故障,并在必要时将一个从节点提升为新的主节点,以确保系统的持续运行和数据一致性。

哨兵搭建

准备好三个redis服务 6380、6381、6382。其中6380主。

sentinel服务和redis主服务是独立的,有一套单独的配置和启动命令

sentinel.conf配置文件也在redis安装目录下,复制三份

sentinel_26380.conf、sentinel_26381.conf、sentinel_26382.conf

修改对应配置

port 26380
daemonize yes
pidfile "/var/run/redis‐sentinel‐26380.pid"
logfile "26379.log"	
dir data/26380

除了基础的配置,还有这里要配置哨兵连接的的主节点信息

sentinel monitor mymaster 127.0.0.1 6380 2

sentinel monitor命令:

sentinel monitor

master-name:用来设置主节点的名称

ip:用来指定主节点的IP

redis-port:用来指定主节点的端口

quorum:是仲裁数,出席人数意思。只有当至少有 quorum 数量的哨兵确认主节点不可用时,哨兵系统才会启动主节点选举过程。

如果主节点设置了密码,可以使用sentinel auth-pass设置连接命令

sentinel auth-pass <master-name> <password>

启动三个sentinel

> ./src/redis-sentinel sentinel_26380.conf
> ./src/redis-sentinel sentinel_26381.conf
> ./src/redis-sentinel sentinel_26382.conf

连接sentinel,查看信息

>./src/redis-cli -p 26380
127.0.0.1:26380> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6380,slaves=2,sentinels=3

这里看到master0其中

name=mymaster 表示master名称

status=ok master当前状态正常

address=127.0.0.1:6380 表示master的地址

slaves=2 表示当前master有2个从节点

sentinels=3 表示当前master有三个sentinels连接

这个时候如果将6380主节点关闭。观察sentinel信息

> ./src/redis-cli -p 6380
127.0.0.1:6380> shutdown
not connected> quit
> ./src/redis-cli -p 26380
127.0.0.1:26380> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6381,slaves=2,sentinels=3

这里看到sentinel自动进行故障转移,将master切到了6381。

为什么这里slaves=2呢,6380已经关闭了。这里查看slave详情

127.0.0.1:26380> sentinel slaves mymaster
2)  1) "name"
    2) "127.0.0.1:6380"
    3) "ip"
    4) "127.0.0.1"
    5) "port"
    6) "6380"
    7) "runid"
    8) ""
    9) "flags"
   10) "s_down,slave,disconnected"
...

这里可以看到6380状态是down,也被算成一个slave,虽然当前服务不可用。

再次启动6380

./src/redis-server redis_6380.conf
./src/redis-cli -p 6380
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6381
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:269051
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:c62dafc2e72c3c958b7676c8e361b902c4d6c23e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:269051
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:252159
repl_backlog_histlen:16893

这里6380重启后自动变成了6381的从节点。

这里看到sentinel可以自动完成主从的切换,可以查看sentinel的日志来查看切换的过程。

sentinel常用命令:

使用redis-cli连接到sentinel服务后,可以使用sentinel命令来查看和维护当前sentinel信息

SENTINEL MASTER 查看某个主节点的状态和信息

SENTINEL SENTINELS 查看某个主节点的所有sentinel信息

SENTINEL MASTERS 查看当前sentinel监控的所有主节点信息

SENTINEL FAILOVER 手动对某个节点进行故障转移

更多命名参见官网说明: sentinel commands

参数配置:

除了上面的指定监控主节点和主节点密码命令,还有许多参数可以配置

sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1

sentinel down-after-milliseconds

指定 Sentinel 判定主节点为“不可用”的时间阈值(毫秒),即主节点多长时间内不可用,sentinel会判定当前主节点不可用。

sentinel failover-timeout

设定故障转移的超时时间,默认是3分钟 180000毫秒。 它设定了 Sentinel 等待故障转移过程完成的最长时间。如果在这个时间内故障转移未完成,Sentinel 将会终止当前操作并重新尝试故障转移。这个时间段包括从检测到主节点故障到将新的主节点提升为主节点的整个过程。

sentinel parallel-syncs

定义了在故障转移过程中,Redis Sentinel 允许同时进行的从节点同步数量。这意味着在故障转移期间,可以有多少个从节点并行地从新的主节点进行数据同步。设置适当的并行同步数量可以优化故障转移的速度和效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值