集群搭建
本机IP 192.168.1.149
分别采用映射 192.168.1.149 的6379 6380 6381 三个端口模拟三台服务器。搭建三主无从的集群。由于单机的内存限制,请部署于三台服务器。
我这里在单机 启动三个容器模拟三台节点,首先可以在本机上创建三份redis.conf配置文件,我这里放在/opt/redis/conf/中分别命名为redis1.conf, redis2.conf, redis3.conf
mkdir /opt/redis/conf/
vim /opt/redis/conf/redis1.conf
vim /opt/redis/conf/redis2.conf
vim /opt/redis/conf/redis3.conf
记得修改cluster-announce-ip ,cluster-announce-port ,cluster-announce-bus-port 为宿主机信息
redis1.conf 内容
# redis进程的端口号
port 6379
# 绑定的主机地址
bind 0.0.0.0
#开启集群
cluster-enabled yes
#由于集群通信端口默认为服务端口号6379+10000,即16379 可以无需修改。
cluster-port 16379
#!!!对外暴露的ip,在docker默认桥接网络模式,容器中IP无法被外部直接访问,则需要对外暴露的宿主机IP
cluster-announce-ip 192.168.1.149
#!!!对外暴露的服务端口号 用于docker映射后外部访问 ,这里分别 改为 6379 6380 6381
cluster-announce-port 6379
#对外暴露的端口号,用在docker映射端口时或客户端访问,实际映射到16379商品。
#!!!单机部署时,这里尤其重要,由于同一台机子用个映射三个端口用以代表三个节点,这里需要分别改为 16379 16380 16381
cluster-announce-bus-port 16379
# 当为集群模式 将无法配置多数据库,默认为0,这里可以不配置
# databases 0
#是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问。要是开启了密码和bind,可以开启。否则最好关闭设置为no。
protected-mode no
# redis进程是否以守护进程的方式运行,yes为是,no为否(不以守护进程的方式运行会占用一个终端)。
daemonize no
redis2.conf 内容
# redis进程的端口号
port 6379
# 绑定的主机地址
bind 0.0.0.0
#开启集群
cluster-enabled yes
#由于集群通信端口默认为服务端口号6379+10000,即16379 可以无需修改。
cluster-port 16379
#!!!对外暴露的ip,在docker默认桥接网络模式,容器中IP无法被外部直接访问,则需要对外暴露的宿主机IP
cluster-announce-ip 192.168.1.149
#!!!对外暴露的服务端口号 用于docker映射后外部访问 ,这里分别 改为 6379 6380 6381
cluster-announce-port 6380
#对外暴露的端口号,用在docker映射端口时或客户端访问,实际映射到16379商品。
#!!!单机部署时,这里尤其重要,由于同一台机子用个映射三个端口用以代表三个节点,这里需要分别改为 16379 16380 16381
cluster-announce-bus-port 16380
# 当为集群模式 将无法配置多数据库,默认为0,这里可以不配置
# databases 0
#是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问。要是开启了密码和bind,可以开启。否则最好关闭设置为no。
protected-mode no
# redis进程是否以守护进程的方式运行,yes为是,no为否(不以守护进程的方式运行会占用一个终端)。
daemonize no
redis3.conf 内容
# redis进程的端口号
port 6379
# 绑定的主机地址
bind 0.0.0.0
#开启集群
cluster-enabled yes
#由于集群通信端口默认为服务端口号6379+10000,即16379 可以无需修改。
cluster-port 16379
#!!!对外暴露的ip,在docker默认桥接网络模式,容器中IP无法被外部直接访问,则需要对外暴露的宿主机IP
cluster-announce-ip 192.168.1.149
#!!!对外暴露的服务端口号 用于docker映射后外部访问 ,这里分别 改为 6379 6380 6381
cluster-announce-port 6381
#对外暴露的端口号,用在docker映射端口时或客户端访问,实际映射到16379商品。
#!!!单机部署时,这里尤其重要,由于同一台机子用个映射三个端口用以代表三个节点,这里需要分别改为 16379 16380 16381
cluster-announce-bus-port 16381
# 当为集群模式 将无法配置多数据库,默认为0,这里可以不配置
# databases 0
#是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问。要是开启了密码和bind,可以开启。否则最好关闭设置为no。
protected-mode no
# redis进程是否以守护进程的方式运行,yes为是,no为否(不以守护进程的方式运行会占用一个终端)。
daemonize no
启动容器
#第一台
docker run --name redis1 -p 6379:6379 -p 16379:16379 --volume=/opt/redis/conf/redis1.conf:/etc/redis.conf -d redis:7 redis-server /etc/redis.conf
#第二台
docker run --name redis2 -p 6380:6379 -p 16380:16379--volume=/opt/redis/conf/redis2.conf:/etc/redis.conf -d redis:7 redis-server /etc/redis.conf
#第三台
docker run --name redis3 -p 6381:6379 -p 16381:16379--volume=/opt/redis/conf/redis3.conf:/etc/redis.conf -d redis:7 redis-server /etc/redis.conf
进入其中一个容器,下面命令创建一个集群,正常情况等待其它节点建立连接。。
并确认采用是否默认分配槽配置,输入 yes 回车,部署完成
docker exec -it redis1 bash
#执行下列命令,分配HASH槽
#--cluster-replicas 0 表示没有从节点,如果有每主配一台从节点,则需要6台节点。
redis-cli --cluster create 192.168.1.149:6379 192.168.1.149:6380 192.168.1.149:6381 --cluster-replicas 0
当各节点都分配完成,测试一下集群效果,进入任何一个容器节点
docker exec -it redis2 bash
#进入客户端操作 ,设置多个值 ,OK,成功
redis-cli
#查看节点信息
CLUSTER NODES
完成。
其它失败可能如下
- 集群至少3个节点,如果配置3主3从 即每个主有一个副本则 --cluster-replicas 1,节点不够则会报错
*** ERROR: Invalid configuration for cluster creation.
*** Redis Cluster requires at least 3 master nodes.
*** This is not possible with 3 nodes and 1 replicas per node.
*** At least 6 nodes are required.
2.未自动完成建立连接,通常是未开放集群通信端口号16379或未正确映射,检查一下redis.conf配置文件,如果都正常,可能需要手动进行其它两台节点容器,采用CLUSTER MEET 命令与刚才的节点建立连接
#进入容器2
docker exec -it redis2 bash
#进入客户端
redis-cli
#连接到之前的节点
CLUSTER MEET 192.168.1.149 6379
exit
#同样进入容器3
docker exec -it redis3 bash
#进入客户端
redis-cli
#连接到之前的节点
CLUSTER MEET 192.168.1.149 6379
exit
个别异常
提示 Warning: 1 node(s) may be unreachable
The port 16379 of node 192.168.1.149 may be unreachable from:
192.168.1.149:6381
Cluster bus ports must be reachable by every node.
Remember that cluster bus ports are different from standard instance ports.
容器需要开放集群通信16379端口号,即6379+10000,在redis.conf配置中修改为其它如 cluster-port 16380
某些情况下,还需重新分配hash槽,在节点中重新分配一下,执行下列命令,会提示节点未覆盖所有槽位,是否修复,输入yes
[ERR] Not all 16384 slots are covered by nodes.
./redis-cli --cluster fix 192.168.1.149:6379
./redis-cli --cluster fix 192.168.1.149:6380 #类似
./redis-cli --cluster fix 192.168.1.149:6381 #类似