redis集群搭建(基于redis5.0+)

一、前戏

1.1 下载软件

去官网下载软件: https://redis.io/download,笔者使用的是5.0.12,理由就是本人公司使用的也是这个版本。
redis集群搭建(基于redis5.0+)_第1张图片

1.2 物理机配置

本人搭建的是 3主3从。使用3台虚拟机,保证主从分配不在一台机器上,避免某台机器挂掉而影响整个集群的运行。

物理配置:
1. 192.168.37.133:6370  
2. 192.168.37.133:6380

3. 192.168.37.130:6370
4. 192.168.37.130:6380

5. 192.168.37.131:6370  
6. 192.168.37.131:6380

二、安装redis

2.1 安装核心步骤

这里只记录关键指令,读者执行动手尝试,指令都是本人操作过程中使用的指令,保证其正确性和顺序性。

// 解压刚下载的文件,文件自行上传至物理机上,不会的可以使用FileZilla Client,再不会就扇自己嘴巴子
[root@localhost ~]# tar -zxvf redis-5.0.12.tar.gz
// 切换到解压目录
[root@localhost ]# cd redis-5.0.12
// 编译,如如编译问题,可以自行安装一些以来的软件,比如 gcc等
[root@localhost redis-5.0.12]# make
// 切换目录
[root@localhost redis-5.0.12]# cd src/
// 编译 安装,这步运行成功,整个redis就安装成功了
[root@localhost src]# make install
// 复制核心文件到自己心仪的目录下
[root@localhost src]# cp  mkreleasehdr.sh redis-benchmark redis-check-aof redis-cli redis-server /home/redis-cluster/redis6370/
// 复制核心文件到自己心仪的目录下
[root@localhost src]# cp  mkreleasehdr.sh redis-benchmark redis-check-aof redis-cli redis-server /home/redis-cluster/redis6380/

最后一步复制出来的文件未核心文件,每台机器按照物理机设计的那样,复制两份。笔者以其中一台机器为例,如下:

[root@localhost redis-cluster]# ll
drwxr-xr-x. 2 root root 130 6月  26 12:29 redis6370
drwxr-xr-x. 2 root root 130 6月  26 12:29 redis6380
-rwxr-xr-x. 1 root root 917 6月  26 12:48 run.sh
[root@localhost redis-cluster]# pwd
/home/redis-cluster

如上,还多余了一份 run.sh ,没错,为了启动方便,下面看下其脚本。

2.2 启动脚本

#!/bin/bash
if [[  -n "$1" ]] ; then
        action=$1
fi
# 启动服务
start(){
        echo "welcome,coder!"
        ./redis6370/redis-server ./redis6370/redis.conf
        echo "redis is running on 6370"
        ./redis6380/redis-server ./redis6380/redis.conf
        echo "redis is running on 6380"
        service iptables restart
        echo "redis is running..."
}
# 停止服务
stop(){
    ./redis6370/redis-cli -a  "123456" -p 6370 shutdown 
    echo "redis is shutdown on 6370"
    ./redis6380/redis-cli -a  "123456" -p 6380 shutdown 
    echo "redis is shutdown on 6380"
    echo "goodbye!"
}


case "$action" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        sleep 1s
        echo "............." 
        sleep 1s
        echo "............." 
        start
        ;;
    *)
        echo "Please use start|stop|restart as first argument"
        ;;
esac

其中,"123456"为redis密码。

三、redis集群实现

3.1 redis.conf配置项

本着最少配置的原则,列出如下配置,其它的可以保持默认。

# redis参数:
port 6370
protected-mode no
# bind 127.0.0.1    # 去掉,表示所有客户端都可以链接
dir ./				# 数据文件的路径
daemonize yes
requirepass 123456
appendonly yes
pidfile /var/run/redis_6370.pid


# 集群参数:
cluster-enabled yes
cluster-config-file node-6370.conf     # redis自动维护
cluster-node-timeout 5000				# 集群超时
masterauth  123456				# 集群密码

其中,portpidfilecluster-config-file 由于每台机器有两个redis,所以此处要修改成不同的端口,按照上面物理机设计的来就行了。

3.2 执行脚本

先要保证,所有的三台上的机器redis 都启动完成了。

// 先要保证,所有的三台上的机器redis都启动完成了。
[root@localhost redis6370]# ps -ef | grep redis
root      13220      1  0 12:50 ?        00:00:18 ./redis6370/redis-server *:6370 [cluster]
root      13225      1  0 12:50 ?        00:00:18 ./redis6380/redis-server *:6380 [cluster]

// 创建集群, --cluster-replicas 1 :表示1主1从。
[root@localhost redis6370]# ./redis-cli --cluster create 192.168.37.133:6370 192.168.37.130:6380 192.168.37.130:6370 192.168.37.131:6380 192.168.37.131:6370 192.168.37.133:6380 --cluster-replicas 1
[ERR] Node 192.168.37.133:6370 NOAUTH Authentication required.

// 因为我们设置了masterauth参数,所以要使用带密码创建集群
[root@localhost redis6370]# ./redis-cli -a 123456 --cluster create 192.168.37.133:6370 192.168.37.130:6380 192.168.37.130:6370 192.168.37.131:6380 192.168.37.131:6370 192.168.37.133:6380 --cluster-replicas 1
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.37.130:6370 to 192.168.37.133:6370
Adding replica 192.168.37.131:6370 to 192.168.37.130:6380
Adding replica 192.168.37.133:6380 to 192.168.37.131:6380
M: 353de564f1d2d3c1ff43d784d2c1e39afeb69106 192.168.37.133:6370
   slots:[0-5460] (5461 slots) master
M: 5719c8542dc4b6ebf7c46c48ff16a805cfaf620a 192.168.37.130:6380
   slots:[5461-10922] (5462 slots) master
S: 818c6f50d8c201885403112ad0b15bac8df82019 192.168.37.130:6370
   replicates 353de564f1d2d3c1ff43d784d2c1e39afeb69106
M: be4f9cb19bf3b71d00509702a7b2ac01a264e579 192.168.37.131:6380
   slots:[10923-16383] (5461 slots) master
S: ad6b9f169aabc806b091cbeac38faecee51a5513 192.168.37.131:6370
   replicates 5719c8542dc4b6ebf7c46c48ff16a805cfaf620a
S: 8567395f6efbc2757e99f0027addcadf1534eafa 192.168.37.133:6380
   replicates be4f9cb19bf3b71d00509702a7b2ac01a264e579
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.........................................................................................................................................................................................................................................................................................................................................................................................................................................
>>> Performing Cluster Check (using node 192.168.37.133:6370)
M: 353de564f1d2d3c1ff43d784d2c1e39afeb69106 192.168.37.133:6370
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: ad6b9f169aabc806b091cbeac38faecee51a5513 192.168.37.131:6370
   slots: (0 slots) slave
   replicates 5719c8542dc4b6ebf7c46c48ff16a805cfaf620a
M: be4f9cb19bf3b71d00509702a7b2ac01a264e579 192.168.37.131:6380
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 5719c8542dc4b6ebf7c46c48ff16a805cfaf620a 192.168.37.130:6380
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 8567395f6efbc2757e99f0027addcadf1534eafa 192.168.37.133:6380
   slots: (0 slots) slave
   replicates be4f9cb19bf3b71d00509702a7b2ac01a264e579
S: 818c6f50d8c201885403112ad0b15bac8df82019 192.168.37.130:6370
   slots: (0 slots) slave
   replicates 353de564f1d2d3c1ff43d784d2c1e39afeb69106
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@localhost redis6370]# 

到这,集群就基本上创建完成了。

3.3 必要查看命令

链接 其中一台redis机器,执行以下命令。

3.3.1 cluster info

// 查看集群信息,可以查看集群状态等关键信息
37.130:6380(jenkins):0>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:6
cluster_my_epoch:2
cluster_stats_messages_ping_sent:1159
cluster_stats_messages_pong_sent:1162
cluster_stats_messages_meet_sent:5
cluster_stats_messages_sent:2326
cluster_stats_messages_ping_received:1162
cluster_stats_messages_pong_received:1135
cluster_stats_messages_received:2297
"

3.3.2 cluster nodes

可以查看 16384 slot都分配到那个主节点上了。

// 集群节点详细信息
37.130:6380(jenkins):0>cluster nodes
"5719c8542dc4b6ebf7c46c48ff16a805cfaf620a 192.168.37.130:6380@16380 myself,master - 0 1624700563000 2 connected 5461-10922
ad6b9f169aabc806b091cbeac38faecee51a5513 192.168.37.131:6370@16370 slave 5719c8542dc4b6ebf7c46c48ff16a805cfaf620a 0 1624700564000 5 connected
8567395f6efbc2757e99f0027addcadf1534eafa 192.168.37.133:6380@16380 slave be4f9cb19bf3b71d00509702a7b2ac01a264e579 0 1624700563517 6 connected
818c6f50d8c201885403112ad0b15bac8df82019 192.168.37.130:6370@16370 slave 353de564f1d2d3c1ff43d784d2c1e39afeb69106 0 1624700563000 3 connected
be4f9cb19bf3b71d00509702a7b2ac01a264e579 192.168.37.131:6380@16380 master - 0 1624700563000 4 connected 10923-16383
353de564f1d2d3c1ff43d784d2c1e39afeb69106 192.168.37.133:6370@16370 master - 0 1624700564952 1 connected 0-5460
"

3.3.3 cluster slots

37.130:6380(jenkins):0>cluster slots
 1)    
 	1)   "5461" 				// slot 起点
  	2)   "10922"				// slot 终点
  	3)      
  		1)    "192.168.37.130"		// master 节点ip
   		2)    "6380"				// master 节点端口
   		3)    "5719c8542dc4b6ebf7c46c48ff16a805cfaf620a"  // master 节点 hash

  	4)      
  		1)    "192.168.37.131"		// slave 节点ip
  		2)    "6370"				// slave 节点端口
   		3)    "ad6b9f169aabc806b091cbeac38faecee51a5513"	// slave 节点 hash


 2)    
 	1)   "10923"
 	2)   "16383"
  	3)      
  		1)    "192.168.37.131"
   		2)    "6380"
   		3)    "be4f9cb19bf3b71d00509702a7b2ac01a264e579"

  	4)      
  		1)    "192.168.37.133"
   		2)    "6380"
   		3)    "8567395f6efbc2757e99f0027addcadf1534eafa"


 3)    
 	1)   "0"
  	2)   "5460"
  	3)      
  		1)    "192.168.37.133"
   		2)    "6370"
   		3)    "353de564f1d2d3c1ff43d784d2c1e39afeb69106"

  	4)      
  		1)    "192.168.37.130"
   		2)    "6370"
   		3)    "818c6f50d8c201885403112ad0b15bac8df82019"

四、可能遇到的问题

4.1 [ERR] Node 192.168.37.133:6370 NOAUTH Authentication required.

// 因为设置了masterauth密码,所以加上密码参数 -a 123456

./redis-cli -a 123456 --cluster create 192.168.37.133:6370 192.168.37.130:6380 192.168.37.130:6370 192.168.37.131:6380 192.168.37.131:6370 192.168.37.133:6380 --cluster-replicas 1

4.2 Sending CLUSTER MEET messages to join the cluster

可能会报这个错误:>>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join ,然后一直卡在这里进行不下去了。

解决办法就是链接每一个redis的客户端,向执行安装集群的命令客户端发送如下命令:

//  192.168.37.131 为 执行安装集群的机器
CLUSTER MEET 192.168.37.131 6370

如果还是卡住进行不下去,可能是端口没有开启,启动如下端口:

// 开启端口,在这其之前 要注意防火墙是否开启 ,如果没有设置firewall,可以不进行开启端口的操作
#systemctl status firewalld
firewall-cmd --zone=public --add-port=16370/tcp --permanent
firewall-cmd --zone=public --add-port=16380/tcp --permanent
firewall-cmd --zone=public --add-port=6370/tcp --permanent
firewall-cmd --zone=public --add-port=6380/tcp --permanent
firewall-cmd --reload

注意,此处使用的端口是63706380
那么按照官网解释,在开启6370和6380的同时,redis同时会开启1637016380端口供集群选举通信使用(CLUSTER MEET),即使用端口的大小加上10000(端口是XXXX,那么通信窗口是1XXXX)。

ps: 想直接使用笔者 REDIS 配置的,请移步 https://download.csdn.net/download/She_lock/19846584 直接下载。包含以下文件,可直接使用:

├── redis6370
│   ├── mkreleasehdr.sh
│   ├── redis-benchmark
│   ├── redis-check-aof
│   ├── redis-cli
│   ├── redis.conf
│   └── redis-server
├── redis6380
│   ├── mkreleasehdr.sh
│   ├── redis-benchmark
│   ├── redis-check-aof
│   ├── redis-cli
│   ├── redis.conf
│   └── redis-server
└── run.sh

你可能感兴趣的:(redis,redis5.0集群,redis集群常见错误,redis启动脚本,redis集群最简配置)