03.Redis单实例部署之基于RDB持久化

Posted chenliangc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了03.Redis单实例部署之基于RDB持久化相关的知识,希望对你有一定的参考价值。

一、部署Redis单实例[RDB持久化]

## 操作系统环境说明

[root@node31 ~]# cat /etc/redhat-release;uname -r;uname -m;
CentOS Linux release 7.5.1804 (Core) 
3.10.0-862.el7.x86_64
x86_64
[root@node31 ~]# firewall-cmd --state       ## 查看firewall墙的状态
not running
[root@node31 ~]# free -h                    ## 查看当前系统可用的内容
              total        used        free      shared  buff/cache   available
Mem:           1.8G        113M        1.3G         17M        384M        1.5G
Swap:          2.0G          0B        2.0G
[root@node31 ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   47G  1.6G   46G   4% /
devtmpfs                 899M     0  899M   0% /dev
tmpfs                    911M     0  911M   0% /dev/shm
tmpfs                    911M   18M  894M   2% /run
tmpfs                    911M     0  911M   0% /sys/fs/cgroup
/dev/sdb1                100G   54M  100G   1% /data             ## 一会把软件安装在该目录挂载的磁盘下
/dev/sda1               1014M  142M  873M  14% /boot
tmpfs                    183M     0  183M   0% /run/user/1000
[root@node31 ~]# ifconfig ens33|awk -F " " ‘NR==2{print $2}‘     ## 外网IP地址
10.0.0.31
[root@node31 ~]# ifconfig ens34|awk -F " " ‘NR==2{print $2}‘     ## 内网IP地址
172.16.1.31

## 软件及实例部署规划

/data/apps               # 该目录下安装Redis软件,安装后就是/data/apps/redis
/data/redis/6379         # 该目录下部署Redis 6379实例
  /data/redis/6379/conf  # 存放redis 6379实例的配置文件
  /data/redis/6379/data  # 存放redis 6379实例的持久化数据
  /data/redis/6379/logs  # 存放redis 6379实例的日志文件
  /data/redis/6379/run   # 存放redis 6379实例的pid和socket文件 

## 准备的配置文件内容

相关参数的含义可以参考博文:https://www.cnblogs.com/chenliangc/p/12324731.html

## Basic parameters
bind 172.16.1.31
protected-mode yes
port 6379
maxmemory 1GB
requirepass chenliang
daemonize yes
databases 16
syslog-enabled no
loglevel notice
logfile /data/redis/6379/logs/redis.log
pidfile /data/redis/6379/run/redis.pid
unixsocket /data/redis/6379/run/redis.sock
 
## Client
maxclients  10000
timeout 300
tcp-backlog 511
tcp-keepalive 60
 
## RDB Persistence
save 900 1                     # 900秒内有1个key被修改,就进行rdb持久化
save 300 10                    # 300秒内有10个key被修改,就进行rdb持久化
save 60 10000                  # 60秒内有10000个key被修改,就进行rdb持久化
dir /data/redis/6379/data/     # 设置持久化数据文件的保存位置
dbfilename dump.rdb            # 设置rdb持久化的数据文件名称,默认也是dump.rdb
rdbcompression yes             # 对于rdb持久化的数据文件是否进行压缩,默认也是yes
rdbchecksum yes                # 是否检查rdb持久化数据文件,默认也是yes
stop-writes-on-bgsave-error no # rdb持久化出现错误时,redis主进程继续响应客户端的写操作

## Redis软件的安装

## 创建redis用户(需要设置密码,需要远程登录,需要有家目录,不要让其用户和密码过期)
[root@node31 ~]# chattr -i /etc/passwd /etc/shadow /etc/group /etc/gshadow
[root@node31 ~]# useradd redis
[root@node31 ~]# echo "redis"|passwd --stdin redis
Changing password for user redis.
passwd: all authentication tokens updated successfully.
[root@node31 ~]# chattr -i /etc/passwd /etc/shadow /etc/group /etc/gshadow
 
## 安装相关的依赖包
[root@node31 ~]# yum -y install gcc gcc-c++ make
[root@node31 ~]# rpm -qa install gcc gcc-c++ make
gcc-4.8.5-39.el7.x86_64
gcc-c++-4.8.5-39.el7.x86_64
make-3.82-24.el7.x86_64
 
## 创建相关的目录
[root@node31 ~]# mkdir /data/apps
[root@node31 ~]# ls -ld /data/apps/
drwxr-xr-x 2 root root 6 Feb 19 09:01 /data/apps/
 
## 上传软件包,进行安装
[root@node31 ~]# mkdir tools
[root@node31 ~]# cd tools
[root@node31 tools]# rz
[root@node31 tools]# ll redis-4.0.14.tar.gz
-rw-r--r-- 1 root root 1740967 Oct 26 14:54 redis-4.0.14.tar.gz
[root@node31 tools]# tar xf redis-4.0.14.tar.gz -C /data/apps
[root@node31 tools]# ls -ld /data/apps/redis-4.0.14/
drwxrwxr-x 6 root root 309 3月  19 2019 /data/apps/redis-4.0.14/
[root@node31 tools]# cd /data/apps/redis-4.0.14    
[root@node31 redis-4.0.14]# make
 
## 做软链接并更改属主/组
[root@node31 redis-4.0.14]# cd
[root@node31 ~]# ln -sv /data/apps/redis-4.0.14/ /data/apps/redis
‘/data/apps/redis’ -> ‘/data/apps/redis-4.0.14/’
[root@node31 ~]# chown -R redis:redis /data/apps/redis/
[root@node31 ~]# ls -ld /data/apps/redis/
drwxr-xr-x 3 redis redis 17 Feb 19 09:06 /data/apps/redis/
 
## 配置环境变量
[root@node31 ~]# ls -ld /data/apps/redis/src/
drwxrwxr-x 3 redis redis 8192 2月  19 15:43 /data/apps/redis/src/
[root@node31 ~]# echo "PATH=/data/apps/redis/src:$PATH" >>/etc/bashrc
[root@node31 ~]# source /etc/bashrc
[root@node31 ~]# which redis-cli
/data/apps/redis/bin/redis-cli

## 部署一个Redis 6379实例

## 创建redis 6379实例的相关目录
[root@node31 ~]# mkdir /data/redis/6379/{conf,data,logs,run} -p
[root@node31 ~]# tree /data/redis/
/data/redis/
`-- 6379
    |-- conf
    |-- data
    |-- logs
    `-- run

5 directories, 0 files

## 为redis 6379实例准备配置文件
cat >>/data/redis/6379/conf/redis.conf<<EOF
## Basic parameters 
bind 172.16.1.31
protected-mode yes
port 6379
maxmemory 1GB
requirepass chenliang
daemonize yes
databases 16
syslog-enabled no
loglevel notice
logfile /data/redis/6379/logs/redis.log
pidfile /data/redis/6379/run/redis.pid
unixsocket /data/redis/6379/run/redis.sock

## Client
maxclients  10000
timeout 300
tcp-backlog 511
tcp-keepalive 60

## RDB Persistence
save 900 1
save 300 10
save 60 10000
dir /data/redis/6379/data/
dbfilename dump.rdb
rdbcompression yes
rdbchecksum yes
stop-writes-on-bgsave-error no
EOF

## 查看配置文件
[root@node31 ~]# ll /data/redis/6379/conf/redis.conf 
-rw-r--r-- 1 root root 499 Feb 19 09:14 /data/redis/6379/conf/redis.conf

## 准备redis 6379实例的配置文件
   ## https://www.cnblogs.com/chenliangc/p/11746400.html 博文件中脚本内容复制
   ## 在/data/redis/6379目录下,创建一个redisd文件,把复制的内容粘贴并保存
   ## chmod 700 /data/redis/6379/redisd  更改权限为700
   
## 更改/data/redis/6379目录及目录下所有文件的属主/组为redis
[root@node31 ~]# chown -R redis:redis /data/redis/6379
[root@node31 ~]# ls -ld /data/redis/6379/
drwxr-xr-x 6 redis redis 67 Feb 19 09:18 /data/redis/6379/

## 启动redis 6379实例
[root@node31 ~]# /data/redis/6379/redisd start
Start redis[6379] service                                  [  OK  ]
[root@node31 ~]# netstat -lntup|grep redis
tcp  0   0 172.16.1.31:6379     0.0.0.0:*    LISTEN   19758/redis-server  

## 加入开机自启动
[root@node31 ~]# echo -ne "
# Boot start redis service[6379]. USER:chenliang TIME:$(date +%F)
/data/redis/6379/redisd start
" >>/etc/rc.local 
[root@node31 ~]# tail -2 /etc/rc.local 
# Boot start redis service[6379]. USER:chenliang TIME:2020-02-19
/data/redis/6379/redisd start
## redis相关命令的简单介绍

redis-sentinel   # 用来启动redis sentinel服务,sentinel是一个单独的服务
redis-server     # 用来启动redis服务
redis-cli        # 用来连接redis服务和sentinel服务
redis-check-rdb  # 检测RDB持久化生成的文件
redis-check-aof  # 检测AOF持久化生成的文件
redis-benchmark  # 性能测试工具,测试Redis在当前系统下的读写性能
redis-trib.rb    # 用来管理Redis-cluster集群的一个命令
## 通过redis-cli命令连接redis 6379实例

## 通过ip+端口的方式连接redis 6379
[root@node31 ~]# redis-cli -h 172.16.1.31 -p 6379 -a chenliang
172.16.1.31:6379> 
172.16.1.31:6379> 

## 通过socket文件连接redis6379
[root@node31 ~]# redis-cli -s /data/redis/6379/run/redis.sock  -a chenliang
redis /data/redis/6379/run/redis.sock> 
redis /data/redis/6379/run/redis.sock> 

## 连接的相关参数说明
-h  指定可连接到redis 6379实例的IP地址
-p  redis 6379实例的监听的端口
-a  指定密码,前期在配置文件中配置的密码就是chenliang
-s  指定redis 6379实例的socket文件,前提是配置文件中得配置哈;

## redis相关命令的简单介绍

redis-sentinel   # 用来启动redis sentinel服务,sentinel是一个单独的服务
redis-server     # 用来启动redis服务
redis-cli        # 用来连接redis服务和sentinel服务
redis-check-rdb  # 检测RDB持久化生成的文件
redis-check-aof  # 检测AOF持久化生成的文件
redis-benchmark  # 性能测试工具,测试Redis在当前系统下的读写性能
redis-trib.rb    # 用来管理Redis-cluster集群的一个命令

## 通过redis-cli命令连接redis 6379实例

## 通过ip+端口的方式连接redis 6379
[root@node31 ~]# redis-cli -h 172.16.1.31 -p 6379 -a chenliang
172.16.1.31:6379> 
172.16.1.31:6379> 

## 通过socket文件连接redis6379
[root@node31 ~]# redis-cli -s /data/redis/6379/run/redis.sock  -a chenliang
redis /data/redis/6379/run/redis.sock> 
redis /data/redis/6379/run/redis.sock> 

## 连接的相关参数说明
-h  指定可连接到redis 6379实例的IP地址
-p  redis 6379实例的监听的端口
-a  指定密码,前期在配置文件中配置的密码就是chenliang
-s  指定redis 6379实例的socket文件,前提是配置文件中得配置哈;

## 看一看redis是什么角色

redis服务(这里就是redis 6379实例)一启动,它默认的角色是Master。

172.16.1.31:6379> info replication
# Replication
role:master          # 角色:master
connected_slaves:0   # 连接slave个数:0
master_replid:414c8302c9996957b1f70921c72e7d2e1dde3a33
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
redis /data/redis/6379/run/redis.sock> 

二、RDB持久化相关知识点总结

01:RDB持久化是Redis默认的持久化,也就是默认是开启的;若想关闭,设置save ""即可。

02:RDB持久化是在设置的时间间隔内生成数据集的快照,快照在磁盘上的体现是一个文件,
    这个文件始终只有一个,不管你的数据集有多大,名称默认为dump.rdb,不能直接查看
    其内容和进行二次的编辑。
	
03:RDB持久化生成的数据文件(dump.rdb)大小比实际数据大小在小,因为它是压缩了的。

04:Redis在进行RDB持久化时是使用bgsave命令for出一个后台子进程来完成持久化的工
    作;这样的好处是不会影响Redis仅有的一个主进程继续响应客户端的操作;

05:RDB持久化时是后台的子进程来工作,若在持久化数据过程中,出现了错误(例如磁盘满
    了或损坏了),Redis的主进程是否还接受客户端的操作呢?这个其实是redis服务的一
    个参数来让其决定,该参数是stop-writes-on-bgsave-error,默认是yes,也就是
    redis主进程不响应客户端的写操作;若是no,则表示继续响应客户端的读写操作;

06:如果数据量比较大的时候,又频繁的进行RDB持久化,此时可能会阻塞服务器对客户端
    的请求,因为RDB的持久化实际是打快照,打快照就得占用服务器的物理内存;

07:RDB持久化在进行持久化的过程中是先生成一个dump.rdb.temp的临时文件,当数据持
    久化工作完成后,替换掉之前的dump.rdb文件,这样的好处是当服务或服务器在数据
    持久化进行时发生宕机,不会影响之前持久化的数据,保证了之前持久化数据的完整性。
	
08:当在大数据集的时候,RDB持久化的数据在加载或恢复时要比AOF持久化的要快;

09:RDB持久化不能做到实时或秒级的数据持久,因此对数据有实时持久化的需求下,RDB持
    久化就不太适合了;

 

以上是关于03.Redis单实例部署之基于RDB持久化的主要内容,如果未能解决你的问题,请参考以下文章

redis 持久化之 rdb 快照持久化

Redis06-Redis集群

Redis 持久化与故障恢复之rdb

性能测试二十四:环境部署之Redis多实例部署

Redis之数据持久化RDB与AOF

Redis的持久化之RDB