群辉 好用的docker 群晖7.0 docker

一、获取Redis镜像 

首先获取镜像,访问Docker 在网站中搜索redis关键字,如下图:

群辉 好用的docker 群晖7.0 docker_redis

我们选择官方镜像,点击进去: 

群辉 好用的docker 群晖7.0 docker_群辉 好用的docker_02

 这一行都是同一个版本,我这里选择的是7.0.7版;点击Tags选项卡,搜索7.0.7,详见如下截图:

群辉 好用的docker 群晖7.0 docker_群辉 好用的docker_03

 执行以下命令来拉取镜像:

docker pull redis:7.0.7

重新打Tag上传私有Harbor:

docker tag redis:7.0.7 11.248.245.184/redis/release:7.0.7 docker push 11.248.245.184/redis/release:7.0.7

本次示例集群配置为一主两从三节点共9台服务器,服务器信息如下:

11.248.246.1
11.248.246.6
11.248.246.7
11.248.246.9
11.248.246.10
11.248.246.11
11.248.246.12
11.248.246.13
11.248.246.15 

资源已经准备完成,这里我们先熟悉一下redis.conf中的配置属性,以下属性只包含本文用到的属性:

  • port:redis监听端口,默认为6379;
  • cluster-enabled: 是否启动为集群节点,集群的话设置为yes;
  • cluster-config-file:cluster配置文件名,该文件属于自动生成,仅用于快速查找文件并查询文件内容;
  • cluster-node-timeout:节点服务响应超时时间,用于判定该节点是否下线或切换为从节点;
  • appendonly:是否开启AOF模式;
  • bind:绑定服务器的网卡IP地址;
  • daemonize:用来指定redis是否要用守护线程的方式启动。设置成yes时,代表开启守护进程模式。在该模式下,redis会在后台运行,并将进程pid号写入至redis.conf选项pidfile设置的文件中,此时redis将一直运行,除非手动kill该进程。当daemonize选项设置成no时,当前界面将进入redis的命令行界面,exit强制退出或者关闭连接工具(putty,xshell等)都会导致redis进程退出。
  • pidfile:存储进程ID配置文件;当daemonize设置为yes时使用(因为使用Dokcer形式启动,daemonize为no,所以pidfile不设置); 

二、单节点部署

在安装之前需要说明的是,自Redis Cluster 5.0之后取消了ruby脚本redis-trib.rb的支持。直接使用redis-cli 也可以创建集群。单节点的部署中关于ACL的配置方式使用的为ACL file方式。

首先登录11.248.246.1服务器,拉取镜像:

docker pull 11.248.245.184/redis/release:7.0.7

创建挂载目录:

mkdir -p /home/redis/data /home/redis/conf

执行以下命令:

cd /home/redis/conf

新建redis.conf文件: 

port 6379 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes bind 11.248.246.1 daemonize no aclfile /usr/local/etc/redis/users.acl

创建ACL file文件:

touch /home/redis/conf/users.acl

设置配置文件权限:

chmod -R 777 /home/redis/conf/

 创建redis.conf后,执行以下命令来启动redis:

docker run -itd -p 6379:6379 \ --privileged=true -v /home/redis/conf:/usr/local/etc/redis \ --privileged=true -v /home/redis/data:/data \ --restart always \ --net=host \ --name redis 11.248.245.184/redis/release:7.0.7 redis-server /usr/local/etc/redis/redis.conf

验证是否可登录,注意目前是单机模式,执行以下命令(我是通过PC机进行登录的,若果本地的redis 客户端不支持7.0版本的主要要安装一个):

./redis-cli -h 11.248.246.1 -p 6379

使用以上命令验证可以正常登录之后,把剩下的node安装完成:

11.248.246.6
11.248.246.7
11.248.246.9
11.248.246.10
11.248.246.11
11.248.246.12
11.248.246.13
11.248.246.15 

 三、创建集群

第二步中我们已经安装了9个节点,现在我们来创建集群,本文章规划的是三个主节点,每个主节点分配2个从节点,执行:

redis-cli --cluster create 11.248.246.1:6379 11.248.246.6:6379 11.248.246.7:6379 \ 11.248.246.9:6379 11.248.246.10:6379 11.248.246.11:6379 11.248.246.12:6379 \ 11.248.246.13:6379 11.248.246.15:6379 \ --cluster-replicas 2

执行完成后,会提示以下信息:

Can I set the above configuration? (type ‘yes’ to accept): 

这里输入yes即可; 最终完成之后,会看见如下提示:

[OK] All 16384 slots covered

输入以下命令来确认节点信息:

./redis-cli -c -h 11.248.246.6 -p 6379 cluster nodes

展示信息如下:

8bdeb2add91f98fbdd765750610d5d6fbc40d597 11.248.246.6:6379@16379 myself,master – 0 1673852419000 2 connected 5461-10922
17599d5bc0c21b8309313adcf7df4599215beced 11.248.246.11:6379@16379 slave 34020415fc5c0734ece9b90f2756f06b758247f2 0 1673852417127 1 connected
e9383ce53b2efaf03d988e468c9369e97ac612a5 11.248.246.13:6379@16379 slave 8bdeb2add91f98fbdd765750610d5d6fbc40d597 0 1673852418133 2 connected
05b8a4a426d72dc9df321e10552f40a638b76453 11.248.246.12:6379@16379 slave 8bdeb2add91f98fbdd765750610d5d6fbc40d597 0 1673852419137 2 connected
8b85f1f1a78e3c6192b67d3acae35327fc8cb1a2 11.248.246.7:6379@16379 master – 0 1673852418635 3 connected 10923-16383
34020415fc5c0734ece9b90f2756f06b758247f2 11.248.246.1:6379@16379 master – 0 1673852418133 1 connected 0-5460
72d0d6a6a6ac331ef4fbe154cb2a1fd4527aa749 11.248.246.15:6379@16379 slave 8b85f1f1a78e3c6192b67d3acae35327fc8cb1a2 0 1673852418000 3 connected
329d4ba50af669f8d8bf8f7ac9e4c89979654802 11.248.246.9:6379@16379 slave 8b85f1f1a78e3c6192b67d3acae35327fc8cb1a2 0 1673852417629 3 connected
0b641478625aff3320887aed3b397d276ade5599 11.248.246.10:6379@16379 slave 34020415fc5c0734ece9b90f2756f06b758247f2 0 1673852418000 1 connected 

四、重新分配槽

重新分配槽点的作用是把集群中的一个Node中的hash slots分配到另一个节点中。这里我们需要知道从哪个节点到哪个节点,我们尝试的场景为:

从11.248.246.1节点迁移5460槽点到11.248.246.7

接下来的命令我们需要知道重新分配的node与接受重新分配槽点的实例ID ,我们可以通过一下命令来获取:

redis-cli -h 11.248.246.1 -p 6379 cluster nodes | grep myself 34020415fc5c0734ece9b90f2756f06b758247f2 11.248.246.1:6379@16379 myself,master - 0 1674890318000 1 connected 0-5460 redis-cli -h 11.248.246.7 -p 6379 cluster nodes | grep myself 8b85f1f1a78e3c6192b67d3acae35327fc8cb1a2 11.248.246.7:6379@16379 myself,master - 0 0 3 connected 10923-16383

通过以上信息我们可以知道, 11.248.246.1实例的ID为34020415fc5c0734ece9b90f2756f06b758247f2;11.248.246.7实例的ID为8b85f1f1a78e3c6192b67d3acae35327fc8cb1a2

以下是执行槽点重新分配的指令命令:

redis-cli --cluster reshard <host>:<port> --cluster-from <node-id> --cluster-to <node-id> --cluster-slots <number of slots> --cluster-yes

参数解析:

  • –cluster reshard <host>:<port>:指的是需要reshard的集群;
  • –cluster-from <node-id>:需要重新分配的node实例,其中node-id指的是实例ID;
  • –cluster-to <node-id>:指定分配的hash slots被分配到的node,其中node-id指的是实例ID;
  • –cluster-slots <number of slots>:需要重新分配的槽点数量;
  • –cluster-yes:表示自动应答为yes,即表示以非交互模式运行;如果不配置该选项,则需要手动确认

上面提到我们需要将number为5460的hash slot迁移到11.248.246.7中,执行以下命令:

redis-cli --cluster reshard 11.248.246.1:6379 --cluster-from 34020415fc5c0734ece9b90f2756f06b758247f2 --cluster-to 8b85f1f1a78e3c6192b67d3acae35327fc8cb1a2 --cluster-slots 5460 --cluster-yes

注意:

  • 特别注意是5460个槽点,并不是第5460个槽,我们无法指定固定的槽来进行迁移,只能告知redis-cli迁移多少个槽
  • 如果–cluster-slots <number of slots>参数配置目前还无法指定范围,例如配置的为–cluster-slots 0-606,则会走人机交互模式;
  • 如果我们操作失误,出现当在迁移槽点的过程中,打断了迁移操作,例如在迁移过程中使用了control+c操作;检查集群状态时就会出现以下错误信息:

[WARNING] Node 11.248.246.1:6379 has slots in migrating state 606. [WARNING] Node 11.248.246.7:6379 has slots in importing state 606. [WARNING] The following slots are open: 606.

可以使用以下命令来完成修复操作:

redis-cli –cluster fix 11.248.246.1:6379

重新分配完成之后,我们需要检查一下redis集群是否正常,执行:

redis-cli --cluster check 11.248.246.1:6379

 如果配置错误会给出错误信息。

六、故障转移测试

本次测试,我们尝试让主节点11.248.246.7宕机,看看redis cluster会发生主从切换。首先我们先查看当前所有主节点信息:

./redis-cli -h 11.248.246.9 -p 6379 cluster nodes | grep master 8bdeb2add91f98fbdd765750610d5d6fbc40d597 11.248.246.6:6379@16379 master - 0 1674972990384 2 connected 5461-10922 34020415fc5c0734ece9b90f2756f06b758247f2 11.248.246.1:6379@16379 master - 0 1674972990585 11 connected 0-605 607-5460 8b85f1f1a78e3c6192b67d3acae35327fc8cb1a2 11.248.246.7:6379@16379 master - 0 1674972990000 10 connected 606 10923-16383

尝试让11.248.246.7宕机,登录11.248.246.7服务器停止docker容器:

docker stop redis

查看集群信息:

./redis-cli -h 11.248.246.9 -p 6379 cluster nodes | grep master 8bdeb2add91f98fbdd765750610d5d6fbc40d597 11.248.246.6:6379@16379 master - 0 1674973506528 2 connected 5461-10922 34020415fc5c0734ece9b90f2756f06b758247f2 11.248.246.1:6379@16379 master - 0 1674973507000 11 connected 0-605 607-5460 72d0d6a6a6ac331ef4fbe154cb2a1fd4527aa749 11.248.246.15:6379@16379 master - 0 1674973506931 12 connected 606 10923-16383 8b85f1f1a78e3c6192b67d3acae35327fc8cb1a2 11.248.246.7:6379@16379 master,fail - 1674973469648 1674973467133 10 disconnected

我们发现11.248.246.15这台服务器变更为了master节点,而11.248.246.7台提示下线;接下来我们尝试重启11.248.246.7这台节点。

登录11.248.246.7服务器,执行:

docker start redis

查看 11.248.246.7的状态:

./redis-cli -h 11.248.246.7 -p 6379 cluster nodes | grep myself 8b85f1f1a78e3c6192b67d3acae35327fc8cb1a2 11.248.246.7:6379@16379 myself,slave 72d0d6a6a6ac331ef4fbe154cb2a1fd4527aa749 0 0 12 connected

已变更为从节点。可以通过以下命令来检查集群状态是否正常:

redis-cli --cluster check 11.248.246.1:6379

注意:

Redis 使用的是异步复制, 在执行故障转移期间, 集群可能会丢失写命令。

但是在实际上, 丢失命令的情况并不常见, 因为 Redis 几乎是同时执行将命令回复发送给客户端, 以及将命令复制给从节点这两个操作, 所以实际上造成命令丢失的时间窗口是非常小的。

不过, 尽管出现的几率不高, 但丢失命令的情况还是有可能会出现的, 所以Redis集群不能保障数据的强一致性

七、添加节点(主节点、从节点)

无论是新增主节点还是从节点,我们都需要先添加一个空的节点。

本次新增服务器的IP地址为11.248.246.16,登录11.248.246.16服务器按照【二、单节点部署】中的步骤来部署单节点;

单节点部署完成之后,我们就可以把本次新增的节点添加到集群中了,执行:

redis-cli --cluster add-node 11.248.246.16:6379 11.248.246.1:6379

执行成功后的展示信息如下:

>>> Adding node 11.248.246.16:6379 to cluster 11.248.246.1:6379
>>> Performing Cluster Check (using node 11.248.246.1:6379)
M: 34020415fc5c0734ece9b90f2756f06b758247f2 11.248.246.1:6379
   slots:[0-605],[607-5460] (5460 slots) master
   2 additional replica(s)
S: 8b85f1f1a78e3c6192b67d3acae35327fc8cb1a2 11.248.246.7:6379
   slots: (0 slots) slave
   replicates 72d0d6a6a6ac331ef4fbe154cb2a1fd4527aa749
S: 329d4ba50af669f8d8bf8f7ac9e4c89979654802 11.248.246.9:6379
   slots: (0 slots) slave
   replicates 72d0d6a6a6ac331ef4fbe154cb2a1fd4527aa749
S: 0b641478625aff3320887aed3b397d276ade5599 11.248.246.10:6379
   slots: (0 slots) slave
   replicates 34020415fc5c0734ece9b90f2756f06b758247f2
M: 72d0d6a6a6ac331ef4fbe154cb2a1fd4527aa749 11.248.246.15:6379
   slots:[606],[10923-16383] (5462 slots) master
   2 additional replica(s)
S: 17599d5bc0c21b8309313adcf7df4599215beced 11.248.246.11:6379
   slots: (0 slots) slave
   replicates 34020415fc5c0734ece9b90f2756f06b758247f2
S: e9383ce53b2efaf03d988e468c9369e97ac612a5 11.248.246.13:6379
   slots: (0 slots) slave
   replicates 8bdeb2add91f98fbdd765750610d5d6fbc40d597
S: 05b8a4a426d72dc9df321e10552f40a638b76453 11.248.246.12:6379
   slots: (0 slots) slave
   replicates 8bdeb2add91f98fbdd765750610d5d6fbc40d597
M: 8bdeb2add91f98fbdd765750610d5d6fbc40d597 11.248.246.6:6379
   slots:[5461-10922] (5462 slots) master
   2 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots…
>>> Check slots coverage…
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 11.248.246.16:6379 to make it join the cluster.
[OK] New node added correctly.

查看集群信息:

./redis-cli -h 11.248.246.7 -p 6379 cluster nodes 4f6f4d242a166cb2fe335e6936a2a7867026ef42 11.248.246.16:6379@16379 master - 0 1675047435501 0 connected 8b85f1f1a78e3c6192b67d3acae35327fc8cb1a2 11.248.246.7:6379@16379 myself,slave 72d0d6a6a6ac331ef4fbe154cb2a1fd4527aa749 0 0 12 connected 34020415fc5c0734ece9b90f2756f06b758247f2 11.248.246.1:6379@16379 master - 0 1675047435501 11 connected 0-605 607-5460 8bdeb2add91f98fbdd765750610d5d6fbc40d597 11.248.246.6:6379@16379 master - 0 1675047434497 2 connected 5461-10922 0b641478625aff3320887aed3b397d276ade5599 11.248.246.10:6379@16379 slave 34020415fc5c0734ece9b90f2756f06b758247f2 0 1675047434999 11 connected 72d0d6a6a6ac331ef4fbe154cb2a1fd4527aa749 11.248.246.15:6379@16379 master - 0 1675047435501 12 connected 606 10923-16383 e9383ce53b2efaf03d988e468c9369e97ac612a5 11.248.246.13:6379@16379 slave 8bdeb2add91f98fbdd765750610d5d6fbc40d597 0 1675047433994 2 connected 17599d5bc0c21b8309313adcf7df4599215beced 11.248.246.11:6379@16379 slave 34020415fc5c0734ece9b90f2756f06b758247f2 0 1675047435501 11 connected 05b8a4a426d72dc9df321e10552f40a638b76453 11.248.246.12:6379@16379 slave 8bdeb2add91f98fbdd765750610d5d6fbc40d597 0 1675047434497 2 connected 329d4ba50af669f8d8bf8f7ac9e4c89979654802 11.248.246.9:6379@16379 slave 72d0d6a6a6ac331ef4fbe154cb2a1fd4527aa749 0 1675047436004 12 connected

我们可以看到11.248.246.16服务器被默认分配为master,并且没有被分配任何槽点。 因为没有被分配hash slots,所以该节点就没有数据,也不会参与集群选举,如果我们想要让新增的这个master节点生效,我们可以给它分配hash slots。

现在我们尝试给新增的master节点分配2000个槽点,执行:

redis-cli --cluster reshard 11.248.246.1:6379

会出现如下提示:

How many slots do you want to move (from 1 to 16384)?

这是在询问你想移动多个槽点,这里我们输入2000并回车后,显示如下信息:

What is the receiving node ID?

 这里是询问接收这2000个槽点的node ID是多少,新增节点IP为11.248.246.16的node ID为4f6f4d242a166cb2fe335e6936a2a7867026ef42,这里我们输入完成之后再次按回车键,会出现如下提示信息:

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.

这里我们选择all,输入all之后会出现如下提示:

Moving slot 662 from 34020415fc5c0734ece9b90f2756f06b758247f2 Moving slot 663 from 34020415fc5c0734ece9b90f2756f06b758247f2 Moving slot 664 from 34020415fc5c0734ece9b90f2756f06b758247f2 Moving slot 665 from 34020415fc5c0734ece9b90f2756f06b758247f2 Moving slot 666 from 34020415fc5c0734ece9b90f2756f06b758247f2 Do you want to proceed with the proposed reshard plan (yes/no)?

除了最后一行的信息外,上面的现实的内容是告知哪些节点中槽点会被迁移到4f6f4d242a166cb2fe335e6936a2a7867026ef42上,并且让我们做最终的确认,这里我们输入yes,经过一段时间的执行后,再次查看新增节点信息:

./redis-cli -h 11.248.246.16 -p 6379 cluster nodes | grep myself 4f6f4d242a166cb2fe335e6936a2a7867026ef42 11.248.246.16:6379@16379 myself,master - 0 1675062116000 14 connected 0-666 5461-6126 10923-11588

这里我们看到新增的master节点已经被分配了hash slots;这里需要注意的是这个主节点并没有从节点,如果该主节点发生故障,这个集群将会不可用

添加从节点与更换

添加从节点一般都是两种方式。更多相关集群可用性的知识可以关注“replicas migration机制”。

1、系统自动分配主节点

新增服务器11.248.246.17,并按照【二、单节点部署】中的步骤来部署单节点。完成之后执行:

redis-cli --cluster add-node 11.248.246.17:6379 11.248.246.1:6379 --cluster-slave
  • 11.248.246.17会被加入到11.248.246.1所在集群中;
  • 11.248.246.17的角色为从节点;
  • 11.248.246.17对应的master节点有系统自己分配(按照从节点最少原则);

2、指定master节点

新增服务器11.248.246.19,并按照【二、单节点部署】中的步骤来部署单节点。完成之后执行:

redis-cli --cluster add-node 11.248.246.19:6379 11.248.246.1:6379 --cluster-slave --cluster-master-id 4f6f4d242a166cb2fe335e6936a2a7867026ef42
  • 11.248.246.19会被加入到11.248.246.1所在集群中;
  • 11.248.246.19的角色为从节点并且它的主节点为4f6f4d242a166cb2fe335e6936a2a7867026ef42;

3、从节点更换主节点

例如我们要把从节点11.248.246.19的主节点变更为8bdeb2add91f98fbdd765750610d5d6fbc40d597。

使用redis-cli登录11.248.246.19节点,并执行:

cluster replicate 8bdeb2add91f98fbdd765750610d5d6fbc40d597

八、去除节点

去除节点的需要区分主节点与从节点,这里演示的是去除从节点。

前面的例子我们有一台新增的11.248.246.19实例,我们把它剔除掉,首先获取11.248.246.19的node ID:

./redis-cli -h 11.248.246.7 -p 6379 cluster nodes | grep 11.248.246.19 ec0b77c020cd05ab7bbce409461a58e2a03438ad 11.248.246.19:6379@16379 slave 8bdeb2add91f98fbdd765750610d5d6fbc40d597 0 1675129513584 2 connected

获取node ID之后,我们执行:

redis-cli --cluster del-node 11.248.246.1:6379 ec0b77c020cd05ab7bbce409461a58e2a03438ad

注意:如果是去除主节点,需要把主节点上已经分配的hash slots迁移走在去除;

原文链接:https://blog.51cto.com/u_12226/9595897

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享