数据库Redis主从复制

工作原理

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

猜你喜欢

转载自blog.csdn.net/weixin_43800781/article/details/85228618