Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。redis3.0.2开始支持了群集架构。 目前redis支持的cluster特性(已测试): 1):节点自动发现 2):slave->master 选举,集群容错 3):Hot resharding:在线分片 4):集群管理:cluster xxx 5):基于配置(nodes-port.conf)的集群管理 6):ASK 转向/MOVED 转向机制.
群集架构如图所示,为类似P2P的结构:
架构细节: (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽. (2)节点的fail是通过集群中超过半数的节点检测失效时才生效. (3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可 (4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
redis-cluster选举:容错
(1)领着选举过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉. (2):什么时候整个集群不可用(cluster_state:fail)? a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完成时进入fail状态. ps : redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败. b:如果集群超过半数以上master挂掉,无论是否有slave集群进入fail状态. ps:当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误
部署步骤: 2台服务器:10.10.0.1和10.10.0.2 redis集群每个机子都需要配置: #wget http://download.redis.io/releases/redis-3.0.2.tar.gz
#tar -zxvf redis-3.0.2.tar.gz
#cd redis-3.0.2
#make
#make install
#echo vm.overcommit_memory = 1 >> /etc/sysctl.conf 修改内存检测方式允许使用所有物理内存,防止高负载时性能严重下降
#echo vm.dirty_bytes=33554432 >> /etc/sysctl.conf 为了解决aof导致的busy问题,让系统从内存往硬盘刷数据的大小由默认的内存的10%减小到32M
#echo never > /sys/kernel/mm/transparent_hugepage/enabled 关闭巨透明页,centos6以上版本需要,如果改了需要重启,否则不用重启
#sysctl -p 立刻生效
#vim /etc/profile 配置环境变量,方便快捷调用命令
export REDIS_HOME=/usr/local/redis
export PATH=$PATH:$REDIS_HOME/src
#source /etc/profile 立刻生效
#mv /root/redis-3.0.2 /usr/local/redis
#cp /usr/local/redis/redis{.conf,7000.conf} 复制成集群需要的端口号命名的conf,需要复制多份,注意用端口号区分,一台上起7000,7001,7002 3个redis实例
#vim /usr/local/redis/redis7000.conf 以其中一个配置文件为例,其他的conf就是改里面的端口号
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| daemonize yes 修改作为后台服务启动
pidfile /var/run/redis7000.pid 单独的pid
port 7000 集群时改成不同的端口号
bind 本机ip 监听本机ip
tcp-keepalive 60 改成官方建议值
logfile /var/log/redis7000.log 日志存放位置,以端口号命名
dbfilename dump7000.db 快照文件名,改为以端口命名
dir /usr/local/redis/ 快照绝对路径
maxmemory 5000mb 限制单redis最大内存,视情况改,要给系统留出4G左右的空余
maxmemory-policy volatile-lru 到达最大内存后的删除缓存策略为删除过期key
appendonly yes 开启AOF同步模式,类似于mysql的binlog
appendfilename "appendonly7000.aof" 同步文件名
cluster-enabled yes 开启集群
cluster-config-file /usr/local/redis/nodes-7000.conf 集群节点配置文件绝对路径,以端口号命名,由redis自动维护
cluster-node-timeout 5000 节点超时时间
|
#vim /etc/rc.local开机自动启动
1
2
3
4
| echo never > /sys/kernel/mm/transparent_hugepage/enabled
/usr/local/redis/src/redis-server /usr/local/redis/redis7000.conf
/usr/local/redis/src/redis-server /usr/local/redis/redis7001.conf
/usr/local/redis/src/redis-server /usr/local/redis/redis7002.conf
|
#shutdown -r 0 如果设置了大页面,则需要重启
#yum install ruby rubygems -y 安装创建群集命令依赖的ruby环境 #wget http://rubygems.global.ssl.fastly.net/gems/redis-3.2.1.gem #gem install -l ./redis-3.2.1.gem
在任意一台机子上创建用集群的命令:
#/usr/local/redis/src/redis-trib.rb create --replicas 1 10.10.0.1:7000 10.10.0.1:7001 10.10.0.1:7002 10.10.0.2:7000 10.10.0.2:7001 10.10.0.2:7002
在任意一个节点上运行上面的命令创建集群,其中--replicas 1的意思是1主有1从,一共随机创建3主3从
运行成功会有提示预览主从状态,并等待输入yes
输入yes后会出现 [OK] All 16384 slots covered. 表示集群运行成功
日常维护:
#/usr/local/redis/src/redis-trib.rb check 10.10.0.1:7000 查看集群状态,任意节点上看就行
#redis-cli -h 10.10.0.1 -p 7000 cluster nodes | grep master |sort -k2 看主节点状态
#redis-cli -h 10.10.0.1 -p 7000 info 可以查看这个实例信息,可用于监控
动态调整redis参数:
#redis-cli -h 10.10.0.1 -p 7000 连接进redis实例
>config get * 查询所有可设置的项目和值
>config set x y 设置要改的项目x为值y
redis基准性能测试:
#redis-benchmark -q -h 10.10.0.1 -p 7000 -c 500 -n 100000
500个并发连接,100000个请求,检测host为10.10.0.1端口为7000的redis实例性能
如果要重新创建群集:
只要把各个nodesxxxx.conf文件删掉就可以,注意重新创建的群集要都为空,清空已有数据进redis各个实例里运行flushall,然后再用创建群集的命令就可以重新创建。
需要扩容主节点和从节点的步骤略过,请参见官方文档
|