1.Redis複製簡介redis
咱們所說的主從複製,主機數據更新後根據配置和策略,自動同步到備機的master/slaver機制,Master以寫爲主,Slave以讀爲主spa
2.Redis做用server
讀寫分離blog
容災恢復ip
3.Redis複製範例ci
1)一主二僕v8
(1)Redis6379.confget
[root@pluto 桌面]# cd /usr/local/bin/同步 [root@pluto bin]# clearit [root@pluto bin]# redis-server /myredis/redis6379.conf [root@pluto 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 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 127.0.0.1:6379> set k1 v1 ok 127.0.0.1:6379> set k2 v2 OK 127.0.0.1:6379> set k3 v3 OK 127.0.0.1:6379> get k3 "v3" 127.0.0.1:6379> keys * 1) "k2" 2) "k3" 3) "k1" 127.0.0.1:6379> set k4 v4 OK 127.0.0.1:6379> INFO replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6380,state=online,offset=221,lag=1 slave1:ip=127.0.0.1,port=6381,state=online,offset=221,lag=1 master_repl_offset:221 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:220 127.0.0.1:6379> set k6 v6
|
(2)Redis6380.conf
[root@pluto 桌面]# cd /usr/local/bin/ [root@pluto bin]# clear [root@pluto bin]# redis-server /myredis/redis6380.conf [root@pluto bin]# redis-cli -p 6380 127.0.0.1:6380> ping PONG 127.0.0.1:6380> 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 127.0.0.1:6380> SLAVEOF 127.0.0.1 6379 OK 127.0.0.1:6380> get k4 "v4" 127.0.0.1:6380> get k1 "v1" 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:4 master_sync_in_progress:0 slave_repl_offset:235 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 127.0.0.1:6380> set k6 v66 (error) READONLY You can't write against a read only slave. 127.0.0.1:6380> set k66 v66 (error) READONLY You can't write against a read only slave. 127.0.0.1:6380> set k7 v7 (error) READONLY You can't write against a read only slave. 127.0.0.1:6380>
|
(3)Redis6381.conf
[root@pluto 桌面]# cd /usr/local/bin/ [root@pluto bin]# clear [root@pluto bin]# redis-server /myredis/redis6381.conf [root@pluto bin]# redis-cli -p 6381 127.0.0.1:6381> ping PONG 127.0.0.1:6381> 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 127.0.0.1:6381> SLAVEOF 127.0.0.1 6379 OK 127.0.0.1:6381> get k4 "v4" 127.0.0.1:6381> info replication # Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:up master_last_io_seconds_ago:7 master_sync_in_progress:0 slave_repl_offset:235 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 127.0.0.1:6381> set k6 v666 (error) READONLY You can't write against a read only slave. 127.0.0.1:6381>
|
[1]主機掛
127.0.0.1:6379> INFO replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6380,state=online,offset=221,lag=1 slave1:ip=127.0.0.1,port=6381,state=online,offset=221,lag=1 master_repl_offset:221 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:220 127.0.0.1:6379> set k6 v6 OK 127.0.0.1:6379> SHUTDOWN not connected> exit [root@pluto bin]# redis-server /myredis/redis6379.conf [root@pluto bin]# redis-cli -p 6379 127.0.0.1:6379> keys * 1) "k2" 2) "k1" 3) "k6" 4) "k3" 5) "k4" 127.0.0.1:6379> set k7 v7 OK 127.0.0.1:6379> |
127.0.0.1:6380> keys * 1) "k2" 2) "k3" 3) "k1" 4) "k4" 5) "k6" 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:684 master_link_down_since_seconds:17 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 127.0.0.1:6380> get k7 "v7" 127.0.0.1:6380> |
127.0.0.1:6381> keys * 1) "k1" 2) "k4" 3) "k6" 4) "k3" 5) "k2" 127.0.0.1:6381> 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:684 master_link_down_since_seconds:29 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 127.0.0.1:6381> get k7 "v7" |
[2]從機掛
127.0.0.1:6379> set k8 v8 OK 127.0.0.1:6379> info replication # Replication role:master connected_slaves:1 slave0:ip=127.0.0.1,port=6381,state=online,offset=334,lag=1 master_repl_offset:334 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:333 127.0.0.1:6379> |
127.0.0.1:6380> SHUTDOWN not connected> exit [root@pluto bin]# redis-server /myredis/redis6380.conf [root@pluto bin]# redis-cli -p 6380 127.0.0.1:6380> 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 127.0.0.1:6380> get k8 (nil)
|
127.0.0.1:6381> get k8 "v8" 127.0.0.1:6381> info replication # Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:up master_last_io_seconds_ago:4 master_sync_in_progress:0 slave_repl_offset:348 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 127.0.0.1:6381> |
2)薪火相傳
(1)redis6379.conf
127.0.0.1:6379> info replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6381,state=online,offset=642,lag=1 slave1:ip=127.0.0.1,port=6380,state=online,offset=642,lag=1 master_repl_offset:642 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:641 127.0.0.1:6379> info replication # Replication role:master connected_slaves:1 slave0:ip=127.0.0.1,port=6380,state=online,offset=684,lag=0 master_repl_offset:684 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:683 127.0.0.1:6379> |
(1)redis6380.conf
127.0.0.1:6380> info replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6381,state=online,offset=642,lag=1 slave1:ip=127.0.0.1,port=6380,state=online,offset=642,lag=1 master_repl_offset:642 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:641 127.0.0.1:6380> info replication # Replication role:master connected_slaves:1 slave0:ip=127.0.0.1,port=6380,state=online,offset=684,lag=0 master_repl_offset:684 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:683 127.0.0.1:6380> |
(1)redis6381.conf
127.0.0.1:6381> info replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6381,state=online,offset=642,lag=1 slave1:ip=127.0.0.1,port=6380,state=online,offset=642,lag=1 master_repl_offset:642 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:641 127.0.0.1:6381> info replication # Replication role:master connected_slaves:1 slave0:ip=127.0.0.1,port=6380,state=online,offset=684,lag=0 master_repl_offset:684 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:683 127.0.0.1:6381> |
3)反客爲主
(1)redis6379.conf
127.0.0.1:6379> info replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6380,state=online,offset=1058,lag=1 slave1:ip=127.0.0.1,port=6381,state=online,offset=1058,lag=1 master_repl_offset:1058 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:1057 127.0.0.1:6379> SHUTDOWN not connected> exit [root@pluto bin]# redis-server /myredis/redis6379.conf [root@pluto bin]# redis-cli -p 6379 127.0.0.1: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 127.0.0.1:6379> |
(2)redis6380.conf
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:0 master_sync_in_progress:0 slave_repl_offset:1072 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:403 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:402 127.0.0.1:6380> SLAVEOF no one OK 127.0.0.1:6380> info replication # Replication role:master connected_slaves:0 master_repl_offset:445 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:444 127.0.0.1:6380> set k10 v10 OK 127.0.0.1:6380> |
(3)redis6381.conf
127.0.0.1:6381> SLAVEOF 127.0.0.1 6379 OK 127.0.0.1:6381> info replication # Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:up master_last_io_seconds_ago:8 master_sync_in_progress:0 slave_repl_offset:1072 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 127.0.0.1:6381> 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:1086 master_link_down_since_seconds:32 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 127.0.0.1:6381> SLAVEOF 127.0.0.1 6380 OK 127.0.0.1:6381> get k10 "v10" 127.0.0.1:6381> |
4.Redis複製原理
5.Redis哨兵模式
1).哨兵模式簡介
反客爲主的自動版,可以後臺監控主機是否故障,若是故障了根據投票數自動將從庫轉換爲主庫
2).哨兵模式使用
[1]redis6379.conf
127.0.0.1:6379> SHUTDOWN not connected> exit [root@pluto bin]# redis-server /myredis/redis6379.conf [root@pluto bin]# redis-cli -p 6379 127.0.0.1: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 127.0.0.1:6379> info replication # Replication role:slave master_host:127.0.0.1 master_port:6380 master_link_status:up master_last_io_seconds_ago:1 master_sync_in_progress:0 slave_repl_offset:12464 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 127.0.0.1:6379> |
[2]redis6380.conf
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:8 master_sync_in_progress:0 slave_repl_offset:365 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:365 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:364 127.0.0.1:6380> keys * 1) "k4" 2) "k9" 3) "k7" 4) "k3" 5) "k8" 6) "k2" 7) "k1" 8) "k6" 127.0.0.1:6380> info replication # Replication role:master connected_slaves:1 slave0:ip=127.0.0.1,port=6381,state=online,offset=8735,lag=0 master_repl_offset:8735 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:8734 127.0.0.1:6380> set k10 v10 OK 127.0.0.1:6380> info replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6381,state=online,offset=13689,lag=1 slave1:ip=127.0.0.1,port=6379,state=online,offset=13822,lag=0 master_repl_offset:13822 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen: |
[3]redis6381.conf
127.0.0.1:6381> info replication # Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:up master_last_io_seconds_ago:1 master_sync_in_progress:0 slave_repl_offset:379 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 127.0.0.1:6381> keys * 1) "k1" 2) "k7" 3) "k4" 4) "k6" 5) "k9" 6) "k3" 7) "k8" 8) "k2" 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:0 master_sync_in_progress:0 slave_repl_offset:8602 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 127.0.0.1:6381> get k10 "v10" 127.0.0.1:6381> |
6.Redis複製缺點
因爲全部的寫操做都是先在Master上操做,而後同步更新到Slave上,因此從Master同步到Slave機器有必定的延遲,當系統很繁忙的時候,延遲問題會更加嚴重,Slave機器數量的增長也會使這個問題更加嚴重。