运行方式说明

Redis如果提供缓存服务,可以关闭所有持久化存储,如此一来redis重启后所有数据都会丢失。开启rdb或aof持久化存储,能把redis中的数据持久化到磁盘中。rdb和aof对性能都有影响,所以建议持久化的操作在从库上进行。


两种存储模式

rdb:也叫做快照,类似VMware虚拟机快照。快速的把内存中的数据,映射到磁盘。容量并不是很大。

aof:类似于Mysql的binlog


Rdb相关配置

Rdb

相关配置文件信息

redis 关闭 protect redis 关闭save_Ansible

save 60 10000:60秒内,redis出现了一万条数据变化,那么进行一次rdb存储。

save 300 10:300秒内出现10次数据变化,进行一次存储

save 900 1 :900秒内出现1次数据变化,进行一次存储

数据变化越快,存储频率就越高

Rdb存储时,用户是无法使用的。


开启关闭

rdb存储

[root@Ansible ~]# redis-cli

//登入redis

127.0.0.1:6379> auth abc123,

OK

//键入密码

127.0.0.1:6379> config get save

1) "save"

2) "900 1 300 10 60 10000"

//查看rdb存储配置参数

127.0.0.1:6379> config set save ""

OK

//写入滞空rdb配置参数

127.0.0.1:6379> config get save

1) "save"

2) ""

//查看rdb存储配置参数

127.0.0.1:6379> config set save "60 10000 300 10 900 1"

OK

//写入rdb配置参数

127.0.0.1:6379> config get save

1) "save"

2) "60 10000 300 10 900 1"

127.0.0.1:6379> config rewrite

OK

//写入配置

数据写入

观察存储日志

[root@Ansible ~]# cd /data/redis/

//进入redis数据存储目录

[root@Ansible redis]# ls

dump.rdb  redis.log  redis.pid

//dump.rdb为rdb存储文件的名字,此文件存在表示rdb开启无误

也可以手动开启

方法一:

127.0.0.1:6379> save

OK

方法二:

127.0.0.1:6379> bgsave

Background saving started

二者区别:

127.0.0.1:6379> save

redis 关闭 protect redis 关闭save_Ansible_02

数据存储在硬盘上

127.0.0.1:6379> bgsave

redis 关闭 protect redis 关闭save_redis 关闭 protect_03

后台存储进程开启,PID为46514;数据存储在硬盘上;RDB占用0兆内存,

使用写实复制技术;后台进程存储成功;


前台保存会阻止用户写入数据,后台无影响;


数据写入

观察日志

[root@Ansible ~]# for line in `seq -w 10000`;do redis-cli set key_${line} value1_${line};done

//写入一万条数据

redis 关闭 protect redis 关闭save_Ansible_04

在60秒内有一万条数据发生了变化,开始保存;后台启动进程开始保存,pid号为77084;数据写入到磁盘;占用0内存,写实复制技术;保存成功;

rdb虽然对数据性能影响最低,但是无法保证100%安全。


Aof相关配置

开启aof

默认情况下,redis的aof是处于关闭状态的,需要开启

redis 关闭 protect redis 关闭save_Ansible_05

第一行是aof是否开启;第二行是开启后的文件名称;第三行是秒级同步。

[root@Ansible ~]# redis-cli

//进入redis

127.0.0.1:6379> config get appendonly

1) "appendonly"

2) "no"

//查看aof是否开启

127.0.0.1:6379> config set appendonly "yes"

OK

//开启aof

127.0.0.1:6379> config get appendonly

1) "appendonly"

2) "yes"

//此时aof已经开启

127.0.0.1:6379> config rewrite

OK

//重写保存配置

[root@Ansible ~]# cat /usr/local/redis/conf/redis.conf

//查看配置文件

redis 关闭 protect redis 关闭save_redis 关闭 protect_06

[root@Ansible ~]# ls /data/redis/

appendonly.aof  dump.rdb  redis.log  redis.pid

//文件存在,aof已开启

写入文件测试

[root@Ansible redis]# du -sh appendonly.aof dump.rdb

//默认情况下,sdb和aof的大小为:

redis 关闭 protect redis 关闭save_redis 关闭 protect_07

[root@Ansible redis]# for line in `seq -w 10000`;do redis-cli set key_${line} value1_${line};done

//写入1000个key测试

redis 关闭 protect redis 关闭save_redis 关闭 protect_08

[root@Ansible redis]# for line in `seq -w 10000`;do redis-cli set key_${line} value1_${line};done

//再写入1000个key进行查看

redis 关闭 protect redis 关闭save_redis 关闭 protect_09

redis 关闭 protect redis 关闭save_redis 关闭 protect_10

[root@Ansible redis]# for line in `seq -w 10000`;do redis-cli set key_${line} value1_${line};done

//再写入1000个key进行查看

redis 关闭 protect redis 关闭save_redis 关闭 protect_11

//可以看到aof文件是不断增大的,而rdb是保持不变的

[root@Ansible redis]# cat appendonly.aof

redis 关闭 protect redis 关闭save_linux_12

//存一个值,key为键;valuel为值;$3是位数,开辟一个可以放三个字母set的空间;$9是开辟一个可以放9个字母的空间;$12是开辟一个可以放12个字母的空间。

redis 关闭 protect redis 关闭save_Ansible_13

由此可以看出,aof是逐条记录,并写入存储空间的。所以会存储很多重复的数据,但是sdb是不会记录重复数据的,所以sdb比aof要小很多。

[root@Ansible redis]# redis-cli bgrewriteaof

//去掉aof中的重复数据,这样才会使文件变小

新版本的redis会自动触发重写,当aof到一定大小,会自动取出重复数据。

补充:我们发现,虽然我们向redis添加了一个key,又删除了这个key。Reids数据库从本质上来看是没有增加任何数据的,但是aof文件仍然将所有操作都记录了,这样就会导致aof文件分厂打,所以aof文件的优化,就是让aof文件进行重写,只保留数据增量的部分,如此aof文件就小的多了。


打开了aof,aof文件和rdb文件都在存储,但是启动redis,redis读取的是aof,不读取rdb。如果向让其读取rdb来恢复数据,那么就需要关闭aof


Redis最大内存设置和删除算法

生命周期

127.0.0.1:6379> ttl name

(integer) -1

//-1表示key永久有效;ttl 查看目标生命周期

127.0.0.1:6379> ttl name

(integer) -2

//-2表示数据已经过期,相当于数据丢失

127.0.0.1:6379> expire name 10

(integer) 1

//设置数据的生效周期,单位为秒;不设置为永久生效

查看设置最大内存

当内存达到限定,redis无法超额抢占系统内存的情况下,redis将无法继续写入数据。

[root@Ansible redis]# redis-cli

//登入

127.0.0.1:6379> config get maxmemory

1) "maxmemory"

2) "0"

//查看最大内存设置

127.0.0.1:6379> config set maxmemory "1M"

OK

//设置最大内存为1M

127.0.0.1:6379> config get maxmemory

1) "maxmemory"

2) "1000000"

//查看


测试:

[root@Ansible redis]# for line in `seq -w 10000`;do redis-cli set key_${line} value1_${line};done

//写入一万条数据测试

redis 关闭 protect redis 关闭save_Ansible_14

OOM表示内存溢出,无法写入

redis 关闭 protect redis 关闭save_redis 关闭 protect_15

可选择的删除算法

redis 关闭 protect redis 关闭save_java_16

当最大内存溢出,默认是noeviction

Volatile-lru:优先删掉有过期时间的键值对

实验

[root@Ansible redis]# for line in `seq -w 10000`;do redis-cli set key_${line} value1_${line};done

//创建10000个键值对,模拟内存溢出

redis 关闭 protect redis 关闭save_redis_17

127.0.0.1:6379> set name when

(error) OOM command not allowed when used memory > 'maxmemory'.

//内存溢出,无法写入

127.0.0.1:6379> config get maxmemory-policy

1) "maxmemory-policy"

2) "noeviction"

//查看算法

127.0.0.1:6379> config set maxmemory-policy volatile-lru

OK

//使用volatile-lru算法

127.0.0.1:6379> config get maxmemory-policy

1) "maxmemory-policy"

2) "volatile-lru"

//算法已更改

127.0.0.1:6379> config rewrite

OK

//应用配置

127.0.0.1:6379> get key_00111

"value1_00111"

//查看键值对儿

127.0.0.1:6379> expire key_00111 3600

(integer) 1

//设置键值对儿生命周期

127.0.0.1:6379> ttl key_00111

(integer) -2

//已过期

127.0.0.1:6379> get key_00111

(nil)

//已经被删除

由上实验可看出:volatile-lru算法当内存达到了最大值后,会优先伤处有过期时间的key



Redis禁用屏蔽危险命令

禁用命令

flushall和flushdb会清除redis数据,比较危险;keys在键过多的时候,使用会阻塞业务请求。

操作

[root@Ansible redis]# echo 'rename-command  FLUSHALL ""' >> /usr/local/redis/conf/redis.conf

[root@Ansible redis]# echo 'rename-command  FLUSHDB ""' >> /usr/local/redis/conf/redis.conf

[root@Ansible redis]# echo 'rename-command  KEYS ""' >> /usr/local/redis/conf/redis.conf

//在配置文件中加入内容

[root@Ansible redis]# tail -3 /usr/local/redis/conf/redis.conf

//查看配置文件的内容

redis 关闭 protect redis 关闭save_Ansible_18

[root@Ansible redis]# redis-cli shutdown

[root@Ansible redis]# redis-server /usr/local/redis/conf/redis.conf

//重启redis服务

[root@Ansible redis]# redis-cli

127.0.0.1:6379> flushall

(error) ERR unknown command `flushall`, with args beginning with:

127.0.0.1:6379> flushdb

(error) ERR unknown command `flushdb`, with args beginning with:

127.0.0.1:6379> key *

(error) ERR unknown command `key`, with args beginning with: `*`,

//测试发现,已禁用的命令都不可用



Redis的主从复制

环境


关闭防火墙和selinux服务

1.

在所有机器上进行redis的安装操作

[root@redis ~]# yum -y install wget gcc gcc-c++ make tar openssl openssl-devel cmake

//解决依赖关系

[root@redis ~]# tar xf redis-4.0.11.tar.gz -C /usr/src

//解压安装包到安装目录

[root@redis ~]# cd /usr/src/redis-4.0.11

//进入安装目录

[root@redis redis-4.0.11]# make && make MALLOC=jemalloc && make PREFIX=/usr/local/redis install

//编译安装redis

[root@redis redis-4.0.11]# cd /usr/local/redis

//进入redis安装目录

[root@redis redis]# mkdir -p /usr/local/redis/conf

//创建conf目录,用于存放配置文件

[root@redis redis]# cp /usr/src/redis-4.0.11/redis.conf /usr/local/redis/conf/

[root@redis redis]# cp /usr/src/redis-4.0.11/sentinel.conf /usr/local/redis/conf/

//复制配置文件到conf目录

[root@redis redis]# ln -s /usr/local/redis/bin/* /usr/local/bin/

//优化命令路径

[root@redis redis]# which redis-server

/usr/local/bin/redis-server

//查看是否存在命令

2.

三台都进行配置文件优化和简单的基础调优

[root@redis redis]# cp conf/redis.conf{,.bak}

//备份配置文件

[root@redis redis]# egrep -v "^$|^#" conf/redis.conf.bak > conf/redis.conf

//优化配置文件

[root@redis redis]# mkdir -p /data/redis

//创建目录用于存放redis数据信息

redis 关闭 protect redis 关闭save_Ansible_19

讲配置文件进行修改

3.

进行基础调优

[root@redis redis]# echo "* - nofile 10240" >> /etc/security/limits.conf

//调整系统文件描述符

[root@redis redis]# echo "net.core.somaxconn = 10240" >> /etc/sysctl.conf

//调整TCP连接数

[root@redis redis]# echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf

//调整系统内存分配策略

[root@redis redis]# sysctl -p

net.core.somaxconn = 10240

vm.overcommit_memory = 1

//从指定文件加载系统参数

[root@redis redis]# echo never > /sys/kernel/mm/transparent_hugepage/enabled

[root@redis redis]# echo never > /sys/kernel/mm/transparent_hugepage/defrag

[root@redis redis]# echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.local

[root@redis redis]# echo 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' >> /etc/rc.local

//关闭系统内核巨大内存支持

[root@redis redis]# redis-server /usr/local/redis/conf/redis.conf

//开启服务

[root@redis redis]# netstat -antup | grep redis

//查看服务是否开启

redis 关闭 protect redis 关闭save_java_20

4.

在两台从机器上执行以下操作

Redis的主从同步,不用修改master任何配置,只需要在redis-slave上指定master的IP地址即可。

[root@redis redis]# redis-cli shutdown

//关闭从库服务

[root@redis redis]# echo "SLAVEOF 192.168.200.136 6379" >> /usr/local/redis/conf/redis.conf

//将主库的IP和端口写入从库的配置文件

[root@redis redis]# redis-server /usr/local/redis/conf/redis.conf

//开启redis服务

redis 关闭 protect redis 关闭save_linux_21

redis 关闭 protect redis 关闭save_java_22

查看服务启动情况

全量同步日志分析

从:

redis 关闭 protect redis 关闭save_redis 关闭 protect_23

主:

redis 关闭 protect redis 关闭save_Ansible_24

部分同步日志分析

[root@redis01 ~]# > /data/redis/redis.log

[root@redis02 ~]# > /data/redis/redis.log

//清空主和从的redis日志

[root@redis02 ~]# redis-cli shutdown

[root@redis02 ~]# redis-server /usr/local/redis/conf/redis.conf

//重启从服务器的redis服务

从:

redis 关闭 protect redis 关闭save_linux_25

主:

redis 关闭 protect redis 关闭save_Ansible_26

主从同步的停止

[root@redis02 ~]# > /data/redis/redis.log

//清空从库日志

[root@redis02 ~]# redis-cli slaveof no one

//停止从库的主从同步

[root@redis02 ~]# cat /data/redis/redis.log

//查看日志

redis 关闭 protect redis 关闭save_linux_27

[root@redis ~]# > /data/redis/redis.log

//清空日志

[root@redis ~]# redis-cli slaveof 192.168.200.136 6379

OK

//恢复主从数据库同步


加密主从同步

1.为redis-master平滑设置连接密码

[root@redis01 ~]# redis-cli

//登入

127.0.0.1:6379> config get requirepass

1) "requirepass"

2) ""

//查看密码配置

127.0.0.1:6379> config set requirepass "xiaofa"

OK

//设置密码

127.0.0.1:6379> auth xiaofa

OK

//键入密码

127.0.0.1:6379> config get requirepass

1) "requirepass"

2) "xiaofa"

//查看密码

127.0.0.1:6379> config rewrite

OK

//保存配置

redis 关闭 protect redis 关闭save_redis 关闭 protect_28

2.为从库提供主从同步密码验证

[root@redis ~]# redis-cli

//登入

127.0.0.1:6379> config get masterauth

1) "masterauth"

2) ""

//查看主库密码配置

127.0.0.1:6379> config set masterauth "xiafao"

OK

//键入主库密码

127.0.0.1:6379> config get masterauth

1) "masterauth"

2) "xiafao"

//查看主库密码配置

127.0.0.1:6379> config rewrite

OK

//写入

127.0.0.1:6379> exit

[root@redis ~]# tail -1 /usr/local/redis/conf/redis.conf

masterauth "xiafao"

//查看从库配置文件,是否存储主库的密码

redis 关闭 protect redis 关闭save_java_29

主机名

IP

用途

Redis01

192.168.200.165

Redis-master

Redis02

192.168.200.164

Redis-slaveA

Redis03

192.168.200.163

Redis-slaveB