一、概述
### Redis3.0版本之后支持Cluster.
1.1、redis cluster的现状
目前redis支持的cluster特性:
1):节点自动发现
2):slave->master 选举,集群容错
3):Hot resharding:在线分片
4):进群管理:cluster xxx
5):基于配置(nodes-port.conf)的集群管理
6):ASK 转向/MOVED 转向机制.
1.2、redis cluster 架构
1)redis-cluster架构图
架构细节:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
2) redis-cluster选举:容错
(1)领着选举过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉.
(2):什么时候整个集群不可用(cluster_state:fail),当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误
a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成进群的slot映射[0-16383]不完成时进入fail状态.
b:如果进群超过半数以上master挂掉,无论是否有slave集群进入fail状态.
二、redis安装
1、关闭防火墙:
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)
2、配置编译环境:sudo yum install gcc-c++
3、下载源码:
cd /usr/local
wget http://download.redis.io/releases/redis-3.2.8.tar.gz
4、解压源码:tar -zxvf redis-3.2.8.tar.gz
5、进入到解压目录:cd redis-3.2.8
6、执行make编译Redis:make MALLOC=libc
注意:make命令执行完成编译后,会在src目录下生成6个可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-check-aof、redis-check-rdb、redis-sentinel。
7、安装Redis:make install
8、redis.conf 的配置信息
1、daemonize 如果需要在后台运行,把该项改为yes
2、pidfile 配置多个pid的地址 默认在/var/run/redis.pid
3、bind 绑定ip,设置后只接受来自该ip的请求
4、port 监听端口,默认是6379
5、loglevel 分为4个等级:debug verbose notice warning
6、logfile 用于配置log文件地址
7、databases 设置数据库个数,默认使用的数据库为0
8、save 设置redis进行数据库镜像的频率。
9、rdbcompression 在进行镜像备份时,是否进行压缩
10、dbfilename 镜像备份文件的文件名
11、Dir 数据库镜像备份的文件放置路径
12、Slaveof 设置数据库为其他数据库的从数据库
13、Masterauth 主数据库连接需要的密码验证
14、Requriepass 设置 登陆时需要使用密码
15、Maxclients 限制同时使用的客户数量
16、Maxmemory 设置redis能够使用的最大内存
17、Appendonly 开启append only模式
18、Appendfsync 设置对appendonly.aof文件同步的频率(对数据进行备份的第二种方式)
19、vm-enabled 是否开启虚拟内存支持 (vm开头的参数都是配置虚拟内存的)
20、vm-swap-file 设置虚拟内存的交换文件路径
21、vm-max-memory 设置redis使用的最大物理内存大小
22、vm-page-size 设置虚拟内存的页大小
23、vm-pages 设置交换文件的总的page数量
24、vm-max-threads 设置VM IO同时使用的线程数量
25、Glueoutputbuf 把小的输出缓存存放在一起
26、hash-max-zipmap-entries 设置hash的临界值
27、Activerehashing 重新hash
三、redis cluster安装
1、两台服务器安装redis服务,分别为:10.10.10.8 ,10.10.10.9,修改redis配置文件内容如下
# cat /usr/local/redis-3.2.8/redis.conf
################################# NETWORK #####################################
bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
################################# GENERAL #####################################
daemonize yes
supervised no
pidfile redis_6379.pid
loglevel notice
logfile redis.log
databases 16
################################ REDIS CLUSTER ###############################
cluster-enabled yes
cluster-config-file ./nodes_6379.conf
cluster-node-timeout 5000
# cluster-slave-validity-factor 10
# cluster-migration-barrier 1
# cluster-require-full-coverage yes
################################## SECURITY ###################################
# requirepass foobared #设置密码,每个节点的密码都必须一致的
# rename-command CONFIG ""
############################## APPEND ONLY MODE ###############################
appendonly yes
# The name of the append only file (default: "appendonly.aof")
appendfilename "appendonly.aof"
# appendfsync always
appendfsync everysec
# appendfsync no
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
################################ SNAPSHOTTING ################################
#save 900 1
#save 300 10
#save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
################################# REPLICATION #################################
# masterauth <master-password>
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
# repl-ping-slave-period 10
# repl-timeout 60
repl-disable-tcp-nodelay no
# repl-backlog-size 1mb
# repl-backlog-ttl 3600
slave-priority 100
# min-slaves-max-lag 10
# min-slaves-max-lag is set to 10.
# slave-announce-ip 5.5.5.5
# slave-announce-port 1234
################################### LIMITS ####################################
# maxclients 10000
maxmemory 1gb
maxmemory-policy noeviction
# maxmemory-samples 5
################################ LUA SCRIPTING ###############################
lua-time-limit 5000
################################## SLOW LOG ###################################
slowlog-log-slower-than 10000
slowlog-max-len 128
################################ LATENCY MONITOR ##############################
latency-monitor-threshold 0
############################# EVENT NOTIFICATION ##############################
notify-keyspace-events ""
############################### ADVANCED CONFIG ###############################
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、10.10.10.8 使用脚本创建redis节点(7000,7001,7002)。
#cd /usr/local/redis-3.2.8
#./utils/install_server.sh
显示结果信息如下:
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379] 7000 //端口分别为7000,7001,7002
Please select the redis config file name [/etc/redis/7000.conf]
Selected default - /etc/redis/7000.conf
Please select the redis log file name [/var/log/redis_7000.log]
Selected default - /var/log/redis_7000.log
Please select the data directory for this instance [/var/lib/redis/7000]
Selected default - /var/lib/redis/7000
Please select the redis executable path [/usr/local/bin/redis-server]
Selected config:
Port : 7000
Config file : /etc/redis/7000.conf
Log file : /var/log/redis_7000.log
Data dir : /var/lib/redis/7000
Executable : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/7000.conf => /etc/init.d/redis_7000
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
10.10.10.8 继续运行 ./utils/install_server.sh创建7001,7002节点
在10.10.10.9创建3个节点:对应的端口改为7003,7004,7005。
3、手动修改redis配置文件端口(若脚本无法成功配置)
# sed -i 's/6379/7000/g' /etc/redis/7000.conf
# sed -i 's/6379/7001/g' /etc/redis/7001.conf
# sed -i 's/6379/7002/g' /etc/redis/7002.conf
# sed -i 's/6379/7003/g' /etc/redis/7003.conf
# sed -i 's/6379/7004/g' /etc/redis/7004.conf
# sed -i 's/6379/7005/g' /etc/redis/7005.conf
4、如果修改过监听地址,则修改redis启动脚本
# sed -i 's/$CLIEXEC -p/$CLIEXEC -h 10.10.10.8 -p/g' /etc/rc.d/init.d/redis_7000
# sed -i 's/$CLIEXEC -p/$CLIEXEC -h 10.10.10.8 -p/g' /etc/rc.d/init.d/redis_7001
# sed -i 's/$CLIEXEC -p/$CLIEXEC -h 10.10.10.8 -p/g' /etc/rc.d/init.d/redis_7002
# sed -i 's/$CLIEXEC -p/$CLIEXEC -h 10.10.10.9 -p/g' /etc/rc.d/init.d/redis_7003
# sed -i 's/$CLIEXEC -p/$CLIEXEC -h 10.10.10.9 -p/g' /etc/rc.d/init.d/redis_7004
# sed -i 's/$CLIEXEC -p/$CLIEXEC -h 10.10.10.9 -p/g' /etc/rc.d/init.d/redis_7005
5、关闭默认端口
killall redis-server
6、两台机启动各节点
/etc/init.d/redis_7000 start
/etc/init.d/redis_7001 start
/etc/init.d/redis_7002 start
/etc/init.d/redis_7003 start
/etc/init.d/redis_7004 start
/etc/init.d/redis_7005 start
7、查看服务
ps -ef | grep redis #查看是否启动成功
netstat -tnlp | grep redis #可以看到redis监听端口
四、创建集群
前面已经准备好了搭建集群的redis节点,接下来我们要把这些节点都串连起来搭建集群。官方提供了一个工具:redis-trib.rb( /usr/local/redis-3.2.8/src/redis-trib.rb) 看后缀就知道这鸟东西不能直接执行,它是用ruby写的一个程序,所以我们还得安装ruby.
yum -y install ruby ruby-devel rubygems rpm-build
再用 gem 这个命令来安装 redis接口 gem是ruby的一个工具包.
gem install redis //等一会儿就好了
当然,方便操作,两台Server都要安装。
注意:在执行gem install redis时,报ERROR:Error installing redis:
redis requires Ruby version >= 2.2.2异常。
点击此处查看解决方案
上面的步骤完事了,接下来运行一下redis-trib.rb
/usr/local/redis-3.2.8/src/redis-trib.rb
Usage: redis-trib <command> <options> <arguments ...>
create host1:port1 ... hostN:portN
--replicas <arg>
check host:port
info host:port
fix host:port
--timeout <arg>
reshard host:port
--from <arg>
--to <arg>
--slots <arg>
--yes
--timeout <arg>
--pipeline <arg>
rebalance host:port
--weight <arg>
--auto-weights
--use-empty-masters
--timeout <arg>
--simulate
--pipeline <arg>
--threshold <arg>
add-node new_host:new_port existing_host:existing_port
--slave
--master-id <arg>
del-node host:port node_id
set-timeout host:port milliseconds
call host:port command arg arg .. arg
import host:port
--from <arg>
--copy
--replace
help (show this help)
For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
看到这,应该明白了吧,就是靠上面这些操作完成redis集群搭建。
确认所有的节点都启动,接下来使用参数 create 创建 (在192.168.1.160中来创建)
/usr/local/redis-3.2.8/src/redis-trib.rb create --replicas 1 10.10.10.8:7000 10.10.10.8:7001 10.10.10.8:7002 10.10.10.9:7003 10.10.10.9:7004 10.10.10.9:7005
解释下, --replicas 1 表示 自动为每一个master节点分配一个slave节点 上面有6个节点,程序会按照一定规则生成 3个master(主)3个slave(从)。其他参数是实例的地址集合。
前面已经提醒过的 防火墙一定要开放监听的端口,否则会创建失败。
运行中,提示Can I set the above configuration? (type 'yes' to accept): yes //输入yes
接下来 提示 Waiting for the cluster to join.......... 安装的时候在这里就一直等等等,没反应,傻傻等半天,看这句提示上面一句,Sending Cluster Meet Message to join the Cluster.
这下明白了,我刚开始在一台Server上去配,也是不需要等的,这里还需要跑到Server2上做一些这样的操作。在10.10.10.9, redis-cli -c -p 700* 分别进入redis各节点的客户端命令窗口, 依次输入 cluster meet 10.10.10.9 7000……`
回到Server1,已经创建完毕了。
/usr/local/redis-3.2.8/src/redis-trib.rb check 10.10.10.8:7000 #查看一下
到这里集群已经初步搭建好了。
五、测试
1)get 和 set数据
redis-cli -h 10.10.10.8 -c -p 7000
进入命令窗口,直接 set hello howareyou
直接根据hash匹配切换到相应的slot的节点上。
还是要说明一下,redis集群有16383个slot组成,通过分片分布到多个节点上,读写都发生在master节点。
2)假设测试
果断先把10.10.10.9服务Down掉,(10.10.10.9有1个Master, 2个Slave)
redis-cli -h 10.10.10.9 -p 7003 shutdown
redis-cli -h 10.10.10.9 -p 7004 shutdown
redis-cli -h 10.10.10.9 -p 7005 shutdown
跑回10.10.10.8, 查看一下 发生了什么事,10.10.10.8的3个节点全部都是Master,其他几个Server2的不见了
测试一下,依然没有问题,集群依然能继续工作。
原因:redis集群 通过选举方式进行容错,保证一台Server挂了还能跑,这个选举是全部集群超过半数以上的Master发现其他Master挂了后,会将其他对应的Slave节点升级成Master.
疑问: 要是挂的是10.10.10.8怎么办?
哥试了,cluster is down!! 没办法,超过半数挂了那救不了了,整个集群就无法工作了。
要是有三台Server,每台两Master,切记对应的主从节点不要放在一台Server,别问我为什么,自己用脑子想想看,互相交叉配置主从,挂哪台也没事,你要说同时两台crash了,呵呵哒......
3)关于一致性
我还没有这么大胆拿redis来做数据库持久化个网站数据,只是拿来做cache
官网说的很清楚,Redis Cluster is not able to guarantee strong consistency.
本文转自奔跑在路上博客51CTO博客,原文链接http://blog.51cto.com/qiangsh/2052526如需转载请自行联系原作者
qianghong000