搭建redis-cluster环境

前提:以前由于redis-cluster没有php客户端+小白鼠,因此直接一票否决,当前状况下使用的redis高可用是经过哨兵+脚本vip切换,但目前redis支持了php客户端,我准备测试下redis cluster.php


参考官网文档:http://redis.io/topics/cluster-tutorialnode

使用版本:3.0.7  下载地址:http://redis.io/downloadweb


server环境:10.1.3.191 redis

目的:构建一个6个master、6个slave的集群环境ruby


1. 下载bash

cd /opt/soft/app

wget  http://219.239.26.10/files/10300000079CAD74/120.52.72.46/download.redis.io/c3pr90ntcsf0/releases/redis-3.0.7.tar.gzide


2. 解压安装
测试


tar -zxf redis-3.0.7.tar.gz spa

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

 执行脚本启动后以下展现

wKiom1bZThfBySM_AATuhKx2eJA978.png





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

wKiom1bZTQ6CD231AA33rCHw3D4348.jpg



7. 集群管理命令

集群  
CLUSTER INFO 打印集群的信息  
CLUSTER NODES 列出集群当前已知的全部节点(node),以及这些节点的相关信息。  
节点  
CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。  
CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。  
CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。  
CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。  
槽(slot)  
CLUSTER ADDSLOTS <slot> [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。  
CLUSTER DELSLOTS <slot> [slot ...] 移除一个或多个槽对当前节点的指派。  
CLUSTER FLUSHSLOTS 移除指派给当前节点的全部槽,让当前节点变成一个没有指派任何槽的节点。  
CLUSTER SETSLOT <slot> NODE <node_id> 将槽 slot 指派给 node_id 指定的节点,若是槽已经指派给另外一个节点,那么先让另外一个节点删除该槽>,而后再进行指派。  
CLUSTER SETSLOT <slot> MIGRATING <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。  
CLUSTER SETSLOT <slot> IMPORTING <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。  
CLUSTER SETSLOT <slot> STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。  
键  
CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪一个槽上。  
CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。  
CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键。



8. 集群简单测试

测试1:查看集群状态等

wKiom1bZT2yD5wltAAdZZTdJZRk287.png


测试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 

wKioL1bmwBOi0cHmAAaJMn6bM4Y575.png


c. 分配数据

     redis-trib.rb reshard 10.1.3.191:9000

    输入被分配的实例id:57e15ffc521a26e4c314447a31ba85afa8d87324

    而后被分配的slot个数:1000

    系统会打印出来须要转移的slot跟你确认,输入yes肯定

    go~~

    wKiom1bmwO-AZqJSAAE3CqiCuIo637.png

<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信息

相关文章
相关标签/搜索