热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

NoSQL——Redis主从复制、RDB/AOF持久化、数据类型

2019独角兽企业重金招聘Python工程师标准一.主从复制1.结构模式一主一从一主多从主丛从2.工作原理slave向master发送sync命令。master启动后台存盘进

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一. 主从复制

1. 结构模式

  • 一主一从
  • 一主多从
  • 主丛从

2. 工作原理

  • slave向master发送sync命令。
  • master启动后台存盘进程,并收集所有修改数据命令。
  • master完成后台存盘后,传送整个数据文件到slave。
  • slave接收数据文件,加载到内存中完成首次完全同步。
  • 后续新数据产生,master继续将新的数据收集到的修改命令依次传给slave,完成同步。

3. 缺点

  • 网络和系统繁忙时,会产生数据同步延时。

4. 一主一从配置

默认所有的Redis服务器都是主库,只需要配置从库。

默认从库都是只读的,不能插入数据。

(1) 查看主从配置信息:主库登陆redis后输入info replication

info replication# Replicationrole:masterconnected_slaves:0 //没有从库master_replid:dc2cd3bb9200687f7e20749128614ab43ca310dcmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:0second_repl_offset:-1repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0

(2) 从库上配置:slaveof 主库IP 主库端口号

slaveof 192.168.4.51 6351

(3) 再次在主库上查看主从配置信息

info replication# Replicationrole:masterconnected_slaves:1 //一个从库slave0:ip=192.168.4.52,port=6352,state=online,offset=210,lag=1master_replid:d4296cbb0f2298172be749620e7b47b5e8d696damaster_replid2:0000000000000000000000000000000000000000master_repl_offset:224second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:224

5. 一主多从配置(主从从方法类似)

(1) 在第二台从库上输入slaveof 命令

slaveof 192.168.4.51 6351

(2) 再次在主库上查看主从配置信息

info replication# Replicationrole:masterconnected_slaves:2 //两个从库slave0:ip=192.168.4.52,port=6352,state=online,offset=476,lag=1slave1:ip=192.168.4.53,port=6353,state=online,offset=476,lag=1master_replid:d4296cbb0f2298172be749620e7b47b5e8d696damaster_replid2:0000000000000000000000000000000000000000master_repl_offset:490second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:490

6. 从库恢复为独立数据库

(1) 重启服务

/etc/init.d/redis_6379 stop
/etc/init.d/redis_6379 start

(2) slaveof no one

7. 永久配置主从配置

修改配置文件,282行取消注释。

/etc/init.d/redis_6379 stopvim /etc/redis/6379.conf282 slaveof 192.168.4.51 6351/etc/init.d/redis_6379 start

8. 配置带密码验证的主从同步

(1) 主库修改密码,配置文件501行。重启服务。

/etc/init.d/redis_6379 stopvim /etc/redis/6379.conf 501 requirepass 123456/etc/init.d/redis_6379 start

(2) 从库修改配置文件,配置文件289行修改密码。重启服务。

/etc/init.d/redis_6379 stopvim /etc/redis/6379.conf 289 masterauth 123456/etc/init.d/redis_6379 start

9. 哨兵模式

  • 主库宕机后,从库自动升级为主库。

(1) 从库主机编辑sentinel.conf文件。(模板在源码包中)

vim /etc/sentinel.confsentinel monitor redis51 192.168.4.51 6351 1#sentinel monitor 主机名 IP地址 端口 票数#票数:有机态哨兵主机连接不上主库时,切换主库。sentinel auth-pass redis51 123456

(2) 从库上运行哨兵程序。(程序将占用该终端)

redis-sentinel /etc/sentinel.conf
#以下为输出信息
2567:X 27 Aug 10:51:24.793 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2567:X 27 Aug 10:51:24.793 # Redis version=4.0.8, bits=64, commit=00000000, modified=0, pid=2567, just started
2567:X 27 Aug 10:51:24.793 # Configuration loaded
2567:X 27 Aug 10:51:24.795 * Increased maximum number of open files to 10032 (it was originally set to 1024)._._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 4.0.8 (00000000/0) 64 bit.-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in sentinel mode|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379| `-._ `._ / _.-' | PID: 2567`-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 2567:X 27 Aug 10:51:24.796 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
2567:X 27 Aug 10:51:24.833 # Sentinel ID is 7c618b1ca9bd3d7eca4ea9e909aa6246f4629544
2567:X 27 Aug 10:51:24.834 # +monitor master redis51 192.168.4.51 6351 quorum 1
2567:X 27 Aug 10:51:24.836 * +slave slave 192.168.4.52:6352 192.168.4.52 6352 @ redis51 192.168.4.51 6351

(3) 主库宕机后,从库将自动升级为主库。之前的主库恢复后,自动变为从库。

二. 持久化

1. RDB

(1) 介绍

  • RDB,Redis DataBase, Redis数据库文件。
  • 数据持久化方式之一,默认。
  • 按照指定时间间隔,将内存的数据集快照(Snapshot)写入硬盘。
  • 恢复时,将快照文件直接都入内存。

(2) 相关参数

  • 文件名dump.rdb,在配置文件中配置,位于数据库目录中。

vim /etc/redis/6379.conf254 dbfilename dump.rdb

  • 数据从内存保存到硬盘的频率在配置文件中定义。

vim /etc/redis/6379.conf219 save 900 1 #900秒有1次修改220 save 300 10 #300秒有10次修改221 save 60 10000 #60秒有10000次修改#该三行值可手动修改

  • 手动立刻存盘
    • save         //阻塞写存盘
    • bgsave     //不阻塞写存盘
  • 压缩:

242 rdbcompression yes #RDB文件是否压缩,默认开启。

  • 存储快照后,使用crc16算法进行数据校验:

251 rdbchecksum yes #默认开启校验

  • gbsave出错时是否停止写操作:

236 stop-writes-on-bgsave-error yes #默认bgsave出错时停止写操作

(3) 备份/恢复数据

备份:在数据库目录/var/lib/redis/6379中,备份dump.rdb文件。

cp dump.rdb dump.rdb.aaa #备份

恢复:将需要恢复的RDB文件拷贝到数据库目录中,重启Redis服务。

/etc/init.d/redis_6379 stop
cp dump.rdb.aaa dump.rdb #恢复
/etc/init.d/redis_6379 start

(4) RDB优缺点

优点:

  • 高性能持久化实现:创建子程序执行持久化,先将数据写入临时文件,再替换RDB文件;主进程不做IO操作。
  • 适合大规模数据恢复且对数据完整性要求不是非常高的场合。

缺点:

  • 意外宕机时,最后一次持久化的数据会丢失。

2. AOF

(1) 介绍

  • Append Only File,只做追加操作的文件
  • 追加Redis的所有写操作到文件末尾
  • 可以使用cat命令查看文件内容

(2) 相关参数

  • 文件名:

/etc/init.d/redis_6379 stop
vim /etc/redis/6379.conf673 appendonly yes #启用aof,默认为no677 appendfilename "appendonly.aof" #aof文件名,启用后重启服务会在数据库文件夹中自动生成
/etc/init.d/redis_6379 start

  • AOF文件记录写操作的方式:

703 appendfsync everysec #每秒记录一次,默认。# appendfsync always #有新的写操作立刻记录# appendfsync no #从不记录。服务本身不记录,等待操作系统记录。

  • 触发日志文件重写:(将重复的操作进行合并)

744 auto-aof-rewrite-percentage 100
745 auto-aof-rewrite-min-size 64mb #每到64M整理一次

  • 修复AOF文件:
    • 当RDB和AOF同时存在时,AOF优先。
    • 把文件恢复到最后一次正确的操作。

手动破坏AOF文件,启动服务会失败:

redis-cli -p 6354 -h 192.168.4.54
Could not connect to Redis at 192.168.4.54:6354: Connection refused
Could not connect to Redis at 192.168.4.54:6354: Connection refused

修复AOF文件:

redis-check-aof --fix appendonly.aof
0x 107: Expected prefix '*', got: 'f'
AOF analyzed: size=284, ok_up_to=263, diff=21
This will shrink the AOF from 284 bytes, with 21 bytes, to 263 bytes
Continue? [y/N]: y #回车
Successfully truncated AOF

再次启动服务时会报错:

/etc/init.d/redis_6379 start
/var/run/redis_6379.pid exists, process is already running or crashed #报错,pid文件已存在,需要删除

删除pid文件重启服务:

rm -rf /var/run/redis_6379.pid #删除pid文件
/etc/init.d/redis_6379 start #再次启动服务
Starting Redis server... #服务正常启动

(3) AOF优缺点

优点:

  • 可灵活设置持久化方式,同步持久化(appendfsync always)或异步持久化(appendfsync everysec)
  • 出现意外宕机,仅丢失1秒数据。

缺点:

  • 持久化文件体积通常大于RDB方式
  • 执行fsync策略速度可能比RDB慢

三. 数据类型

1. String字符串操作 

(1) 插入 set/mset

set key value [ex seconds] [px milliseconds] [nx|xx]

  • ex 设置过期时间,秒为单位
  • px 设置过期时间,毫秒为单位
  • nx 变量不存在时才创建,存在时不创建
  • xx 不论变量是否存在都覆盖创建,默认

mset aa 1 bb 2 cc 3

(2) 复写特定位置的值 setrange

set first 'hello world'
setrange first 6 'Redis'
get first #输出"hello Redis"

(3) 统计字串长度 strlen

strlen first #输出 (integer) 11

(4) 追加 append

存在则追加,不存在则创建,返回key的长度。

append first (add) #输出(integer) 16
get first #输出"hello Redis(add)"
append second 222 #输出(integer) 3

(4) 按比特存储 setbit

  • value的值可以为1或0,offset为0~2^32之间
  • key不存在时则创建
  • 节约空间
  • bitcount 统计字符串中设置为1的比特数

setbit aaa 1 1
setbit aaa 2 1
setbit aaa 3 0
setbit aaa 4 0
setbit aaa 5 0
setbit aaa 6 1
setbit aaa 7 1
bitcount aaa #输出为4

(5) 变量值自减 decr/decrby (值必须为整数)

set a 100
decr a #输出为99
decrby a 20 #输出80

(6) 变量值自加 incr/incrby (值必须为整数)

set a 100
incr a #输出101
incrby a 20 #输出120

(7) 获取字符串值 get/mget

  • 返回字符串值
  • 如果key的值不是字符串,则返回错误

get abc
#输出"999"
mget a abc c
#输出
1) "100.5"
2) "999"
3) "110"

(8) 获取子字符串 getrange

set kkk ABCDEFG
getrange kkk 0 3
#输出"ABCD"
getrange kkk -2 -1
#输出"FG"
getrange kkk -1 -3
#输出""

2. List列表操作

  • 字符串队列
  • 先进后出
  • 一个key可以有多个值

(1) 插入lpush

  • 将一个或多个value值插入到key的表头
  • key不存在则创建

(2) 输出lrange

lpush a 1 2 3 4
lrange a 0 1
#输出
1) "4"
2) "3"
lrange a 0 -2
#输出
1) "4"
2) "3"
3) "2"
lrange a 0 -1
#输出
1) "4"
2) "3"
3) "2"
4) "1"

(3) 返回key长度 llen 

(4) 移除列表头元素,key不存在则返回nil

llen a
#输出4,表示长度为4
lpop a
#输出"4"
lpop a
#输出"3"
lpop a
#输出"2"
lpop a
#输出"1"
lpop a
#输出(nil)

(5) 返回某个位置的值 lindex

(6) 设置某个位置的值lset

lpush b A B C D E F
lindex b 0
#输出第一个值"F"
lindex b -1
#输出最后一个值"A"
lset b 1 EE #修改位于位置1的值为“EE”

(7) 将值插入key的尾部 rpush

(8) 删除并返回key尾部的值 rpop

rpush b G H #b的尾部插入“G”和“H”
lrange b 0 -1 #输出b所有的值
1) "F"
2) "EE"
3) "D"
4) "C"
5) "B"
6) "A"
7) "G"
8) "H"
rpop b #删除b末尾的值
"H"
lrange b 0 -1 #输出b所有的值
1) "F"
1) "F"
2) "EE"
3) "D"
4) "C"
5) "B"
6) "A"
7) "G"

3. Hash表操作

  • string类型的field和value的映射表
  • 一个key对应多个field,一个field对应一个value
  • 节省内存

(1) 存储hset/取值hget

hset site baidu www.baidu.com
hset site google www.google.com
hget site baidu
#输出"www.baidu.com"
hget site google
#输出"www.google.com"
hget site aaa
#输出(nil)

(2) 多个存储hmset/取值hmget

hmset site 163 www.163.com sina www.sina.com
hmget site 163 sina
#输出
1) "www.163.com"
2) "www.sina.com"

(3) 返回所有的field值hkeys

(4) 返回所有的value值hvals

(5) 返回所有的值hgetall 

hkeys site
#输出
1) "baidu"
2) "google"
3) "163"
4) "sina"
hvals site
#输出
1) "www.baidu.com"
2) "www.google.com"
3) "www.163.com"
4) "www.sina.com"
hgetall site
#输出
1) "baidu"
2) "www.baidu.com"
3) "google"
4) "www.google.com"
5) "163"
6) "www.163.com"
7) "sina"
8) "www.sina.com"

(6) 删除多个field值 hdel

hdel site google 163 aaa
hgetall site
#输出
1) "baidu"
2) "www.baidu.com"
3) "sina"
4) "www.sina.com"

 


转:https://my.oschina.net/alexanderwee/blog/1934972



推荐阅读
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 在《Linux高性能服务器编程》一书中,第3.2节深入探讨了TCP报头的结构与功能。TCP报头是每个TCP数据段中不可或缺的部分,它不仅包含了源端口和目的端口的信息,还负责管理TCP连接的状态和控制。本节内容详尽地解析了TCP报头的各项字段及其作用,为读者提供了深入理解TCP协议的基础。 ... [详细]
  • Hadoop平台警告解决:无法加载本机Hadoop库的全面应对方案
    本文探讨了在Hadoop平台上遇到“无法加载本机Hadoop库”警告的多种解决方案。首先,通过修改日志配置文件来忽略该警告,这一方法被证明是有效的。其次,尝试指定本地库的路径,但未能解决问题。接着,尝试不使用Hadoop本地库,同样没有效果。然后,通过替换现有的Hadoop本地库,成功解决了问题。最后,根据Hadoop的源代码自行编译本地库,也达到了预期的效果。以上方法适用于macOS系统。 ... [详细]
  • 在2019年寒假强化训练中,我们深入探讨了二分算法的理论与实践应用。问题A聚焦于使用递归方法实现二分查找。具体而言,给定一个已按升序排列且无重复元素的数组,用户需从键盘输入一个数值X,通过二分查找法判断该数值是否存在于数组中。输入的第一行为一个正整数,表示数组的长度。这一训练不仅强化了对递归算法的理解,还提升了实际编程能力。 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • 本文探讨了一种高效的算法,用于生成所有数字(0-9)的六位组合,允许重复使用数字,并确保这些组合的和等于给定的整数N。该算法通过优化搜索策略,显著提高了计算效率,适用于大规模数据处理和组合优化问题。 ... [详细]
  • 在洛谷 P1344 的坏牛奶追踪问题中,第一问要求计算最小割,而第二问则需要找到割边数量最少的最小割。通过为每条边附加一个单位权值,可以在求解最小割时优先选择边数较少的方案,从而同时解决两个问题。这种策略不仅简化了问题的求解过程,还确保了结果的最优性。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • 在项目开发过程中,掌握一些关键的Linux命令至关重要。例如,使用 `Ctrl+C` 可以立即终止当前正在执行的命令;通过 `ps -ef | grep ias` 可以查看特定服务的进程信息,包括进程ID(PID)和JVM参数(如内存分配和远程连接端口);而 `netstat -apn | more` 则用于显示网络连接状态,帮助开发者监控和调试网络服务。这些命令不仅提高了开发效率,还能有效解决运行时的各种问题。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 当使用 `new` 表达式(即通过 `new` 动态创建对象)时,会发生两件事:首先,内存被分配用于存储新对象;其次,该对象的构造函数被调用以初始化对象。为了确保资源管理的一致性和避免内存泄漏,建议在使用 `new` 和 `delete` 时保持形式一致。例如,如果使用 `new[]` 分配数组,则应使用 `delete[]` 来释放内存;同样,如果使用 `new` 分配单个对象,则应使用 `delete` 来释放内存。这种一致性有助于防止常见的编程错误,提高代码的健壮性和可维护性。 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
  • Linux入门教程第七课:基础命令与操作详解
    在本课程中,我们将深入探讨 Linux 系统中的基础命令与操作,重点讲解网络配置的相关知识。首先,我们会介绍 IP 地址的概念及其在网络协议中的作用,特别是 IPv4(Internet Protocol Version 4)的具体应用和配置方法。通过实际操作和示例,帮助初学者更好地理解和掌握这些基本技能。 ... [详细]
  • 基于域名、端口和IP的虚拟主机构建方案
    本文探讨了在单台物理服务器上构建多个Web站点的虚拟主机方案,详细介绍了三种主要的虚拟主机类型:基于域名、基于IP地址和基于端口的虚拟主机。每种类型的实现方式及其优缺点均进行了深入分析,为实际应用提供了全面的技术指导。 ... [详细]
author-avatar
烟灰TT
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有