centos7.6 docker 安装 redis-cluster

1. 下载镜像

docker pull redis:5.0

2. 编写配置文件

分别在 192.168.80.200192.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"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值