为了提升redis高可用性,除了备份redis dump数据之外,还需要创建redis主从架构,可以利用从将数据库持久化,(我们所说的数据持久化将是将数据保存到写磁盘上,保证不会因为断电等因素丢失数据)

Redis需要经常将内存中的数据同步到磁盘来保证持久化,redis支持两种持久化方式:一种是snapshotting(快照)是默认的方式,另一种是Append-only-file(缩写写就是aof的方式)

Redis主从复制,也就是说当用户在往master端主redis写入 数据的时候,会通过redis sync机制将数据发送到redis slave,slave也会执行相同操作确保数据一致性,且实现redis主从复制非常简单,同时redis slave上还可以开启二级slave,三级slave从库;实现一主多从的架构 ,与mysql主从非常类似;

[半持久化RDB]

半持久化RDB模式也是Redis备份默认的方式,是通过快照(snapshotting)完成的,当符合在redis.conf配置中设置的条件时,redis会自动将内存中的数据进行快照并存储在硬盘上,完成数据备份;

Redis进行RDB快照的条件 由用户在配置文件中自定义,由两个参数构成;时间和改动的键的个数,当在指定的时间内被更改的键的个数大于指定的数值时就会进行快照。在配置文件中预制了三个条件

save    900  1    #900秒内有至少1个键被更改则进行快照

save    300   10    #300秒内有至少10个键被更改 则进行快照

save    60      10000    #60秒内至少10000个键被更改则进行快照

Ps:默认可以存在多个条件,多个条件之间是或者的关系,也就是说满足其中 一个条件就会进行快照,如果想要禁止自动快照,只需要将save参数删除即可,redis快照默认会被存在 redis数据目录中,默认文件名为dump.rdb,可以通过该配置dir和dbfilename两个参数分指定存储路径和文件名。也可以在redis命令行中执行config get dir查看redis数据保存路径;

Redis RDB 实现快照的过程:redis使用fork函数复制一份当前进程的副本,这个当前进程也就是父进程,副本也是指子进程,父进程继续接受并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件,当子进程写入完所有数据之后会用该临时文件替换旧的RDB文件,至此一次快照完成

【半持久化AOF模式】

如果数据很重要如果无法承受任何损失,可以考虑使用AOF方式进行持久化,默认是没有开启AOF(append noly file)的方式的持久化模式

在启动时redis会逐个执行AOF文件中的命令来将硬盘中的数据载入到内存中,载入的速度与RDB相比会慢一下,开启AOF持久化后执行一条会更改redis中的数据命令,redis就会将该命令写入硬盘中的AOF文件,AOF文件保存位置和RDB位置相同,都是通过dir参数设置的,默认文件名是appendonly.aof,可以通过appendfilename参数修改名称

Redis允许同时开启AOF和RDB,既保证了数据安全性又使得备份操作简单,此时重启redis后,redis会使用AOF文件来恢复数据,因为AOF方式的持久化可能丢失的数据更少,在redis.conf中通过appendonly参数开启redis AOF模式

 appendonly  yes     #开启AOF持久化功能
appendfilename appendonly.aof #AOF持久化保存文件名称
auto-aof-rewrite-percentage #当AOF文件大小超过上一次重写时的AOF文件大小的百分之多少时会再次进行重写,如果之前没有重写过,则以启动时的AOF文件大小为依据;
 auto-aof-rewrite-min-size 64mb    #允许重写的最小AOF文件大小配置写入AOF文件后,要求系统刷新硬盘缓存机制
appendfsync always #每次执行写入都会执行同步,最安全也最慢;
#appendfsync everysec #每秒自行同步操作
#appendfsync no #不主动进行同步操作,而是完全交给操作系统来做,每30秒一次,最快也最不安全

【部署】

# wget http://download.redis.io/releases/redis-4.0.5.tar.gz

# tar zxvf redis-4.0.5.tar.gz -C /usr/src/

# cd /usr/src/redis-4.0.5/
# make

# cd src/
# make install PREFIX=/usr/local/redis

# cp redis.conf  /usr/local/redis/

mkdir /usr/local/redis/etc -p
mkdir /usr/local/redis/var -p

cp redis.conf /usr/local/redis/etc

# export PATH=/usr/local/redis/bin:$PATH
# nohup /usr/local/redis/bin/redis-server /usr/local/redis/redis.conf &

# vim /usr/local/redis/etc/redis.conf      #Redis-master的redis.conf配置文件

 daemonize yes
pidfile /var/run/redis.pid
port
tcp-backlog
timeout
tcp-keepalive
loglevel notice
logfile /usr/local/redis/var/redis.log
databases
save
save
save
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename redis.rdb
dir /data/redis/
slave-serve-stale-data yes
slave-read-only yes
repl-disable-tcp-nodelay no
slave-priority
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage
auto-aof-rewrite-min-size 64mb
lua-time-limit
slowlog-log-slower-than
slowlog-max-len
latency-monitor-threshold
notify-keyspace-events ""
hash-max-ziplist-entries
hash-max-ziplist-value
list-max-ziplist-entries
list-max-ziplist-value
set-max-intset-entries
zset-max-ziplist-entries
zset-max-ziplist-value
hll-sparse-max-bytes
activerehashing yes
client-output-buffer-limit normal
client-output-buffer-limit slave 256mb 64mb
client-output-buffer-limit pubsub 32mb 8mb
hz
aof-rewrite-incremental-fsync yes
bind 0.0.0.0

redis-slave从配置文件

 daemonize yes
pidfile /var/run/redis.pid
port
slaveof 192.168.17.129
tcp-backlog
timeout
tcp-keepalive
loglevel notice
logfile /usr/local/redis/var/redis.log
databases
save
save
save
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename redis.rdb
dir /data/redis/
slave-serve-stale-data yes
slave-read-only yes
repl-disable-tcp-nodelay no
slave-priority
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage
auto-aof-rewrite-min-size 64mb
lua-time-limit
slowlog-log-slower-than
slowlog-max-len
latency-monitor-threshold
notify-keyspace-events ""
hash-max-ziplist-entries
hash-max-ziplist-value
list-max-ziplist-entries
list-max-ziplist-value
set-max-intset-entries
zset-max-ziplist-entries
zset-max-ziplist-value
hll-sparse-max-bytes
activerehashing yes
client-output-buffer-limit normal
client-output-buffer-limit slave 256mb 64mb
client-output-buffer-limit pubsub 32mb 8mb
hz
aof-rewrite-incremental-fsync yes

【问题拓展】

redis-slave端redis主从无法同步 ,连接被拒绝,这种情况在排除防火墙,selinux之外,那就是redis-master中的配置文件bind参数

原因:如果redis主服务器绑定了127.0.0.1,那么跨服务器IP的访问就会失败,从服务器用IP和端口访问主的时候,主服务器发现本机6379端口绑在了127.0.0.1上,也就是只能本机才能访问,外部请求会被过滤,这是linux的网络安全策略管理的

在redis-master端的redis.conf配置文件中

bind 127.0.0.1

改成

bind  0.0.0.0

可能会有人会想过直接将其注释,这种做法是错误的,注释掉之后,redis-slave端日志仍然报错

恢复正常之后,将redis启动并进入命令终端验证即可

【Redis启动脚本】

vim  /etc/init.d/redis

# redis Startup script for Redis Server
# chkconfig: -
# description: Redis is an open source, advanced key-value store.
# processname: redis-server
#This is the redis startup script written by Xiaoyu on 05.27, .
# config: /usr/local/redis/etc/redis.conf
# pidfile: /var/run/redis.pid
source /etc/init.d/functions
BIN="/usr/local/redis/bin"
CONFIG="/usr/local/redis/etc/redis.conf"
PIDFILE="/var/run/redis.pid"
### Read configuration
[ -r "$SYSCONFIG" ] && source "$SYSCONFIG"
RETVAL=
prog="redis-server"
desc="Redis Server"
start() {
if [ -e $PIDFILE ];then
echo "$desc already running...."
exit
fi
echo -n $"Starting $desc: "
daemon $BIN/$prog $CONFIG
RETVAL=$?
echo
[ $RETVAL -eq ] && touch /var/lock/subsys/$prog
return $RETVAL
}
stop() {
echo -n $"Stop $desc: "
killproc $prog
RETVAL=$?
echo
[ $RETVAL -eq ] && rm -f /var/lock/subsys/$prog $PIDFILE
return $RETVAL
}
restart() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
condrestart)
[ -e /var/lock/subsys/$prog ] && restart
RETVAL=$?
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart|status}"
RETVAL=
esac
exit $RETVAL

Redis主从实战的更多相关文章

  1. Redis实战——redis主从备份和哨兵模式实践

    借鉴:http://redis.majunwei.com/topics/sentinel.html     https://blog.csdn.net/u011784767/article/detai ...

  2. k8s实战--redis主从--guestbook

    快速入门 实验:通过服务自动发现的redis主从 难点: 1,服务的自动发现,即如何确定coreDNS 已生效 2,redis的主从验证 遇到的问题: 1,Can't handle RDB forma ...

  3. puppet工作原理及部署redis主从篇

    一.简介 1.国际惯例什么是puppet puppet是一种Linux.Unix.windows平台的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件.用户.cron任务.软件包.系统 ...

  4. redis 主从、哨兵、集群

    出处: redis主从复制和哨兵 Redis集群方式共有三种:主从模式,哨兵模式,cluster(集群)模式 一.Redis主从复制 主从复制:主节点负责写数据,从节点负责读数据,主节点定期把数据同步 ...

  5. Redis系列之(二):Redis主从同步,读写分离

    1. Redis主从同步 Redis支持主从同步.数据可以从主服务器向任意数量的从服务器上同步,同步使用的是发布/订阅机制. 2. 配置主从同步 Mater Slave的模式,从Slave向Maste ...

  6. Redis 主从配置和参数详解

    安装redis 下载redis wget http://download.redis.io/releases/redis-3.0.7.tar.gz 解压redis tar -xvf redis-.ta ...

  7. 基于Windows服务器集群的Redis主从配置指南

    前段时间一个项目因并发量大.因防止宕机做了主从备份,首页的表连接查询又非常的耗时.故此拿出利器Redis缓存这个查询结果,并随着用户操作而更新. 因官方目前只有linux版,Windows版下载:  ...

  8. redis 主从同步

    修改redis.conf配置文件 vi redis.conf 在编辑模式下 输入  /slaveof 来搜索 将slaveof启用 即 将#删除 依次配置所有 slave 并将进程 kill 掉 重启 ...

  9. redis主从 以及认证配置

    以前用redis用的很多,各种数据类型用的飞起,算是用得很溜了.不过那都是封装好的方法,自己直接调用.以前的公司比较规范,开发只是开发,很少去做跟运维相关的事情. 换了一份工作,不过这边项目刚开始起步 ...

随机推荐

  1. JGroups

    JGroups Developer(s) Bela Ban Stable release 4.0.10.Final / February 1, 2018 Written in Java Operati ...

  2. CSS学习——基础分类整理

        1. CSS     层叠样式表: Cascading Style Sheets,定义如何显示html元素 CSS规则: 选择器{属性: 值; 属性: 值;} CSS注释: /*在这里写注释说 ...

  3. Confluence 6 Oracle 连接问题解决

    如果 Confluence 提示没有 class 文件,你可能将你的 JDBC 驱动放置到了错误的文件夹. 下面的页面包含了一些你在使用 Oracle 数据库连接的时候可能会遇到的常见问题,请参考: ...

  4. js 获取当前的网址

    http://www.xcx.cc/index.php/home/index/ind?idf=12321var $cur_url=window.location.href; //获取全部的网址var ...

  5. 纯css使用线性渐变实现滚动进度条(来自于微信前端早读课)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 【linux】环境变量配置

    假设要添加环境变量 JAVA_HOME 1.先用自己的个人账号 vim /etc/profile 在文件末尾添加 export JAVA_HOME=/usr/java/jdk1..0_144 2. s ...

  7. 正则化 L1 L2

    机器学习中几乎都可以看到损失函数后面会添加一个额外项,常用的额外项一般有两种,一般英文称作ℓ1ℓ1-norm和ℓ2ℓ2-norm,中文称作L1正则化和L2正则化,或者L1范数和L2范数. L1正则化和 ...

  8. java----DOS命令

    dir /?   查看帮助 dir /s   查看当前的目录,以及子目录

  9. 广工赛-hdu6469-树链压缩/二分

    比较复杂的一题.. 不管是二分答案还是直接做,都需要压缩树链 /* 给定n种怪物,每个怪物有属性a[i] 打死第i种怪物后,第i只怪物会分裂成a[i]个第i-1种怪 如果打死的是第1种,那么获得经验a ...

  10. CF919F

    题意: Alice和Bob玩游戏,每人各有8张牌,牌的大小在0~4之间 每次操作,先手可以选择自己一张牌和对方一张牌求和后%5,将新的牌替代自己拿出的那张牌,以此类推,直到有一个人手中的牌全部是0,则 ...