Docker启动redis服务以及搭建redis集群
Posted @Kerry~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker启动redis服务以及搭建redis集群相关的知识,希望对你有一定的参考价值。
单体redis启动
下载redis 镜像 docker pull redis 由于docker 镜像的redis是精简版本的 所以没有配置文件和数据存储目录,需要在启动容器时候做映射,把自己配置好redis配置文件,通过数据卷挂载进来,再次以配置文件启动redis容器服务。 下载redis 配置文件 wget http://download.redis.io/redis-stable/redis.conf 配置文件相关配置信息 bind 127.0.0.1 #注释掉这部分,这是限制redis只能本地访问 protected-mode no #默认yes,开启保护模式,限制为本地访问 daemonize no#默认no,改为yes意为以守护进程方式启动,可后台运行,除非kill进程,改为yes会使配置文件方式启动redis失败 databases 16 #数据库个数(可选),我修改了这个只是查看是否生效。。 dir ./ #输入本地redis数据库存放文件夹(可选) appendonly yes #redis持久化(可选) 启动命令 [root@iZ2ze4zc54bfy36wjglfqsZ redis-02]# docker run -d -p 2627:6379 --name ymbredis-02 -v /myredis/redis-02/redis.conf:/etc/redis/redis.conf -v /myredis/redis-02/data:/data redis redis-server /etc/redis/redis.conf --appendonly yes
有些人启动 redis 服务 会马上挂掉,原因是:检查配置文件是否设置了daemonize yes,如果是,就要改为daemonize no,因为该选项让redis成为在后台运行的守护进程,而docker容器必须要有一个前台进程才能留存。
Redis搭建集群
在docker 上面搭建 redis 集群,采用 分片 + 高可用 + 集群
- 第一步:清除docker里面的环境
删除所有容器 确保在干净环境下测试 [root@iZ2ze4zc54bfy36wjglfqsZ /]# docker rm -f $(docker ps -aq)
- 第二步:创建 redis 网络
[root@iZ2ze4zc54bfy36wjglfqsZ /]# docker network create --driver bridge --subnet 172.16.0.0/16 --gateway 172.16.0.1 redis 查看网络 [root@iZ2ze4zc54bfy36wjglfqsZ /]# docker network inspect redis
- 第三步:shell 脚本 创建redis配置文件
for port in $(seq 1 6); \\ do \\ mkdir -p /mydata/redis/node-${port}/conf touch /mydata/redis/node-${port}/conf/redis.conf cat << EOF >/mydata/redis/node-${port}/conf/redis.conf port 6379 bind 0.0.0.0 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 cluster-announce-ip 172.16.0.1${port} #注意这里需要和你定义的网络 网段一样 172.16~ cluster-announce-port 6379 cluster-announce-bus-port 16379 appendonly yes EOF done 参数说明 port:节点端口; requirepass:添加访问认证; masterauth:如果主节点开启了访问认证,从节点访问主节点需要认证; protected-mode:保护模式,默认值 yes,即开启。开启保护模式以后,需配置 bind ip 或者设置访问密码;关闭保护模式,外部网络可以直接访问; daemonize:是否以守护线程的方式启动(后台启动),默认 no; appendonly:是否开启 AOF 持久化模式,默认 no; cluster-enabled:是否开启集群模式,默认 no; 这个是集群的关键参数 cluster-config-file:集群节点信息文件; cluster-node-timeout:集群节点连接超时时间; cluster-announce-ip:集群节点 IP,填写宿主机的 IP;节点绑定的ip地址 cluster-announce-port:集群节点映射端口; cluster-announce-bus-port:集群节点总线端口。
每个 Redis 集群节点都需要打开两个 TCP 连接。一个用于为客户端提供服务的正常 Redis TCP 端口,例如 6379。还有一个基于 6379 端口加 10000 的端口,比如 16379。
第二个端口用于 集群总线,这是一个使用二进制协议的节点到节点通信通道。节点使用集群总线进行故障检测、配置更新、故障转移授权等等。客户端永远不要尝试与集群总线端口通信,与正常的 Redis 命令端口通信即可,但是请确保防火墙中的这两个端口都已经打开,否则 Redis 集群节点将无法通信。
- 第四步:shell 脚本 运行docker redis 服务容器
for port in $(seq 1 6); \\ do \\ docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \\ -v /mydata/redis/node-${port}/data:/data \\ -v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \\ -d --net redis --ip 172.16.0.1${port} redis redis-server /etc/redis/redis.conf; done
- 第五步:进入其中一个 redis 服务容器中 并且搭建 redis 集群操作
进入 其中一个 redis 服务容器 docker exec -it redis-1 /bin/sh 搭建 redis 集群 redis-cli --cluster create 172.16.0.11:6379 172.16.0.12:6379 172.16.0.13:6379 172.16.0.14:6379 172.16.0.15:6379 172.16.0.16:6379 --cluster-replicas 1 注意ip 和端口的映射 回车 回复 yes 完成
- 第六步:查看相关 redis 集群相关信息
集群模式连接 redis redis-cli -c ( -c 是集群连接) 查看redis 信息 cluster info # redis-cli -c 127.0.0.1:6379> cluster info cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:1 cluster_stats_messages_ping_sent:619 cluster_stats_messages_pong_sent:616 cluster_stats_messages_sent:1235 cluster_stats_messages_ping_received:611 cluster_stats_messages_pong_received:619 cluster_stats_messages_meet_received:5 cluster_stats_messages_received:1235 查看节点信息 cluster nodes 127.0.0.1:6379> cluster nodes c0c34d5635227297a5dbcc9cd087d787c407f3ce 172.16.0.11:6379@16379 myself,master - 0 1628594340000 1 connected 0-5460 1f240376792bbbaaf839aefd0c9f9b4f042e9a55 172.16.0.15:6379@16379 slave c0c34d5635227297a5dbcc9cd087d787c407f3ce 0 1628594340090 1 connected 41330caeb32481b870e90d1754074ffc2e34a67a 172.16.0.14:6379@16379 slave b41507c5a42a95f4724eed6fab98920a24e28eeb 0 1628594339584 3 connected 4ebe17d5433f84f6c261d1bdac87c0560da4e20a 172.16.0.12:6379@16379 master - 0 1628594340592 2 connected 5461-10922 b41507c5a42a95f4724eed6fab98920a24e28eeb 172.16.0.13:6379@16379 master - 0 1628594340000 3 connected 10923-16383 fb230f0d0ace5d51e8ce6f12ec1c0df4938a5597 172.16.0.16:6379@16379 slave 4ebe17d5433f84f6c261d1bdac87c0560da4e20a 0 1628594339584 2 connected 127.0.0.1:6379>
- 第七步:检测是否搭建成功
测试redis 集群是否搭建成功 127.0.0.1:6379> set aa bb 默认进入了 redis-1 就是 172.16.0.11 OK 127.0.0.1:6379> set hh lol -> Redirected to slot [12077] located at 172.16.0.13:6379 证明当前是 存储到了 redis-3中 OK 172.16.0.13:6379> 用另外一个窗口 把redis-3 容器服务停止 docker stop redis-3 再次回到redis 连接 获取 发现数据放到了 14 127.0.0.1:6379> get hh -> Redirected to slot [12077] located at 172.16.0.14:6379 "lol" 172.16.0.14:6379>
再次查看节点信息 发现redis-3 已经是 master,fail 状态了
搭建成功了!
以上是关于Docker启动redis服务以及搭建redis集群的主要内容,如果未能解决你的问题,请参考以下文章