1、主从复制
1、什么是主从复制
- redis的复制功能是支持多个数据库之间的数据同步。一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库。
- 通过redis的复制功能可以很好的实现数据库的读写分离,提高服务器的负载能力。主数据库主要进行写操作,而从数据库负责读操作。
主从复制,读写分离,大部分情况下都是在进行读操作,减缓服务器的压力,架构中经常使用,一主二从(至少3台服务器)
2、举个栗子
1、共打开4台机器,3台做主从复制,1台测试
2、复制3个 redis.conf 配置文件
[root@iZ2ze5v2vdwv6veyksylhxZ bin]# cd muzhen_config
[root@iZ2ze5v2vdwv6veyksylhxZ muzhen_config]# ls
redis79.conf redis80.conf redis81.conf redis.conf
[root@iZ2ze5v2vdwv6veyksylhxZ muzhen_config]# cp redis.conf redis79.conf #复制 redis.conf 文件
[root@iZ2ze5v2vdwv6veyksylhxZ muzhen_config]# cp redis.conf redis80.conf
[root@iZ2ze5v2vdwv6veyksylhxZ muzhen_config]# cp redis.conf redis81.conf
[root@iZ2ze5v2vdwv6veyksylhxZ muzhen_config]# ls
redis79.conf redis80.conf redis81.conf redis.conf
[root@iZ2ze5v2vdwv6veyksylhxZ muzhen_config]#
3、修改 con.conf 配置文件
#端口号
port 6380
#pid名字
pidfile /var/run/redis_6380.pid
#日志文件名字
logfile "6380.log"
#dump.rdb名字
dbfilename dump6380.rdb
4、启动3个机器
redis-server muzhen_config/redis79.conf #启动redis
[root@iZ2ze5v2vdwv6veyksylhxZ bin]# redis-cli -p 6379 #连接客户端
127.0.0.1:6379> ping
PONG #连接成功
127.0.0.1:6379>
redis-server muzhen_config/redis80.conf
[root@iZ2ze5v2vdwv6veyksylhxZ bin]# redis-cli -p 6380
127.0.0.1:6380> ping
PONG
127.0.0.1:6380>
redis-server muzhen_config/redis81.conf
[root@iZ2ze5v2vdwv6veyksylhxZ bin]# redis-cli -p 6381
127.0.0.1:6381> ping
PONG
127.0.0.1:6381>
5、查看3台机器均为主机,以端口号为6379的机器为例
[root@iZ2ze5v2vdwv6veyksylhxZ bin]# redis-server muzhen_config/redis.conf
[root@iZ2ze5v2vdwv6veyksylhxZ bin]# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> info replication #查看当前库信息
# Replication
role:master #角色:主机
connected_slaves:0 #从机 0个
master_replid:d1766f1175c91bbcf828bfcfe634d1b7df4c2cd7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379>
6、查看redis进程,都已启动
[root@iZ2ze5v2vdwv6veyksylhxZ ~]# ps -ef | grep redis
root 1459 1 0 16:44 ? 00:00:00 redis-server 127.0.0.1:6379
root 1466 1 0 16:44 ? 00:00:00 redis-server 127.0.0.1:6380
root 1472 1 0 16:44 ? 00:00:00 redis-server 127.0.0.1:6381
root 1478 1408 0 16:45 pts/3 00:00:00 grep --color=auto redis
3、 一主二从
默认情况下,每台Redis服务器都是主节点(默认都是主机,从机需要设置)
类似 认大哥
,一主(79)二从(80,81)
#在从机80进行配置
127.0.0.1:6380> slaveof 127.0.0.1 6379 #slaveof host port,找谁当自己的老大
OK
127.0.0.1:6380> info replication
# Replication
role:slave #角色:从机
master_host:127.0.0.1 #主机
master_port:6379 #主机端口号
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:6b7e719860ff170eb592f702b9e7d0cee2a30d5c
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>
#在主机中查看
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1 #多了从机的配置
slave0:ip=127.0.0.1,port=6380,state=online,offset=434,lag=1
master_replid:6b7e719860ff170eb592f702b9e7d0cee2a30d5c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:434
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:434
127.0.0.1:6379>
#从机8081配置如上
真实的主从配置应该在配置文件中配置,这样的话是永久的,使用命令配置是暂时的
案例演示
主机可以写,从机不能写,只能读,主机中的所有信息和数据,都会自动被从机保存
1、主机写好数据
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 v1 #主机可以写数据
OK
127.0.0.1:6379>
2、从机读取数据
127.0.0.1:6380> keys * #主机写数据之前,从机查看键值
(empty array)
127.0.0.1:6380> keys * #主机写数据之后,从机查看键值,可以查到
1) "k1"
127.0.0.1:6380> get k1
"v1"
127.0.0.1:6380> set k2 v2 #从机写数据,报错 提示只能读数据
(error) READONLY You can't write against a read only replica.
127.0.0.1:6380>
3、如果老大主机没了,shutdown,exit,从机状态依然不变,想变成主机只能手动配置
#主机停机
127.0.0.1:6379> shutdown
not connected> exit
4、从机查看,状态不变
127.0.0.1:6380> info replication
# Replication
role:slave #角色:从机
master_host:127.0.0.1
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:2446
master_link_down_since_seconds:49
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:6b7e719860ff170eb592f702b9e7d0cee2a30d5c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2446
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2446
127.0.0.1:6380>
5、如果老大主机又回来了,再次启动了主机,而且设置新键值,从机依然可以读取到
#主机启动
[root@iZ2ze5v2vdwv6veyksylhxZ bin]# redis-server muzhen_config/redis79.conf
[root@iZ2ze5v2vdwv6veyksylhxZ bin]# redis-cli -p 6379
127.0.0.1:6379> set k3 v3 #主机启动后再次设置新键值
OK
#从机查看,依然可以获得数据
127.0.0.1:6380> get k3
"v3"
6、如果从机80突然宕机,关掉了
#从机80,关掉
127.0.0.1:6380> shutdown
not connected> exit
7、通过进程查看,80端口关掉了
[root@iZ2ze5v2vdwv6veyksylhxZ muzhen_config]# ps -ef | grep redis
root 1472 1 0 16:44 ? 00:00:01 redis-server 127.0.0.1:6381
root 1487 1387 0 16:50 pts/2 00:00:00 redis-cli -p 6381
root 1567 1 0 17:26 ? 00:00:00 redis-server 127.0.0.1:6379
root 1574 1158 0 17:26 pts/0 00:00:00 redis-cli -p 6379
root 1593 1408 0 17:31 pts/3 00:00:00 grep --color=auto redis
8、主机查看,从机已经只剩下一个了
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1 #从机只剩下一个了
slave0:ip=127.0.0.1,port=6381,state=online,offset=668,lag=0 #只剩下了从机81
master_replid:3fe4839cced66622954988e873356bddadca8393
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:668
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:668
127.0.0.1:6379>
9、如果是使用命令行配置的主从,如果重启了从机,从机就会变回主机
[root@iZ2ze5v2vdwv6veyksylhxZ bin]# redis-server muzhen_config/redis80.conf
[root@iZ2ze5v2vdwv6veyksylhxZ bin]# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> info replication
# Replication
role:master #角色:从机已经变回了主机
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=1018,lag=1
master_replid:3fe4839cced66622954988e873356bddadca8393
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1018
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1018
127.0.0.1:6379>
10、如果从机重启之后,变成了主机角色,没有手动设置为从机,当主机写了新的数据,然后从机才将主机角色再次设置成从机,依然可以获取新的数据
#主机写入新数据
127.0.0.1:6379> set k4 v4
OK
#从机角色从主机,手动再次设置为从机后
127.0.0.1:6379> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6379> get k4
"v4"
127.0.0.1:6379>
复制原理
- Slave启动成功连接到maser后会发送一个sync同步命令
- Master接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,并完成一次完全同步。
- 全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中
- 增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步
- 但是只要是重新连接master,一次完全同步(全量复制)将被自动执行,我们的数据一定可以在从机上看到
4、 层层链路
主从复制有多种模式,可以 1对多,也可像火车一样,一个传一个,例如 :主机79—连接—80从机—连接—81从机
案例演示:
1、操作端口号为81的从机,将其主机从79修改为80,换老大了
127.0.0.1:6381> SLAVEOF 127.0.0.1 6380 #将主机设置为6380
OK
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:8
master_sync_in_progress:0
slave_repl_offset:0
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:71edae81b9c7a64e15a448d6a1eb1f2b26dfdb4d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:0
127.0.0.1:6381>
2、79主机查看主从复制信息,查看剩余所属从机
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1 #从机只剩下一个了,从机端口是6380
slave0:ip=127.0.0.1,port=6380,state=online,offset=14,lag=0
master_replid:613fa27016e4f3a2d8fc02394e783fe2bda5ceeb
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:6379>
3、80主机查看主从复制信息,80依然是从机,从机只能读数据,不能写数据
127.0.0.1:6380> info replication
# Replication
role:slave #80依然是从机
master_host:127.0.0.1
master_port:6379
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:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=168,lag=0
master_replid:613fa27016e4f3a2d8fc02394e783fe2bda5ceeb
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:6380>
4、主机79写入新数据,查看从机是否可以正常接收到
127.0.0.1:6379> set k5 v5
OK
5、端口号为80和81的从机依然可以读取到数据
127.0.0.1:6380> get k5
"v5"
5、 问题:如果没有老大了,这个时候能不能选择一个老大出来呢?答案只能 手动
#老大主机挂了,从机依然状态是从机
127.0.0.1:6379> shutdown
not connected> exit
127.0.0.1:6380> info replication
# Replication
role:slave #从机依然角色是小弟
master_host:127.0.0.1 #大哥即使挂了,小弟依然认大哥,不篡权
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1200
master_link_down_since_seconds:87
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:613fa27016e4f3a2d8fc02394e783fe2bda5ceeb
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1200
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1200
127.0.0.1:6380>
那如果有的小弟想当老大,要莫权篡位 SLAVEOF no one
127.0.0.1:6380> SLAVEOF no one #执行篡权命令后,自己就成了老大了
OK
127.0.0.1:6380> info replication
# Replication
role:master #角色已经由从机变为主机,小老弟成大哥了
connected_slaves:1 #自己也有了小弟,端口号是81从机
slave0:ip=127.0.0.1,port=6381,state=online,offset=1214,lag=1
master_replid:780a11570a1a6dd0c34472566d5bc2c53e2263c3
master_replid2:613fa27016e4f3a2d8fc02394e783fe2bda5ceeb
master_repl_offset:1214
second_repl_offset:1201
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1214
127.0.0.1:6380>
小结:
如果主机断开了连接,我们就可以使用 SLAVEOF no one 让自己变成主机,其他的节点就可以手动连接到最新的这个主节点(手动),如果这个时候老大又修复了,那就重新连接
2、哨兵模式
(自动选举老大的模式)
什么是烧饼模式?
- 主从切换技术的方法是:当主服务器宕机后,需要手动把一台从机服务器切换为主服务器,这就需要人工干预,费时费力,还会造成一段时间内服务不可用,这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。Redis从2.8开始正式提供了Sentinel(哨兵)架构来解决这个问题。
- 谋朝篡位的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。
- 哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行,其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。
进入 cd/usr/local/bin目录下面
这里的哨兵有两个作用:
1、通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器
2、当哨兵检测到master宕机,会自动将slave切换成master,然后通过 发布订阅模式 通知其他的从机服务器,修改配置文件,让她们切换主机
然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式
假如主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行 failover(故障切换) 过程,仅仅是哨兵1主观的认为服务器不可用,这个现象称为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果是由一个哨兵发起,进行 failover操作,切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。
1、 举个栗子,我们目前状态是 一主二从
1、配置哨兵配置文件 sentinel.conf
# 数字1:代表主机宕机,从机投票,谁票数多就会自动成为主机
#哨兵 监控 被监控的名称 主机host 端口号port
sentinel monitor myredis 127.0.0.1 6379 1 #写入sentinel.conf文件内
[root@iZ2ze5v2vdwv6veyksylhxZ muzhen_config]# vim sentinel.conf
[root@iZ2ze5v2vdwv6veyksylhxZ muzhen_config]# ls
redis79.conf redis80.conf redis81.conf redis.conf sentinel.conf
[root@iZ2ze5v2vdwv6veyksylhxZ muzhen_config]#
2、启动哨兵
[root@iZ2ze5v2vdwv6veyksylhxZ bin]# ls
6379,log chardetect dump6379.rdb easy_install jsonpatch pcre-config redis-check-aof redis-server
6380.log cloud-id dump6380.rdb easy_install-3.6 jsonpointer pcregrep redis-check-rdb
6381.log cloud-init dump6381.rdb easy_install-3.8 jsonschema pcretest redis-cli
appendonly.aof cloud-init-per dump.rdb jsondiff muzhen_config redis-benchmark redis-sentinel
[root@iZ2ze5v2vdwv6veyksylhxZ bin]# redis-sentinel muzhen_config/sentinel.conf
1743:X 07 Jan 2021 19:17:20.965 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1743:X 07 Jan 2021 19:17:20.965 # Redis version=6.0.9, bits=64, commit=00000000, modified=0, pid=1743, just started
1743:X 07 Jan 2021 19:17:20.965 # Configuration loaded
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 6.0.9 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
| `-._ `._ / _.-' | PID: 1743
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
1743:X 07 Jan 2021 19:17:20.966 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1743:X 07 Jan 2021 19:17:20.969 # Sentinel ID is 1f38f33ef59194d1f635122bfe407ec0f23e733a
1743:X 07 Jan 2021 19:17:20.969 # +monitor master myredis 127.0.0.1 6379 quorum 1
1743:X 07 Jan 2021 19:17:20.970 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 127.0.0.1 6379
1743:X 07 Jan 2021 19:17:20.973 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 127.0.0.1 6379
3、关掉主机,查看到两个从机 80 和 81 依然是 从机角色,稍等一会,哨兵需要时间检测,再次查看从机就会发现其中有一个成为主机了
#主机挂掉
127.0.0.1:6379> shutdown
not connected> exit
#查看从机
127.0.0.1:6380> info replication
# Replication
role:master #端口号为80的从机,现在角色变成了主机
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=26898,lag=0
master_replid:2f2e8e511237032a779ff78e4debc0defd53033e
master_replid2:18de7b9d37960d45bcc669a853d9b97cf8f02421
master_repl_offset:26898
second_repl_offset:26202
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:26898
127.0.0.1:6380>
4、哨兵日志
1743:X 07 Jan 2021 19:23:37.880 # +sdown master myredis 127.0.0.1 6379
1743:X 07 Jan 2021 19:23:37.880 # +odown master myredis 127.0.0.1 6379 #quorum 1/1
1743:X 07 Jan 2021 19:23:37.880 # +new-epoch 1
1743:X 07 Jan 2021 19:23:37.880 # +try-failover master myredis 127.0.0.1 6379
1743:X 07 Jan 2021 19:23:37.883 # +vote-for-leader 1f38f33ef59194d1f635122bfe407ec0f23e733a 1
1743:X 07 Jan 2021 19:23:37.883 # +elected-leader master myredis 127.0.0.1 6379
1743:X 07 Jan 2021 19:23:37.883 # +failover-state-select-slave master myredis 127.0.0.1 6379
1743:X 07 Jan 2021 19:23:37.946 # +selected-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 127.0.0.1 6379
1743:X 07 Jan 2021 19:23:37.946 * +failover-state-send-slaveof-noone slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 127.0.0.1 6379
1743:X 07 Jan 2021 19:23:38.012 * +failover-state-wait-promotion slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 127.0.0.1 6379
1743:X 07 Jan 2021 19:23:38.386 # +promoted-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 127.0.0.1 6379
1743:X 07 Jan 2021 19:23:38.386 # +failover-state-reconf-slaves master myredis 127.0.0.1 6379
1743:X 07 Jan 2021 19:23:38.444 * +slave-reconf-sent slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 127.0.0.1 6379
1743:X 07 Jan 2021 19:23:39.392 * +slave-reconf-inprog slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 127.0.0.1 6379
1743:X 07 Jan 2021 19:23:40.415 * +slave-reconf-done slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 127.0.0.1 6379
1743:X 07 Jan 2021 19:23:40.481 # +failover-end master myredis 127.0.0.1 6379
1743:X 07 Jan 2021 19:23:40.482 # +switch-master myredis 127.0.0.1 6379 127.0.0.1 6380
1743:X 07 Jan 2021 19:23:40.482 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 127.0.0.1 6380
1743:X 07 Jan 2021 19:23:40.482 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ myredis 127.0.0.1 6380
1743:X 07 Jan 2021 19:24:10.514 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ myredis 127.0.0.1 6380
5、如果主机又开启了,老大的位置已经有人了,只能当新老大的小弟从机了
#原主机6379再次启动
[root@iZ2ze5v2vdwv6veyksylhxZ bin]# redis-server muzhen_config/redis79.conf
[root@iZ2ze5v2vdwv6veyksylhxZ bin]# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> info replication
# Replication
role:slave #角色由master 变成 slave 了
master_host:127.0.0.1
master_port:6380 #主机已经是6380了
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:63463
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:2f2e8e511237032a779ff78e4debc0defd53033e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:63463
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:61023
repl_backlog_histlen:2441
127.0.0.1:6379>
6、6380原从机,查看主从复制信息
127.0.0.1:6380> info replication
# Replication
role:master #小老弟成大哥了,从机变成主机了
connected_slaves:2 #手下也多了两个小老弟,端口号分别为 6379(原来的老大),和6381
slave0:ip=127.0.0.1,port=6381,state=online,offset=61719,lag=0
slave1:ip=127.0.0.1,port=6379,state=online,offset=61719,lag=0
master_replid:2f2e8e511237032a779ff78e4debc0defd53033e
master_replid2:18de7b9d37960d45bcc669a853d9b97cf8f02421
master_repl_offset:61719
second_repl_offset:26202
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:61719
127.0.0.1:6380>
小结
优点
:
- 哨兵集群,基于主从复制模式,所有的主从配置优点,它都有
- 主从可以切换,故障可以转移,系统的可用性就会更好
- 哨兵模式就是主从模式的升级,手动到自动,更加健壮
缺点:
- Redis不好在线扩容,集群容量一旦到达上限,在线扩容就十分麻烦
- 实现哨兵模式的配置其实时很麻烦,里面有很多选择
哨兵模式的全部配置
# 端口
port 26379
# 是否后台启动
daemonize yes
# pid文件路径
pidfile /var/run/redis-sentinel.pid
# 日志文件路径
logfile "/var/log/sentinel.log"
# 定义工作目录
dir /tmp
# 定义Redis主的别名, IP, 端口,这里的2指的是需要至少2个Sentinel认为主Redis挂了才最终会采取下一步行为
sentinel monitor mymaster 127.0.0.1 6379 2
# 如果mymaster 30秒内没有响应,则认为其主观失效
sentinel down-after-milliseconds mymaster 30000
# 如果master重新选出来后,其它slave节点能同时并行从新master同步数据的台数有多少个,显然该值越大,所有slave节点完成同步切换的整体速度越快,但如果此时正好有人在访问这些slave,可能造成读取失败,影响面会更广。最保守的设置为1,同一时间,只能有一台干这件事,这样其它slave还能继续服务,但是所有slave全部完成缓存更新同步的进程将变慢。
sentinel parallel-syncs mymaster 1
# 该参数指定一个时间段,在该时间段内没有实现故障转移成功,则会再一次发起故障转移的操作,单位毫秒
sentinel failover-timeout mymaster 180000
# 不允许使用SENTINEL SET设置notification-script和client-reconfig-script。
sentinel deny-scripts-reconfig yes