一.redis集群分配情况

1.两台主机

主机ip 作用
192.168.238.141 做rancher服务器
192.168.238.142 做k8s集群worker机器

2.redis集群信息(三主三从)

服务名 容器内redis端口 容器内redis集群通信端口 映射主机 映射主机redis端口 映射主机redis集群通信端口
credis1 6379 16379 192.168.238.142  20301  30301
credis2 6379 16379 192.168.238.142  20302  30302
credis3 6379 16379 192.168.238.142  20303  30303
credis4 6379 16379 192.168.238.142  20304  30304
credis5 6379 16379 192.168.238.142  20305  30305
credis6 6379 16379 192.168.238.142  20306  30306

由于只有两台主机,一台用来部署rancher服务了,所以就把redis集群都放到192.168.238.142上了,如果有多台主机的话可以分开部署

3.redis数据持久化配置

服务名 容器内conf文件路径 容器内data文件路径 映射主机 主机conf文件路径 主机data文件路径
credis1

/home/redis

/redis.conf

/data/ 192.168.238.142

/home/cluster_redis

/credis1.conf

/home/cluster_redis/credis1
credis2

/home/redis

/redis.conf

/data/ 192.168.238.142

/home/cluster_redis

/credis2.conf

/home/cluster_redis/credis2
credis3

/home/redis

/redis.conf

/data/ 192.168.238.142

/home/cluster_redis

/credis3.conf

/home/cluster_redis/credis3
credis4

/home/redis

/redis.conf

/data/ 192.168.238.142

/home/cluster_redis

/credis4.conf

/home/cluster_redis/credis4
credis5

/home/redis

/redis.conf

/data/ 192.168.238.142

/home/cluster_redis

/credis5.conf

/home/cluster_redis/credis5
credis6

/home/redis

/redis.conf

/data/ 192.168.238.142

/home/cluster_redis

/credis6.conf

/home/cluster_redis/credis2

二.主机持久化数据配置

1.在主机192.168.238.142上创建redis集群的根文件夹

/home/cluster_redis

2.在/home/cluster_redis下创建6个conf文件和6个数据文件夹

​​

3.conf文件内容

port 6379                            # redis容器内端口


logfile "redis.log"


dir /data                            # redis容器内数据文件夹


appendonly yes


appendfilename appendonly.aof


cluster-enabled yes                  # 开启redis集群


cluster-config-file nodes.conf       # redis集群配置记录文件


cluster-node-timeout 5000


daemonize no                         # 是否后台运行,这里不能改成yes,不然docker运行就关闭了


protected-mode no

这里各个redis的conf文件其实是一样的,我创建了6个一样的conf文件,在主机上可以只创一个,都用这一个conf也可以。

三.创建redis服务

rancher搭建可以参考: https://blog.csdn.net/fengyuyeguirenenen/article/details/1244895

1.选择k8s集群,点击部署服务

2.配置端口映射

​ 

服务名为credis1,这里直接用Deployment部署无状态应用,没有用StatefulSet。

redis容器内要启动2个端口,一个是redis服务端口6379,一个是redis集群通信端口6379+10000即16379,然后分别映射到主机的20301和30301端口。

网络模式选择NodePort,这样在外部就可以通过主机的ip+端口访问到redis容器内的端口。

3.选择主机即192.168.238.142运行所有pod

4.配置容器和主机的持久化映射

添加2个主机映射目录,一个是容器内conf文件和主机conf文件的映射,另一个是容器内数据文件夹和主机数据文件夹credis1的映射。

这样即使pod重启,对应的redis数据也不会丢失,因为数据已经映射保存到主机上了。

5.配置容器命令

redis-server /home/redis/redis.conf --cluster-announce-ip 192.168.238.142 --cluster-announce-port 20301 --cluster-announce-bus-port 30301

 

注意redis启动命令redis-server后面除了要加配置文件路径,还要加上cluster-announce-ip,cluster-announce-port和cluster-announce-bus-port这几个参数。

这几个参数在创建 Redis Cluster 集群时,容器内记录集群信息的nodes.conf文件中会识别到这几个参数代表的该redis结点的ip,port和集群通信port

如果不加这几个参数,nodes.conf中记录的集群就是就是默认的redis容器的ip和容器内的6379和16379端口,这样就会造成pod重启导致的ip变更集群失效和无法在k8s集群外访问redis容器的问题

参数解释:

cluster-announce-ip:集群节点 IP,填写宿主机的 IP;

cluster-announce-port:集群节点映射端口;

cluster-announce-bus-port:集群节点总线端口。

6.完成创建并启动容器

 

其他选项都不用配置,用默认就好。然后点击启动,完成credis1的redis服务的创建。

7.按照上述步骤依次创建credis2 ~ credis6,完成后如下:

 

四.创建redis集群

1.进入上面创建好的任意一个redis容器。

 

2.创建集群

redis-cli --cluster create \
192.168.238.142:20301 \
192.168.238.142:20302 \
192.168.238.142:20303 \
192.168.238.142:20304 \
192.168.238.142:20305 \
192.168.238.142:20306 \
 --cluster-replicas 1

 

其中ip和port要使用redis容器映射到的主机的ip和port,这样redis集群的记录文件nodes.conf中记录的就会是固定的外部ip和port,不会受到容器的重启影响。

 --cluster-replicas 1参数代表创建集群时自动分配的主和从的比例是1,也就是三个主和三个从。通过该参数可以调整主从比例,但要注意主的数量至少3个。

3.创建完毕

 

自动分配主从和对应的槽。

 输入yes,确认分配

完成创建。

4.集群创建完,看看集群记录文件nodes.conf里记录了什么内容。

cat nodes.conf

可以看到,里面记录了主从关系,还有对应的各个结点的ip和端口。

5.查看集群状态,已经ok

redis-cli

cluster nodes

cluster info

 

 

 五.测试集群

1.验证集群自动跳转

在其他机器上使用redis客户端登录任意的redis容器,这里登录credis6

redis-cli -c -h 192.168.238.142 -p 20306

 

注意使用redis-cli命令时要加上参数-c,这个代表以集群模式登录,不加这个参数代表本地模式,不加的话登录上去后,操作key无法自动跳转。

登录成功后,可以看到设置key和获取key的时候,客户端会自动跳转到对应的redis服务上。

2.验证主从切换

可以看到开始时credis2是master,credis4是credis2的slave,然后删除credis2。 

再次查看集群状态,可以看到credis2已经为fail状态,credis4已经变为master。

然后再把credis2创建并启动。

 

 credis2重新创建之后已经变成credis2的slave。

 

 

Logo

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

更多推荐