- 1、redis由来
- 2、NoSQL的优点/缺点
- 3、关系型数据库
- 1.redis的相关工具
- 2.redis配置文件
- 3.redis持久化
- redis主从复制:
- 端口
port 26379
# 是否后台启动
daemonize yes
# 保护模式如果开启只接受回环地址的ipv4和ipv6地址链接,拒绝外部链接,而且正常应该配置多个哨兵,避免一个哨兵出现独裁情况,如果配置多个哨兵那如果开启也会拒绝其他sentinel的连接。导致哨兵配置无法生效。
protected-mode no
# pid文件路径
pidfile /var/run/redis-sentinel.pid
# 日志文件路径
logfile “/var/log/redis/sentinel.log”
# 定义工作目录
dir /tmp
# 定义Redis主的别名, IP, 端口,这里的2指的是需要至少2个Sentinel认为主Redis挂了才最终会采取下一步行为
sentinel monitor mymaster 127.0.0.1 6379 2
#如果redis配置了密码,那这里必须配置认证,否则不能自动切换
sentinel auth-pass mymaster redispass
# 如果mymaster 30秒内没有响应,则认为其主观失效
sentinel down-after-milliseconds mymaster 30000
# 如果master重新选出来后,其它slave节点能同时并行从新master同步数据的台数有多少个,显然该值越大,所有slave节点完成同步切换的整体速度越快,但如果此时正好有人在访问这些slave,可能造成读取失败,影响面会更广。最保守的设置为1,同一时间,只能有一台干这件事,这样其它slave还能继续服务,但是所有slave全部完成缓存更新同步的进程将变慢。
sentinel parallel-syncs mymaster 1
# 该参数指定一个时间段,在该时间段内没有实现故障转移成功,则会再一次发起故障转移的操作,单位毫秒
sentinel failover-timeout mymaster 180000
# 不允许使用SENTINEL SET设置notification-script和client-reconfig-script。
sentinel deny-scripts-reconfig yes
1、redis由来
随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。Memcached/redis是高性能的分布式内存缓存服务器,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web等应用的速度、 提高可扩展性。为弥补关系型数据库的不足,各种各样的NoSQL数据库应运而生。(RDBMS:关系型数据库(SQL Server Oracle mysql),NOSQL:非关系型数据库(redis,mongodb,memcached))(memcached:纯内存数据库,数据只保留在内存当中,缓存)
2、NoSQL的优点/缺点
优点:
- 高可扩展性
- 分布式计算
- 低成本
- 架构的灵活性,半结构化数据
- 没有复杂的关系
缺点:
- 没有标准化
- 有限的查询功能(到目前为止)
- 最终一致是不直观的程序
缓存服务器作用: 加快访问速度 ,缓解数据库压力
3、关系型数据库
产品:SQL Server Oracle mysql
优点:
1、易于维护:都是使用表结构,格式一致;
2、使用方便:SQL语言通用,可用于复杂查询;
3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度稍欠;
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
注意:
非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等
redis安装部署
yum安装(网络,防火墙及selinux,仓库)
ping -c1 www.baidu.com && systemctl stop firewalld && systemctl disable firewalld && set -i ‘/^SELINUX=/c SELINUX=DISABLED’ /etc/selinux/config && setenforce 0 && yum -y install epel-release && yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm #准备环境及base,epel,remi仓库
yum —enablerepo=remi -y install redis
vim /etc/redis/redis.conf
将bind 127.0.0.1修改为0.0.0.0 #允许远程登录
redis使用(set ,get ,ping检测是否通畅)
systemctl start redis #启动redis
redis-cli #访问redis命令,进入访问redis
127.0.0.1:6379>set
编译安装:
下载源码包,并解压
wget http://download.redis.io/releases/redis-6.0.7.tar.gz && tar xf redis-6.0.7.tar.gz -C /usr/local/ && cd /usr/local && mv redis-6.0.7 redis
准备编译环境,
yum -y install centos-release-scl && yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils tcl && scl enable devtoolset-9 bash && echo “source /opt/rh/devtoolset-9/enable” >> /etc/profile #准备gcc 9版本及centos-release-scl及tcl
cd /usr/local/redis && make MAKEOC=lib #进行编译
虚拟机如果报错:
cc: error: ../deps/hiredis/libhiredis.a: No such file or directory
cc: error: ../deps/lua/src/liblua.a: No such file or directory
则执行:cd deps/ && make lua hiredis linenoise && cd /usr/local/redis && make test && make make all;
编译成功后,准备守护运行redis(systemctl启动,关闭及重启操作)
修改配置文件,分别将redis.conf和edis_init_script分别复制到/etc/redis/及/etc/init.d/目录下
vim /usr/local/redis/redis.conf
修改内容如下:
#bind 127.0.0.1 #将bind 127.0.0.1注释掉(否则数据库只有本机能够使用)或者修改为 0.0.0.0
daemonize yes #将no改为yes,使数据库能够以后台守护进程运行
protected-mode no #把保护模式的yes改为no,否则会阻止远程访问
requirepass redis #打开注释,设置密码
vim /usr/local/redis/utils/redis_init_script #修改redis_init_script文件,
修改内容如下:
REDISPORT=6379
EXEC=/usr/local/redis/src/redis-server
CLIEXEC=/usr/local/redis/src/redis-cli
PIDFILE=/var/run/redis.pid
CONF=”/etc/redis/redis.conf”
mkdir /etc/redis/ && cp /usr/local/redis/redis.conf /etc/redis/ && cp /usr/local/redis/utils/redis_init_script /etc/init.d/redis #分别将两个配置文件放到/etc/redis和/etc/init.d目录下
systemctl daemon-reload #重新加载守护进程
systemctl start redis
redis-cli -a redis #启动客户端,需要加入密码,上述redis.conf配置文件中requirepass 中设置的密码
如果不加入密码,操作命令时提示: (error) NOAUTH Authentication required.
1.redis的相关工具
./redis-benchmark #用于进行redis性能测试的工具
./redis-check-rdb #用于修复出问题的dump.rdb文件
./redis-cli #redis的客户端
./redis-server #redis的服务端
./redis-check-aof #用于修复出问题的AOF文件
./redis-sentinel #用于集群管理
2.redis配置文件
1、是否后台运行
daemonize no/yes
2、默认端口
port 6379
3、AOF 日志开关是否打开
appendonly no/yes
4、日志文件位置
logfile /var/log/redis.log
5、RDB 持久化数据文件
dbfilename dump.rdb
6、指定IP进行监听
bind 10.0.0.51 ip2 ip3 ip4
7、禁止protected-mode
protected-mode yes/no (保护模式,是否只允许本地访问)
8、增加requirepass {password}
requirepass xiang 在redis-cli中使用(redis-cli -a xiang)
3.redis持久化
持久化的两种方式:RDB和AOF
RDB:在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上。(安装Redis默认开起RDB持久化模式)
特点:
1.周期性
2.不影响数据写入 #RDB会启动子进程,备份所有数据。当前进程,继续提供数据的读写。当备份完成,才替换老的备份文件。
3.高效 #一次性还原所有数据
4.完整性较差 #故障点到上一次备份,之间的数据无法恢复。
AOF:将redis执行过的所有写指令记录下来,在下次redis重新启动时,把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
特点:
1.实时性
2.完整性较好
3.体积大 #记录数据的指令,删除数据的指令都会被记录下来。
RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。
如果你没有数据持久化的需求,也完全可以关闭RDB和AOF方式,这样的话,redis将变成一个纯内存数据库,就像memcache一样。
如何选择方式?
缓存:不用开启任何持久方式
双开:因RDB数据不实时,但同时使用两者时服务器只会找AOF文件,所以RDB留作万一的手段。
redis持久化 – 如何选择RDB和AOF
对于我们应该选择RDB还是AOF,官方的建议是两个同时使用。这样可以提供更可靠的持久化方案。
写入速度快 ——————AOF
写入速度慢 ——————RDB
持续化配置
1、RDB配置:
[root@redis-master redis]# vim redis.conf
#dbfilename:持久化数据存储在本地的文件
dbfilename dump.rdb
#dir:持久化数据存储在本地的路径
dir /var/lib/redis/dump.rdb
##snapshot触发的时机,save
##如下为900秒后,至少有一个变更操作,才会snapshot
##对于此值的设置,需要谨慎,评估系统的变更操作密集程度
##可以通过“save “””来关闭snapshot功能
#save时间,以下分别表示更改了1个key时间隔900s进行持久化存储;更改了10个key300s进行存储;更改10000个key60s进行存储。
save 900 1
save 300 10
save 60 10000
##当snapshot时出现错误无法继续时,是否阻塞客户端“变更操作”,“错误”可能因为磁盘已满/磁盘故障/OS级别异常等
stop-writes-on-bgsave-error yes
##是否启用rdb文件压缩,默认为“yes”,压缩往往意味着“额外的cpu消耗”,同时也意味这较小的文件尺寸以及较短的网络传输时间
rdbcompression yes
2、客户端使用命令进行持久化save存储:
方式一
redis-cli -h 192.168.246.202 -p 6379 save #前台进行存储
OK
方式二
redis-cli -h ip -p port bgsave #后台进行存储
注意:每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步脏数据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘io操作,可能会严重影响性能。
3、AOF 持久化配置
appendonly yes/no 是否打开aof日志功能
appendfsync always 每1个命令,都立即同步到aof
appendfsync everysec 每秒写1次
appendfsync no 写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof.
高级参数:
no-appendfsync-on-rewrite yes/no 正在导出rdb快照的过程中,要不要停止同步 aof
auto-aof-rewrite-percentage 100 aof文件大小比起上次重写时的大小,增长率100%时重写,缺点:业务开始的时候,会重复重写多次。
auto-aof-rewrite-min-size 64mb aof文件,至少超过64M时,重写
Redis基本数据类型
String字符串:Redis 字符串数据类型的相关命令用于管理 redis 字符串值
List列表:Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边) 一个列表最多可以包含 2^32 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
Hash哈希:Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。Redis 中每个 hash 可以存储 (2的32次方)2^32 - 1 键值对(40多亿)。
Set集合:Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Sorted set有序集合:Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
根据输出可以看到 help 命令有三种用法
“help @
”help 命令” for help on
”help tab键” to get a list of possible help topics
help @ 查看命令组的帮助
help @generic查看通用组的命令包括del,dump…等等通用命令。
help @string查看字符串组命令。还可以查看其他组的命令如help @list, help @set, help @sorted_set,help @hash 等等。
查看所有的分组可以通过help
常见key命令
set/del命令:添加/删除一个key
192.168.188.153:6379> set test 1234
192.168.188.153:6379> del test
添加/删除多个 key
192.168.188.153:6379> mset test1 1111 test2 2222
192.168.188.153:6379> del test1 test2
exists命令:判断key是否存在命令 exists
返回(integer)1,证明key已存在
设置key的存活时间(expire,pexpire,expireat)
expire 命令:设置key的存活时间默认单位 ”s“。
pexpire 命令: 设置 key 的有效时间以毫秒为单位。
pexpireat 命令:设置 key 的到期 UNIX 时间戳以毫秒为单位。
数据恢复实验:
两台yum安装的redis服务器
1.旧redis 产生数据 (启动rdb【默认开启,如果关闭,开启它】)利用redis-cli 在服务上产生数据
set name xiang
set class cloud
save
2.找到旧机器的rdb文件(1.看配置文件;2.在redis-cli使用:config get dir(查看dump.rdb文件位置))
3.把rdb文件拷贝新机器(需要安装有redis,在恢复之前保证里面没有数据,并且redis处于停止状态)
拷贝到新机器存放rdb文件的目录下: 默认(/var/lib/redis/)
4.启动新机器的redis
5.利用redis-cli进入到redis,使用get获取对应key的值,能够获取到在旧机器上的数据,说明恢复成功。
redis主从复制:
master配置文件:
修改配置文件
bind “master的ip地址” 127.0.0.1为当前主机访问
slave配置文件:
修改配置文件
bind “slave的ip地址” 可添加127.0.0.1当前主机允许访问
添加的配置为,
replicaof “master的ip地址 端口号”
masterauth “master中设置的requirepass的密码”
修改配置后,重启redis,登录
master测试:
redis-cli -a “密码” -h “ip” -p “端口号”
redis-cli -a xiang -h 192.168.188.152 -p 6379
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.188.155,port=6379,state=online,offset=42,lag=1
slave1:ip=192.168.188.153,port=6379,state=online,offset=42,lag=1
master_failover_state:no-failover
master_replid:0e8ad2b26bc00bdaa5432142060906319e4a4bcf
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:42
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:42
127.0.0.1:6379> set name xiangxiangxiang
OK
slave测试:
192.168.188.155:6379> info replication
# Replication
role:slave
master_host:192.168.188.152
master_port:6379
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_read_repl_offset:182
slave_repl_offset:182
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:0e8ad2b26bc00bdaa5432142060906319e4a4bcf
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:182
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:182
192.168.188.155:6379> get name
“xiangxiangxiang”
利用redis-sentinel做高可用
主从的redis-sentinel.conf配置文件保持一致
初始化时只需修改
sentinel monitor mymaster 192.168.188.152 6379 2 #mymaster为master的名字,ip就是master的ip
打开sentinel auth-pass “master的名字” “master中设置的requirepass的密码” 即可 #其中requirepass设置的密码必须主从保持一致,否则不成功
redis-sentinel.conf参数
port 26379
daemonize no
pidfile /var/run/redis-sentinel.pid
logfile /var/log/redis/sentinel.log
dir /tmp
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
端口
port 26379
# 是否后台启动
daemonize yes
# 保护模式如果开启只接受回环地址的ipv4和ipv6地址链接,拒绝外部链接,而且正常应该配置多个哨兵,避免一个哨兵出现独裁情况,如果配置多个哨兵那如果开启也会拒绝其他sentinel的连接。导致哨兵配置无法生效。
protected-mode no
# pid文件路径
pidfile /var/run/redis-sentinel.pid
# 日志文件路径
logfile “/var/log/redis/sentinel.log”
# 定义工作目录
dir /tmp
# 定义Redis主的别名, IP, 端口,这里的2指的是需要至少2个Sentinel认为主Redis挂了才最终会采取下一步行为
sentinel monitor mymaster 127.0.0.1 6379 2
#如果redis配置了密码,那这里必须配置认证,否则不能自动切换
sentinel auth-pass mymaster redispass
# 如果mymaster 30秒内没有响应,则认为其主观失效
sentinel down-after-milliseconds mymaster 30000
# 如果master重新选出来后,其它slave节点能同时并行从新master同步数据的台数有多少个,显然该值越大,所有slave节点完成同步切换的整体速度越快,但如果此时正好有人在访问这些slave,可能造成读取失败,影响面会更广。最保守的设置为1,同一时间,只能有一台干这件事,这样其它slave还能继续服务,但是所有slave全部完成缓存更新同步的进程将变慢。
sentinel parallel-syncs mymaster 1
# 该参数指定一个时间段,在该时间段内没有实现故障转移成功,则会再一次发起故障转移的操作,单位毫秒
sentinel failover-timeout mymaster 180000
# 不允许使用SENTINEL SET设置notification-script和client-reconfig-script。
sentinel deny-scripts-reconfig yes
使用sentinel master “master的名字” 查看master的信息
[root@redis ~]# redis-cli -p 26379
127.0.0.1:26379> sentinel master mymaster
1) “name”
2) “mymaster”
3) “ip”
4) “192.168.188.153”
5) “port”
6) “6379”
7) “runid”
8) “027674e962c9ebbea80898cbeb9a916d98c96267”
9) “flags”
10) “master”
11) “link-pending-commands”
12) “0”
13) “link-refcount”
14) “1”
15) “last-ping-sent”
16) “0”
17) “last-ok-ping-reply”
18) “166”
19) “last-ping-reply”
20) “166”
21) “down-after-milliseconds”
22) “30000”
23) “info-refresh”
24) “4358”
25) “role-reported”
26) “master”
27) “role-reported-time”
28) “817946”
29) “config-epoch”
30) “4”
31) “num-slaves”
32) “2”
33) “num-other-sentinels”
34) “2”
35) “quorum”
36) “2”
37) “failover-timeout”
38) “180000”
39) “parallel-syncs”
40) “1”
注意:
当旧的master重新启动时,需要再redis.conf中添加masterauth “新的master的requirepass密码”才能实现同步
可能之前是主节点,没有配置从节点的连接信息 如:masterauth 连接密码,当master转变为slave后,由于他没有密码,所以他不能从新的master同步数据,随之导致 info replication 的时候,同步状态为 down ,所以只需要修改 redis.conf 中的 masterauth 为 对应的密码
