一.redis集群分配情况

1.两台主机

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

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

服务名容器内redis端口容器内redis集群通信端口映射主机映射主机redis端口映射主机redis集群通信端口
credis1637916379192.168.238.142 20301 30301
credis2637916379192.168.238.142 20302 30302
credis3637916379192.168.238.142 20303 30303
credis4637916379192.168.238.142 20304 30304
credis5637916379192.168.238.142 20305 30305
credis6637916379192.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

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐