redis集群

redis集群

m-s架构

1.准备配置文件

[root@VM-8-7-centos ~]# cp redis.conf  ./redis6380.conf #准备配置文件
[root@VM-8-7-centos ~]# cp redis.conf  ./redis6381.conf #准备配置文件
[root@VM-8-7-centos ~]# cp redis.conf  ./redis6382.conf #准备配置文件

2、修改参数

[root@VM-8-7-centos conf]# vim redis6380.conf
##########################6380#########################
port 6380 #修改端口
pidfile /var/run/redis6380.pid #修改pid 文件名
dbfilename dump6380.rdb # 修改rdb文件位置
logfile '' #为空可以不修改否则就要修改
[root@VM-8-7-centos conf]# vim redis6381.conf
##########################6381#########################
port 6381 #修改端口
pidfile /var/run/redis6381.pid #修改pid 文件名
dbfilename dump6381.rdb # 修改rdb文件位置
logfile '' #为空可以不修改否则就要修改
[root@VM-8-7-centos conf]# vim redis6382.conf
##########################6382#########################
port 6382 #修改端口
pidfile /var/run/redis6382.pid #修改pid 文件名
dbfilename dump6382.rdb # 修改rdb文件位置
logfile '' #为空可以不修改否则就要修改

3、设置master 需要修改slave的配置文件指定从哪个机器获取数据

[root@VM-8-7-centos conf]# vim redis6381.conf
##########################6381#########################
replicaof 127.0.0.1 6380 #指定master ip port
[root@VM-8-7-centos conf]# vim redis6382.conf
##########################6382#########################
replicaof 127.0.0.1 6380 #指定master ip port

4、启动集群

[root@VM-8-7-centos ~]# ../src/redis-server redis6380.conf # 启动master
[root@VM-8-7-centos ~]# ../src/redis-server redis6381.conf # 启动slave
[root@VM-8-7-centos ~]# ../src/redis-server redis6382.conf # 启动slave

5、进入客户端查看集群状态

================================6380==============================================
[root@VM-8-7-centos ~]# ./redis-6.0.6/src/redis-cli -p 6380
127.0.0.1:6380> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=4423,lag=0 # slave信息
slave1:ip=127.0.0.1,port=6382,state=online,offset=4423,lag=1 # slave信息
master_replid:aea1b82abf7dde199b0b8dbd32339f7de7ded19c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:4423
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:4423
127.0.0.1:6380>
================================6381==============================================
[root@VM-8-7-centos ~]# ./lch/redis-6.0.6/src/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:168
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:aea1b82abf7dde199b0b8dbd32339f7de7ded19c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:168
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:168
127.0.0.1:6381> get name
"123"
127.0.0.1:6381>
================================6382==============================================
[root@VM-8-7-centos ~]# ./lch/redis-6.0.6/src/redis-cli -p 6382
127.0.0.1:6382> INFO replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:168
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:aea1b82abf7dde199b0b8dbd32339f7de7ded19c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:168
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:154

6、测试

================================master=========================================
127.0.0.1:6380> set name zhngsan
OK
127.0.0.1:6380> get name
"zhngsan"
127.0.0.1:6380>
================================slave=========================================
127.0.0.1:6381> get name #slave可以获取master的数据
"zhngsan"
127.0.0.1:6381> set age 12 # salve默认不可以写数据
(error) READONLY You can't write against a read only replica.
127.0.0.1:6381>

7、复制原理

  • slave 连接到master以后会发布一个sync命令,Master接到命令启动后台的存盘进程,同时收集所有用来修改数据的集命令,在后头执行完毕后master将传送整个数据文件到slave。并完成一次完全同步。
  • 全量复制:salve在接收到master发送的数据文件后,会将其存盘并加载到内存中。
  • 增量复制:Master继续讲新的所有收集到的修改指令一次传输给slave
  • 一旦发生重连。会执行一次全量复制。

备注 集群相关参数

# masterauth <master-password> #如果master开启了密码验证则需要配置此项
replica-serve-stale-data yes # 当与master失去联系时slave是否还提供服务默认是yes
replica-read-only yes # slave是否只读 默认yes 往salve写数据非常容易被master覆盖
repl-diskless-sync no # 是否开启无盘复制,若开启。master生成的rdb问价不会存入磁盘而是直接通过网络传输给slave
repl-diskless-sync-delay 5 #无盘复制延迟时间
repl-diskless-load disabled# 是否使用无盘加载 选项如下
#disabled:不要使用无磁盘加载,先将rdb文件存储到磁盘
#on-empty-db:只有在完全安全的情况下才使用无磁盘加载
#swapdb:解析时在RAM中保留当前db内容的副本,直接从套接字获取数据。
repl-ping-replica-period 10 #副本以预定义的间隔向服务器发送ping 默认是10s
repl-timeout 60 #设置复制超时时间 以下三种情况会被认为复制超时
#	1)slave角度,如果在repl-timeout时间内没有收到master SYNC传输的rdb snapshot数据,
#	2)slave角度,在repl-timeout没有收到master发送的数据包或者ping。
#	3)master角度,在repl-timeout时间没有收到REPCONF ACK确认信息。
repl-disable-tcp-nodelay no # 同步后在副本套接字上禁用TCP\U节点? 
#如果您选择“是”,Redis将使用较少的TCP数据包和较少的带宽将数据发送到副本。但是这会增加数据出现在副	本端的延迟,对于使用默认配置的Linux内核,延迟最长可达40毫秒。
#如果选择“否”,数据在副本端出现的延迟将减少,但复制将使用更多的带宽。
#默认情况下,我们会针对低延迟进行优化,但是在流量非常大的情况下,或者当主副本和副本有很多跳距时,将	此选项改为“是”可能是个好主意。
1mb repl-backlog-size 1mb #设置backlog的大小,backlog是一个缓冲区,在slave端失连时存放要同步到slave的数据,因此当一个slave要重连时,经常是不需要完全同步的,执行局部同步就足够了。backlog设置的越大,slave可以失连的时间就越长。
repl-backlog-ttl 3600 #如果一段时间后没有slave连接到master,则backlog size的内存将会被释放。如果值为0则表示永远不释放这部份内存。
slave-priority 100 # slave端的优先级设置,值是一个整数,数字越小表示优先级越高。当master故障时将会按照优先级来选择slave端进行恢复,如果值设置为0,则表示该slave永远不会被选择。
min-slaves-to-write 3 
min-slaves-max-lag 10 # 设置当一个master端的可用slave少于3个,或者延迟时间大于10秒时,不接收写操作。

哨兵模式

哨兵模式redis2.8以后提供的一个自动选举模式。哨兵是一个独立运行的进程。通过不停地向各个实例发送心跳来判断实例是否正常。当哨兵认为master死亡说会通过预定的算法自动选举新的master。并通过发布订阅的模式通知其他slave“改投明主”。

工作过程

1):每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令。

2):如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。

3):如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。

4):当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线 。

5):在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有Master,Slave发送 INFO 命令 。

6):当Master被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次 。

7):若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会被移除。

8):若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。

一个哨兵的集群:

1、添加配置文件

[root@VM-8-7-centos conf]# vim sentinel.conf
# 默认端口
port 26379
sentinel monitor mymaster 127.0.0.1 6382 1 # 监控的主机 1 是指如果有一个哨兵认为主机挂了。那么久让主机客观下线。开始选举新的主机
dir /data/sentinel #存储哨兵的工作信息

2、启动上面配置的redis集群

[root@VM-8-7-centos lch]# ./redis-6.0.6/src/redis-server ./redis-6.0.6/conf/redis6380.conf
18642:C 14 Jul 2021 13:48:53.198 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
18642:C 14 Jul 2021 13:48:53.199 # Redis version=6.0.6, bits=64, commit=00000000, modified=0, pid=18642, just started
18642:C 14 Jul 2021 13:48:53.199 # Configuration loaded
[root@VM-8-7-centos lch]# ./redis-6.0.6/src/redis-server ./redis-6.0.6/conf/redis6381.conf
18655:C 14 Jul 2021 13:48:56.899 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
18655:C 14 Jul 2021 13:48:56.900 # Redis version=6.0.6, bits=64, commit=00000000, modified=0, pid=18655, just started
18655:C 14 Jul 2021 13:48:56.900 # Configuration loaded
[root@VM-8-7-centos lch]# ./redis-6.0.6/src/redis-server ./redis-6.0.6/conf/redis6382.conf
18667:C 14 Jul 2021 13:49:00.720 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
18667:C 14 Jul 2021 13:49:00.720 # Redis version=6.0.6, bits=64, commit=00000000, modified=0, pid=18667, just started
18667:C 14 Jul 2021 13:49:00.720 # Configuration loaded
[root@VM-8-7-centos lch]#

3、查看集群配置

[root@VM-8-7-centos lch]# ./redis-6.0.6/src/redis-cli -p 6380
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=14,lag=1
slave1:ip=127.0.0.1,port=6382,state=online,offset=14,lag=1
master_replid:730ea810f11b28ed92bfe8225d4771c7b3fd3473
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:6380>

4、启动哨兵

[root@VM-8-7-centos lch]# ./redis-6.0.6/src/redis-sentinel ./redis-6.0.6/conf/sentinel.conf
19864:X 14 Jul 2021 13:56:59.130 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
19864:X 14 Jul 2021 13:56:59.130 # Redis version=6.0.6, bits=64, commit=00000000, modified=0, pid=19864, just started
19864:X 14 Jul 2021 13:56:59.130 # Configuration loaded
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 6.0.6 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 19864
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

19864:X 14 Jul 2021 13:56:59.132 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
19864:X 14 Jul 2021 13:56:59.136 # Sentinel ID is ccf0c6ad5e7d8c7a3a450176554daf5cdf4c7fe4
19864:X 14 Jul 2021 13:56:59.136 # +monitor master mymaster 127.0.0.1 6382 quorum 1

5、模拟master故障手动停掉master

[root@VM-8-7-centos lch]# ./redis-6.0.6/src/redis-cli -p 6380
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=476,lag=1
slave1:ip=127.0.0.1,port=6382,state=online,offset=476,lag=1
master_replid:730ea810f11b28ed92bfe8225d4771c7b3fd3473
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:490
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:490
127.0.0.1:6380> SHUTDOWN
not connected>

5、登录从机查看集群状态 发现6382变为master

[root@VM-8-7-centos lch]# ./redis-6.0.6/src/redis-cli -p 6382
127.0.0.1:6382> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=39728,lag=0
master_replid:407041a9412c5fe76b5129cf12a372d2d1bfd39a
master_replid2:df858340d78a490f2f575a1eaa17661296b765bc
master_repl_offset:39728
second_repl_offset:1406
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:39728
127.0.0.1:6382>

6、重启6380 发现6380又加入集群且变为从机

[root@VM-8-7-centos lch]# ./redis-6.0.6/src/redis-server  ./redis-6.0.6/conf/redis6380.conf
127.0.0.1:6380> 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:47060
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:407041a9412c5fe76b5129cf12a372d2d1bfd39a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:47060
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:45241
repl_backlog_histlen:1820
127.0.0.1:6380>

7、选举过程

32114:X 14 Jul 2021 15:26:10.224 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
32114:X 14 Jul 2021 15:26:10.224 # Sentinel ID is ccf0c6ad5e7d8c7a3a450176554daf5cdf4c7fe4
32114:X 14 Jul 2021 15:26:10.224 # +monitor master mymaster 127.0.0.1 6380 quorum 1
32114:X 14 Jul 2021 15:26:10.224 * +slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
32114:X 14 Jul 2021 15:26:10.228 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
32114:X 14 Jul 2021 15:26:57.433 # +sdown master mymaster 127.0.0.1 6380
32114:X 14 Jul 2021 15:26:57.433 # +odown master mymaster 127.0.0.1 6380 #quorum 1/1
32114:X 14 Jul 2021 15:26:57.433 # +new-epoch 16
32114:X 14 Jul 2021 15:26:57.433 # +try-failover master mymaster 127.0.0.1 6380
32114:X 14 Jul 2021 15:26:57.441 # +vote-for-leader ccf0c6ad5e7d8c7a3a450176554daf5cdf4c7fe4 16
32114:X 14 Jul 2021 15:26:57.442 # +elected-leader master mymaster 127.0.0.1 6380
32114:X 14 Jul 2021 15:26:57.442 # +failover-state-select-slave master mymaster 127.0.0.1 6380
32114:X 14 Jul 2021 15:26:57.532 # +selected-slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
32114:X 14 Jul 2021 15:26:57.532 * +failover-state-send-slaveof-noone slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
32114:X 14 Jul 2021 15:26:57.587 * +failover-state-wait-promotion slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
32114:X 14 Jul 2021 15:26:58.479 # +promoted-slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
32114:X 14 Jul 2021 15:26:58.479 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6380
32114:X 14 Jul 2021 15:26:58.539 * +slave-reconf-sent slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
32114:X 14 Jul 2021 15:26:59.539 * +slave-reconf-inprog slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
32114:X 14 Jul 2021 15:26:59.539 * +slave-reconf-done slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
32114:X 14 Jul 2021 15:26:59.604 # +failover-end master mymaster 127.0.0.1 6380
32114:X 14 Jul 2021 15:26:59.604 # +switch-master mymaster 127.0.0.1 6380 127.0.0.1 6382
32114:X 14 Jul 2021 15:26:59.604 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6382
32114:X 14 Jul 2021 15:26:59.604 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6382
32114:X 14 Jul 2021 15:27:29.636 # +sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6382
32114:X 14 Jul 2021 15:37:34.087 # -sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6382
32114:X 14 Jul 2021 15:37:44.030 * +convert-to-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6382
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值