1. 拉取redis镜像
这里我使用的是之前打包的镜像,redis版本是:6.2.0
直接拉取也行:
docker pull redis:latest
三台服务器:192.168.104.79
、192.168.104.80
、192.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:6379 | 192.168.104.80:6380 |
192.168.104.80:6379 | 192.168.104.81:6380 |
192.168.104.81:6379 | 192.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