Redis 3.2 生产环境集群部署
一、 概述
Redis从3.0开始支持集群模式。
1.1 架构图
架构细节:
1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
1.2 集群特点
1) 节点自动发现:所有节点相互连接
2) 集群消息通信通过集群总线通信,集群总线端口为客户端服务端口+10000(自动生成)
3) 节点与节点之间通过二进制协议进行通信
4) 数据按照Slot存储分布在多个Redis实例上
5) 集群节点挂掉会自动故障转移
一、 集群安装
本文采用2台主机,三主三从集群模式部署,每台机器部署三个节点。
2.1 服务器规划
主机 |
IP |
端口 |
node-10 |
172.10.10.10 |
6385、6386、6387 |
node-11 |
172.10.10.11 |
6385、6386、6387 |
2.2 下载(以下步骤先以node-10机器为例,node11机器步骤一样按照执行一遍即可)
[root@node-10 ~]# cd tools/ [root@node-10 tools]# wget http://download.redis.io/releases/redis-3.2.3.tar.gz [root@node-10 tools]# tar -xf redis-3.2.3.tar.gz [root@node-10 tools]# cd redis-3.2.3
2.3 编译
[root@node-10 redis-3.2.3]# make [root@node-10 redis-3.2.3]# make MALLOC=libc [root@node-10 redis-3.2.3]# make install PREFIX=/opt/redis-cluster 执行完这一步可以看到默认生成以下redis相关命令 [root@node-10 ~]# ll /opt/redis-cluster/bin/ total 6864 -rwxr-xr-x 1 root root 337424 Feb 28 14:06 redis-benchmark -rwxr-xr-x 1 root root 24992 Feb 28 14:06 redis-check-aof -rwxr-xr-x 1 root root 3083072 Feb 28 14:06 redis-check-rdb -rwxr-xr-x 1 root root 490264 Feb 28 14:06 redis-cli lrwxrwxrwx 1 root root 12 Feb 28 14:06 redis-sentinel -> redis-server -rwxr-xr-x 1 root root 3083072 Feb 28 14:06 redis-server
2.4 为三个节点创建对应的根目录及每个节点数据、日志、配置文件目录
[root@node-10 ~]# mkdir -p /opt/redis-cluster/{6385,6386,6387} [root@node-10 ~]# mkdir /opt/redis-cluster/6385/{data,conf,logs} [root@node-10 ~]# mkdir /opt/redis-cluster/6386/{data,conf,logs} [root@node-10 ~]# mkdir /opt/redis-cluster/6387/{data,conf,logs}
2.5 编辑配置文件
注意:不同节点端口不同,需要根据实际情况修改对应的实例数据的相应目录位置信息(这里以6385实例为例,其它按照这个修改即可)。
[root@node-10 ~]# vim /opt/redis-cluster/6385/conf/6385_redis.conf bind 0.0.0.0 protected-mode yes port 6385 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize yes supervised no pidfile /var/run/redis_6385.pid loglevel notice logfile "/opt/redis-cluster/6385/logs/redis_6385.log" databases 16 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump.rdb dir "/opt/redis-cluster/6385/data" 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 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 lua-time-limit 5000 cluster-enabled yes cluster-config-file "/opt/redis-cluster/6385/conf/nodes.conf" cluster-node-timeout 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
2.6 编辑统一启动脚本
[root@node-10 ~]# vim /opt/redis-cluster/start_rediscluster.sh #!/bin/bash REDIS_HOME=/opt/redis-cluster $REDIS_HOME/bin/redis-server $REDIS_HOME/6385/conf/6385_redis.conf $REDIS_HOME/bin/redis-server $REDIS_HOME/6386/conf/6386_redis.conf $REDIS_HOME/bin/redis-server $REDIS_HOME/6387/conf/6387_redis.conf [root@node-10 ~]# chmod +x /opt/redis-cluster/start_rediscluster.sh
2.7 启动
[root@node-10 ~]# cd /opt/redis-cluster/ [root@node-10 redis-cluster]# ./start_rediscluster.sh [root@node-10 redis-cluster]# ps -ef|grep redis root 5247 1 0 14:22 ? 00:00:00 /opt/redis-cluster/bin/redis-server 0.0.0.0:6385 [cluster] root 5249 1 0 14:22 ? 00:00:00 /opt/redis-cluster/bin/redis-server 0.0.0.0:6386 [cluster] root 5251 1 0 14:22 ? 00:00:00 /opt/redis-cluster/bin/redis-server 0.0.0.0:6387 [cluster] root 5260 1507 0 14:22 pts/1 00:00:00 grep --color=auto redis
注:这里只是部署好一台机器的三个redis实例,另一台机器部署与这一台一样,执行相应的命令即可,这里不再进行演示。
三、 创建集群(随便一台机器执行)
以上部署只是把单个节点部署好,需要把所有节点整合成一个集群,这样一个三主三从的Redis集群才算部署完成。
3.1 安装ruby
集群创建我们使用redis自带的redis-trib工具,该工具为ruby开发,需要安装ruby。
[root@node-10 ~]# yum install ruby -y [root@node-10 ~]# gem install redis
如果出现以上安装错误信息。我们需要升级ruby版本:
## 安装ruby管理工具rvm [root@node-10 ~]# gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB [root@node-10 ~]# curl -sSL https://get.rvm.io | bash -s stable ## 加载 [root@node-10 ~]# source /etc/profile.d/rvm.sh ## 查看ruby版本 [root@node-10 ~]# rvm list known ## 安装2.4.6 [root@node-10 ~]# rvm install 2.5.1
[root@node-10 ~]# rvm use 2.5.1 –default ## 安装redis-trib.rb即redis集群工具 [root@node-10 ~]# gem install redis -v 3.3.5 ## 启动集群 [root@node-10 ~]# cd tools/redis-3.2.3/src/ [root@node-10 src]# ./redis-trib.rb create --replicas 1 172.16.10.10:6385 172.16.10.10:6386 172.16.10.10:6387 172.16.10.11:6385 172.16.10.11:6386 172.16.10.11:6387
--replicas 1:表示我们想为每个master指定一个slave
## 验证 [root@node-10 bin]# cd /opt/redis-cluster/bin/ [root@node-10 bin]# ./redis-cli -p 6385 -c
11服务器:6385,10服务器:6385、6386为主节点
3.2 集群重启
由于redis-trib的功能还比较弱,重启集群的话需要kill各个节点进程,然后再执行启动脚本 ## kill命令 [root@node-10 ~]# ps -ef | grep redis |grep -v grep|awk '{print $2}'|xargs kill ## 启动 [root@node-10 ~]# cd /opt/redis-cluster/ [root@node-10 redis-cluster]# ./start_rediscluster.sh