? 集群搭建的概念
1、节点
在单机上配置集群,7000-7005 端口
2、meet
cluster meet ip port 命令
如:
./redis-cli -p 7000 cluster meet 127.0.0.1 7001
3、 指派槽
cluster addslots 0
4、复制
cluster replicate node-id
?集群配置文件?
# 指定端口
port 7000
# 后端运行
daemonize yes
#指定文件存放目录
dir "/opt/redis/redis-5.0.7/cluster-file"
# 日志文件存放
logfile "7000.log"
# rdb 文件
dbfilename "dump-7000.rdb"
#使能集群
cluster-enabled yes
#集群配置文件
cluster-config-file nodes-7000.conf
#集群故障失败,是否使集群不可用,这是配置no
cluster-require-full-coverage no
~
使用sed 命令 生成对应的节点文件?
sed 's/7000/7002/g' redis-7000.conf > redis-7002.conf
启动节点:
[root@hadoop02 bin]# ./redis-server /opt/redis/redis-5.0.7/cluster-config/redis-7001.conf
使用脚本启动:
#!/bin/bash
# create nodes array
nodes=(7000 7001 7002 7003 7004 7005)
for node in ${nodes[@]}
do
./redis-server /opt/redis/redis-5.0.7/cluster-config/redis-${node}.conf
if [ $? = 0 ]; then
echo "port $node start success !";
else
echo " port $node start fail ";
fi
done
exit 0
[root@hadoop02 bin]# ./start-redis-cluster.sh
port 7000 start success !
port 7001 start success !
port 7002 start success !
port 7003 start success !
port 7004 start success !
port 7005 start success !
[root@hadoop02 bin]# ps -ef | grep redis
root 3701 1 0 12:08 ? 00:00:00 ./redis-server *:7000 [cluster]
root 3706 1 0 12:08 ? 00:00:00 ./redis-server *:7001 [cluster]
root 3708 1 0 12:08 ? 00:00:00 ./redis-server *:7002 [cluster]
root 3716 1 0 12:08 ? 00:00:00 ./redis-server *:7003 [cluster]
root 3721 1 0 12:08 ? 00:00:00 ./redis-server *:7004 [cluster]
root 3726 1 0 12:08 ? 00:00:00 ./redis-server *:7005 [cluster]
root 3731 3477 0 12:09 pts/0 00:00:00 grep --color=auto redis
----至此我们已经启动了6个node节点。
查看集群状态
发现集群是不可用的状态,这是因为我们只是启动了nodes 并没有做meet操作等后续的步骤。那我们是否可以写数据呢,现在,发现是不可以的,写数据依赖 分片功能还没有提供服务。
127.0.0.1:7000> cluster info
cluster_state:fail
cluster_slots_assigned:0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:1
cluster_size:0
cluster_current_epoch:0
cluster_my_epoch:0
cluster_stats_messages_sent:0
cluster_stats_messages_received:0
cluster_stats_messages_received:0
127.0.0.1:7000> set key1 value1
(error) CLUSTERDOWN Hash slot not served
二、meet 进行节点间通信
简单写一个脚本进行操作。
[root@hadoop02 bin]# vi start-cluster-meet.sh
#!/bin/bash
#create other nodes,implements meet
nodes=(7001 7002 7003 7004 7005)
for node in ${nodes[@]}
do
if [ -n "$1" ]; then
./redis-cli -p $1 cluster meet 127.0.0.1 $node
if [ $? = 0 ]; then
echo " meet susccess ! ";
else
echo " meet fail !";
fi
else
echo " not find paras ";
fi
done
[root@hadoop02 bin]# ./start-cluster-meet.sh
not find paras
not find paras
not find paras
not find paras
not find paras
[root@hadoop02 bin]# ./start-cluster-meet.sh 7000
OK
meet susccess !
OK
meet susccess !
OK
meet susccess !
OK
meet susccess !
OK
meet susccess !
查看集群meet 情况
[root@hadoop02 bin]# ./redis-cli -p 7000 cluster nodes
32f6998c0f784fca1ba320fd8d019414378a36c5 127.0.0.1:7004@17004 master - 0 1575693038502 3 connected
1a44c8fc719f20cb4842f52cf0c777830424da6e 127.0.0.1:7000@17000 myself,master - 0 1575693036000 1 connected
1afc890fccc7416a219bb9299ab1b9b2a01ed17b 127.0.0.1:7005@17005 master - 0 1575693037492 4 connected
b1e05f6ced501923e9bbca90e063a2a2cb91ff73 127.0.0.1:7003@17003 master - 0 1575693039513 0 connected
76ca8d83587c9de5fb80f034509a610bc611943d 127.0.0.1:7001@17001 master - 0 1575693040521 2 connected
2e591d755b2b2537554a2b0279541b3c51334c76 127.0.0.1:7002@17002 master - 0 1575693035000 5 connected
我们发现已经在node-7000.conf 已经有了节点了。
[root@hadoop02 bin]# ./redis-cli -p 7000 cluster info
cluster_state:fail
cluster_slots_assigned:0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:0
cluster_current_epoch:5
cluster_my_epoch:1
cluster_stats_messages_ping_sent:356
cluster_stats_messages_pong_sent:349
cluster_stats_messages_meet_sent:5
cluster_stats_messages_sent:710
cluster_stats_messages_ping_received:349
cluster_stats_messages_pong_received:361
cluster_stats_messages_received:710
查看其它的端口是否已经识别了
[root@hadoop02 bin]# ./redis-cli -p 7004 cluster info
cluster_state:fail
cluster_slots_assigned:0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:0
cluster_current_epoch:5
cluster_my_epoch:3
cluster_stats_messages_ping_sent:397
cluster_stats_messages_pong_sent:394
cluster_stats_messages_meet_sent:4
cluster_stats_messages_sent:795
cluster_stats_messages_ping_received:390
cluster_stats_messages_pong_received:401
cluster_stats_messages_meet_received:4
cluster_stats_messages_received:795
三、 为节点分配槽,这个6个节点需要三台节点作为主机,三台作为从机。
master 7000 7001 7002
slaves 7003 7004 7005
假设我们需要0~16383个数据。
7000 16383%3 0-5641
7001 5462 -10922
7003 10923-16383
---使用脚本分配
[root@hadoop02 bin]# cat start-cluster-slots.sh
#!/bin/bash
port=$1
start=$2
end=$3
for slot in `seq $start $end `
do
./redis-cli -p ${port} cluster addslots ${slot}
if [ $? = 0 ]; then
echo " add slot success ! ";
else
echo " add slot fail ";
fi
done
exit 0
查看是否分配OK
[root@hadoop02 bin]# ./redis-cli -p 7000 cluster nodes
32f6998c0f784fca1ba320fd8d019414378a36c5 127.0.0.1:7004@17004 master - 0 1575694781555 3 connected
1a44c8fc719f20cb4842f52cf0c777830424da6e 127.0.0.1:7000@17000 myself,master - 0 1575694780000 1 connected 0-5461
1afc890fccc7416a219bb9299ab1b9b2a01ed17b 127.0.0.1:7005@17005 master - 0 1575694783569 4 connected
b1e05f6ced501923e9bbca90e063a2a2cb91ff73 127.0.0.1:7003@17003 master - 0 1575694782563 0 connected
76ca8d83587c9de5fb80f034509a610bc611943d 127.0.0.1:7001@17001 master - 0 1575694780548 2 connected 5462-10922
2e591d755b2b2537554a2b0279541b3c51334c76 127.0.0.1:7002@17002 master - 0 1575694780000 5 connected 10923-16383
[root@hadoop02 bin]#
从图中可以看出 slot已经分配成功了。
[root@hadoop02 bin]# ./redis-cli -p 7000 cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:5
cluster_my_epoch:1
cluster_stats_messages_ping_sent:2082
cluster_stats_messages_pong_sent:2034
cluster_stats_messages_meet_sent:5
cluster_stats_messages_sent:4121
cluster_stats_messages_ping_received:2034
cluster_stats_messages_pong_received:2087
cluster_stats_messages_received:4121
[root@hadoop02 bin]#
这个也可以看出,集群分配了slot 的个数。
四、 实现主从复制
注意 我们要做的是7000 7003 节点做master-slave 对应。
7001 7004 做master-slave 对应
7002 7005 做master-slave 对应
(error) ERR To set a master the node must be empty and without assigned slots.
[root@hadoop02 bin]# ./redis-cli -p 7003 cluster replicate b1e05f6ced501923e9bbca90e063a2a2cb91ff73
(error) ERR Can't replicate myself
[root@hadoop02 bin]# ./redis-cli -p 7003 cluster replicate 1a44c8fc719f20cb4842f52cf0c777830424da6e
OK
[root@hadoop02 bin]# ./redis-cli -p 7004 cluster replicate 32f6998c0f784fca1ba320fd8d019414378a36c5
(error) ERR Can't replicate myself
[root@hadoop02 bin]# ./redis-cli -p 7004 cluster replicate 76ca8d83587c9de5fb80f034509a610bc611943d
OK
[root@hadoop02 bin]# ./redis-cli -p 7005 cluster replicate 2e591d755b2b2537554a2b0279541b3c51334c76
OK
[root@hadoop02 bin]# ./redis-cli -p 7004 -c
127.0.0.1:7004> exit
[root@hadoop02 bin]# ./redis-cli -p 7000 -c
127.0.0.1:7000> set key1 hello
-> Redirected to slot [9189] located at 127.0.0.1:7001
OK
127.0.0.1:7001> get hello
-> Redirected to slot [866] located at 127.0.0.1:7000
(nil)
127.0.0.1:7000> get key1
-> Redirected to slot [9189] located at 127.0.0.1:7001
"hello"
127.0.0.1:7001> get key1
"hello"
127.0.0.1:7001>
使用 命令启动cli -c 命令,我么输入一个值 set key1 hello
集群会计算当前的hash值落到哪个 nodes slot上,
上面的提示就是最后的证明。
key1 被分配到了 7001 上,我们去 7004 上看下,是否复制OK了。
[root@hadoop02 bin]# ./redis-cli -p 7004 -c
127.0.0.1:7004> get key1
-> Redirected to slot [9189] located at 127.0.0.1:7001
"hello"
127.0.0.1:7001>
单机版搭建结束。。。
其实还没有实验 故障转移,假设7001 节点挡掉了,会发生什么?
[root@hadoop02 bin]# ./redis-cli -p 7001 -c
Could not connect to Redis at 127.0.0.1:7001: Connection refused
not connected> exit
[root@hadoop02 bin]# ./redis-cli -p 7000 -c
127.0.0.1:7000> set key1 hh
-> Redirected to slot [9189] located at 127.0.0.1:7004
OK
127.0.0.1:7004> cluster nodes
1afc890fccc7416a219bb9299ab1b9b2a01ed17b 127.0.0.1:7005@17005 slave 2e591d755b2b2537554a2b0279541b3c51334c76 0 1575696523080 5 connected
76ca8d83587c9de5fb80f034509a610bc611943d 127.0.0.1:7001@17001 master,fail - 1575696411045 1575696408000 2 disconnected
2e591d755b2b2537554a2b0279541b3c51334c76 127.0.0.1:7002@17002 master - 0 1575696521000 5 connected 10923-16383
32f6998c0f784fca1ba320fd8d019414378a36c5 127.0.0.1:7004@17004 myself,master - 0 1575696522000 6 connected 5462-10922
b1e05f6ced501923e9bbca90e063a2a2cb91ff73 127.0.0.1:7003@17003 slave 1a44c8fc719f20cb4842f52cf0c777830424da6e 0 1575696520000 1 connected
1a44c8fc719f20cb4842f52cf0c777830424da6e 127.0.0.1:7000@17000 master - 0 1575696522070 1 connected 0-5461
127.0.0.1:7004>
我们发现发生了故障转移到了7004 机器上,slot 也一并转移了过去。
如果管理员发现了7001 宕机了,重启了,会发生什么状况?
[root@hadoop02 bin]# ./redis-cli -c -p 7000
127.0.0.1:7000> set key1 h1
-> Redirected to slot [9189] located at 127.0.0.1:7004
OK
127.0.0.1:7004> cluster nodes
1afc890fccc7416a219bb9299ab1b9b2a01ed17b 127.0.0.1:7005@17005 slave 2e591d755b2b2537554a2b0279541b3c51334c76 0 1575696690000 5 connected
76ca8d83587c9de5fb80f034509a610bc611943d 127.0.0.1:7001@17001 slave 32f6998c0f784fca1ba320fd8d019414378a36c5 0 1575696689000 6 connected
2e591d755b2b2537554a2b0279541b3c51334c76 127.0.0.1:7002@17002 master - 0 1575696690576 5 connected 10923-16383
32f6998c0f784fca1ba320fd8d019414378a36c5 127.0.0.1:7004@17004 myself,master - 0 1575696689000 6 connected 5462-10922
b1e05f6ced501923e9bbca90e063a2a2cb91ff73 127.0.0.1:7003@17003 slave 1a44c8fc719f20cb4842f52cf0c777830424da6e 0 1575696691582 1 connected
1a44c8fc719f20cb4842f52cf0c777830424da6e 127.0.0.1:7000@17000 master - 0 1575696689000 1 connected 0-5461
发现重启了7001 ,他是作为备份的机器使用的。
增加机器?
假设我们的三台主机服务不够使用了,怎么增加机器呢。
我们借助ruby trib 进行操作,请看下一次流水笔记。