目录
1、实验准备
hostname | IP | 系统 | redis版本 |
node1 | 172.19.16.7 | centos7.6 | redis6.2.7 |
2、编译安装
下载对应版本的redis(下载地址:Index of /releases/)
wget http://download.redis.io/releases/redis-6.2.7.tar.gz
编译安装
tar xf redis-6.2.7.tar.gz && cd redis-6.2.7/
make && make install
3、安装准备
3.1 目录准备
在/data/redis/目录下创建文件7001
mkdir -p /data/redis && cd /data/redis
mkdir -p {7001..7006}
3.2 执行文件配置
在7001文件夹下创建相当于文件夹
mkdir -p bin conf data logs redis-cluster
cd bin
cp -r /usr/local/bin/redis-* ./
编写启动脚本redis.sh
#!/bin/bash
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
REDIS_HOME="/data/redis/7001"
EXEC="$REDIS_HOME/bin/redis-server"
CLIEXEC="$REDIS_HOME/bin/redis-cli"
CONF="$REDIS_HOME/conf/redis.conf"
REDISPORT=$(awk '/^port/{print $2}' $CONF)
PIDFILE=$(awk '/^pidfile/{print $2}' $CONF)
start() {
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis server..."
$EXEC $CONF &
fi
}
stop() {
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$CLIEXEC -p $REDISPORT shutdown
while [ -x /proc/${PID} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis stopped"
fi
}
restart() {
stop
sleep 1
start
}
case "$1" in
start)
start;;
stop)
stop;;
restart)
restart;;
esac
3.3 配置文件优化
编制redis.conf配置文件
#只让本地访问
protected-mode yes
#访问端口7001
port 7001
#最大内存96GB,最大物理内存的四分之三
maxmemory 96GB
#tcp最大连接数,默认511,大于511连接数抛弃
tcp-backlog 511
#单位秒,默认0;如果在一个 timeout 时间内,没有数据的交互,是否断开连接。0代表永不断开
timeout 0
#单位:秒,默认是300;客户端与服务器端如果没有任何数据交互,多少秒会进行一次ping,pong 交互。作用:①用于校验是否有机器已经挂了②保持网络活跃(通讯)
tcp-keepalive 300
#默认值:no;是否开启守护进行启动redis,yes表达开启集群
daemonize yes
#管理Redis守护进程,no:没有监督互动;upstart:通过将Redis置于SIGSTOP模式来启动信号;systemd:signal systemd将READY = 1写入$ NOTIFY_SOCKET;auto :检测upstart或systemd方法基于 UPSTART_JOB或NOTIFY_SOCKET环境变量
supervised no
#配置pid文件
pidfile /data/redis/redis_7001.pid
#loglevel :默认值:notice ;redis 服务器日志打印级别,其中:
#1)debug:在开发,调试阶段很有用,大量的日志;
#2)verbose:在debug的基础上,减少连接信息以及内部信息
#3)notice:建议在生产使用
#4)warning:只打印重要、关键的信息
loglevel notice
#配置日志文件
logfile "/data/redis/logs/redis.log"
#默认值:16;redis 数据库的数量,默认使用 0 数据库
databases 16
#是否使用logo,也就是服务启动时命令台打印的那个字符logo
always-show-logo yes
#持久化设置
#15分钟内,至少有1个写操作
save 9000 1
#5分钟内,至少有10个操作
save 3000 10
#30分钟内,至少有10000个写操作
save 1800 10000
#持久化失败后是否禁止新的写入操作
stop-writes-on-bgsave-error yes
#默认值为:yes ; 是否对日志进行压缩,如果服务器磁盘是ssd,但是cpu比较吃紧,可以配置为no,减少cpu的压力
rdbcompression yes
#是否检验rdb文件并自动修复,默认值为:yes
rdbchecksum yes
#默认值:dump.rdb;快照的存储文件
dbfilename dump.rdb
#rdb文件的保存目录
dir /data/redis/data/
replica-serve-stale-data yes
#默认值:yes;从服务器是否只读。
replica-read-only yes
repl-diskless-sync no
#单位:秒,默认值5, 最少异步同步操作的时间
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
#默认值为 no ,不适用append 模式的配置
appendonly no
#默认值:"appendonly.aof",append 模式的日志文件
appendfilename "appendonly.aof"
#默认值:everysec;持久化的频率,always:每一次写操作都持久化;everysec:每隔一秒持久化一次(99%的场景都满足);no:不持久化
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 10
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
cluster-enabled yes
cluster-config-file /data/redis/redis-cluster/nodes-7003.conf
cluster-node-timeout 5000
slowlog-log-slower-than 10000
slowlog-max-len 10000
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
#默认是注释掉的,生产建议禁止keys,flushall,flushdb和修改配置等危险操作
rename-command KEYS ""
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG "redisconf"
masterauth "123456"
#默认是注释掉的,即无密码登录
requirepass "123456"
3.4配置其他节点
把7001文件夹复制到其他文件夹,并将7001端口改成其他的
cd /data/redis
cp -r 7001 7002
cp -r 7001 7003
cp -r 7001 7004
cp -r 7001 7005
cp -r 7001 7006
修改bin/redis.sh配置文件夹位置,修改conf/redis.conf配置端口
3.5 service配置
/usr/lib/systemd/system/redis.service配置如下:
[Unit]
Description=redis
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
ExecStart=/data/redis/bin/redis.sh start
ExecReload=/data/redis/bin/redis.sh restart
ExecStop=/data/redis/bin/redis.sh stop
[Install]
WantedBy=multi-user.target
4、集群搭建
4.1 redis启动
/data/redis/7001/bin/redis.sh start
4.2 检查启动情况
netstat -tnlp | grep redis
4.3 集群搭建
/data/redis/bin/redis-cli --cluster create 172.19.16.7:7001 172.19.16.7:7002 172.19.16.7:7003 172.19.16.7:7004 172.19.16.7:7005 172.19.16.7:7006 --cluster-replicas 1 -a 123456
中间的一些询问输入 yes
4.4 集群检验
/data/redis/bin/redis-cli -a 123456 -h 172.19.16.7 -p 7003 -c
172.19.16.7:7003> cluster nodes
b5690448509f531a7235fb1f2f18ef32e8298d0c 172.19.16.7:7001@17001 slave 671aacc092a2f6eea9ef5bab8a1cc6dddb843af5 0 1653817019625 1 connected
093ad4be077cfb0a1d6ce1d9fdf9a3a9378f56c1 172.19.16.7:7002@17002 master - 0 1653817018022 2 connected 5461-10922
671aacc092a2f6eea9ef5bab8a1cc6dddb843af5 172.19.16.7:7003@17003 myself,master - 0 1653817019000 1 connected 0-5460
bf5bc1e6ffc7c7a8269e1e7ba9dbf137847f5545 172.19.16.7:7004@17004 slave 093ad4be077cfb0a1d6ce1d9fdf9a3a9378f56c1 0 1653817019123 2 connected
d8c5389916af476bcad5f066a4cef3d0ee3f2bab 172.19.16.7:7005@17005 slave 4ac60c99f996a724982a67e81bdeaba728731a68 0 1653817018117 3 connected
4ac60c99f996a724982a67e81bdeaba728731a68 172.19.16.7:7006@17006 master - 0 1653817018620 3 connected 10923-16383
5、增加和删除节点
5.1 增加节点
启动新的两个节点8001和8002
/data/redis/8001/bin/redis.sh start
/data/redis/8002/bin/redis.sh start
5.1.1 新增/设置主节点
任意连接一台集群中的节点,然后使用cluster meet将 8001和8002 添加到集群中。
[root@VM-16-7-centos ~]# /data/redis/bin/redis-cli -a 123456 -h 172.19.16.7 -p 7003 -c
172.19.16.7:7003> cluster meet 172.19.16.7 8001
OK
172.19.16.7:7003> cluster meet 172.19.16.7 8002
OK
172.19.16.7:7003> cluster nodes
分配槽位
[root@VM-16-7-centos ~]# /data/redis/bin/redis-cli --cluster reshard 172.19.16.7:8001 -a 123456
需要输入的内容:
1、算出来每个 master 的槽数:4096(原本三个 master,加一个变四个 maste,16384/4=4096)。
2、填写接收槽位的172.19.16.7:8001节点 ID:36efcd23eecc5c4238711c4e680026fea1a71e6d。
3、填写槽位来源节点 Source node 为 all,表示从其他所有 master 节点迁移槽位。
5.1.2 新增/设置从节点
任意连接一台集群中的节点,然后使用cluster meet将8002 添加到集群中。
[root@VM-16-7-centos ~]# /data/redis/bin/redis-cli -a 123456 -h 172.19.16.7 -p 7003 -c
172.19.16.7:7003> cluster meet 172.19.16.7 8002
OK
CTRL+D退出,登录172.19.16.7:8002设置为从节点,使用cluster replicate + 主节点ID(指定主节点8002)就能指定当前节点为目标节点的从节点:
[root@VM-16-7-centos ~]# /data/redis/bin/redis-cli -a 123456 -h 172.19.16.7 -p 8002 -c
172.19.16.7:8002> cluster replicate 36efcd23eecc5c4238711c4e680026fea1a71e6d
OK
172.19.16.7:8002> cluster nodes
5.2 删除节点
停止redis服务
/data/redis/bin/redis.sh stop
删除节点,命令redis-cli --cluster del-node 节点:端口 节点ID -a 密码
[root@VM-16-7-centos ~]# /data/redis/bin/redis-cli --cluster del-node 172.19.16.7:8001 36efcd23eecc5c4238711c4e680026fea1a71e6d -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Removing node 36efcd23eecc5c4238711c4e680026fea1a71e6d from cluster 172.19.16.7:8001
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.
6、常用命令
6.1 内存查看及调整
1、redis默认内存:如果不设置最大内存大小或者设置最大内存大小为0,在64位操作系统下不限制内存大小,在32位操作系统下最多使用3GB内存。
2、生产上内存设置:一般推荐redis设置内存为最大物理内存的四分之三。
3、内存修改的两种方式
3.1 通过redis.conf配置文件修改
格式:maxmemory 字节
举例:maxmemory 104857600
3.2 通过config命令修改
格式:config set maxmemory 字节
举例:config set maxmemory 104857600
查看内存命令:config get maxmemory
4、查看redis内存使用情况的命令:info memory