7. Docker安装Redis,搭建集群,配置主从复制,主从扩容缩容

此文档内容太长,如果想一步一步搭建集群就按着步骤来,如果需要一部分内容可以点击目录进行跳转。

目录

1. 下载镜像

2. 配置并启动Redis

2.1 创建配置文件

2.2 启动redis

3. 配置redis集群

3.1 开启并创建redis

3.2 开启集群

3.3 读写错误

3.4 主从容错

3.5 主从扩容

3.6 主从缩容

1. 下载镜像

使用docker pull 拉去镜像到本地(有redis镜像的可以忽略这一步)

docker pull redis

2. 配置并启动Redis

2.1 创建配置文件

首先在宿主机创建存储redis配置文件,建议直接从其他的redis安装目录下复制一份

# 宿主机上新建存储redis的目录
mkdir -p /usr/local/redis-1

# 从其他redis安装目录复制一份redis.conf 到该目录下
cp /usr/loca/redis/redis.conf /usr/local/redis-1

# 按要求修改redis.conf,以下列出的是我认为有必要改的
# 修改127.0.0.1 为 0.0.0.0,不修改的话外部主机是无法访问到的
bind 0.0.0.0 
# 修改daemonze为no,如果不改的话可能会与docker的-d命令冲突
daemonze no
# 保护模式,有时候开启会导致外部主机无法连接到redis
protected-mode no

2.2 启动redis

docker run -d --name redis -p 6379:6379 --privileged=true \
-v /usr/local/redis-1/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis-1/data:/data \
redis \
redis-server /etc/redis/redis.conf

启动命令详解:

docker run:创建并运行docker容器

--name redis:指定容器名字

-p 6379:6379:指定端口映射 宿主机端口:容器内端口

--privilegted=true:获取宿主机root用户权限

-v /usr/local/redis-1/redis.conf:/etc/redis/redis.conf:指定容器卷

redis-server:指定配置文件,路径是容器的路径

现在就可以使用redis啦。

3. 配置redis集群

在配置集群之前,请先了解一下分布式存储的哈希槽算法,然后再回来看会轻松很多,当然直接按着教程来也是没有问题的。

需求:需要配置4主4从的redis集群,共需要8个redis容器,分别设置容器名称为node1-node8,端口依次为6381-6388。

3.1 开启并创建redis

创建目录来存储集群的数据。

# 创建存储redis集群相关的目录
mkdir -p /usr/local/redis-cluster

# 进入到redis-cluster目录,分别创建node1-node8的目录,分别存储各个redis容器的数据
cd /usr/local/redis-cluster
mkdir data
cd data 
mkdir node1
mkdir node2
mkdir node3
mkdir node4
mkdir node5
mkdir node6
mkdir node7
mkdir node8

cd ../

接下来就是一个一个的启动集群了,请看命令(命令详解请看第2.2步,部分命令解释在代码下面):

# 启动node1
docker run -d --name redis-node1 --net host --privileged=true -v /usr/local/redis-cluster/data/node1:/data redis --cluster-enabled yes --annpendonly yes --port 6381

# 启动node2
docker run -d --name redis-node2 --net host --privileged=true -v /usr/local/redis-cluster/data/node2:/data redis --cluster-enabled yes --annpendonly yes --port 6382

# 启动node3
docker run -d --name redis-node3 --net host --privileged=true -v /usr/local/redis-cluster/data/node3:/data redis --cluster-enabled yes --annpendonly yes --port 6383

# 启动node4
docker run -d --name redis-node4 --net host --privileged=true -v /usr/local/redis-cluster/data/node4:/data redis --cluster-enabled yes --annpendonly yes --port 6384

# 启动node5
docker run -d --name redis-node5 --net host --privileged=true -v /usr/local/redis-cluster/data/node5:/data redis --cluster-enabled yes --annpendonly yes --port 6385

# 启动node6
docker run -d --name redis-node6 --net host --privileged=true -v /usr/local/redis-cluster/data/node6:/data redis --cluster-enabled yes --annpendonly yes --port 6386

# 启动node7
docker run -d --name redis-node7 --net host --privileged=true -v /usr/local/redis-cluster/data/node7:/data redis --cluster-enabled yes --annpendonly yes --port 6387

# 启动node8
docker run -d --name redis-node8 --net host--privileged=true -v /usr/local/redis-cluster/data/node8:/data redis --cluster-enabled yes --annpendonly yes --port 6388

 以上部分命令详解:

--net host:使用宿主机的IP和端口,默认

--cluster-enabled yes:开启redis集群

--appendonly yes:开启持久化

--port 6380:redis端口号

如果想配置redis的其他信息,直接在最后用[ --配置项 值 ]的格式追加就行,比如说设置数据库的数量:

--databases 30

3.2 开启集群

第3.1步只是用常规命令开启并创建了8个reids容器,这才是刚刚开始,下面才是真真正正的开启集群。

随便进入一个容器,我这里拿redis-node1容器为例:

# 进入redis-node1容器
docker exec -it redis-node1 bash

# 执行开启集群的命令
# 命令格式:redis-cli --cluster create 主机IP:端口号 主机IP:端口号 ... --cluster-replicas 1
redis-cli --cluster create \
192.168.1.12:6381 192.168.1.12:6382 \
192.168.1.12:6383 192.168.1.12:6384 \
192.168.1.12:6385 192.168.1.12:6386 \
192.168.1.12:6387 192.168.1.12:6388 \
--cluster-replicas 1

# 以上命令执行后,控制台会出现如下结果:
>>> Performing hash slots allocation on 8 nodes...
Master[0] -> Slots 0 - 4095
Master[1] -> Slots 4096 - 8191
Master[2] -> Slots 8192 - 12287
Master[3] -> Slots 12288 - 16383
Adding replica 192.168.1.12:6386 to 192.168.1.12:6381
Adding replica 192.168.1.12:6387 to 192.168.1.12:6382
Adding replica 192.168.1.12:6388 to 192.168.1.12:6383
Addomg replica 192.168.1.12:6385 to 192.168.1.12:6384
......
Can I set the above configuration? (type 'yes' to accpet): yes
......

--cluster-replicas 1 :表示为每个master创建一个slave节点

通过执行结果可以看到,共分成了4主4从的集群,redis的哈希槽共有16384个,所以能看到集群1的哈希槽范围是0  - 4095,集群2的哈希槽范围是4096 - 8191,集群3的哈希槽范围是8192 - 12287,集群4的哈希槽范围是12288 - 16383。 当出现Can I set the above configuration?时输入yes即可。

到现在集群就搭建成功啦,我们在redis控制台内使用cluster nodes命令查看主从关系。

3.3 读写错误

集群搭建成功以后,我们当然要试一试看看集群好用不用,现在以node1为例,现在尝试着插入一些数据:

# 进入redis-node1容器
docker exec -it redis-node1 bash

# 进入redis控制台
redis-cli -p 6381

# 插入一条数据
set key-1 value-1

set key-2 value-2
# 此时执行结果提示错误:(error) MOVED 12422 192.168.1.12:6384
# 这是因为我们现在是集群环境了,key-2这个key用hash算法之后的值并不在node1的哈希槽内,
# 提示请移步到 端口6384的redis上进行操作,现在我们可以使用集群方式连接就没有这个烦恼了。

# 关闭当前连接
exit 

# 使用集群方式连接
redis-cli -p 6381 -c

# 现在继续在node1上插入key-2
set key-2 value-2

# 现在发现插入成功了,但是提示了:Redircted to slot [12422] located at 192.168.1.12:6384
# 这是redis集群自动给我们重定向到了node4上面,然后再进行数据的插入操作

3.4 主从容错

主从容错切换reids集群已经帮我们处理好了,假设我们的node1节点宕机了,那么此时从机node5就会从slave变成master继续工作,如果现在node1节点又恢复了,那么此时node5是master,而node1就会变成slave。

3.5 主从扩容

需求:在4主4从的基础上,再扩容1个主节点和1个从节点,分别是node9和node10,端口是6389和6390。

继续创建2个redis容器:

# 启动node9
docker run -d --name redis-node9 --net host--privileged=true -v /usr/local/redis-cluster/data/node9:/data redis --cluster-enabled yes --annpendonly yes --port 6389

# 启动node10
docker run -d --name redis-node10 --net host--privileged=true -v /usr/local/redis-cluster/data/node10:/data redis --cluster-enabled yes --annpendonly yes --port 6390

现在进入到node9容器并作为master节点加入到reids集群当中:

# 进入redis-node9容器
docker exec -it redis-node9 bash

# 加入到reids集群
redis-cli --cluster add-node 192.168.1.12:6389 192.168.1.12:6381

上面命令中,192.168.1.12:6389就是要加入集群的节点IP和端口号,192.168.1.12:6381是集群当中的第一个节点IP和端口号,也就是node1。

现在已经成功加入集群了,但是还没有分配槽位,是没有办法往这个节点插入数据的(可以在node9容器内使用命令reids-cli --cluster check 192.168.1.12:6381查看集群状态)

现在就需要重新分配槽位:

# 重新分配槽号 redis-cli --cluster reshard IP地址:端口号
redis-cli --cluster reshard 192.168.1.12:6381

# 命令执行后需要输入一些信息,请参考:
>>> Performing Cluster Check (using node 192.168.1.12:6381)
M: 26c04dff03344d853004aaeedbafd49dc9c8d0a7 192.168.1.12:6381
   slots:[0-4095] (4096 slots) master
......
M: 15cc0fd387677373d354504099ae21774fd36e7a 192.168.1.12:6389
   slots:(0 slots) master
......
# 这里意思是需要迁移出多少个槽位,直接输入 16384 ÷ 集群master数量。我这里是5台master,所以结果是3276
How many slots do you want to move (from 1 to 16384)? 3276

# 分配给新加入集群的节点,找到192.168.1.12:6389的ID复制过来
What is the receiving node ID? 15cc0fd387677373d354504099ae21774fd36e7a

# 哪些节点的槽位需要导出,直接输入all就行
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: all
......
# 直接输入yes就行
Do you want to proceed with the proposed reshard plan (yes/no)? yes
......现在就在重新开始分配槽号了

 (分配规则是将旧的4台master使用的槽位各自匀一点出来给新加入的集群节点)

现在node9已成功加入到了集群当中,此时就应该把node10挂载到node9上,实现主从复制:

# 将node10挂载到node9上,实现主从复制
# redis-cli --cluster add-node 从机IP:端口号 主机IP:端口号 --cluster-slave --cluster-master-id 主机的ID(可使用命令redis-cli --cluster check 192.168.1.12:8381中查看)
redis-cli --cluster add-node 192.168.1.12:6390 192.168.1.12:6389 --cluster-slave --cluster-master-id 15cc0fd387677373d354504099ae21774fd36e7a

# 查看集群节点信息
redis-cli --cluster check 192.168.1.12:6381

现在集群扩容就完成啦。

3.6 主从缩容

需求:在5主5从的集群中,删除1主1从,分别是node9和node10,端口号是6389和6390。

删除之前先获取一下node10节点的ID:

# 查询集群节点信息,从执行结果上找到6390的ID,并记录一下
redis-cli --cluster check 192.168.1.12:6381

# 执行结果如下:
......
>>> Performing Cluster Check(using node 192.168.1.12:6381)
......
S: b93681e7637a8dda3e327296f3138c46a4fd0bcc 192.168.1.12:6390
   slots: (0 slots) slave
   replicates 15cc0fd387677373d354504099ae21774fd36e7a
......

从集群中删除node10从节点:

# 删除集群节点:redis-cli --cluster del-node 从机IP:端口号 从节点ID
redis-cli --cluster del-node 192.168.1.12:6390 b93681e7637a8dda3e327296f3138c46a4fd0bcc

现在重新查询一下集群节点发现只有9个节点了,之前的node10节点已经被删除了。

重新分配槽号:

# 重新分配槽位
redis-cli --cluster reshard 192.168.1.12:6381

# 命令执行后需要输入一些信息,请参考:
>>> Performing Cluster Check (using node 192.168.1.12:6381)
M: 26c04dff03344d853004aaeedbafd49dc9c8d0a7 192.168.1.12:6381
   slots:[0-4095] (4096 slots) master
......
M: 15cc0fd387677373d354504099ae21774fd36e7a 192.168.1.12:6389
   slots:(0 slots) master
......
# 这里意思是需要迁移出多少个槽位,直接输入 16384 ÷ 集群master数量。我这里是5台master,所以结果是3276
How many slots do you want to move (from 1 to 16384)? 3276

# 分配给集群中的某一个节点。我这里是直接分配给了node1,找到192.168.1.12:6381的ID复制过来
What is the receiving node ID? 26c04dff03344d853004aaeedbafd49dc9c8d0a7

# 哪些节点的槽位需要导出,这里是选择从哪里获取槽位
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
# 这里直接把要删除的node9的节点ID复制过来
Source node #1: 15cc0fd387677373d354504099ae21774fd36e7a
Source node #2: done
......
# 直接输入yes就行
Do you want to proceed with the proposed reshard plan (yes/no)? yes
......现在就在重新开始分配槽号了

现在在查询一下集群节点信息,发现node9还存在,但是已经没有槽位了,因为我们刚才只是重新分配了一下槽位,并没有删除node9节点,现在就删除一下node9节点。

# 删除集群节点:redis-cli --cluster del-node 从机IP:端口号 从节点ID
redis-cli --cluster del-node 192.168.1.12:6389 15cc0fd387677373d354504099ae21774fd36e7a

现在是将node9占用的3276个槽位全部分配给了node1,现在就出现了node1节点过于庞大了,现在可以执行以下命令,让redis重新以AA制的方式分配槽位。

redis-cli --cluster rebalance 192.168.1.12:6381

现在查询集群节点信息就发现已经没有node9节点啦,好啦,现在集群缩容已经完成啦。 

额外补充:

现在有一个需求,node1主节点想要3个从节点,那么如何把node9和node10挂载到node1下?看下面代码:(直接参考第3.5步最后的把node10挂载到node9)

# 将node9挂载到node1上
redis-cli --cluster add-node 192.168.1.12:6389 192.168.1.12:6381 --cluster-slave --cluster-master-id node1节点ID

# 将node10挂载到node1上
redis-cli --cluster add-node 192.168.1.12:6390 192.168.1.12:6381 --cluster-slave --cluster-master-id node1节点ID

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值