redis集群安装与配置(redis4.x)
概要说明
redis单机/redis集群(本文档为redis4.0版本)
Redis 复制、Sentinel的搭建和原理(限于版本低于redis3.0的)
截止2019/06/27 最新稳定版为 redis5.0.5(x.y.z,y为偶数为稳定版).
redis5.x版本的集群,请重新查找网上资料(不再需要ruby支持). 如
https://www.jianshu.com/p/8045b92fafb2
官方集群搭建
https://redis.io/topics/cluster-tutorial
哨兵模式 Sentinel (redis3以前的方式)
在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般,特别是在主从切换的瞬间存在访问瞬断的情况,而且哨兵模式只有一个主节点对外提供服务,没法支持很高的并发,且单个主节点内存也不宜设置得过大,否则会导致持久化文件过大,影响数据恢复或主从同步的效率。
20180615 Chenxin整理
安装单机版redis
cd /opt
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
tar xzvf redis-4.0.10.tar.gz
cd redis-4.0.10
make
cd /opt;mv /opt/redis-4.0.10 /usr/local/redis
Redis 集群说明
Redis 在3.0版本前只支持单实例模式,Redis 在 3.0 版本以后就推出了集群模式.
Redis 集群(至少需要6个节点,3主3从)采用了P2P的模式,完全去中心化。Redis 把所有的 Key 分成了 16384 个 slot,每个 Redis 实例负责其中一部分 slot .集群中的所有信息(节点、端口、slot等),通过节点之间定期的数据交换进行更新.
Redis 客户端可以向任意一个 Redis 实例发出请求,如果所需数据不在该实例中,通过重定向命令引导客户端访问所需的实例.
集群准备
mkdir /usr/local/redis-cluster
cd /usr/local/redis-cluster
mkdir -p 9001/data 9002/data 9003/data 9004/data 9005/data 9006/data
mkdir bin
cd /usr/local/redis/src
cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-trib.rb /usr/local/redis-cluster/bin/
cp -rf /usr/local/redis/* /usr/local/redis-cluster/9001
配置文件
修改配置文件/usr/local/redis-cluster/9001/redis.conf
cd /usr/local/redis-cluster/9001/
cat redis.conf
bind 127.0.0.1
bind 10.0.1.200
protected-mode yes
port 6379
port 9001
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
daemonize no
dir /usr/local/redis-cluster/9001/data/
以下为cluster需要的几项配置.
pidfile /var/run/redis_9001.pid
cluster-enabled yes
cluster-config-file nodes9001.conf
cluster-node-timeout 15000
以下为默认
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly yes
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
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
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
配置文件结束.
cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9002
cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9003
cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9004
cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9005
cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9006
sed -i 's/9001/9002/g' /usr/local/redis-cluster/9002/redis.conf
sed -i 's/9001/9003/g' /usr/local/redis-cluster/9003/redis.conf
sed -i 's/9001/9004/g' /usr/local/redis-cluster/9004/redis.conf
sed -i 's/9001/9005/g' /usr/local/redis-cluster/9005/redis.conf
sed -i 's/9001/9006/g' /usr/local/redis-cluster/9006/redis.conf
启动
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/9001/redis.conf
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/9002/redis.conf
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/9003/redis.conf
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/9004/redis.conf
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/9005/redis.conf
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/9006/redis.conf
测试各单节点运行情况
/usr/local/redis-cluster/bin/redis-cli -h 10.0.1.200 -p 9001
keys *
set name chenxin
会提示"(error) CLUSTERDOWN Hash slot not served(不提供集群的散列槽)",redis集群需要使用ruby命令,需要安装ruby和相关接口.
密码认证的方式
1.配置文件
requirepass aA.......THJ7jrd
2.连接方式
方式一 /usr/local/redis/src/redis-cli -h 10.16.200.6 -a aAORnquDATHJ7jrd (此方式会将密码记录在历史指令里)
方式二 /usr/local/redis/src/redis-cli -h 10.16.200.6 登陆进去后,执行 10.16.200.6:6379> auth aAORnquDATHJ7jrd
集群链接多个守护进程-构建集群
Redis的实例全部运行之后,还需要redis-trib.rb工具来完成集群的创建,redis-trib.rb二进制文件在Redis包主目录下的src目录中,运行该工具依赖Ruby环境和gem.Gem是一个管理Ruby库和程序的标准包,它通过Ruby Gem(如 http://rubygems.org/ )源来查找、安装、升级和卸载软件包
官网下载编译安装ruby2.5版本
编译安装ruby2.2以上版本 (注意,redis5.0版本以后,就不再使用此方式了,无需安装ruby.直接集成进redis-cli里了).
cd /opt/
wget https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.1.tar.gz
tar xzvf ruby-2.5.1.tar.gz;cd ruby-2.5.1;
./configure
make
报错:
uh-oh! RDoc had a problem:
Directory .ext/rdoc already exists, but it looks like it isn't an RDoc directory.
Because RDoc doesn't want to risk destroying any of your existing files,
you'll need to specify a different output directory name (using the --op
option)
run with --debug for full backtrace
make: *** [rdoc] Error 1
没有查到解决此问题的办法,只能通过禁用掉的方式了.如下
./configure --disable-install-rdoc
make
make install
默认安装到/usr/local/bin/下的.系统自带的会在/usr/bin/目录下,自带的是ruby2.0版本.这里需要安装2.2以上版本.
确认当前调用的是2.5版本.
ruby -v
安装gem
yum install -y rubygems
安装gem需要的依赖包
yum install -y zlib zlib-devel openssl openssl-devel
gem安装redis
gem install redis
Fetching: redis-4.0.1.gem (100%)
Successfully installed redis-4.0.1
Parsing documentation for redis-4.0.1
Installing ri documentation for redis-4.0.1
Done installing documentation for redis after 0 seconds
1 gem installed
没有报错.
gem install redis 如果报错(缺少zlib依赖和openssl库),则修改以下
添加zlib依赖
cd /opt/ruby-2.5.1/ext/zlib
ruby extconf.rb
然后修改Makefile文件中的zlib.o: $(top_srcdir)/include/ruby.h,将$(top_srcdir)修改为../..即zlib.o: ../../include/ruby.h
sed -i 's/$(top_srcdir)/../../g' Makefile
make && make install
添加openssl库
cd /opt/ruby-2.5.1/ext/openssl
ruby extconf.rb
然后同样修改Makefile文件中的$(top_srcdir)为../..
sed -i 's/$(top_srcdir)/../../g' Makefile
make && make install
再次安装gem install redis
gem install redis
正式链接整个集群
/usr/local/redis-cluster/bin/redis-trib.rb create --replicas 1 10.0.1.200:9001 10.0.1.200:9002 10.0.1.200:9003 10.0.1.200:9004 10.0.1.200:9005 10.0.1.200:9006
调用 ruby 命令来进行创建集群,--replicas 1 表示主从复制比例为 1:1,即一个主节点对应一个从节点;然后,默认给我们分配好了每个主节点和对应从节点服务,以及 solt 的大小,因为在 Redis 集群中有且仅有 16383 个 solt ,默认情况会给我们平均分配,当然你可以指定,后续的增减节点也可以重新分配。
测试集群
/usr/local/redis-cluster/bin/redis-cli -c -h 10.0.1.200 -p 9001
执行:
cluster info
cluster nodes
可以详细的看出集群信息和各个节点状态,主从信息以及连接数、槽信息等
当我们 set name chenxin,出现了 Redirected to slot 信息并自动连接到了9002节点。这也是集群的一个数据分配特性,这里不详细说了.
另外,cluster的配置文件和数据文件发生了变化:
ls /usr/local/redis-cluster/9001/data/
appendonly.aof dump.rdb nodes9001.conf
迁移IP后注意事项
如果cluster发生IP地址的变化(迁移),需要调整nodes9001.conf文件内的IP配置信息.否则集群会无法"链接".
如何关闭集群
正确关闭
redis-cli -p 6380 -a fafa123 shutdown
/usr/local/redis/src/redis-cli -p 9001 -h 10.0.1.200 shutdown 并依次关闭9002-9006
语法
SHUTDOWN [NOSAVE|SAVE]
[root@T4 conf]# redis-cli -c -h 172.16.57.57 -p 6382
172.16.57.57:6382> shutdown save
注意关闭只能关闭一个进程,不能关闭集群.
/etc/init.d/redis-server stop
/etc/init.d/redis-server start
/etc/init.d/redis-server restart
或
redis-cli -h 127.0.0.1 -p 6379 shutdown
手动save:
/usr/local/redis/src/redis-cli -h 127.0.0.1 -p 6379 save
OK
集群的扩容与收缩
略
数据的备份与恢复
貌似还是按照单个实例的方式进行备份或恢复物理文件,待后期继续研究更加合理的备份/恢复方案.
将远端redis上的rdb文件传输到本地(实现备份)
/usr/local/redis/src/redis-cli -h 10.0.1.198 -p 10379 save
cd /home/admin/
/usr/local/redis/src/redis-cli -h 10.0.1.198 -p 10379 --rdb test.rdb #将1.198上的redis数据拖到本地,本地文件命名为test.rdb
AWS的ElasticCache Redis不支持save和 --rdb 的指令.所以备份方案请参考aws云笔记里的ElasticCache备份和删除过期文件.
使用云服务商提供的redis集群服务
若服务过多,以及数据可靠性完整性考虑,推荐后期使用云服务商提供的redis集群服务.备份采取自备,不依赖云平台服务.