Redis主从实战

     为了提升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模式

1 appendonly  yes     #开启AOF持久化功能
2 appendfilename appendonly.aof     #AOF持久化保存文件名称
3 auto-aof-rewrite-percentage 100   #当AOF文件大小超过上一次重写时的AOF文件大小的百分之多少时会再次进行重写,如果之前没有重写过,则以启动时的AOF文件大小为依据;
4 auto-aof-rewrite-min-size 64mb    #允许重写的最小AOF文件大小配置写入AOF文件后,要求系统刷新硬盘缓存机制
5 appendfsync always   #每次执行写入都会执行同步,最安全也最慢;
6 #appendfsync everysec   #每秒自行同步操作
7 #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配置文件

 1 daemonize yes
 2 pidfile /var/run/redis.pid
 3 port 6379
 4 tcp-backlog 511
 5 timeout 0
 6 tcp-keepalive 0
 7 loglevel notice
 8 logfile /usr/local/redis/var/redis.log
 9 databases 16
10 save 900 1
11 save 300 10
12 save 60 10000
13 stop-writes-on-bgsave-error yes
14 rdbcompression yes
15 rdbchecksum yes
16 dbfilename redis.rdb
17 dir /data/redis/
18 slave-serve-stale-data yes
19 slave-read-only yes
20 repl-disable-tcp-nodelay no
21 slave-priority 100
22 appendonly no
23 appendfilename "appendonly.aof"
24 appendfsync everysec
25 no-appendfsync-on-rewrite no
26 auto-aof-rewrite-percentage 100
27 auto-aof-rewrite-min-size 64mb
28 lua-time-limit 5000
29 slowlog-log-slower-than 10000
30 slowlog-max-len 128
31 latency-monitor-threshold 0
32 notify-keyspace-events ""
33 hash-max-ziplist-entries 512
34 hash-max-ziplist-value 64
35 list-max-ziplist-entries 512
36 list-max-ziplist-value 64
37 set-max-intset-entries 512
38 zset-max-ziplist-entries 128
39 zset-max-ziplist-value 64
40  hll-sparse-max-bytes 3000
41 activerehashing yes
42 client-output-buffer-limit normal 0 0 0
43 client-output-buffer-limit slave 256mb 64mb 60
44 client-output-buffer-limit pubsub 32mb 8mb 60
45 hz 10
46 aof-rewrite-incremental-fsync yes
47 bind 0.0.0.0

redis-slave从配置文件

 1 daemonize yes
 2 pidfile /var/run/redis.pid
 3 port 6379
 4 slaveof 192.168.17.129 6379
 5 tcp-backlog 511
 6 timeout 0
 7 tcp-keepalive 0
 8 loglevel notice
 9 logfile /usr/local/redis/var/redis.log
10 databases 16
11 save 900 1
12 save 300 10
13 save 60 10000
14 stop-writes-on-bgsave-error yes
15 rdbcompression yes
16 rdbchecksum yes
17 dbfilename redis.rdb
18 dir /data/redis/
19 slave-serve-stale-data yes
20 slave-read-only yes
21 repl-disable-tcp-nodelay no
22 slave-priority 100
23 appendonly no
24 appendfilename "appendonly.aof"
25 appendfsync everysec
26 no-appendfsync-on-rewrite no
27 auto-aof-rewrite-percentage 100
28 auto-aof-rewrite-min-size 64mb
29 lua-time-limit 5000
30 slowlog-log-slower-than 10000
31 slowlog-max-len 128
32 latency-monitor-threshold 0
33 notify-keyspace-events ""
34 hash-max-ziplist-entries 512
35 hash-max-ziplist-value 64
36 list-max-ziplist-entries 512
37 list-max-ziplist-value 64
38 set-max-intset-entries 512
39 zset-max-ziplist-entries 128
40 zset-max-ziplist-value 64
41 hll-sparse-max-bytes 3000
42 activerehashing yes
43 client-output-buffer-limit normal 0 0 0
44 client-output-buffer-limit slave 256mb 64mb 60
45 client-output-buffer-limit pubsub 32mb 8mb 60
46 hz 10
47 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: - 80 12
# 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, 2018.
# 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=0
prog="redis-server"
desc="Redis Server"
start() {
if [ -e $PIDFILE ];then
echo "$desc already running...."
exit 1
fi
echo -n $"Starting $desc: "
daemon $BIN/$prog $CONFIG
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
return $RETVAL
}
stop() {
echo -n $"Stop $desc: "
killproc $prog
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && 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=1
esac
exit $RETVAL

转载于:https://www.cnblogs.com/bixiaoyu/p/9094874.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 基础面试 英文_[Java面试] 面试java基础总结大全

原标题:[Java面试] 面试java基础总结大全基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性。java语言是跨平台,jvm不是跨平台的。JRE(Java Runtime Environment):ja…

在win7环境下使用网络无线共享把电脑变成一台无线路由器

视频教程: http://www.tudou.com/programs/view/PuWxjgYE2Sw/?frrec1&FRLIAN&refid7d145a79fe0ff49f 其中有几点的注意是要把网络设置为WEP、这样的通用性会广泛点、安全性会差点、看实际情况吧、可以先试试用WAP2加密方式、

Ubuntu下安装SSH服务

判断是否安装ssh服务,可以通过如下命令进行:$ ssh localhost ssh: connect to host localhost port 22: Connection refused 如上所示,表示没有还没有安装,可以通过apt安装,命令如下:apt-get install opens…

php字符串怎么传到html_php字符串函数(四):html与字符串之间的转换

* 1.addslashes($str):为了数据库查询语句等的需要在某些字符前加上了反斜线:单引号,双引号,反斜线,建议使用DBMS自带的:mysqli_real_escape_string()* 2.stripslashes($str):功能与addslashes()相反,去掉字符串中的转义反斜线字符* 3.htmlspecialchars($str,FLAG):将特殊字符转…

【Visual C++】游戏开发笔记二十七 Direct3D 11入门级知识介绍

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。http://blog.csdn.net/zhmxy555/article/details/7707628作者:毛星云 邮箱: happylifemxy163.com 期待着与志同道合的朋友们相互交流上一节里我们介绍了在迈入…

thinkphp省略php,ThinkPHP的截取字符串函数无法显示省略号的解决方法

对于ThinkPHP的截取字符串函数无法显示省略号的情况,解决方法如下:打开Common/extend.php页面,修改msubstr函数如下:function msubstr($str, $start0, $length, $charset"utf-8", $suffixtrue){if(function_exists(&quo…

Python Day 21 面向对象 (面向对象的三大特性(二)继承,多态,封装,几个装饰器函数)...

Python Day 21 面向对象 (面向对象的三大特性(二)继承,多态,封装,几个装饰器函数) https://mubu.com/doc/1AqL_M0IbW 继承之钻石继承 多态 封装 几个装饰器函数 classmethod 可以通过类使用被装饰的方法staticmethod …

将Fri May 04 17:25:34 CST 2012形式的日期字符串转换成java.util.Date对象的方法

java.util.Date类的toString()方法默认生成"Fri May 04 17:25:34 CST 2012"形式的字符串,但从这样的字符串生成java.util.Data对象却不那么自然,如下述代码 Date a new Date(); SimpleDateFormat sdf new SimpleDateFormat( "…

php webservice 上传,PHP实现WebService服务

第一步,安装PHP扩展SOAP并开启扩展,是否开启成功以phpinfo为准。第二步,创建服务端文件server.php{public functionhello(){return "Hello World!";}public function sum($num1,$num2){return $num1$num2;}}//创建 SoapServer 对象…

微信小程序小结(3) -- 使用wxParse解析html及多数据循环

wxParse-微信小程序富文本解析组件:https://github.com/icindy/wxParse 支持Html及markdown转wxml可视化 使用 1、copy下载好的文件夹wxParse - wxParse/-wxParse.js(必须存在)-html2json.js(必须存在)-htmlparser.js(必须存在)-showdown.js(必须存在)-wxDiscode.js…

简单实用的分页存储过程,支持多字段排序

CREATE PROCEDURE [dbo].[PublicSplitPage_sp] TableName varchar(8000), --表名 SqlStr varchar(8000)null, --查询语句 Condition varchar(8000), --查询条件 PageIndex int, --页所引,从0开始 PageSize int, --分页大…

php响应超过三十秒会报错么,如何捕捉致命错误:PHP中超过30秒的最大执行时间...

你唯一的select是增加允许的执行时间(将其设置为0使其无限,但不推荐)或产生一个新的线程,并希望最好的。这是不可捕捉的原因是它并没有真正抛出。 没有一行代码实际上触发了这个错误,而是PHP说:“不,不好意思&#xff…

前端代码标准最佳实践:javascript篇

前言 最近一直重构项目的前端代码,也参考了各种前端代码的最佳实践,目的是让前端的HTML,CSS,Javacript代码更符合标准,有更好的性能,更好的可维护性,尝到了重构后的甜头,也萌生了写这个系列博客的念头。前端…

配置springboot在访问404时自定义返回结果以及统一异常处理

在搭建项目框架的时候用的是springboot,想统一处理异常,但是发现404的错误总是捕捉不到,总是返回的是springBoot自带的错误结果信息。 如下是springBoot自带的错误结果信息: 1 { 2 "timestamp": 1492063521109, 3 &…

nginx配置php 9000,Nginx支持php配置

Nginx本身是不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux 下是socket,(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wra…

用例写到抽筋

这几天是第一次写web类的测试用例,不得不说,写web类的测试用例真是会写死人,每一项都要至少写一个测试用例,就算以一项一个用例来算,一个非常非常简单的网站都要写上上百个测试用例。比如说今天写的测试用例中&#xf…

ansible 判断和循环

标准循环 模式一 - name: add several usersuser: name{{ item }} statepresent groupswheelwith_items:- testuser1- testuser2 orwith_items: "{{ somelist }}" 模式2. 字典循环- name: add several usersuser: name{{ item.name }} statepresent groups{{ item.g…

Windows XP中快速识别真假SVCHOST.EXE

SVCHOST.EXE是基于NT核心技术的操作系统非常重要的进程,它提供许多系统服务,比如远程过程调用系统服务 (RPCSS)、动态主机配置协议(DPCH) 服务等与网络相关的服务。现在广大计算机用户普遍使用的Windows XP、Windows 2003等操作系统都涉及该进…

php require 500,thinkphp5出现500错误怎么办

thinkphp5出现500错误,如下图所示:require(): open_basedir restriction in effect. File(/home/wwwroot/pic/thinkphp/start.php) is not within the allowed解决方法:1、我是lnmp1.4 php5.6,php.ini里面的open_basedir 是注释掉…

eclipse从svn导入maven项目变成普通项目解决办法

右击项目-->configure-->Convert to Maven Project转载于:https://www.cnblogs.com/zhanzhuang/p/9105463.html