您的位置:首页 > 数据库 > Redis

学习笔记--Swarm搭建redis集群

2019-04-20 11:06 465 查看

ps:博客用与记录个人学习过程中遇到的一些问题以及解决方案。若有表述不当之处还请见谅。

环境准备

  1. 两个节点以上的swarm集群,关于swarm搭建可以参考之前的文章。
  2. publicisworldwide/redis-cluster 镜像,这个镜像是redis专门的集群镜像,但在这里最好做一点小小的改变。后面会贴上dockerfile
  3. inem0o/redis-trib 镜像,该镜像用于管理redis集群。但也貌似有些小问题。后面有本人委曲求全的适应方案嘿。

第一步

自定义镜像

FROM publicisworldwide/redis-cluster
MAINTAINER 121

RUN sed -i 's/http:\/\/archive\.ubuntu\.com\/ubuntu\//http:\/\/mirrors\.ustc\.edu\.cn\/ubuntu\//g' /etc/apt/sources.list

RUN apt-get update

publicisworldwide/redis-cluster为了保持其轻量,需要我们自己去update(对于一些不需要的服务则可以不用 类似nginx)
update目的是为了使用其中redis-cli工具。
第4行代码是更新了原镜像源,为了很快的速度。当前使用了中科大的镜像源,如果你在build的过程中发现404可以换其他镜像源,例如阿里云,清华大学等。

第二步

关于redis集群应该注意的事情这里不在重复,示例采用3主3从的形式。(后面会贴上完整的compose代码)

  1. 首先redis集群应该和服务分离,当服务关闭调整时redis集群应该还是启动状态。
  2. 既然需要分离,那么redis的网络应该是开放式,compose文件应该是redis网络添加attachable属性并赋值为true
  3. 连接redis集群的服务相对应使用连接redis网络的时候也应该标示是外来网络,即external属性为true
  4. 跑集群的服务器应该开启redis端口,redis端口+10000端口。例如redis1,端口7001,那应该开启7001,17001。
  5. 关于compose端口是否暴露方面按照个人习惯。端口暴露有利于远程查询管理。不暴露则安全(第三方服务与redis集群处在同一网络下采用主机名:端口号即可通讯)
  6. compose兼容volumes的nfs连接,但这里不做展示
  7. 本次展示每个容器分别一个文件夹,端口7001~7006,文件夹名同样。
  8. 下面代码使用的镜像 redis-cluster是使用第一步build的镜像( docker build -t 别名 dockerfile路径)起的别名
version: "3.2"
services:

redis1:
image: redis-cluster
networks:
redis-net:
volumes:
- ./data/7001/data:/data
environment:
- REDIS_PORT=7001
ports:
- "7001:7001"
- "17001:17001"

redis2:
image: redis-cluster
networks:
redis-net:
volumes:
- ./data/7002/data:/data
environment:
- REDIS_PORT=7002
ports:
- "7002:7002"
- "17002:17002"

redis3:
image: redis-cluster
networks:
redis-net:
volumes:
- ./data/7003/data:/data
environment:
- REDIS_PORT=7003
ports:
- "7003:7003"
- "17003:17003"

redis4:
image: redis-cluster
networks:
redis-net:
volumes:
- ./data/7004/data:/data
environment:
- REDIS_PORT=7004
ports:
- "7004:7004"
- "17004:17004"

redis5:
image: redis-cluster
networks:
redis-net:
volumes:
- ./data/7005/data:/data
environment:
- REDIS_PORT=7005
ports:
- "7005:7005"
- "17005:17005"

redis6:
image: redis-cluster
networks:
redis-net:
volumes:
- ./data/7006/data:/data
environment:
- REDIS_PORT=7006
ports:
- "7006:7006"
- "17006:17006"

networks:
redis-net:
attachable: true

第三步

确认6个容器均正常运行之后,我们下一步对容器进行集群关联。

docker run --rm -it --network redis_redis-net inem0o/redis-trib create --replicas 1 容器1ip:port 容器2ip:port..........

运行inem0o/redis-trib镜像 加入redis集群网络创建集群

这里出现第一个坑(也是基础不扎实)
原本我使用127.0.0.1或者本机ip等ip均不能使集群顺利创建。卡在 ‘等待加入’ 阶段,后来通过查询资料了解应该使用网络内ip。

即:

docker network inspect redis_redis-net

会出现json格式的配置,其中“Containers”内容是我们需要的,里面ip地址才是我们在创建集群时候应该输入的ip地址。
逐一复制粘贴入上述docker run代码中可以实现集群。这里贴个小脚本以用来获取ip和端口

# -*- coding: utf-8 -*-
# coding:utf-8
import os
import json
import re

def cluster():
"""
构建redis集群
:return:
"""
os.system('docker network inspect redis_redis-net > data.json')
with open('data.json', 'r') as fp:
# 获取网络数据
data = json.loads(fp.read())

if len(data) == 0:
print("[!] service isn't up...")
return

info = data[0]
containers = info.get('Containers', {})

# 构建命令
# code = "docker run --rm -it --network redis_redis-net inem0o/redis-trib create --replicas 1 "
code = ""
for _, v in containers.items():
try:
num = re.findall('redis(\w)\.', v['Name'])[0]
code += " {}:700{}".format(
v['IPv4Address'].split('/')[0], num)
except:
pass
# os.system(code)
print(code)
os.system('rm -rf data.json')

if __name__ == '__main__':

cluster()

里面有注释的地方因为实际业务上集群不会跑在同一服务器上,所以获取的其实只是本机部分集群网络的节点信息而言,需要每个服务器都跑一次以获取全部ip和端口 (暂时没有想到更方便的方法,如果有朋友知道其他解决方法希望不吝赐教嘻)

第四步

通过上述三个部分操作可以启动一个redis集群。下面是一些管理方面的分享。

  1. 进入任意一个节点,因为一开始的镜像已经update过了,所以redis集群工具基本都在。可以直接使用
    使用方法跟非docker模式的集群一致,还请自行百度一下。
  2. inem0o/redis-trib镜像也有管理功能(还请help一下) ,但我发现在集群运行一段时间时候这个管理镜像就会出现连接不上但情况(但此时但redis集群还是很正常的)于是我放弃使用他来做管理,只做集群关联。

小结

没有小结,

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: