redis集群的原生命令搭建

背景知识:

  1. 生产环境中集群的搭建一般不会使用原生命令,而是使用redis官方提供的ruby工具
  2. 原生命令的安装只是帮助你更好的理解redis集群这个架构
  3. 一般集群都是搭建在不同的主机上,案例为了演示就直接在单机上部署,用端口区分
  4. 本篇文章的测试环境是阿里云主机CentOS Linux release 7.3.1611

1.配置开启redis(其实和开启普通redis节点一样,只是多增加了几个配置项),主要的配置如下:

在本案例中主要设置如下几个配置向即可

port 设置端口 
daemonize  设置是否以守护进程开启
dir  设置目录,例如日志,rdb文件等等
dbfilename  设置rdb文件名
logfile   设置日志文件名
cluster-enabled yes  是否开启集群模式
cluster-config-file  集群节点的单独配置
cluster-node-timeout  超时时间,有很多用处,例如ping的有效时间,一般默认配置即可
cluster-require-full-coverage 用来设置什么情况下集群可以对外提供服务,yes表示只有集群节点
都正常才提供对外服务,一般生产环境设置为no


本案例计划开启6个节点,端口分别是7000,7001,7002,7003,7004,7005,其中前三个端口为master节点,后三个端口为slave节点

例如7000的端口配置设置如下:

port 7000
daemonize yes
dir /root/redis/data/
logfile "7000.log"
cluster-enabled yes
cluster-config-file node-7000.conf
cluster-node-timeout 15000
cluster-require-full-coverage no                      

同理其他几个端口只需要将7000换成对应的端口即可,注意配置文件用端口号区分,例如7000端口的配置文件为redis-7000.conf。这里介绍一种偷懒的方式,使用linux的sed命令:

sed 's/7000/7001/g' redis-7000.conf > redis-7001.conf

2.配置好配置文件之后,依次使用 “redis-server + 配置文件” 的方式开启:

3.这时如果你执行如下命令,会发现节点不可用:

[root@iZwz99qee7e1l6w7mibgirZ config]# 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:1
cluster_size:0
cluster_current_epoch:0
cluster_my_epoch:0
cluster_stats_messages_sent:0
cluster_stats_messages_received:0

4.接下来我们要进行节点之间的握手,使用如下命令:

redis-cli -h 127.0.0.1 -p 7000  cluster meet 127.0.0.1 7001

连接7000端口的服务器,按照上述方式依次对7001-7005的端口进行握手

5.通过以上步骤,各个节点之间都互相“认识了”,可能有小伙伴会有疑惑,你要是说7000端口和其他端口都“认识了”这很好理解毕竟是拿着7000端口去握手的,但是其他端口之间为什么也会“认识”?这就要归功于meet命令使用的是gossip协议。可以通过如下命令验证节点之间是否已经“认识”:

6.至此如果你连接其中一台服务器,并试图写入数据会发现还是不行,这时因为我们的槽点还没有分配:

7.redis总共有16384个槽点,并且只有主节点需要分配槽点,这里我们使用的是三主三从,因此将槽点均分为三等分,分别是:

0--5460,5461--10922,10923--16383。首先我们编写执行分配槽点的shell脚本:

start=$1
end=$2
port=$3

for slot in `seq ${start} ${end}`
do
        echo "slot:${slot}"
        redis-cli -h 127.0.0.1 -p ${port} cluster addslots ${slot}
done

然后依次执行如下命令分配槽点:

sh addslots.sh 0 5460 7000
sh addslots.sh 5461 10922 7001
sh addslots.sh 10923 16383 7002

8.上述步骤完成之后,我们的槽点就已经全部分配好了,可以使用如下命令查看:

9.这时候我们连接其中一个服务器之后就可以写入数据了:

上面的报错并不是因为集群节点不可写,而是name这个键算出来的槽点是5798,而7000端口的槽点范围是0--5460,超出了范围,因此redis报错,让你去7001端口的节点上执行 set name weixin。如果嫌这样子麻烦,可以在连接服务器的使用加上-c参数,那么redis服务器会自动进行跳转:

10.接下来我们配置主从关系,使用如下命令:

redis-cli -h 127.0.0.1 -p 7003 cluster replicate nodeid

注意nodeid和runid的区别,nodeid重启之后也是不会改变的,但是runid一般重启之后就会改变。那么如果获取nodeid呢,执行如下命令:

redis-cli -p 7000 cluster nodes

知道了nodeid之后,我们设置主从关系,首先要明确主从关系:7000是主节点对应的从节点是7003,7001是主节点对应的从节点是7004,7002是主节点对应的从节点是7005(设置了槽点的是主节点):

11.以上就是redis集群环境原生命令的搭建过程,主要分为如下几步:

  1. 设置相应的集群配置并开启节点
  2. 节点直接握手,使用cluster meet命令(只需要一个端口遍历握手一次即可)
  3. 分配槽点,使用cluster addslots命令(只给主节点分配)
  4. 设置主从关系,使用cluster replicate

猜你喜欢

转载自blog.csdn.net/wx145/article/details/82748406