Redis主从复制以及哨兵模式

 

主从复制

  官网:https://redis.io/topics/replication

 是什么:

               主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制, Master以写为主,Slave以读为主
 

  目的:读写分离,容灾恢复

 怎么做:

  •  拷贝多个redis.conf文件                     //cp redis.conf redis6379.conf
  •  开启daemonize yes
  •  Pid文件名字
  •  指定端口
  •  Log文件名字
  •  Dump.rdb名字
[root@C2_SW_5748F_1 copy]# cp redis.conf redis6379.conf
[root@C2_SW_5748F_1 copy]# ls
appendonly.aof  redis6379.conf   redis-cli   redis-server
dump.rdb        redis-check-aof  redis.conf
[root@C2_SW_5748F_1 copy]# cp redis.conf redis6380.conf
[root@C2_SW_5748F_1 copy]# cp redis.conf redis6381.conf
[root@C2_SW_5748F_1 copy]# ls
appendonly.aof  dump.rdb  redis6379.conf  redis6380.conf  redis6381.conf  redis-check-aof  redis-cli  redis.conf  redis-server

   vim编译时:快捷键使用"/"输入对应的关键字,按n寻找下一个出现的位置,:wq保存并退出

   需要把redis6379.conf、 redis6380.conf、redis6381.conf分别配置一下

   redis6380.conf如下:

//开启daemonize yes启动时为守护线程
# By default Redis does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
daemonize yes


//指定端口号
# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6380


//进程管道路径
# Creating a pid file is best effort: if Redis is not able to create it
# nothing bad happens, the server will start and run normally.
pidfile /var/run/redis6380.pid


//log文件名称
# Specify the log file name. Also the empty string can be used to force
# Redis to log on the standard output. Note that if you use standard
# output for logging but daemonize, logs will be sent to /dev/null
logfile "6380.log"


//dump.rdb名称
# The filename where to dump the DB
dbfilename dump6380.rdb

 把所有的文件配置一下,非常详细关于redis安装和redis配置文件可以看这些文章《Linux下Redis的安装》《Redis配置文件详解》

 这里模拟的是一台虚拟机上有多个redis,正常工作一定是把主服务器和辅服务器分开的,要不然这台虚拟机挂了,主服务器和辅服务器会一起挂,就凉凉了

 

 分别开启连接:redis6379.conf redis6380.conf  redis6381.conf

[root@C2_SW_5748F_1 copy]# redis-server redis6380.conf
[root@C2_SW_5748F_1 copy]# redis-cli -p 6380

  看查进程:

[root@C2_SW_5748F_1 copy]# ps -ef|grep redis
root       3201      1  0 4月03 ?       00:00:00 redis-server 127.0.0.1:6380
root       3214   2361  0 00:00 pts/2    00:00:00 redis-cli -p 6380
root       3219      1  0 00:00 ?        00:00:00 redis-server 127.0.0.1:6381
root       3245   2313  0 00:01 pts/1    00:00:00 redis-cli -p 6381
root       3285      1  0 00:05 ?        00:00:00 redis-server 127.0.0.1:6379
root       3289   2263  0 00:05 pts/0    00:00:00 redis-cli -p 6379
root       3512   3399  0 00:23 pts/3    00:00:00 grep --color=auto redis
[root@C2_SW_5748F_1 copy]# 

看查: 

模式一:一主二仆

前面的环境已经布置好了,开始进行主从复制,以6379为主机,6380和6381为辅机

看查

 redis6380和redis6381信息基本一样,辅机只有读取数据的权利

 辅机的权限:只读取

如果主机宕机,辅机会怎么样?

可以看到,主机挂掉以后,辅机仍然可以读取到以前的数据,主机的状态从up变成了down

 主机再次连接上,是否还是老大的权利?

 答案是可以的

如果辅机宕机了,需要重新连接才行,否则不能当6379的辅机,除非在redis.conf里面配置才行。

 

模式二:薪火相传

上一个Slave可以是下一个slave的Master, Slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个的master,可以有效减轻master的写压力
中途变更转向:会清除之前的数据,重新建立拷贝最新的
Slaveof新主库IP新主库端口
开始:

但是6380仍然不能写

模式三:反客为主

这个模式其实就是简单的示例,就是刚开始6380和6381都是6379的辅机,但是6379突然间挂掉了,6380自己摆脱了6379自己成为了主机,6381也愿意成为6380的辅机,当6379重新回来的时候,发现自己一个辅机也没有了,6380成为了赢家

主从复制原理:

          Slave启动成功连接到master后会发送一个sync命令,Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步
         全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
         增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步
         但是只要是重新连接master一次完全同步(全量复制)将被自动执行

缺点:

     由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一 定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。



哨兵模式:

      作用:能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。

 

使用步骤:

 1、6379为主机,6380和6381分别为6379的辅机

2、在启动目录下创建sentinel.conf文件

[root@C2_SW_5748F_1 copy]# ls
6379.log  6380.log  6381.log  appendonly.aof  dump6379.rdb  dump6380.rdb  dump6381.rdb  dump.rdb  redis6379.conf  redis6380.conf  redis6381.conf  redis-check-aof  redis-cli  redis.conf  redis-server
[root@C2_SW_5748F_1 copy]# touch sentinel.conf
[root@C2_SW_5748F_1 copy]# ls
6379.log  6381.log        dump6379.rdb  dump6381.rdb  redis6379.conf  redis6381.conf   redis-cli   redis-server
6380.log  appendonly.aof  dump6380.rdb  dump.rdb      redis6380.conf  redis-check-aof  redis.conf  sentinel.conf
[root@C2_SW_5748F_1 copy]# 

3、sentinel monitor 被监控数据库名字(自己起名字) 127.0.0.1 6379 1     1表示sentinel通过投票后认为mater宕机的数量,此处为至少1

  sentinel.conf文件详解:

#配置端口
port 26379
#以守护进程模式启动
daemonize yes
#日志文件名
logfile "sentinel_26379.log"
#存放备份文件以及日志等文件的目录
dir "/opt/redis/data"
#监控的IP 端口号 名称 sentinel通过投票后认为mater宕机的数量,此处为至少2个
sentinel monitor mymaster 192.168.14.101 6379 2
#30秒ping不通主节点的信息,主观认为master宕机
sentinel down-after-milliseconds mymaster 30000
#故障转移后重新主从复制,1表示串行,>1并行
sentinel parallel-syncs mymaster 1
#故障转移开始,三分钟内没有完成,则认为转移失败
sentinel failover-timeout mymaster 180000

 我们就简单配置一下:

[root@C2_SW_5748F_1 copy]# vim sentinel.conf

#配置端口
port 26379
#以守护进程模式启动   设置为no时可以看到哨兵的运行过程,如果第一次用,建议设置为no
daemonize yes        
#日志文件名
logfile "sentinel_26379.log"
#存放备份文件以及日志等文件的目录
dir "/lhl/copy"
#监控的IP 端口号 名称 sentinel通过投票后认为mater宕机的数量,此处为至少2个
sentinel monitor host6379 127.0.0.1 6379 2                                    

 :wq保存并退出

4、启动哨兵

[root@C2_SW_5748F_1 redis-4.0.1]# cd src
[root@C2_SW_5748F_1 src]# mv redis-sentinel /lhl/copy/
[root@C2_SW_5748F_1 src]# cd /lhl/copy/
[root@C2_SW_5748F_1 copy]# ls
6379.log  6381.log        dump6379.rdb  dump6381.rdb  redis6379.conf  redis6381.conf   redis-cli   redis-sentinel  sentinel.conf
6380.log  appendonly.aof  dump6380.rdb  dump.rdb      redis6380.conf  redis-check-aof  redis.conf  redis-server
[root@C2_SW_5748F_1 copy]# redis-sentinel sentinel.conf

5、看一下哨兵日志,可以看到master为6379,辅机为6380和6381

[root@C2_SW_5748F_1 copy]# vim sentinel_26379.log

3373:X 04 Apr 06:22:19.687 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3373:X 04 Apr 06:22:19.687 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=3373, just started
3373:X 04 Apr 06:22:19.687 # Configuration loaded
3374:X 04 Apr 06:22:19.690 * Increased maximum number of open files to 10032 (it was originally set to 1024).
3374:X 04 Apr 06:22:19.691 * Running mode=sentinel, port=26379.
3374:X 04 Apr 06:22:19.692 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
3374:X 04 Apr 06:22:19.693 # Sentinel ID is a14f03ba90918091d2a1a3884fa1af78227f92a7
3374:X 04 Apr 06:22:19.693 # +monitor master host6379 127.0.0.1 6379 quorum 1
3374:X 04 Apr 06:22:19.695 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 6379
3374:X 04 Apr 06:22:19.695 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ host6379 127.0.0.1 6379

6、让6379宕机

 再次看查日志:

[root@C2_SW_5748F_1 copy]# vim sentinel_26379.log

3373:X 04 Apr 06:22:19.687 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3373:X 04 Apr 06:22:19.687 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=3373, just started
3373:X 04 Apr 06:22:19.687 # Configuration loaded
3374:X 04 Apr 06:22:19.690 * Increased maximum number of open files to 10032 (it was originally set to 1024).
3374:X 04 Apr 06:22:19.691 * Running mode=sentinel, port=26379.
3374:X 04 Apr 06:22:19.692 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
3374:X 04 Apr 06:22:19.693 # Sentinel ID is a14f03ba90918091d2a1a3884fa1af78227f92a7
3374:X 04 Apr 06:22:19.693 # +monitor master host6379 127.0.0.1 6379 quorum 1
3374:X 04 Apr 06:22:19.695 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 6379
3374:X 04 Apr 06:22:19.695 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ host6379 127.0.0.1 6379
3374:X 04 Apr 06:29:22.293 # +sdown master host6379 127.0.0.1 6379
3374:X 04 Apr 06:29:22.293 # +odown master host6379 127.0.0.1 6379 #quorum 1/1
3374:X 04 Apr 06:29:22.293 # +new-epoch 1
3374:X 04 Apr 06:29:22.293 # +try-failover master host6379 127.0.0.1 6379
3374:X 04 Apr 06:29:22.293 # +vote-for-leader a14f03ba90918091d2a1a3884fa1af78227f92a7 1
3374:X 04 Apr 06:29:22.293 # +elected-leader master host6379 127.0.0.1 6379
3374:X 04 Apr 06:29:22.293 # +failover-state-select-slave master host6379 127.0.0.1 6379
3374:X 04 Apr 06:29:22.376 # +selected-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 6379
3374:X 04 Apr 06:29:22.376 * +failover-state-send-slaveof-noone slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 6379
3374:X 04 Apr 06:29:22.448 * +failover-state-wait-promotion slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 6379
3374:X 04 Apr 06:29:23.351 # +promoted-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 6379
3374:X 04 Apr 06:29:23.351 # +failover-state-reconf-slaves master host6379 127.0.0.1 6379

7、发现6380成为了主机:

8、如果6379重新上线怎么办,哨兵会让6379成为6380(新的主机)的辅机

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值