redis 流水笔记 八 集群搭建

? 集群搭建的概念

 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 进行操作,请看下一次流水笔记。

发布了61 篇原创文章 · 获赞 1 · 访问量 668

猜你喜欢

转载自blog.csdn.net/u012842247/article/details/103433923