勿以浮沙筑高台
Redis主从机制
环境搭建
这里我们搭建三个rdis来实现一个一主二从的redis集群。
- 修改redis.conf文件为三个,端口号分别是6379,6380,6381
[root@work1 bin]# ./redis-server ./redis-6379.conf [root@work1 bin]# ./redis-server ./redis-6380.conf [root@work1 bin]# ./redis-server ./redis-6381.conf
- 修改配置文件信息
92 行 port 6380 #端口号 247 行 pidfile /var/run/redis_6380.pid #pidfile文件 260 行 logfile "/usr/local/redis/logs/6380.log" #配置文件地址 342 行 dbfilename dump_6380.rdb #rdb文件
- 启动三个Redis
[root@work1 bin]# ./redis-server ./redis-6379.conf [root@work1 bin]# ./redis-server ./redis-6380.conf [root@work1 bin]# ./redis-server ./redis-6381.conf
- 这里以6379为主,80和81为从
- 分别切换到80和81上执行命令
SLAVEOF 192.168.3.109 6379 #执行指定master命令 info replication #查看当前redis主从info命令 # Replication role:slave master_host:192.168.31.109 #masterIP master_port:6379 #masterPort master_link_status:up master_last_io_seconds_ago:9 master_sync_in_progress:0 slave_repl_offset:14 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:705152324014710b88db075af98e225910b45d8e 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> exit [root@work1 bin]# cp redis.conf redis-6381.conf cp:是否覆盖"redis-6381.conf"? n [root@work1 bin]# ./redis-cli -p 6381
演示
- 在6379主中写入一个节点,在从数据中获得了节点数据。倘若重新写加入一个从Redis也可以从copy中获得节点
127.0.0.1:6379> set name zhangshan OK 127.0.0.1:6379> exit [root@work1 bin]# ./redis-cli -p 6381 127.0.0.1:6381> get name "zhangshan" 127.0.0.1:6381> [root@work1 bin]# ./redis-cli -p 6380 127.0.0.1:6380> get name "zhangshan" 127.0.0.1:6380>
pkill redis
主从实现原理
-
基础准备对RDB的概念请看文章。
Redis持久化机制(RDB原理和AOF原理) -
Slave(从) 启动成功连接到 Master(主) 后会发送一个 sync (同步)同步命令。
-
Master 接收到命令后,启动后台的存盘进程,将 RDB文件全部copy到Slave当中。
-
Slave文件运行RDB文件,创建节点。
-
倘若后面还有数据的增加就不是全量Copy,只将增连Copy。
Redis哨兵机制
处理问题,当Master(主)程序发生宕机后,Slave(从)是无法重新进行选举的。因为彼此之间并没有进行联系,这时候Redis采用哨兵进行监听(本质就是心跳检测),哨兵进行监听,发现宕机后,重新从中选举master,当宕机的机子重启后,定义为Slave。
哨兵配置
- 到redis启动目录创建配置文件
sentinel.conf
# sentinel monitor 被监控的名字(随便写) host 1 sentinel monitor myredis 192.168.31.109 6379 1
- 启动
./redis-sentinel ./sentinel.conf
[root@work1 bin]# vi sentinel.conf #编辑config文件 [root@work1 bin]# ./redis-sentinel ./sentinel.conf #启动 1646:X 21 Jun 2021 22:05:20.502 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 1646:X 21 Jun 2021 22:05:20.502 # Redis version=6.0.7, bits=64, commit=00000000, modified=0, pid=1646, just started 1646:X 21 Jun 2021 22:05:20.502 # Configuration loaded 1646:X 21 Jun 2021 22:05:20.503 * Increased maximum number of open files to 10032 (it was originally set to 1024). _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 6.0.7 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in sentinel mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 26379 | `-._ `._ / _.-' | PID: 1646 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 1646:X 21 Jun 2021 22:05:20.504 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 1646:X 21 Jun 2021 22:05:20.611 # Sentinel ID is a184b83f8cb622f0cd4b86d8f718e535b01d924e 1646:X 21 Jun 2021 22:05:20.611 # +monitor master myredis 127.0.0.1 6379 quorum 1 #监听Master 1646:X 21 Jun 2021 22:05:20.611 * +slave slave 192.168.31.109:6380 192.168.31.109 6380 @ myredis 127.0.0.1 6379 #监听Slave 1646:X 21 Jun 2021 22:05:20.616 * +slave slave 192.168.31.109:6381 192.168.31.109 6381 @ myredis 127.0.0.1 6379 #监听Slave
演示
- 切换到Master 6379上,shutdown掉主
[root@work1 bin]# ./redis-cli 127.0.0.1:6379> exit [root@work1 bin]# ./redis-cli shutdown #shutdown掉主 [root@work1 bin]#
- 查看哨兵监听显示,多出来以来内容,,发现纪元+1
+new-epoch 2
,新的Master是63811646:X 21 Jun 2021 22:18:59.281 # +new-epoch 2 #新纪元 1646:X 21 Jun 2021 22:18:59.281 # +try-failover master myredis 192.168.31.109 6381 1646:X 21 Jun 2021 22:18:59.292 # +vote-for-leader a184b83f8cb622f0cd4b86d8f718e535b01d924e 2 1646:X 21 Jun 2021 22:18:59.292 # +elected-leader master myredis 192.168.31.109 6381 1646:X 21 Jun 2021 22:18:59.292 # +failover-state-select-slave master myredis 192.168.31.109 6381 1646:X 21 Jun 2021 22:18:59.377 # +selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 192.168.31.109 6381 1646:X 21 Jun 2021 22:18:59.377 * +failover-state-send-slaveof-noone slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 192.168.31.109 6381 1646:X 21 Jun 2021 22:18:59.461 * +failover-state-wait-promotion slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 192.168.31.109 6381 1646:X 21 Jun 2021 22:18:59.586 # -sdown master myredis 192.168.31.109 6381 #选举出的新Master 1646:X 21 Jun 2021 22:18:59.587 # -odown master myredis 192.168.31.109 6381 1646:X 21 Jun 2021 22:19:00.233 # +promoted-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 192.168.31.109 6381 1646:X 21 Jun 2021 22:19:00.233 # +failover-state-reconf-slaves master myredis 192.168.31.109 6381 1646:X 21 Jun 2021 22:19:00.290 * +slave-reconf-sent slave 192.168.31.109:6380 192.168.31.109 6380 @ myredis 192.168.31.109 6381 1646:X 21 Jun 2021 22:19:01.283 * +slave-reconf-inprog slave 192.168.31.109:6380 192.168.31.109 6380 @ myredis 192.168.31.109 6381 1646:X 21 Jun 2021 22:19:01.283 * +slave-reconf-done slave 192.168.31.109:6380 192.168.31.109 6380 @ myredis 192.168.31.109 6381 1646:X 21 Jun 2021 22:19:01.338 * +slave-reconf-sent slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 192.168.31.109 6381 1646:X 21 Jun 2021 22:19:02.292 * +slave-reconf-inprog slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 192.168.31.109 6381 1646:X 21 Jun 2021 22:19:02.292 * +slave-reconf-done slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 192.168.31.109 6381 1646:X 21 Jun 2021 22:19:02.383 # +failover-end master myredis 192.168.31.109 6381 1646:X 21 Jun 2021 22:19:02.383 # +switch-master myredis 192.168.31.109 6381 127.0.0.1 6381 1646:X 21 Jun 2021 22:19:02.384 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ myredis 127.0.0.1 6381 1646:X 21 Jun 2021 22:19:02.384 * +slave slave 192.168.31.109:6380 192.168.31.109 6380 @ myredis 127.0.0.1 6381 1646:X 21 Jun 2021 22:19:02.384 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 127.0.0.1 6381 1646:X 21 Jun 2021 22:19:02.384 * +slave slave 192.168.31.109:6381 192.168.31.109 6381 @ myredis 127.0.0.1 6381 1646:X 21 Jun 2021 22:19:12.550 * +convert-to-slave slave 192.168.31.109:6381 192.168.31.109 6381 @ myredis 127.0.0.1 6381 1646:X 21 Jun 2021 22:19:32.398 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ myredis 127.0.0.1 6381 1646:X 21 Jun 2021 22:20:09.608 # +sdown master myredis 127.0.0.1 6381 1646:X 21 Jun 2021 22:20:09.608 # +odown master myredis 127.0.0.1 6381 #quorum 1/1
小结:
哨兵的作用,就是在中心节点宕机时,重新选举出新的Master。但是有个可能就算当哨兵宕机时,选举就不存在了,因此需要多个哨兵搭建集群。