Linux基础——Redis(二)

运行方式说明

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

两种存储模式

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

aof:类似于Mysqlbinlog

Rdb相关配置

Rdb

相关配置文件信息

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

save 300 10300秒内出现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.rdbrdb存储文件的名字,此文件存在表示rdb开启无误

也可以手动开启

方法一:

127.0.0.1:6379> save

OK

方法二:

127.0.0.1:6379> bgsave

Background saving started

二者区别:

127.0.0.1:6379> save

数据存储在硬盘上

127.0.0.1:6379> bgsave

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

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

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

数据写入

观察日志

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

//写入一万条数据

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

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

Aof相关配置

开启aof

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

第一行是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

//查看配置文件

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

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

//文件存在,aof已开启

写入文件测试

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

//默认情况下,sdbaof的大小为:

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

//写入1000key测试

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

//再写入1000key进行查看

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

//再写入1000key进行查看

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

[root@Ansible redis]# cat appendonly.aof

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

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

[root@Ansible redis]# redis-cli bgrewriteaof

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

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

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

打开了aofaof文件和rdb文件都在存储,但是启动redisredis读取的是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

//写入一万条数据测试

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

可选择的删除算法

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

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

实验

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

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

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禁用屏蔽危险命令

禁用命令

flushallflushdb会清除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

//查看配置文件的内容

[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的主从复制

环境

主机名

IP

用途

Redis01

192.168.200.165

Redis-master

Redis02

192.168.200.164

Redis-slaveA

Redis03

192.168.200.163

Redis-slaveB

关闭防火墙和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数据信息

讲配置文件进行修改

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

//查看服务是否开启

4.

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

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

[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服务

查看服务启动情况

全量同步日志分析

从:

主:

部分同步日志分析

[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服务

从:

主:

主从同步的停止

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

//清空从库日志

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

//停止从库的主从同步

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

//查看日志

[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

//保存配置

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"

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值