Redis是现网中使用率非常高的中间件,其作用和优势不在本文讨论范围。本系列主要从运维人员角度出发,从安装,集群架构,调优等方面,全面讲解Redis的各种疑难问题及处理方法。字字皆辛苦,且看且珍惜!
这里使用了三台虚拟机,系统为centos7,默认使用root,IP分别为:192.168.8.133;192.168.8.134;192.168.8.135
请关闭防火墙和selinux。
Redis下载地址网上一大把,比较齐全的比如:http://download.redis.io/releases/
强烈建议右键获取下载地址,然后用迅雷下载。
我们本次使用redis-5.0.9.tar
然后将包分别传到3台服务器上,方法不限,高兴就好。
然后开始安装步骤:
yum -y install make makeinstall gcc gcc-c++
[root@localhost ~]# ls
anaconda-ks.cfg redis-5.0.9.tar.gz
[root@localhost ~]# tar -xf redis-5.0.9.tar.gz
[root@localhost ~]# cd redis-5.0.9/
[root@localhost redis-5.0.9]# make
[root@localhost redis-5.0.9]# cd src/
[root@localhost src]# make install
三台都要安装,这样就得到了三台单独运行的Redis。
安装完成之后,就需要起服务了。但是不要着急,让我们来说些深奥的东西。
首先,这个Redis安装目录下,就大有讲究。
默认的目录下,redis.conf是默认的系统配置文件,后续各种优化,都是基于这个文件来修改的。这里暂时不精讲。
src这个目录下,存放的是各种命令,这个文件也很重要。utils这个文件夹很少用到,但最好留着。
但是,除了这三个之外,其余的全部都是废话,让我们来删除他们
[root@localhost redis-5.0.9]# ls | egrep -v 'utils|redis.conf|src' | xargs rm -rf
[root@localhost redis-5.0.9]# ls
redis.conf src utils
为了便于存放和管理配置文件、持久化文件和日志,让我们来建两个文件夹,分别为:conf,cluster,logs
[root@localhost redis-5.0.9]# mkdir conf
[root@localhost redis-5.0.9]# mkdir cluster
[root@localhost redis-5.0.9]# mkdir logs
[root@localhost redis-5.0.9]# ls
cluster conf redis.conf src utils logs
[root@localhost redis-5.0.9]# mv redis.conf conf/
[root@localhost redis-5.0.9]# ls
cluster conf src utils logs
接下来,重点来了。一个完整的Redis集群,至少需要6个实例。我们现在有三台服务器,那么每台就用2个实例。端口就使用6371和6471,所以,我们要修改conf/redis.conf
[root@localhost conf]#cd ../../
[root@localhost ~]# mv redis-5.0.9 redis
[root@localhost redis]# cd conf/
[root@localhost conf]# cp redis.conf 6371.conf
[root@localhost conf]# cp redis.conf 6471.conf
[root@localhost conf]# ls
6371.conf 6471.conf redis.conf
让我们开始修改文件:
vim打开,找到
[root@localhost conf]# cat 6371.conf | grep -v ^# | grep -v ^$
bind 192.168.8.133 #本机是什么IP就改成什么
protected-mode yes
port 6371 #自定义
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes #可以让redis程序在后台运行
supervised no
pidfile /root/redis/cluster/redis_6371.pid #设置pid路径
loglevel notice
logfile "/root/redis/logs/6371.log" #设置单独的日志文件目录
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb #默认的配置不用修改,文件默认存放在/root/redis/cluster下面
dir /root/redis/cluster/ #设置上面文件的存放目录
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
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
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 yes
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
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
cluster-enabled yes #将实例修改为cluster模式,用来建立集群
cluster-config-file nodes-6371.conf #每一个单独的cluster实例的配置文件都存放在/root/redis/cluster下面
[root@localhost conf]# cp 6371.conf 6471.conf
cp: overwrite ‘6471.conf’? y
[root@localhost conf]# ls
6371.conf 6471.conf redis.conf
[root@localhost conf]#
让我们打开6471.conf,修改6371为6471,其余的保持不变
启动Redis:
[root@localhost redis]# /root/redis/src/redis-server /root/redis/conf/6371.conf
[root@localhost redis]# /root/redis/src/redis-server /root/redis/conf/6471.conf
[root@localhost redis]# ps -ef | grep redis
root 50121 1 0 22:52 ? 00:00:02 /root/redis/src/redis-server 192.168.8.135:6371 [cluster]
root 50697 1 0 23:13 ? 00:00:00 /root/redis/src/redis-server 192.168.8.135:6471 [cluster]
root 50702 9672 0 23:14 pts/0 00:00:00 grep --color=auto redis
这样,一个拥有两个节点的Redis就搭建好了。
我们来看看cluster目录下有什么?
[root@localhost redis]# ls cluster/
nodes-6471.conf nodes.conf redis_6371.pid redis_6471.pid
接下来,我们将6371.conf和6471.conf拷到其余两台服务器的对应目录下,并检查一下这两台的redis目录下,是否有:conf,cluster,logs这三个目录,如果没有,赶快建吧。
然后修改这两个文件中的bind 192.168.8.133分别为
bind 192.168.8.134
bind 192.168.8.135
其余的内容保持不变即可。
然后分别启动6371和6471,使用ps -ef |grep redis检查一下你的进程有了吗?
我推测,并不是所有人做到这一步的时候,都可以顺利得到3个IP每个IP上有两个redis进程。错误,来源于粗心大意,请往上翻,将我上面讲的步骤再三核对一遍。
这里也列举一些常见的坑:
错误1:
这个问题明细是没有建logs目录,同样,要是报错cluster目录没有,请立马建一个
错误2:
redis启动之后,停留在当前页面,按CTRL+c退出。发现进程没起来,这是咋了?
daemonize yes
修改了吗??
6个进程都有了之后,让我们来建集群,建一个3节点6实例的redis集群。
安装集群,我们选择192.168.8.133作为主节点,一下的操作,都在133上操作,其余两台不用动!!!
[root@localhost redis]# yum install ruby
如果你的yum源安装不了ruby,请使用阿里的源,配置yum源这里不讲。
安装完成之后,我们会得到一个gem命令,注意,一定要有这个命令。不然下面步骤无法操作。
还需要一个文件,请把它传到redis目录下
redis-3.0.0.gem文件
链接:https://pan.baidu.com/s/1IiKDQGxP4XU7wDEKxNoVkw
提取码:ignv
感谢作者 和乐赢 分享
两个必备条件都有了之后,我们开始安装集群。
[root@localhost redis]# ls
cluster conf logs redis-3.0.0.gem src utils
[root@localhost redis]# gem install redis-3.0.0.gem
Successfully installed redis-3.0.0
Parsing documentation for redis-3.0.0
Installing ri documentation for redis-3.0.0
1 gem installed
然后使用命令:
echo yes | /root/redis/src/redis-cli --cluster create 192.168.8.133:6371 192.168.8.133:6471 192.168.8.134:6371 192.168.8.134:6471 192.168.8.135:6371 192.168.8.135:6471 --cluster-replicas 1
这个版本使用的集群安装命令和低版本不同,低版本可能要使用
/root/redis/src/redis-trib.rb create --replicas 1 192.168.8.133:6371 192.168.8.133:6471 192.168.8.134:6371 192.168.8.134:6471 192.168.8.135:6371 192.168.8.135:6471
[root@localhost redis]# /root/redis/src/redis-cli -h 192.168.8.133 -p 6371 -c
这里就表示安装好了。
到此为止,一个3节点6实例的redis集群安装成功。我们现在来看下133节点上的cluster目录下有什么?
在这里郑重提示:nodes-6371.conf和nodes-6471.conf,是集群起来之后,保存的该实例的集群连接信息,不能删除,否则重启实例之后,集群必然失败!!建议备份到其他地方。这个坑一旦踩进去,生产环境必然崩溃!
重建集群需要删除所有节点下的这两个文件
然后使用gem install redis-3.0.0.gem
然后在使用 echo yes | /root/redis/src/redis-cli --cluster create 192.168.8.133:6371 192.168.8.133:6471 192.168.8.134:6371 192.168.8.134:6471 192.168.8.135:6371 192.168.8.135:6471 --cluster-replicas 1
一套操作下来,至少需要10分钟,等业务恢复之后,客户早就投诉过来了,后续又要回溯,又要挨叼,还要写各种文档,看各种眼色。亲们,一定要慎重啊!
在看看logs下:
接下来,记录一些坑:
如果报错6371不是一个cluster节点,那肯定是你的
cluster-enabled yes
cluster-config-file nodes-6371.conf
这两句没有按要求改好,请改好后杀掉进程并重启redis
请注意:进程后面一定要带有cluster字样,普通的redis服务,在这个版本是不可以做集群的。