1. 拉取redis镜像

这里我使用的是之前打包的镜像,redis版本是:6.2.0

直接拉取也行:

docker pull redis:latest

三台服务器:192.168.104.79192.168.104.80192.168.104.81 三台机器可通信即可。

上面拉取的镜像是X86的镜像,如果是ARM64的服务器,上面镜像则不能用,这里贴一个热心网友的镜像,亲测可用(单机、集群均好使),版本为:5.0.9,下载地址:https://gitee.com/AlphaHinex/trunk/blob/master/docker-library/redis/5.0/redis-kunpeng-5.0.9.tar.gz

2. 创建redis集群容器

这步先创建6个redis容器(这里是没有设置redis连接密码的,如果需要设置redis密码,在创建容器时,最后都需要加上在最后添加:--requirepass "redis密码" --masterauth "redis密码"),先不启动。

这里创建redis集群密码给我坑的不行,使用docker 容器部署的redis集群,一旦容器创建之后,任何修改的东西,只要重启,就会失效!!!

这点给忽略了,导致浪费了大半天的时间去改这个集群密码。。。。。。。。。。。。。。。。。最后尝试在创建容器时指定密码,果然好使了。 如果需要指定密码,下面创建容器时,在最后添加:--requirepass "redis密码" --masterauth "redis密码"

docker-79 机器:

docker create --name redis-node1 --net host -v /data/redis-data/node1:/data 192.168.104.51:5000/redis:latest --cluster-enabled yes --cluster-config-file nodes-node-1.conf --port 6379

docker create --name redis-node2 --net host -v /data/redis-data/node2:/data 192.168.104.51:5000/redis:latest --cluster-enabled yes --cluster-config-file nodes-node-2.conf --port 6380

docker-80 机器:


docker create --name redis-node3 --net host -v /data/redis-data/node3:/data 192.168.104.51:5000/redis:latest --cluster-enabled yes --cluster-config-file nodes-node-3.conf --port 6379

docker create --name redis-node4 --net host -v /data/redis-data/node4:/data 192.168.104.51:5000/redis:latest --cluster-enabled yes --cluster-config-file nodes-node-4.conf --port 6380

docker-81 机器:


docker create --name redis-node5 --net host -v /data/redis-data/node5:/data 192.168.104.51:5000/redis:latest --cluster-enabled yes --cluster-config-file nodes-node-5.conf --port 6379

docker create --name redis-node6 --net host -v /data/redis-data/node6:/data 192.168.104.51:5000/redis:latest --cluster-enabled yes --cluster-config-file nodes-node-6.conf --port 6380
	

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在操作了几次之后,发现这种启动方式,并没有使用一个明显的配置文件,也就是现在redis集群的配置文件,是看不到的(也可能是我没有找到)。

为什么会这么说,后面可以在连接上redis后,测试修改下配置文件,比如修改redis持久化配置,默认是关闭持久化的,可以用 CONFIG GET appendonly 查看。开启的话,用:config set appendonly yes,然后将改动写入配置文件:config rewrite,会发现报错了:(error) ERR The server is running without a config file。意思是服务没有配置文件。。。。。。。。

另外有个规律就是,如果想自定义redis的配置文件,比如设置下密码,改下redis节点启动的端口,设置是否持久化什么的,只需要在上面命令的最后,用-- config的名称 值追加即可。例如上面的设置密码,直接追加:--requirepass "redis密码" --masterauth "redis密码",因为这里是集群模式,远程连接用的密码是requirepass,而节点间的通信验证的是masterauth,所以设置密码的话,要加上这两个属性。如果只有
requirepass 没有 masterauth,那么redis会疯狂打印日志,提示节点通信验证密码失败,日志文件半天就能达到N多个G。然后将服务器占满。然后redis宕掉。。。。。。。

日志提示信息为:(Non critical) Master does not understand REPLCONF listening-port: -NOAUTH Authentication required.

接着依次启动容器:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里还有一点,要设置容器自动重启,否则服务器重启之后,redis没有自动起来。三台机器依次执行

docker update --restart=always redis-node1 redis-node2
docker update --restart=always redis-node3 redis-node4
docker update --restart=always redis-node5 redis-node6

3. 创建集群关系

进入上面创建的任意容器:
在这里插入图片描述
组建redis集群:

redis-cli --cluster create 192.168.104.79:6379 192.168.104.79:6380 192.168.104.80:6379 192.168.104.80:6380 192.168.104.81:6379 192.168.104.81:6380  --cluster-replicas 1

如果创建redis容器时,设置了密码,则这里组建集群时,需要指定密码:在上面命令最后加上:-a redis密码

这里这个 --cluster-replicas 1 表示主从比例,当前集群主从节点比例是 1:1,由于创建了6个redis容器,那么正常应该是三主三从。并且redis集群,主节点最少3个,3个才能保证集群的健壮性。
在这里插入图片描述
执行上面命令后,会打印配置信息,可以看到当前集群环境为3个Master节点,并且平分16383个数据槽,并且自动分配3个从节点对应到其他3台Master节点。

redis集群情况为:

Master主节点Slave从节点
192.168.104.79:6379192.168.104.80:6380
192.168.104.80:6379192.168.104.81:6380
192.168.104.81:6379192.168.104.79:6380

接着是等待用户输入确认上面的集群信息:这里需要输入 yes
在这里插入图片描述
至此,redis集群搭建成功了。

4. 测试redis集群

如果设置了密码,则启动redis客户端时,要使用集群模式:redis-cli -c -h IP -p 端口 否则后面测试设置值的时候,报错:(error) MOVED 9189 192.168.104.67:6380。这里是因为上面分配了哈希槽了,测试的这个key的位置没有在当前连接的节点上,节点跳转出错。

看下集群节点信息是否是上面创建的节点信息:cluster info 如果上面设置了redis密码,则会提示:(error) NOAUTH Authentication required.,需要先输入下密码:auth 你的redis密码
在这里插入图片描述
如果没有设置密码,则可以直接使用redis自带连接工具连接redis:redis-cli
在这里插入图片描述
可以看到 3 个Master 节点,3 个Slave节点。

在任意一台redis上设置一个key值:set key1 “Hello World”
在这里插入图片描述
如果提示:(error) MOVED 9189 192.168.104.67:6380,则可能是没有启动集群模式。启动集群模式,使用命令:

redis-cli -h yourhost -p yourpost -a 'redis密码' -c 

如果没有密码,则不用加参数 -a 'redis密码'。后面的-c 不能省略。

在其他redis上查看:get key1
在这里插入图片描述
在这里插入图片描述
可以看到,都是可以拿到这个值的。

测试删除key:
在这里插入图片描述
在这里插入图片描述

查看redis配置,可以在连接上redis后,使用 :127.0.0.1:6379> CONFIG GET *,不过这里打印的配置上面一行是属性,下面是值
在这里插入图片描述
可以看到,端口是6379,日志级别是 notice

如果是单机启动的话,是可以在命令行修改配置的,格式: CONFIG SET 属性名称 新值 如修改密码:CONFIG SET requirepass abc123456,修改立即生效,不过重启可能会失效,下面将改动写入配置文件:config rewrite

5. 关于redis集群

上面组建集群时使用了 --cluster-replicas 1 ,那么如果是指定 --cluster-replicas 2的话,会不会变成2个主节点,对应4个从节点呢?

这个后面有空了测一下。

另外关于redis主从集群,为什么要用6个节点的问题,看到有人这么说:

既然要搭建集群,那么master节点至少要3个,slave节点也是3个,为什么呢?这是因为一个redis集群如果要对外提供可用的服务,那么集群中必须要有过半的master节点正常工作。基于这个特性,如果想搭建一个能够允许 n 个master节点挂掉的集群,那么就要搭建2n+1个master节点的集群。(感觉和Zookeeper的vote机制差不多)
如:
2个master节点,挂掉1个,则1不过半,则集群down掉,无法使用,容错率为0
3个master节点,挂掉1个,2>1,还可以正常运行,容错率为1
4个master节点,挂掉1个,3>1,还可以正常运行,但是当挂掉2个时,2=2,不过半,容错率依然为1

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐