Redis主从复制实践(windows)

278 阅读5分钟

简单的主从复制配置

配置conf文件

redis.conf文件配置

port 6379
...
logfile "6379.log"
...
dbfilename dump79.rdb

进入其中一个客户端

redis-cli -p 6379
info replication

###
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
###

开启3个redis进程

配置了3个客户端6379、6380、6381

配置主从

配置

6379为主,6380和6381为从

127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
127.0.0.1:6381> SLAVEOF 127.0.0.1 6379


127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=99,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=99,lag=1
master_repl_offset:99
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:98

测试

理论上,主写从读

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"

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 slave.  

127.0.0.1:6381> get k1
"v1"
127.0.0.1:6381> set k2 v2
# (error) READONLY You can't write against a read only slave.

可以看出在主机6379写的k2已经是同步到了6380和6381,而且它们不能写

  1. 主机挂机,从机是否可以读主机所写的数据?
127.0.0.1:6380> get k1
"v1"

结论:可以 2. 从机挂机,主机写了数据,从机恢复,是否可读?

127.0.0.1:6379> set k2 v2
OK
# 6380重新启动,重新变回从机
127.0.0.1:6380> keys *
1) "k1"
2) "k2"

结论:可以

复制原理

从机连接主机的时候会进行一次数据的复制。
全面复制:将主机的内容全部复制一遍,从机连接主机一定会进行一次全面复制。
增量复制:将主机原有的内容上增删,就是全员在线的时候,读写的过程。

手动扶植一个主节点

如果主机挂了,不能起来了。只剩两个从机,这样redis就不能写了,只能读。所以要从剩下的两个从机中选出一个从机升级为主机。

# 6380从6381
127.0.0.1:6380> SLAVEOF 127.0.0.1 6381
OK

# 6381为主机
127.0.0.1:6381> SLAVEOF no one
OK
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=85,lag=0
master_repl_offset:85
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:84

# 6379恢复后,也是什么都没有了
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:23825
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:23824

哨兵模式

以上是可以用手动的配置,如果是两三个还好,但是真实生产环境很少会有几个,就算有,出问题了也不可能由人去配置,这样会影响效率。所以要自动配置,就是所谓的哨兵模式。一旦主机挂了,立马从从机中选举出一个从机升级为主机。

单哨兵模式

启动一个哨兵进程监视其他几个缓存进程。
配置一个sentinel.conf文件

sentinel monitor redis0 127.0.0.1 6379 1
# sentinel monitor 主机名 host port 权值

这个配置是监控主机

redis-server.exe sentinel.conf --sentinel

##
[14896] 06 Jan 11:41:36.785 # Sentinel ID is ec72d177fcf66dd453a3df1fd9032ca6c926815f
[14896] 06 Jan 11:41:36.786 # +monitor master redis0 127.0.0.1 6379 quorum 1
[14896] 06 Jan 11:41:37.272 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ redis0 127.0.0.1 6379
[14896] 06 Jan 11:41:37.291 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ redis0 127.0.0.1 6379

现在关闭6379主机
过了一会,哨兵进程开始运作

[14896] 06 Jan 11:44:49.696 # +sdown master redis0 127.0.0.1 6379
[14896] 06 Jan 11:44:49.697 # +odown master redis0 127.0.0.1 6379 #quorum 1/1
[14896] 06 Jan 11:44:49.697 # +new-epoch 1
[14896] 06 Jan 11:44:49.697 # +try-failover master redis0 127.0.0.1 6379
[14896] 06 Jan 11:44:49.710 # +vote-for-leader ec72d177fcf66dd453a3df1fd9032ca6c926815f 1
[14896] 06 Jan 11:44:49.710 # +elected-leader master redis0 127.0.0.1 6379
[14896] 06 Jan 11:44:49.710 # +failover-state-select-slave master redis0 127.0.0.1 6379
[14896] 06 Jan 11:44:49.805 # +selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ redis0 127.0.0.1 6379
[14896] 06 Jan 11:44:49.805 * +failover-state-send-slaveof-noone slave 127.0.0.1:6381 127.0.0.1 6381 @ redis0 127.0.0.1 6379
[14896] 06 Jan 11:44:49.884 * +failover-state-wait-promotion slave 127.0.0.1:6381 127.0.0.1 6381 @ redis0 127.0.0.1 6379
[14896] 06 Jan 11:44:50.753 # +promoted-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ redis0 127.0.0.1 6379
[14896] 06 Jan 11:44:50.753 # +failover-state-reconf-slaves master redis0 127.0.0.1 6379
[14896] 06 Jan 11:44:50.804 * +slave-reconf-sent slave 127.0.0.1:6380 127.0.0.1 6380 @ redis0 127.0.0.1 6379
[14896] 06 Jan 11:44:51.791 * +slave-reconf-inprog slave 127.0.0.1:6380 127.0.0.1 6380 @ redis0 127.0.0.1 6379
[14896] 06 Jan 11:44:51.791 * +slave-reconf-done slave 127.0.0.1:6380 127.0.0.1 6380 @ redis0 127.0.0.1 6379
[14896] 06 Jan 11:44:51.868 # +failover-end master redis0 127.0.0.1 6379
[14896] 06 Jan 11:44:51.868 # +switch-master redis0 127.0.0.1 6379 127.0.0.1 6381
[14896] 06 Jan 11:44:51.871 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ redis0 127.0.0.1 6381
[14896] 06 Jan 11:44:51.874 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ redis0 127.0.0.1 6381
[14896] 06 Jan 11:45:21.961 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ redis0 127.0.0.1 6381

6381已经被选举为主机,6380是从机

127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=5914,lag=0
master_repl_offset:5914
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:5913

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:0
master_sync_in_progress:0
slave_repl_offset:10045
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

如果恢复原来的主机6379,则它已经是从机了

127.0.0.1:6379> 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:14620
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

多哨兵模式

启动多个哨兵进程同时监督缓存进程和除了自己以外的其他哨兵进程,以防止哨兵进程挂了。 配置多个sentinel.conf即可

哨兵模式的配置文件还有很多,就不一一展示。