docker搭建redis集群
前提:系统已经安装docker-ce,给当前用户赋予/data的权限
下面有两种方式创建:
公共部分
docker拉取redis的镜像,这里以:redis(6.0.12)为例
docker pull redis:6.0.12
先提前开放防火墙-否则会在启动服务的时候失败:
开启防火墙 7001-7006是对外的端口,17001-17006是docker的端口
for port in `seq 7001 7006`; do \
firewall-cmd --zone=public --remove-port=${port}/tcp --permanent
done
for port in `seq 17001 17006`; do \
firewall-cmd --zone=public --remove-port=${port}/tcp --permanent
done
firewall-cmd --reload
一、单机版redis
限制内存等,redis的命令可以放在后面
docker run -d -m 512M --memory-swap -1 --name redis -p 6379:6379 redis:6.0.8 --requirepass "password"
二、集群
2.1 根据配置文件搭建
2.1.1 创建配置文件
创建存放配置文件的文件夹
cd /home/docker
mkdir /redis
vi cluster.tmpl
将下面的配置粘贴,wq保存退出
#rdb备份 默认是开启的
#save 900 1
#save 300 10
#save 60 10000
#设置外部网络连接redis服务,默认是yes,即开启。开启protected-mode保护模式,需配置bind ip或者设置访问密码,关闭protected-mode模式,此时外部网络可以直接访问
protected-mode no
#指定redis是否要用守护线程的方式启动,默认no
daemonize no
#端口号
port ${PORT}
#设置集群节点间访问密码,跟下面一致
masterauth 12345678
#设置redis访问密码
requirepass 12345678
#启动集群模式
cluster-enabled yes
#集群节点信息文件
cluster-config-file nodes.conf
#redis节点宕机被发现的时间
cluster-node-timeout 5000
#集群节点的汇报ip,防止nat,预先填写为网关ip后续需要手动修改配置文件
cluster-announce-ip 127.0.0.1
#集群节点的汇报port,防止nat
cluster-announce-port ${PORT}
#集群节点的汇报bus-port,防止nat
cluster-announce-bus-port 1${PORT}
#最大连接数,默认10000
maxclients 30000
#开启aof
appendonly yes
2.1.2 生成节点配置文件信息
注意文件的权限问题
for port in `seq 7001 7006`; do \
mkdir -p ${port}/conf \
&& PORT=${port} envsubst < cluster.tmpl > ${port}/conf/redis.conf \
&& mkdir -p ${port}/data; \
done
2.1.3 创建并启动镜像
注意参数--restart always表示容器启动的时候会自动启动,但是会一直重启,unless-stopped如果启动失败则不会再重启
for port in `seq 7001 7006`; do
docker run -d --net=host -v /home/docker/redis/${port}/conf/redis.conf:/etc/redis/redis.conf -v /home/docker/redis/${port}/data:/data --restart unless-stopped --name=redis-${port} redis:6.0.12 redis-server /etc/redis/redis.conf;
done
2.1.4 容器启动问题(只是警告可以忽略)
启动镜像的时候可能会失败,通过下面命令进行日志查看
#查看指定时间后的日志,只显示最后100行
docker logs -f -t --since="2021-04-19" --tail=100 CONTAINER_ID
#查看当前容器30分钟内的日志
docker logs --since 30m CONTAINER_ID
#查看某时间段日志
docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" CONTAINER_ID
2.1.5 异常处理
WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
解决方法
vi /etc/sysctl.conf
#增加一行
net.core.somaxconn= 1024
#生效
sysctl -p
WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
解决方法
vi /etc/sysctl.conf
#增加一行
vm.overcommit_memory = 1
#生效
sysctl -p
WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo madvise > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled (set to 'madvise' or 'never').
解决方法
vi /etc/sysctl.conf
#增加
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
2.2 不使用配置文件
2.2.1 创建镜像
直接执行以下命令:
docker create --name redis-7001 --net host -v /data/redis-data/node1:/data redis:6.0.12 --cluster-enabled yes --cluster-node-timeout 5000 --appendonly yes --cluster-config-file --restart always nodes-node-1.conf --port 7001
docker create --name redis-7002 --net host -v /data/redis-data/node2:/data redis:6.0.12 --cluster-enabled yes --cluster-node-timeout 5000 --appendonly yes --cluster-config-file --restart always nodes-node-2.conf --port 7002
docker create --name redis-7003 --net host -v /data/redis-data/node3:/data redis:6.0.12 --cluster-enabled yes --cluster-node-timeout 5000 --appendonly yes --cluster-config-file --restart always nodes-node-3.conf --port 7003
docker create --name redis-7004 --net host -v /data/redis-data/node4:/data redis:6.0.12 --cluster-enabled yes --cluster-node-timeout 5000 --appendonly yes --cluster-config-file --restart always nodes-node-4.conf --port 7004
docker create --name redis-7005 --net host -v /data/redis-data/node5:/data redis:6.0.12 --cluster-enabled yes --cluster-node-timeout 5000 --appendonly yes --cluster-config-file --restart always nodes-node-5.conf --port 7005
docker create --name redis-7006 --net host -v /data/redis-data/node6:/data redis:6.0.12 --cluster-enabled yes --cluster-node-timeout 5000 --appendonly yes --cluster-config-file --restart always nodes-node-6.conf --port 7006
2.2.2 启动镜像
docker start redis-node1 redis-node2 redis-node3 redis-node4 redis-node5 redis-node6
三、公共:执行集群指令
#进入随便一个节点
docker exec -it redis-7001 bash
#创建集群组,cluster-replicas参数是按比例创建主从集群,如6个节点,比例为1,则主节点为3个,从节点为3个
#如果是公网ip,需要改成公网ip的地址,这里必须要使用-a 才能成功,如果使用-u则没有权限
redis-cli -a 12345678 --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1
#查看集群情况
redis-cli -a 12345678 -h 127.0.0.1 -p 7001
#如果没有权限
auth 密码
cluster nodes
删除镜像
for port in `seq 7001 7006`; do \
docker stop redis-${port};
docker rm redis-${port};
done