一、概述
- REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。
- Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。
- Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)、有序集合(Sorted Set:)。
- Redis持久化方式:全量数据(RDB:Redis DataBase)和增量请求(AOF:Append Only File)。全量数据在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot);增量请求则是把内存中的数据序列转化为操作请求,用于读取文件进行replay得到数据,这种类似于mysql的binlog。Redis的存储分为内存存储、磁盘存储和log文件三部分。
- Redis有三种集群模式:主从模式,Sentinel(哨兵)模式,Cluster模式
官方文档:Docs
二、主从模式 部署
1)架构与简介
主从模式特点:
- 主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库
- 从数据库一般都是只读的,并且接收主数据库同步过来的数据
- 一个master可以拥有多个slave,但是一个slave只能对应一个master
- slave挂了不影响其他slave的读和master的读和写,重新启动后会将数据从master同步过来
- master挂了以后,不影响slave的读,但redis不再提供写服务,master重启后redis将重新对外提供写服务
- master挂了以后,不会在slave节点中重新选一个master
工作机制:
- 当slave启动后,主动向master发送SYNC命令。master接收到SYNC命令后在后台保存快照(RDB持久化)和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存的命令发送给slave。slave接收到快照文件和命令后加载快照文件和缓存的执行命令。
- 复制初始化后,master每次接收到的写命令都会同步发送给slave,保证主从数据一致性。
2)环境准备
IP | 主机名 | 角色 |
---|---|---|
local-168-182-110 | 192.168.182.110 | master |
local-168-182-111 | 192.168.182.111 | slave1 |
local-168-182-112 | 192.168.182.112 | slave2 |
3)下载解压Redis安装包(所有节点)
下载地址:Index of /releases/
highlighter- Bash
cd /opt/software wget http://download.redis.io/releases/redis-7.0.3.tar.gz # 解压 tar -xf redis-7.0.3.tar.gz cd redis-7.0.3 # 设置环境变量 echo "export REDIS_HOME=/opt/software/redis-7.0.3">> /etc/profile source /etc/profile
4)编译安装(所有节点)
highlighter- Bash
cd $REDIS_HOME yum -y install gcc gcc++ make && make install # 默认安装目录 /usr/local/bin
5)配置成服务(所有节点)
highlighter- SQL
cat << EOF > /usr/lib/systemd/system/redis.service [Unit] Description=Redis persistent key-value database After=network.target After=network-online.target Wants=network-online.target [Service] ExecStart=/usr/local/bin/redis-server /usr/local/redis/redis.conf --supervised systemd ExecStop=/usr/libexec/redis-shutdown Type=forking User=redis Group=redis RuntimeDirectory=redis RuntimeDirectoryMode=0755 LimitNOFILE=65536 PrivateTmp=true [Install] WantedBy=multi-user.target EOF
配置描述:
highlighter- Python
Description: # 描述服务 After: # 描述服务类别 [Service] # 服务运行参数的设置 Type=forking # 是后台运行的形式 ExecStart # 为服务的具体运行命令 ExecReload # 为重启命令 ExecStop # 为停止命令 LimitNOFILE=65536 # 打开文件数和进程数有限制,默认限制为1024,如果不设置,或者设置为LimitNOFILE=unlimited(不识别),则得到了1024 PrivateTmp=True # 表示给服务分配独立的临时空间 #【注意】[Service]的启动、重启、停止命令全部要求使用绝对路径 [Install] #运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3 重载系统服务:systemctl daemon-reload
/usr/libexec/redis-shutdown
highlighter- Bash
#!/bin/bash # # Wrapper to close properly redis and sentinel test x"$REDIS_DEBUG" != x && set -x REDIS_CLI=/usr/local/bin/redis-cli # Retrieve service name SERVICE_NAME="$1" if [ -z "$SERVICE_NAME" ]; then SERVICE_NAME=redis fi # Get the proper config file based on service name CONFIG_FILE="/usr/local/redis/$SERVICE_NAME.conf" # Use awk to retrieve host, port from config file HOST=`awk '/^[[:blank:]]*bind/ { print $2 }' $CONFIG_FILE | tail -n1` PORT=`awk '/^[[:blank:]]*port/ { print $2 }' $CONFIG_FILE | tail -n1` PASS=`awk '/^[[:blank:]]*requirepass/ { print $2 }' $CONFIG_FILE | tail -n1` SOCK=`awk '/^[[:blank:]]*unixsocket\s/ { print $2 }' $CONFIG_FILE | tail -n1` # Just in case, use default host, port HOST=${HOST:-127.0.0.1} if [ "$SERVICE_NAME" = redis ]; then PORT=${PORT:-6379} else PORT=${PORT:-26739} fi # Setup additional parameters # e.g password-protected redis instances [ -z "$PASS" ] || ADDITIONAL_PARAMS="-a $PASS" # shutdown the service properly if [ -e "$SOCK" ] ; then $REDIS_CLI -s $SOCK $ADDITIONAL_PARAMS shutdown else $REDIS_CLI -h $HOST -p $PORT $ADDITIONAL_PARAMS shutdown fi
配置完就可以通过systemctl启停redis了
6)授权启动服务(所有节点)
highlighter- Bash
chmod +x /usr/libexec/redis-shutdown useradd -s /sbin/nologin redis mkdir /usr/local/redis ; cp $REDIS_HOME/redis.conf /usr/local/redis/ && chown -R redis:redis /usr/local/redis mkdir -p /opt/software/redis-7.0.3/data && chown -R redis:redis /opt/software/redis-7.0.3/data yum install -y bash-completion && source /etc/profile # 命令补全 systemctl daemon-reload systemctl enable redis