因服务器资源限制,只是在一台服务器上操作的。Redis版本:redis-6.2.6
Redis安装见:Redis安装篇
1、将redis安装到指定路径下
cd /usr/local/soft/
mkdir redis-cluster
# 安装后,redis-sentinel目录下只有bin文件夹
make PREFIX=/usr/local/soft/redis-cluster/ install
2、复制redis.conf 到不同节点目录下
创建三个文件夹:7000(主节点)、7001(从节点)、7002(从节点)、8000(主节点)、8001(从节点)、8002(从节点)、9000(主节点)、9001(从节点)、9002(从节点);分别在九个文件夹下放置 redis.conf 配置文件。
cd /usr/local/soft/redis-cluster
mkdir 7000
mkdir 7001
mkdir 7002
mkdir 8000
mkdir 8001
mkdir 8002
mkdir 9000
mkdir 9001
mkdir 9002
# 复制配置文件redis.conf
cd /usr/local/soft/redis-6.2.6
cp redis.conf /usr/local/soft/redis-cluster/7000/
cp redis.conf /usr/local/soft/redis-cluster/7001/
cp redis.conf /usr/local/soft/redis-cluster/7002/
cp redis.conf /usr/local/soft/redis-cluster/8000/
cp redis.conf /usr/local/soft/redis-cluster/8001/
cp redis.conf /usr/local/soft/redis-cluster/8002/
cp redis.conf /usr/local/soft/redis-cluster/9000/
cp redis.conf /usr/local/soft/redis-cluster/9001/
cp redis.conf /usr/local/soft/redis-cluster/9002/
3、修改配置文件
各个节点的配置文件大部分都是相同的,区别的配置项为:
- 端口;
- dir 保存路径、logfile文件、pidfile 等其他路径相关;
tcp-backlog 511
# 超时时间,300秒
timeout 300
# TCP连接保活策略,server端300秒向客户端发送一次ACK请求,检测客户端是否存活,0表示不会进行保活检测。
tcp-keepalive 300
# 后台启动,会写一个pid文件到pidfile指定的目录下
daemonize yes
databases 16
# 保存路径
dir /usr/local/soft/redis-cluster/7000/
bind 0.0.0.0
protected-mode yes
port 7000
# 密码
requirepass abc123
pidfile /usr/local/soft/redis-cluster/7000/redis.pid
# 日志打印级别,默认notice。有四大级别:debug\verbose\notice\warning
loglevel notice
# 日志文件位置,若不指定路径,会在启动目录下生成一个redis.log
logfile "/usr/local/soft/redis-cluster/7000/redis.log"
######### 集群模式的配置项 #########
# 主节点的密码,SYSC时需要密码,不然从节点同步时会失败
masterauth abc123
# 是否开启集群模式,默认不开启。
cluster-enabled yes
# 集群配置文件的名称,每个cluster节点都有一个集群相关的配置文件,持久化保存集群的信息。不需要手动配置,由Redis生成并更新.
cluster-config-file nodes.conf
# 集群节点超时时间,节点持续超时的时间超过阀值,才认定该节点出现故障。默认为15000毫秒,即15秒。
cluster-node-timeout 15000
####### 如果是云服务器上部署的redis集群,需要指定公网ip ######
# 云服务器上部署需指定公网ip,否则创建集群时,节点ip可能会是内网ip
cluster-announce-ip 121.37.1.255
# cluster-announce-port
# cluster-announce-tls-port
# Redis总线端口,用于与其它节点通信,若不配置,则为redis端口 + 10000;例如,redis端口为7000,则该节点的集群总线端口为17000
# cluster-announce-bus-port 17000
4、启动服务端
创建启动脚本
cd /usr/local/soft/redis-cluster
touch start-all-server.sh
chmod +x start-all-server.sh
start-all-server.sh 启动文件中的内容为:
./bin/redis-server 7000/redis.conf
./bin/redis-server 7001/redis.conf
./bin/redis-server 7002/redis.conf
./bin/redis-server 8000/redis.conf
./bin/redis-server 8001/redis.conf
./bin/redis-server 8002/redis.conf
./bin/redis-server 9000/redis.conf
./bin/redis-server 9001/redis.conf
./bin/redis-server 9002/redis.conf
启动后,ps -ef|grep redis 查看九个服务是否启动。此时使用redis-cli连接后,是不能使用的,因为虽然启动了集群服务,但是暂时不在一个集群中,服务之间互相发现不了对方。
2018年十月 Redis 发布了稳定的 5.0 版本,推出了非常多的新特性,其中一点是放弃 Ruby的集群方式,改为 使用 C语言编写的 redis-cli 的方式。
所以说现在有两种方式来创建集群:
● 一种是ruby启动方式;
● 另外一个是 C语言的方式。
因为我用的 redis 版本是 6.2.6,如果要用ruby创建集群的方式,还需要安装ruby语言的一些东西,所以这里使用的 redis-cli 的方式创建集群。
介绍 ruby 创建集群的方式
进入到redis源码存放目录redis-6.2.6/src下,执行redis-trib.rb,此脚本是ruby脚本,它依赖ruby环境。
命令为:./redis-trib.rb create --replicas 1 ip:端口1 ip:端口2 …
–replicas 1 表示为每个主节点创建1个子节点。
# 复制源码包下的
cd /usr/local/soft/redis-6.2.6/src
# --replicas 1 表示为每个主节点创建1个子节点
./redis-trib.rb create --replicas 1 121.37.1.255:7000 121.37.1.255:8000 121.37.1.255:9000 121.37.1.255:7001 121.37.1.255:7002 121.37.1.255:8001 121.37.1.255:9001
5、使用 redis-cli 的方式创建集群
5.1、使用命令创建集群
redis-cli 会按照给定的顺序设置主节点和从节点,比如下面121.37.1.255:7000、121.37.1.255:8000、121.37.1.255:9000设置在前,所以会被定为主节点。
# 创建集群命令(无密码时)
# 启动集群命令为:./bin/redis-cli --cluster create ip:port1 ip:port2 ... --cluster-replicas 2
# --cluster-replicas 2 表示每个主节点有两个从节点,如果是三主三从,应该设置1
./bin/redis-cli --cluster create 121.37.1.255:7000 121.37.1.255:8000 121.37.1.255:9000 121.37.1.255:7001 121.37.1.255:7002 121.37.1.255:8001 121.37.1.255:8002 121.37.1.255:9001 121.37.1.255:9002 --cluster-replicas 2
如果加了密码,那么创建集群时就需要加 -a password 参数:
./bin/redis-cli --cluster create 121.37.1.255:7000 121.37.1.255:8000 121.37.1.255:9000 121.37.1.255:7001 121.37.1.255:7002 121.37.1.255:8001 121.37.1.255:8002 121.37.1.255:9001 121.37.1.255:9002 --cluster-replicas 2 -a abc123
输入创建集群的命令后会出现以下提示,注意Can I set the above configuration? (type ‘yes’ to accept): yes,该处请输入yes,不然好像分配不了哈希槽(别人说的,没试过)。
输完yes后,会出现如下提示,[OK] All 16384 slots covered. 说明成功啦。
5.2、集群完整性检查
集群完整性是指所有的槽都分配到存活的redis主节点上,只要16384个槽中有一个槽未被分配,则表示集群不完整。
出现一下信息说明所有槽都分配到节点了。
5.3、可能出现的错误1
如果加了密码,那么创建集群时就需要加-a password参数:
./bin/redis-cli --cluster create 121.37.1.255:7000 121.37.1.255:8000 121.37.1.255:9000 121.37.1.255:7001 121.37.1.255:7002 121.37.1.255:8001 121.37.1.255:8002 121.37.1.255:9001 121.37.1.255:9002 --cluster-replicas 2 -a abc123
5.4、可能出现的错误2
如果一直 Waiting for the cluster to join…,原因可能是:没有开通集群总线端口。
因为 redis集群不仅需要开通redis客户端连接的端口,而且需要开通集群总线端口,集群总线端口号为:redis客户端连接的端口 + 10000。
举例:如果 redis端口为 7000,则集群总线端口为 17000。
所以,所有服务节点都需要开通redis的服务端的端口和集群总线端口。
6、验证
# 连接服务端时,使用 -c 参数表示以集群模式连接
./bin/redis-cli -c -p 7000 -a abc123
# 连接服务端后,查看各节点信息,哈希槽信息。
cluster nodes
cluster slots
cluster info
# 可以在不同的节点使用set/get/del等命令进行测试。
连接后,使用 cluster nodes 展示的各节点信息:
如果连接服务端时,没有使用 -c 参数,会有下面的错误:
7、关闭
创建关闭脚本
cd /usr/local/soft/redis-cluster
touch stop-all-server.sh
chmod +x stop-all-server.sh
stop-all-server.sh 脚本内容为:
./bin/redis-cli -h 127.0.0.1 -p 7000 -a abc123 shutdown
./bin/redis-cli -h 127.0.0.1 -p 7001 -a abc123 shutdown
./bin/redis-cli -h 127.0.0.1 -p 7002 -a abc123 shutdown
./bin/redis-cli -h 127.0.0.1 -p 8000 -a abc123 shutdown
./bin/redis-cli -h 127.0.0.1 -p 8001 -a abc123 shutdown
./bin/redis-cli -h 127.0.0.1 -p 8002 -a abc123 shutdown
./bin/redis-cli -h 127.0.0.1 -p 9000 -a abc123 shutdown
./bin/redis-cli -h 127.0.0.1 -p 9001 -a abc123 shutdown
./bin/redis-cli -h 127.0.0.1 -p 9002 -a abc123 shutdown
8、移除集群模式
创建移除脚本,移除各节点目录下运行中生成的文件,例如:nodes.conf、dump.rdb、redis.log、appendonly.aof、redis.pid。
cd /usr/local/soft/redis-cluster
touch remove-cluster.sh
chmod +x remove-cluster.sh
移除脚本中的内容如下:
rm -rf 7*/nodes.conf 7*/dump.rdb 7*/redis.log 7*/redis.pid 7*/appendonly.aof 8*/nodes.conf 8*/dump.rdb 8*/redis.log 8*/redis.pid 8*/appendonly.aof 9*/nodes.conf 9*/dump.rdb 9*/redis.log 9*/redis.pid 9*/appendonly.aof
到此,Redis集群已经搭建完毕,有错误之处,还请指出,共同学习。