前提:之前因为redis-cluster没有php客户端+小白鼠,所以直接一票否决,当前情况下使用的redis高可用是通过哨兵+脚本vip切换,但目前redis支持了php客户端,我准备测试下redis cluster.
参考官网文档:http://redis.io/topics/cluster-tutorial
使用版本:3.0.7 下载地址:http://redis.io/download
server环境:10.1.3.191
目的:构建一个6个master、6个slave的集群环境
1. 下载
cd /opt/soft/
wget http://219.239.26.10/files/10300000079CAD74/120.52.72.46/download.redis.io/c3pr90ntcsf0/releases/redis-3.0.7.tar.gz
2. 解压安装
tar -zxf redis-3.0.7.tar.gz
cd redis-3.0.7
make && make install
3. 统一配置文件
cd /opt/soft/redis-3.0.7/
cp redis.conf redis.conf_bak
重点参数如下:
maxmemory 5Gb port 7000 cluster-enabled yes pidfile /var/run/redis_7000.pid cluster-config-file nodes-7000.conf cluster-node-timeout 5000 appendonly yes dir /u01/redis-cluster-test/7000/data/ logfile "/u01/redis-cluster-test/log/redis_7000.log"
4. 系统配置
echo 512 >/proc/sys/net/core/somaxconn sysctl vm.overcommit_memory=1 echo never > /sys/kernel/mm/transparent_hugepage/enabled yum install ruby rubygems -y gem install redis
5. 统一脚本配置
function create_dir { #创建数据文件和配置文件目录 port="7001 7002 7003 7004 7005 8000 8001 8002 8003 8004 8005" for i in $port; do mkdir -p /etc/redis/$i/ mkdir -p /u01/redis-cluster-test/$i/data/ done mkdir -p /u01/redis-cluster-test/log } function conf { # 修改配置文件 port="7001 7002 7003 7004 7005 8000 8001 8002 8003 8004 8005 " for i in $port; do cp /etc/redis/7000/redis.conf /etc/redis/$i/ #copy redis.conf cd /etc/redis/$i/ sed -i "s/7000/$i/g" redis.conf done } function start_redis { /opt/soft/redis-3.0.7/src/redis-server /etc/redis/7000/redis.conf & /opt/soft/redis-3.0.7/src/redis-server /etc/redis/7001/redis.conf & /opt/soft/redis-3.0.7/src/redis-server /etc/redis/7002/redis.conf & /opt/soft/redis-3.0.7/src/redis-server /etc/redis/7003/redis.conf & /opt/soft/redis-3.0.7/src/redis-server /etc/redis/7004/redis.conf & /opt/soft/redis-3.0.7/src/redis-server /etc/redis/7005/redis.conf & /opt/soft/redis-3.0.7/src/redis-server /etc/redis/8000/redis.conf & /opt/soft/redis-3.0.7/src/redis-server /etc/redis/8001/redis.conf & /opt/soft/redis-3.0.7/src/redis-server /etc/redis/8002/redis.conf & /opt/soft/redis-3.0.7/src/redis-server /etc/redis/8003/redis.conf & /opt/soft/redis-3.0.7/src/redis-server /etc/redis/8004/redis.conf & /opt/soft/redis-3.0.7/src/redis-server /etc/redis/8005/redis.conf & } create_dir conf start_redis
执行脚本启动后如下展示
6. 创建集群
#建立12个实例的集群
/opt/soft/redis-3.0.7/src/redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 \ 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:8000 127.0.0.1:8001 \ 127.0.0.1:8002 127.0.0.1:8003 127.0.0.1:8004 127.0.0.1:8005
7. 集群管理命令
集群 CLUSTER INFO 打印集群的信息 CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。 节点 CLUSTER MEET将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。 CLUSTER FORGET 从集群中移除 node_id 指定的节点。 CLUSTER REPLICATE 将当前节点设置为 node_id 指定的节点的从节点。 CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。 槽(slot) CLUSTER ADDSLOTS [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。 CLUSTER DELSLOTS [slot ...] 移除一个或多个槽对当前节点的指派。 CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。 CLUSTER SETSLOT NODE 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。 CLUSTER SETSLOT MIGRATING 将本节点的槽 slot 迁移到 node_id 指定的节点中。 CLUSTER SETSLOT IMPORTING 从 node_id 指定的节点中导入槽 slot 到本节点。 CLUSTER SETSLOT STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。 键 CLUSTER KEYSLOT 计算键 key 应该被放置在哪个槽上。 CLUSTER COUNTKEYSINSLOT 返回槽 slot 目前包含的键值对数量。 CLUSTER GETKEYSINSLOT 返回 count 个 slot 槽中的键。
8. 集群简单测试
测试1:查看集群状态等
测试2:模拟宕机切换
注意一点集群客户端连接方式需要用:redis-cli -c -p 7000 登陆,否则在执行写入的时候会报错
附: -c Enable cluster mode (follow -ASK and -MOVED redirections)
127.0.0.1:7000> set tiger bear
(error) MOVED 2772 127.0.0.1:7001
127.0.0.1:7000> get tiger
(error) MOVED 2772 127.0.0.1:7001
redis-cli -c -p 7000
127.0.0.1:7000> set tiger bear
-> Redirected to slot [2772] located at 127.0.0.1:7001
OK
127.0.0.1:7001> get tiger
"bear"
127.0.0.1:7001>
高可用测试1:模拟转存的实例宕机
上述说明在7000实例插入的key备份在了7001实例上,通过其他节点来访问key(tiger)的时候,也都是提示分发到7001端口。
# redis-cli -c -p 7001 127.0.0.1:7001> SHUTDOWN not connected> # redis-cli -c -p 7004 127.0.0.1:7004> get tiger -> Redirected to slot [2772] located at 127.0.0.1:8001 "bear"
说明:主动shutdown7001端口后,再去其他节点访问key(tiger),会转发的8001(7001的slave)
这里的slave并不同于slaveof中的slave概念,是集群给实例的定位,作为M的备切点,所以实际使用的时候,作为‘主备’的实例不要放在一个机器上。
好,我们再启动7001实例,又会怎么样的?
# /opt/soft/redis-3.0.7/src/redis-server /etc/redis/7001/redis.conf &
结果是再次访问还是会访问8001实例,我们把8001下掉,如下是测试结果
# redis-cli -c -p 7004 127.0.0.1:7004> get tiger -> Redirected to slot [2772] located at 127.0.0.1:8001 "bear" # redis-cli -c -p 8001 127.0.0.1:8001> SHUTDOWN not connected> # redis-cli -c -p 7004 127.0.0.1:7004> get tiger (error) CLUSTERDOWN The cluster is down 127.0.0.1:7004> get tiger -> Redirected to slot [2772] located at 127.0.0.1:7001 "bear"
当8001下掉的时候,立马访问会提示集群宕机,是因为集群切换也需要时间,短暂不能用,很快切换后又回到7001节点。
今天先写到这,后续继续添加内容.....
继续之前:
<1> 添加新的master节点;
a. 新启动一个实例9000 ok (do it yourself)
b. redis-trib.rb add-node 10.1.3.191:9000 10.1.3.191:7000
c. 分配数据
redis-trib.rb reshard 10.1.3.191:9000
输入被分配的实例id:57e15ffc521a26e4c314447a31ba85afa8d87324
然后被分配的slot个数:1000
系统会打印出来需要转移的slot跟你确认,输入yes确定
go~~
<2> 添加一个slave节点
./redis-trib.rb add-node --slave 127.0.0.1:7006 127.0.0.1:7000
<3> 移除一个节点
./redis-trib del-node 127.0.0.1:7000 57e15ffc521a26e4c314447a31ba85afa8d87324
<4> 迁移一个slave节点
进入某个slave节点,执行 CLUSTER REPLICATE 57e15ffc521a26e4c3144324
即可更换slave信息