工作原理
slave向master发送sync命名---master启动后台存盘(收集所有修改数据命令)---完成后台存盘后,传送整个数据文件到slave---slave接受数据文件后,加载到内存,首次完成完全同步---有新的数据产生时,master继续将新收集到的数据修改命令依次传递给slave,完成同步
缺点是网络或者系统繁忙,会产生数据同步延时问题
注:从库不需要和主库数据一致,配置完主从复制之后,从库会自动同步数据并覆盖自己的数据
从库不作额外操作,客户端只能在从库上查看数据,并不能写入
结构模式
一主一从 一主多从 主从从
配置主从复制
拓 扑 结 构 |
---|
master服务器 复制/同步 slave服务器 192.168.4.51/24 -------------------------------------------> 192.168.4.52/24 | | ---------------------------------------------------------------------------------------------- | clien 客户机 192.168.4.50/24 |
配置从库 进入redis 执行slaveof 主机IP 端口(这种配置是临时的,重启就失效了!)
永久配置,修改配置文件/etc/redis/6379.conf 282 # slaveof <masterip> <masterport>
[root@redis52 ~]# redis-cli -h 192.168.4.52 -p 6352
192.168.4.52:6352> SLAVEOF 192.168.4.51 6351
OK
192.168.4.52:6352> info replication //查看主从配置信息
# Replication
role:slave
master_host:192.168.4.51
master_port:6351
[root@redis51 ~]# redis-cli -h 192.168.4.51 -p 6351
192.168.4.51:6351> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.4.52,port=6352,state=online,offset=168,lag=1
master_replid:0c141f6f2be45cc6760898c0be1e2c16fc7f869e
192.168.4.51:6351> set x 123
OK
192.168.4.52:6352> keys * //在52上查看信息,已经同步
1) "x"
[root@mysql52 ~]# /etc/init.d/redis_6379 stop
[root@mysql52 ~]# vim /etc/redis/6379.conf
########### REPLICATION ###########
...
282 slaveof 192.168.4.51 6351
[root@mysql52 ~]# /etc/init.d/redis_6379 start
[root@mysql52 ~]# redis-cli -h 192.168.4.52 -p 6352
192.168.4.52:6352> info replication
# Replication
role:slave
master_host:192.168.4.51
master_port:6351
master_link_status:up
...
主库宕机后,可以将从库设置为主库
命令行 slaveof no one 配置文件在注释掉(永久为主库)
192.168.4.52:6352> slaveof no one
OK
192.168.4.52:6352> info replication
# Replication
role:master
配置带验证的主从配置
配置master主机,设置密码
192.168.4.51:6351> shutdown
not connected> exit
[root@redis51 ~]# vim /etc/redis/6379.conf
...
############# SECURITY #############
...
501 requirepass 123456
[root@redis51 ~]# vim /etc/init.d/redis_6379
...
REDISPORT="6351 -h 192.168.4.51 -a 123456"
...
[root@redis51 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@redis51~]# redis-cli -h 192.168.4.51 -p 6351
192.168.4.51:6351> keys *
(error) NOAUTH Authentication required. //需输入密码才可以查看
192.168.4.51:6351> auth 123456
OK
192.168.4.51:6351> set y 123
配置 从库主机,指定主库IP,设置链接密码(289 # masterauth <master-password>)
[root@redis52 ~]# redis-cli -h 192.168.4.52 -p 6352
192.168.4.52:6352> INFO replication
# Replication
role:slave
master_host:192.168.4.51
master_port:6351
master_link_status:down //可以看到状态已经关了
...
192.168.4.52:6352> keys * //数据也没有同步
1) "x"
[root@redis52 ~]# /etc/init.d/redis_6379 stop
[root@redis52 ~]# vim /etc/redis/6379.conf
...
289 masterauth 123456
...
[root@redis52 ~]# /etc/init.d/redis_6379 start
[root@mysql52 ~]# redis-cli -h 192.168.4.52 -p 6352
192.168.4.52:6352> INFO replication
# Replication
role:slave
master_host:192.168.4.51
master_port:6351
master_link_status:up
...
192.168.4.52:6352> keys *
1) "x"
2) "y"
配置一主两从
在上面的基础上添加53为51的从库
[root@redis53 ~]# /etc/init.d/redis_6379 stop
[root@redis53 ~]# vim /etc/redis/6379.conf
...
############ REPLICATION ############
...
282 slaveof 192.168.4.51 6351
...
289 masterauth 123456
[root@redis53 ~]# /etc/init.d/redis_6379 start
[root@redis53 ~]# redis-cli -h 192.168.4.53 -p 6353
192.168.4.53:6353> info replication
# Replication
role:slave
master_host:192.168.4.51
master_port:6351
master_link_status:up
在51上验证从库,还有数据同步
[root@redis51 ~]# redis-cli -h 192.168.4.51 -p 6351
192.168.4.51:6351> auth 123456
OK
192.168.4.51:6351> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.4.52,port=6352,state=online,offset=1204,lag=0
slave1:ip=192.168.4.53,port=6353,state=online,offset=1204,lag=0
...
192.168.4.51:6351> set z 123
OK
在53上查看数据是否同步
192.168.4.53:6353> keys *
1) "y"
2) "z"
3) "x"
客户端链接主库51,写入数据,在53上再次查看
[root@redis50 ~]# redis-cli -h 192.168.4.51 -p 6351 -a 123456
192.168.4.51:6351> keys *
1) "y"
2) "x"
3) "z"
192.168.4.51:6351> set a 001
OK
[root@redis53 ~]# redis-cli -h 192.168.4.53 -p 6353
192.168.4.53:6353> keys *
1) "y"
2) "a"
3) "z"
4) "x"
配置主从从结构
先将刚才用的从库53还原为独立的主库
[root@redis53 ~]# /etc/init.d/redis_6379 stop
[root@redis53 ~]# vim /etc/redis/6379.conf
############## REPLICATION #############
...
282 #slaveof 192.168.4.51 6351 //注释
...
289 #masterauth 123456 //注释
[root@redis53 ~]# /etc/init.d/redis_6379 start
[root@redis53 ~]# redis-cli -h 192.168.4.53 -p 6353
192.168.4.53:6353> INFO replication
# Replication
role:master
192.168.4.53:6353> FLUSHALL
OK
192.168.4.53:6353> keys *
(empty list or set)
修改配置文件,设置为52的从库
[root@redi53 ~]# /etc/init.d/redis_6379 stop
[root@redisc ~]# vim /etc/redis/6379.conf
...
slaveof 192.168.4.52 6352
[root@redis53 ~]# /etc/init.d/redis_6379 start
[root@redis53 ~]# redis-cli -h 192.168.4.53 -p 6353
192.168.4.53:6353> info replication
# Replication
role:slave
master_host:192.168.4.52
master_port:6352
master_link_status:up
192.168.4.53:6353> keys *
1) "x"
2) "a"
3) "y"
4) "z"
客户端链接51,并写入数据,验证从库52和53
[root@redis50 ~]# redis-cli -h 192.168.4.51 -p 6351 -a 123456
192.168.4.51:6351> set b 002
OK
192.168.4.52:6352> keys *
1) "y"
2) "z"
3) "a"
4) "b"
5) "x"
192.168.4.53:6353> keys *
1) "x"
2) "a"
3) "b"
4) "z"
5) "y"
哨兵(sentinel)模式 ----监控主库
所用结构(主从从51 52 53)
编写哨兵服务的配置文件(在52上设置)
sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel auth-pass <master-name> <password>
[root@redis52 ~]# cd redis/redis-4.0.8/
[root@redis52 redis-4.0.8]# cp sentinel.conf /etc/
[root@mysql52 redis-4.0.8]# vim /etc/sentinel.conf
...
15 bind 0.0.0.0
21 port 26379 //默认端口
...
52 # sentinel monitor <master-name> <ip> <redis-port> <quorum> //在下面添加
sentinel monitor redis51 192.168.4.51 6351 1
...
71 # sentinel auth-pass <master-name> <password> //在下面添加
sentinel auth-pass redis51 123456
...
启动哨兵服务
[root@mysql52 ~]# redis-sentinel /etc/sentinel.conf
...
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 4.0.8 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
| `-._ `._ / _.-' | PID: 3841
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
3841:X 24 Dec 11:55:57.666 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
3841:X 24 Dec 11:55:57.693 # Sentinel ID is 53ddd54e5bbba74e70927a758807995453a076ec
3841:X 24 Dec 11:55:57.694 # +monitor master mymaster 127.0.0.1 6379 quorum 2
3841:X 24 Dec 11:55:57.694 # +monitor master redis51 192.168.4.51 6351 quorum 1
3841:X 24 Dec 11:55:57.695 * +slave slave 192.168.4.52:6352 192.168.4.52 6352 @ redis51 192.168.4.51 6351
3841:X 24 Dec 11:56:27.674 # +sdown master mymaster 127.0.0.1 6379
[root@mysql52 ~]# redis-sentinel /etc/sentinel.conf & //可以放到后台
测试(51宕机,52自动成为主库)
[root@redisa ~]# redis-cli -h 192.168.4.51 -p 6351
192.168.4.51:6351> auth 123456
192.168.4.51:6351> shutdown
not connected>
[root@redis52 ~]# redis-cli -h 192.168.4.52 -p 6352
192.168.4.52:6352> INFO replication
# Replication
role:master
connected_slaves:1
[root@redis52 ~]# vim /etc/sentinel.conf //文件的内容已经相应改变
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel myid 53ddd54e5bbba74e70927a758807995453a076ec
...
# sentinel auth-pass <master-name> <password>
sentinel config-epoch mymaster 0
[root@redis52 ~]# redis-sentinel /etc/sentinel.conf
...
3841:X 24 Dec 12:00:19.914 * +slave slave 192.168.4.53:6353 192.168.4.53 6353 @ redis51 192.168.4.52 6352
3841:X 24 Dec 12:00:49.023 # +sdown slave 192.168.4.51:6351 192.168.4.51 6351 @ redis51 192.168.4.52 6352
启动51,自动成为52的从库
[root@redis51 ~]# /etc/init.d/redis_6379 start
[root@redis52 ~]# redis-cli -h 192.168.4.52 -p 6352
192.168.4.52:6352> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.4.53,port=6353,state=online,offset=573865,lag=1
slave1:ip=192.168.4.51,port=6351,state=online,offset=573865,lag=0
...