运行方式说明 | Redis如果提供缓存服务,可以关闭所有持久化存储,如此一来redis重启后所有数据都会丢失。开启rdb或aof持久化存储,能把redis中的数据持久化到磁盘中。rdb和aof对性能都有影响,所以建议持久化的操作在从库上进行。 | ||||||||||||
两种存储模式 | rdb:也叫做快照,类似VMware虚拟机快照。快速的把内存中的数据,映射到磁盘。容量并不是很大。 aof:类似于Mysql的binlog | ||||||||||||
Rdb相关配置 | |||||||||||||
Rdb 相关配置文件信息 | 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 数据存储在硬盘上 127.0.0.1:6379> bgsave 后台存储进程开启,PID为46514;数据存储在硬盘上;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 | 默认情况下,redis的aof是处于关闭状态的,需要开启 第一行是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 //默认情况下,sdb和aof的大小为: [root@Ansible redis]# for line in `seq -w 10000`;do redis-cli set key_${line} value1_${line};done //写入1000个key测试 [root@Ansible redis]# for line in `seq -w 10000`;do redis-cli set key_${line} value1_${line};done //再写入1000个key进行查看 [root@Ansible redis]# for line in `seq -w 10000`;do redis-cli set key_${line} value1_${line};done //再写入1000个key进行查看 //可以看到aof文件是不断增大的,而rdb是保持不变的 [root@Ansible redis]# cat appendonly.aof //存一个值,key为键;valuel为值;$3是位数,开辟一个可以放三个字母set的空间;$9是开辟一个可以放9个字母的空间;$12是开辟一个可以放12个字母的空间。 由此可以看出,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 //写入一万条数据测试 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禁用屏蔽危险命令 | |||||||||||||
禁用命令 | 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 //查看配置文件的内容 [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数据信息 讲配置文件进行修改 | ||||||||||||
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上指定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服务 查看服务启动情况 | ||||||||||||
全量同步日志分析 | 从: 主: | ||||||||||||
部分同步日志分析 | [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" //查看从库配置文件,是否存储主库的密码 |
Linux基础——Redis(二)
最新推荐文章于 2022-11-05 17:33:41 发布