1. 下载镜像
docker pull redis:5.0
2. 编写配置文件
分别在 192.168.80.200
和 192.168.80.201
两台机器上执行下列操作
# 创建目录
mkdir -p /usr/local/docker-redis/redis-cluster
# 切换至指定目录
cd /usr/local/docker-redis/redis-cluster/
# 编写 redis-cluster.tmpl 文件
vi redis-cluster.tmpl
192.68.80.200
机器的 redis-cluster.tmpl 配置文件如下
#节点端口
port ${PORT}
#添加访问认证
requirepass 1234
#如果主节点开启了访问认证,从节点访问主节点需要认证
masterauth 1234
#保护模式,默认值 yes,即开启。开启保护模式以后,需配置 bind ip 或者设置访问密码;关闭保护模式,外部网络可以直接访问
protected-mode no
#是否以守护线程的方式启动(后台启动),默认 no (docker环境下 改成yes后一直处于restarting状态)
daemonize no
#是否开启 AOF 持久化模式,默认 no
appendonly yes
#是否开启集群模式,默认 no
cluster-enabled yes
#集群节点信息文件
cluster-config-file nodes-${PORT}.conf
#集群节点连接超时时间
cluster-node-timeout 15000
#集群节点 IP,填写宿主机的 IP
cluster-announce-ip 192.168.80.200
#集群节点映射端口
cluster-announce-port ${PORT}
#集群节点总线端口
cluster-announce-bus-port 1${PORT}
192.68.80.201
机器的 redis-cluster.tmpl 配置文件如下
port ${PORT}
requirepass 1234
masterauth 1234
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes-${PORT}.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.80.201
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
每个 Redis 集群节点都需要打开两个 TCP 连接。一个用于为客户端提供服务的正常 Redis TCP 端口,例如 6379。还有一个基于 6379 端口加 10000 的端口,比如 16379。
第二个端口用于集群总线,这是一个使用二进制协议的节点到节点通信通道。节点使用集群总线进行故障检测、配置更新、故障转移授权等等。客户端永远不要尝试与集群总线端口通信,与正常的 Redis 命令端口通信即可,但是请确保防火墙中的这两个端口都已经打开,否则 Redis 集群节点将无法通信。
3. 创建各个节点的配置文件及目录
在 192.68.80.200
机器的 redis-cluster
目录下执行以下命令
for port in `seq 6371 6373`; do \
mkdir -p ${port}/conf \
&& PORT=${port} envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf \
&& mkdir -p ${port}/data;\
done
在 192.68.80.201
机器的 redis-cluster
目录下执行以下命令
for port in `seq 6374 6376`; do \
mkdir -p ${port}/conf \
&& PORT=${port} envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf \
&& mkdir -p ${port}/data;\
done
查看创建后的路径,tree命令(如果未下载,可以先安装 yum install -y tree
)
[root@localhost redis-cluster]# tree
.
├── 6374
│ ├── conf
│ │ └── redis.conf
│ └── data
│ ├── appendonly.aof
│ ├── dump.rdb
│ └── nodes-6374.conf
├── 6375
│ ├── conf
│ │ └── redis.conf
│ └── data
│ ├── appendonly.aof
│ ├── dump.rdb
│ └── nodes-6375.conf
├── 6376
│ ├── conf
│ │ └── redis.conf
│ └── data
│ ├── appendonly.aof
│ ├── dump.rdb
│ └── nodes-6376.conf
└── redis-cluster.tmpl
4. 创建redis容器
将宿主机的 6371 ~ 6376
之间的端口与 6 个 Redis 容器映射,并将宿主机的目录与容器内的目录进行映射(目录挂载)。记得指定网络模式,使用 host
网络模式
在 192.68.80.200
机器执行以下命令:
for port in $(seq 6371 6373); do \
docker run -d -it --restart always --name redis-${port} --net host \
-v /usr/local/docker-redis/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /usr/local/docker-redis/redis-cluster/${port}/data:/data \
redis:5.0 redis-server /usr/local/etc/redis/redis.conf; \
done
在 192.68.80.201
机器执行以下命令:
for port in $(seq 6374 6376); do \
docker run -d -it --restart always --name redis-${port} --net host \
-v /usr/local/docker-redis/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /usr/local/docker-redis/redis-cluster/${port}/data:/data \
redis:5.0 redis-server /usr/local/etc/redis/redis.conf; \
done
5. 创建 Redis Cluster 集群
随便进入一个容器节点,并进入 /usr/local/bin/
目录
# 进入容器
docker exec -it redis-6371 bash
# 切换至指定目录
cd /usr/local/bin/
接下来我们就可以通过以下命令实现 Redis Cluster 集群的创建
redis-cli -a 1234 --cluster create 192.168.80.200:6371 192.168.80.200:6372 192.168.80.200:6373 192.168.80.201:6374 192.168.80.201:6375 192.168.80.201:6376 --cluster-replicas 1
#--cluster-replicas 1 1主1从
#--cluster-replicas 2 1主2从
#-a 1234 redis连接密码
出现选择提示信息,输入 yes
以下是创建集群时返回的详细信息:
root@localhost:/usr/local/bin# redis-cli -a 1234 --cluster create 192.168.80.200:6371 192.168.80.200:6372 192.168.80.200:6373 192.168.80.201:6374 192.168.80.201:6375 192.168.80.201:6376 --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.80.201:6376 to 192.168.80.200:6371
Adding replica 192.168.80.200:6373 to 192.168.80.201:6374
Adding replica 192.168.80.201:6375 to 192.168.80.200:6372
M: 906fca3f8a8499add69a4f386cd09da6c97ea384 192.168.80.200:6371
slots:[0-5460] (5461 slots) master
M: b9f93bc74a97cf44e2fec0df02f1bfd8c78aaad0 192.168.80.200:6372
slots:[10923-16383] (5461 slots) master
S: a3dda50da71381e70ef71461fce1367864830ef9 192.168.80.200:6373
replicates 939e0b104ec0efe5bf740ea2338f25ccfbc0d31e
M: 939e0b104ec0efe5bf740ea2338f25ccfbc0d31e 192.168.80.201:6374
slots:[5461-10922] (5462 slots) master
S: fbd6a91f9ebbb93e3a2d97a174c55502b67a19cd 192.168.80.201:6375
replicates b9f93bc74a97cf44e2fec0df02f1bfd8c78aaad0
S: 4e796b227d4177a6098946ec6bf54f5db69bbf56 192.168.80.201:6376
replicates 906fca3f8a8499add69a4f386cd09da6c97ea384
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.80.200:6371)
M: bd505be5aabb29eb4e3408ebc2342169357120bf 192.168.80.200:6371
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: cf5d1ffd171af024c753bba22f45276d5759ef87 192.168.80.201:6375
slots: (0 slots) slave
replicates 23efbbacae544bd49aa391b5725cc5aaa8da7cfd
S: c2787f3ed5bf2304c6ec0d263004fc81b0ec6e47 192.168.80.201:6376
slots: (0 slots) slave
replicates bd505be5aabb29eb4e3408ebc2342169357120bf
M: 36b1e51f54365779696f9b783353b567df89fa48 192.168.80.201:6374
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: f14ed907c981dc33fe1d928e23dbb476b035b0d7 192.168.80.200:6373
slots: (0 slots) slave
replicates 36b1e51f54365779696f9b783353b567df89fa48
M: 23efbbacae544bd49aa391b5725cc5aaa8da7cfd 192.168.80.200:6372
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
6. 删除redis实例
192.168.80.200
docker stop redis-6371 redis-6372 redis-6373
docker rm redis-6371 redis-6372 redis-6373
rm -rf 637*
192.168.80.201
docker stop redis-6374 redis-6375 redis-6376
docker rm redis-6374 redis-6375 redis-6376
rm -rf 637*
7. 验证是否配置成功
连接客户端
# 随便进入一个容器
docker exec -it redis-6371 bash
# 切换至指定目录
cd /usr/local/bin/
#可以直接连接指定ip和端口的客户端 记得一定要加 -c 连接客户端开启集群模式,否则会出现 (error) MOVED
redis-cli -c -h 192.168.80.200 -p 6372 -a 1234
查看节点信息
192.168.80.200:6372> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.80.201,port=6375,state=online,offset=2099,lag=1
master_replid:8e6208a247c88d575d84737fbbcbec20d360c49f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2099
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2099
设置一个key,观察从节点是否同步数据成功
192.168.80.200:6372> set k1 hello
OK
192.168.80.201:6375> get k1
-> Redirected to slot [12706] located at 192.168.80.200:6372
"hello"