M1-Mac 中 docker 的 redis 集群配置
前言
题目起名有些绕不过为了避免读者误会这也是一个必要的,本文是集体的一次 mac 上搭建 redis 集群的实战笔记,笔者为 mac 零碎,尽管很多操作相似 Linux 然而有差别,也踩了不少的坑,本教程也能够作为 linux 的 docker 搭建 redis 集群参考应用,最初有任何疑难欢送探讨。
提醒:本教程实用于 linux 和 mac 零碎,然而须要留神的是 mac 零碎中
/usr/local
目录上面其实是被 mac 关闭的,不能作为配置和应用,尽管能够通过 sudo 强制构建配置等文件,然而会呈现莫名其妙的状况,本文也会列出集体的 踩坑点,心愿能帮忙同样应用 mac 零碎的同学避坑。
一、筹备 docker
巧妇难为无米之炊,所以先得在 mac 上装一个 docker。
1. 装置 docker
集体目前应用 mac 作为主力机,所以所有的演示都是在 mac 上实现,当然下载也是只提供 mac 的下载地址,首先须要跑到这个网址进行下载,https://docs.docker.com/deskt…。
- mac 的装置间接拖过来就行,这里装置实现之后不晓得为什么 docker 容器老是无奈启动,然而点击了 unintall 啥的之后忽然就好了,目前通过版本迭代 docker 曾经能够失常在 m1 中应用了。
- 装置实现之后启动软件,能够先运行一下 docker 的
ddocker info
的命令,也能够先抉择软件举荐的镜像来运行一下,命令如下:docker run -d -p 80:80 docker/getting-started
- 运行实现之后,间接拜访 localhost 即可,此时会进入一个 docker 的疾速入门页面。
2. 更新镜像
因为国外的 docker 切实是慢,所以这里须要先切换为国内的镜像仓库,最终应用的是网易的镜像地址:http://hub-mirror.c.163.com。在任务栏点击 Docker for mac 利用图标 -> Perferences... -> Daemon -> Registry mirrors
。在列表中填写加速器地址即可,批改实现之后,点击 Apply & Restart
按钮,Docker 就会重启并利用配置的镜像地址了。
新版的 docker 只有更改 docker engine 的相干 json 配置即可,比方上面的就是替换之后的后果,也算是一个踩坑点,网上的少数教程都是老版本的 docker,找了半天没找到在哪 =-=:
最初为了验证配置是否失效咱们能够应用 docker info
查看,在打印信息的最下方看到对应的配置地址阐明配置失效了:
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://docker.mirrors.ustc.edu.cn/
https://hub-mirror.c.163.com/
Live Restore Enabled: false
二、docker 的 redis 单机部署
单机部署就非常简略了,只须要上面几个命令即可:
# 默认拉取一个最新的 redis 镜像
docker pull redis
#在默认的 6379 端口上启动一个 redis 服务
docker run --name test-redis -p 6379:6379 -d redis
#进入容器外部
docker exec -it test-redis /bin/bash
# 连贯 redis
redis-cli
#进入之后装置常规 ping 一下即可
ping
单机运行还是配置还是挺快的,不过须要留神单机的运行应用的配置都是默认的配置,并且docker 启动 redis 镜像里是没有配置文件的,如果想要像装置 redis 一样应用自定义的配置文件启动须要做如下的更改。
自定义 redis 配置启动
- 如果是自定义的配置,首先在本人在任意的目录地位创立用于映射的目录以及从 https://github.com/redis/redi… 拉一个模板的配置文件过去即可。
- 最初,通过上面的命令内容进行配置
#-d 后盾运行返回容器 id
#-p 端口映射
#-v 数据卷映射
#开端 [COMMAMD] 执行该命令
docker run -d -p 6380:6380 -v /usr/docker/redis/myRedis/redis.conf:/etc/redis/redis.conf -v /usr/docker/redis/myRedis/data:/data --name myRedis redis redis-server /etc/redis/redis.conf
/usr/docker/redis/myRedis/redis.conf
:这里须要改为你须要映射的配置文件地址,同理 data 文件也须要对应的批改。
三、docker 中 redis 集群部署(重点)
首先须要确保下面的内容都曾经实现了解决,上面就能够进行相干的 redis 装置了,装置的过程如下:
1. 检索 redis 镜像
docker search redis,展现之后发现了常见的官网提供的 redis 镜像,间接啦取即可。
2. 拉取镜像
docker pull redis,同样也是把 redis 的镜像拉到本地来,拉取之后执行docker images
, 上面是执行后果:
zxd@zxddeMacBook-Pro ~ % docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest c3d77c9fc5b8 2 weeks ago 107MB
docker/getting-started latest 613921574f76 4 months ago 26.7MB
3. 构建 redis 自定义
执行:docker network create redis-net
,执行命令之后呈现如下的返回后果,这样就创立了 redis 集群的通信端了
创立实现之后呈现上面的内容:
a42040f20cb54027b75a68f3d000a7bb02f417e2f202297658bfc1a2c88041d7
4. 构建集群配置文件模板文件
构建根底集群的配置文件,如果你是 linux 零碎能够执行:cd /usr/local/src && mkdir redis-cluster && cd ./redis-cluster && touch redis-cluster.conf
。然而如果你是 mac 零碎,倡议不要这样操作,更加倡议在 /User/ 用户名 /redis/xxx
上面构建本人的配置,上面是 redis-cluster.conf
文件的模板。
# ${PORT}不须要替换,为占位符,留神
port ${PORT}
cluster-enabled yes
protected-mode no
cluster-config-file nodes.conf
cluster-node-timeout 5000
#对外 ip,这里的 ip 要改为你的服务器 Ip。【留神不能应用 127.0.0.1】cluster-announce-ip 192.168.0.12
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
appendonly yes
5. 生成具体集群配置文件
如果是 linux 零碎,则能够应用命令 cd /usr/local/src/redis-cluster
进入到对应的构建配置的目录,当然这里是 mac 进行了对应的目录,而后咱们生成 conf 和 data 目录,并生成配置信息:
seq 6000 6005
: 能够本人指定遍历的端口,这里刚好是 6 个 redis 实例,也就是默认的 3 主 3 从的形式。
for port in `seq 6000 6005`; do
mkdir -p ./${port}/conf && PORT=${port} envsubst < ./redis-cluster.conf > ./${port}/conf/redis.conf && mkdir -p ./${port}/data;
done
生成之后的成果如下,能够看到生成了从 6000-6005 的配置文件以及 data 目录,这就是搭建集群的根底配置:
如果关上其中一个配置文件,它的内容如下,这里能够比照之前的模板配置就能明确改了哪些内容:
port 6000
cluster-enabled yes
protected-mode no
cluster-config-file nodes.conf
cluster-node-timeout 5000
#对外 ip
cluster-announce-ip 192.168.0.12
cluster-announce-port 6000
cluster-announce-bus-port 16000
appendonly yes
6. 编写并运行集群运行脚本
接着,在以后的目录下咱们能够创立一个脚本文件 start.sh
,并且执行vim start.sh
,在脚本的内容如下,编写实现之后应用 shell 命令执行如下:sh start.sh
运行脚本即可。
上面重点来了,前文说过 mac 零碎的 /usr/local/src 目录是不给拜访的,尽管能够应用 sudo
强制创立或者批改文件,然而这并不是权限的问题,是 mac 把这个文件夹进行关闭并且不倡议在此文件夹操作,所以上面的命令 仅仅实用 Linux 零碎。
for port in `seq 6000 6005`; do
docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} -v /usr/local/src/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf -v /usr/local/src/redis-cluster/${port}/data:/data --restart always --name redis-${port} --net redis-net --sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf;
done
针对这个问题,在 mac 的零碎中我做出了如下的调整(文件夹蕴含局部个人信息,已作解决):
for port in `seq 6000 6005`; do
docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} -v /Users/zxd/com/docker-redis/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf -v /Users/zxd/com/docker-redis/${port}/data:/data --restart always --name redis-${port} --net redis-net --sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf;
done
上面是局部的参数解释:
#-d 后盾运行返回容器 id
#-p 端口映射,留神在下面中两个 -p,前一个是启动端口,后一个是总线的通信端口
#-v 数据卷映射
#--net redis-net 自定义 network(redis-net)
#--sysctl net.core.somaxconn=1024 是 Linux 中的一个 kernel 参数,示意 socket 监听(listen)的 backlog 下限。它的次要作用是限度了接管新 TCP 连贯侦听队列的大小。对于一个常常解决新连贯的高负载 web 服务环境来说,默认的 128 太小了。大多数环境这个值倡议减少到 1024 或者更多
#redis redis-server /usr/local/etc/redis/redis.conf 应用配置文件开启一个 redis 服务的命令,留神这里的 redis.conf 实际上会映射到不同的文件夹中的 conf 中运行
7. 构建 redis 集群
构建集群的形式如下,验证是否能够应用,当然这里的 /usr/local/bin 应用的是对应的配置文件寄存地位。
留神须要把 ip 改为之前的模板配置的 ip 否则是无奈启动的
cd /usr/local/bin && redis-cli --cluster create 192.168.0.12:6000 192.168.0.12:6001 192.168.0.12:6002 192.168.0.12:6003 192.168.0.12:6004 ip:6005 --cluster-replicas 1
而后咱们运行 docker ps
呈现如下的后果,另外这里有可能存在因为端口没有凋谢的报错,然而因为我是本地搭建的,所以没有呈现此问题:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
deb9f97f6f0a redis "docker-entrypoint.s…" 33 hours ago Up 30 hours 0.0.0.0:6005->6005/tcp, 0.0.0.0:16005->16005/tcp, 6379/tcp redis-6005
b226de3d1fa1 redis "docker-entrypoint.s…" 33 hours ago Up 30 hours 0.0.0.0:6004->6004/tcp, 0.0.0.0:16004->16004/tcp, 6379/tcp redis-6004
c805e9704a1a redis "docker-entrypoint.s…" 33 hours ago Up 30 hours 0.0.0.0:6003->6003/tcp, 0.0.0.0:16003->16003/tcp, 6379/tcp redis-6003
fbae17f03f77 redis "docker-entrypoint.s…" 33 hours ago Up 30 hours 0.0.0.0:6002->6002/tcp, 0.0.0.0:16002->16002/tcp, 6379/tcp redis-6002
93e668ff8f2b redis "docker-entrypoint.s…" 33 hours ago Up 30 hours 0.0.0.0:6001->6001/tcp, 0.0.0.0:16001->16001/tcp, 6379/tcp redis-6001
9bdb2de54709 redis "docker-entrypoint.s…" 33 hours ago Up 30 hours 0.0.0.0:6000->6000/tcp, 0.0.0.0:16000->16000/tcp, 6379/tcp redis-6000
8. 验证集群是否可用
最初咱们通过连贯某一个节点验证集群是否胜利可用:
首先进入任意一个 Redis 容器内(CONTAINER ID 为容器 id)
docker exec -it deb9f97f6f0a(改为你的容器 ID)/bin/bash
而后进入 redis-cli(ip 为你服务器 ip)
redis-cli -h 192.168.0.12 -p 6000
查看节点音讯
cluster nodes
查看集群信息
cluster info
9. 验证集群散布
最初是理论输出几条简略的命令验证一下是否真的能够分片并且散布到多台机器进行解决
集群模式连贯:以下例子显示操作失常(首先要退出以后 redis-cli,而后再执行以下代码,ip 为你服务器 ip)。
redis-cli -c -h ip -p 6000 set test 1
redis-cli -c -h ip -p 6000 get test
其余补充
关闭系统防火墙
systemctl restart firewalld
重启 docker
systemctl restart docker
写在最初
内容比拟多,一次胜利的概率其实并不算很高,如果有疑难欢送评论。