Redis的主从复制(Master/Slave)(九)
2016-12-31 12:44
801 查看
Redis虽然有着卓越的性能,但我们仍然可以通过master/slave这种简单架构,进行读写分离,进一步挖掘redis的性能,提高系统的可用性。
redis怎么进行主从复制呢?redis复制主要是通过master server持久化的rdb文件实现的。master server 先dump出内存快照文件,然后将rdb文件传给slave server,slave server 根据rdb文件重建内存表。redis复制过程如下:
1、slave server启动连接到master server之后,salve server主动发送SYNC命令给master server。
2、master server接受SYNC命令之后,判断,是否有正在进行内存快照的子进程,如果有,则等待其结束,否则,fork一个子进程,子进程把内存数据保存为文件,并发送给slave server。
3、master server子进程进程做数据快照时,父进程可以继续接收client端请求写数据,此时,父进程把新写入的数据放到待发送缓存队列中。
4、slave server 接收内存快照文件之后,清空内存数据,根据接收的快照文件,重建内存表数据结构。
5、master server把快照文件发送完毕之后,发送缓存队列中保存的子进程快照期间改变的数据给slave server,slave server做相同处理,保存数据一致性。
6、master server 后续接收的数据,都会通过步骤1建立的连接,把数据发送到slave server
需要注意:slave server如果因为网络或其他原因断与master server的连接,当slave server重新连接时,需要重新获取master server的内存快照文件,slave server的数据会自动全部清空,然后再重新建立内存表,这样会让slave server 启动恢复服务比较慢,同时也给master
server带来较大压力,可以看出redis的复制没有增量复制的概念,这是redis主从复制的一个主要弊端,在实际环境中,尽量规避中途增加从库
容灾恢复
master server 配置文件master.conf, 主要配置如下:
daemonize yes
pidfile /var/run/redis_6379.pid
port 6379
#save 900 1
#save 300 10
#save 60 10000
dbfilename dump.rdb
dir /var/lib/redis/6379
slave server 配置文件redis80.conf,主要配置如下:
daemonize yes
pidfile /var/run/redis_6379.pid
port 6380
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
dir /var/lib/redis/6380
slaveof 127.0.0.1 6379
从库配置:slaveof 主库IP 主库端口
如果不配置slaveof 127.0.0.1 6379
每次与master断开之后,都需要重新连接,除非你配置进redis.conf文件
slave.conf中,主要通过slaveof指定其master的ip和端口。启动master和slave:
/usr/local/bin/redis-server /etc/redis/master.conf
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/07/5686fbcb2b52830032fb1fc3d44b10e6)
/usr/local/bin/redis-server /etc/redis/redis80.conf
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/07/539906f403849e7e0662f6c0eb8dfcbe)
连接master server,写入数据:
[root@xsf001 ~]# redis-cli -p 6379
redis 127.0.0.1:6379> set user.1.name zhangsan
OK
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/07/3477eef8f5512831e527f4dcb33146fb)
连接 slave server,读数据:
[root@xsf001 ~]# redis-cli -p 6380
redis 127.0.0.1:6380> get user.1.name
"zhangsan"
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/07/986d8d32a8e01b89eee1cd372db1a5b8)
从测试结果看,数据确实自动复制了。通过复制功能,我们可以在master上只写数据,在slave上读数据,关闭master的持久化(或aof)功能(在salve上开启),从而分担master服务器读压力,提高master服务器性能,同时,master挂了,可以快速地用slave server来替换master server,提高系统的可用性。
测试:
主从复制
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/07/5e3a76ab0cb90250eb6c3b685f401e7c)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/07/4e81a746111a6c22a8e55aad5ab34e09)
从库只能读
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/07/5e3a76ab0cb90250eb6c3b685f401e7c)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/07/7ad5804b4fba0ebbaea5044387cf1cde)
上一个Slave可以是下一个slave的Master,Slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个的master,可以有效减轻master的写压力中途变更转向:会清除之前的数据,重新建立拷贝最新的 slaveof 新主库IP 新主库端口
反客为主
使当前数据库停止与其他数据库的同步,转成主数据库
SLAVEOF no one
复制原理
slave启动成功连接到master后会发送一个sync命令
Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,
在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步
全量复制:slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步
配置步骤:
1.在redis的配置文件中添加鉴权和验证(添加requirepass和masterauth),redis主从都需要配置,配置的密码一般相同。
2.redis一般都在内网运行,所以注释掉#bind 127.0.0.1
3.关闭保护模式,protected-mode 把yes改为no
4.添加sentinel.conf配置文件:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
Sentinel参数在运行时可以使用SENTINEL SET命令更改
上面配置中的mymaster为该主从的名字,代码中会使用。
通过哨兵查看集群的信息:
启动哨兵:
一组sentinel能同时监控多个Master
5.复制的缺点:复制延时
由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。
redis怎么进行主从复制呢?redis复制主要是通过master server持久化的rdb文件实现的。master server 先dump出内存快照文件,然后将rdb文件传给slave server,slave server 根据rdb文件重建内存表。redis复制过程如下:
1、slave server启动连接到master server之后,salve server主动发送SYNC命令给master server。
2、master server接受SYNC命令之后,判断,是否有正在进行内存快照的子进程,如果有,则等待其结束,否则,fork一个子进程,子进程把内存数据保存为文件,并发送给slave server。
3、master server子进程进程做数据快照时,父进程可以继续接收client端请求写数据,此时,父进程把新写入的数据放到待发送缓存队列中。
4、slave server 接收内存快照文件之后,清空内存数据,根据接收的快照文件,重建内存表数据结构。
5、master server把快照文件发送完毕之后,发送缓存队列中保存的子进程快照期间改变的数据给slave server,slave server做相同处理,保存数据一致性。
6、master server 后续接收的数据,都会通过步骤1建立的连接,把数据发送到slave server
需要注意:slave server如果因为网络或其他原因断与master server的连接,当slave server重新连接时,需要重新获取master server的内存快照文件,slave server的数据会自动全部清空,然后再重新建立内存表,这样会让slave server 启动恢复服务比较慢,同时也给master
server带来较大压力,可以看出redis的复制没有增量复制的概念,这是redis主从复制的一个主要弊端,在实际环境中,尽量规避中途增加从库
1.是什么
是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主2.能干嘛
读写分离容灾恢复
3.配置
原文 http://blog.csdn.net/love__coder/article/details/8679198master server 配置文件master.conf, 主要配置如下:
daemonize yes
pidfile /var/run/redis_6379.pid
port 6379
#save 900 1
#save 300 10
#save 60 10000
dbfilename dump.rdb
dir /var/lib/redis/6379
slave server 配置文件redis80.conf,主要配置如下:
daemonize yes
pidfile /var/run/redis_6379.pid
port 6380
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
dir /var/lib/redis/6380
slaveof 127.0.0.1 6379
从库配置:slaveof 主库IP 主库端口
如果不配置slaveof 127.0.0.1 6379
每次与master断开之后,都需要重新连接,除非你配置进redis.conf文件
slave.conf中,主要通过slaveof指定其master的ip和端口。启动master和slave:
/usr/local/bin/redis-server /etc/redis/master.conf
/usr/local/bin/redis-server /etc/redis/redis80.conf
连接master server,写入数据:
[root@xsf001 ~]# redis-cli -p 6379
redis 127.0.0.1:6379> set user.1.name zhangsan
OK
连接 slave server,读数据:
[root@xsf001 ~]# redis-cli -p 6380
redis 127.0.0.1:6380> get user.1.name
"zhangsan"
从测试结果看,数据确实自动复制了。通过复制功能,我们可以在master上只写数据,在slave上读数据,关闭master的持久化(或aof)功能(在salve上开启),从而分担master服务器读压力,提高master服务器性能,同时,master挂了,可以快速地用slave server来替换master server,提高系统的可用性。
测试:
主从复制
从库只能读
上一个Slave可以是下一个slave的Master,Slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个的master,可以有效减轻master的写压力中途变更转向:会清除之前的数据,重新建立拷贝最新的 slaveof 新主库IP 新主库端口
反客为主
使当前数据库停止与其他数据库的同步,转成主数据库
SLAVEOF no one
复制原理
slave启动成功连接到master后会发送一个sync命令
Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,
在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步
全量复制:slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步
4.哨兵模式(sentinel)
反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库redis哨兵配置主从
redis哨兵的启动和redis实例的启动没有关系。所以可以在任何机器上启动redis哨兵。至少要保证有两个哨兵在运行,要不然宕机后哨兵会找不到主节点。配置步骤:
1.在redis的配置文件中添加鉴权和验证(添加requirepass和masterauth),redis主从都需要配置,配置的密码一般相同。
2.redis一般都在内网运行,所以注释掉#bind 127.0.0.1
3.关闭保护模式,protected-mode 把yes改为no
4.添加sentinel.conf配置文件:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
#sentinel端口 port 26379 #工作路径,注意路径不要和主重复 dir "/usr/local/redis-6379" # 守护进程模式 daemonize yes #关闭保护模式 protected-mode no # 指明日志文件名 logfile "./sentinel.log" #哨兵监控的master,主从配置一样,这里只用输入redis主节点的ip/port和法定人数。 sentinel monitor mymaster 192.168.125.128 6379 1 # master或slave多长时间(默认30秒)不能使用后标记为s_down状态。 sentinel down-after-milliseconds mymaster 5000 #若sentinel在该配置值内未能完成failover操作(即故障时master/slave自动切换),则认为本次failover失败。 sentinel failover-timeout mymaster 18000 #设置master和slaves验证密码 sentinel auth-pass mymaster 123456 sentinel parallel-syncs mymaster 1//指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
Sentinel参数在运行时可以使用SENTINEL SET命令更改
上面配置中的mymaster为该主从的名字,代码中会使用。
通过哨兵查看集群的信息:
$ redis-cli -p 26379 sentinel master mymaster//查看master的状态 SENTINEL slaves mymaster //查看salves的状态 SENTINEL sentinels mymaster //查看哨兵的状态 SENTINEL get-master-addr-by-name mymaster//获取当前master的地址 info sentinel//查看哨兵信息
启动哨兵:
方式一:redis-sentinel /path/to/sentinel.conf(推荐,这种方式启动和redis实例没有任何关系) 方式二:redis-server /path/to/sentinel.conf --sentinel
一组sentinel能同时监控多个Master
5.复制的缺点:复制延时
由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。
相关文章推荐
- redis主从复制【master-slave集群】
- Redis实现主从复制(master-slave)
- Redis实现主从复制(Master&Slave)
- Linux下Redis主从复制(master-slave)配置
- Redis主从复制(Master-Slave Replication)
- noSQL-redis学习(六) -- redis主从复制(Master/Slave)
- redis基础简介(七)- 主从复制(master & slave)
- Redis的master/slave复制(主从复制)
- CentOS 下安装Redis主从,Redis主从复制,Master-Slave部署架构
- Redis主从(Master-Slave)复制(Replication)设置
- redis主从复制(Master、Slave)
- Redis学习手册(主从复制) Master-Slave
- MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践
- MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践
- MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践
- 主从(master/slave)默认引擎不一致导致复制失败
- MySQL主从复制(Master-Slave)实践
- mysql 主从master-slave同步复制 配置,为读写分离准备
- MySQL主从复制(Master-Slave)
- MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)