一、前言

redis集群对于很多人来说非常熟悉,在前些日子,我也有一位大兄弟也发布过一篇关于在阿里云(centOS7)上搭建redis 集群的文章,虽然集群搭建的文章在网上很多,我比较喜欢这篇文章的地方是他在搭建过程中,指出一些我们会遇到而别人没有指出的问题。

在这里,我同样带给大家一遍关于阿里云(centOS7)redis集群搭建的文章,但是这次搭建有所不同的是,它是在docker上搭建的redis集群。

环境说明

采用单机部署

操作系统 ip docker版本 redis版本
centos 7.6 192.168.31.150

19.03.5

4.0.10

二、准备镜像

docker pull redis:4.0.
docker pull ruby

说明:ruby用是来做加入集群的用的,仅一次使用。

三、搭建

创建redis配置文件

mkdir -p /data/redis-cluster
vi /data/redis-cluster/redis-cluster.tmpl

内容如下:

port ${PORT}
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout
cluster-announce-ip 192.168.31.150
cluster-announce-port ${PORT}
cluster-announce-bus-port ${PORT}
appendonly no

注意:ip地址修改为本机ip

配置文件解释

port ${PORT}                        ##节点端口
protected-mode no #关闭protected-mode模式,外部网络可以直接访问
cluster-enabled yes ##cluster集群模式
cluster-config-file nodes.conf ##集群配置名
cluster-node-timeout ##超时时间
cluster-announce-ip 192.168.31.150 ##实际为各节点网卡分配ip 先用上网关ip代替
cluster-announce-port ${PORT} ##节点映射端口
cluster-announce-bus-port ${PORT} ##节点总线端
appendonly no ##持久化模式

备注:此模版文件为集群节点通用文件 其中${PORT} 将读取命令行变量

创建自定义network

docker network create redis-net

生成配置文件

生成conf和data目录,并生成配置信息

for port in `seq  `; do \
mkdir -p ./${port}/conf \
&& PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \
&& mkdir -p ./${port}/data; \
done

共生成6个文件夹,从7000到7005,每个文件夹下包含data和conf文件夹,同时conf里面有redis.conf配置文件

创建容器

创建6个redis容器

for port in `seq  `; do \
docker run -d -ti -p ${port}:${port} -p ${port}:${port} \
-v /data/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /data/redis-cluster/${port}/data:/data \
--restart always --name redis-${port} --net redis-net \
--sysctl net.core.somaxconn= redis:4.0. redis-server /usr/local/etc/redis/redis.conf; \
done

至此,通过命令docker ps可查看刚刚生成的6个容器信息

四、创建集群

通过启动ruby来实现集群

echo yes | docker run -i --rm --net redis-net ruby sh -c '\
gem install redis \
&& wget http://download.redis.io/releases/redis-4.0.10.tar.gz \
&& tar xvf redis-4.0..tar.gz && cd redis-4.0./src \
&& ruby redis-trib.rb create --replicas \
'"$(for port in `seq 7000 7005`; do \
echo -n "$(docker inspect --format '{{ (index .NetworkSettings.Networks "redis-net").IPAddress }}' "redis-${port}")":${port} ' ' ; \
done)"

它其实就是调用了命令:

ruby redis-trib.rb create --replicas 1 172.18.0.2:7000  172.18.0.3:7001  172.18.0.4:7002  172.18.0.5:7003  172.18.0.6:7004  172.18.0.7:7005  

输出如下:

...
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join..
>>> Performing Cluster Check (using node 172.18.0.2:)
M: a779c88a19a2582620d0a1ad3f90431f92f91af5 172.18.0.2:
slots:- ( slots) master
additional replica(s)
M: 880a2b0671d0ff15192e758ff7204ccf15f52cd0 192.168.31.150:
slots:- ( slots) master
additional replica(s)
S: 3b04d5b6bcd86efaaceb2002087729bcb9bb1c07 192.168.31.150:
slots: ( slots) slave
replicates 5e33b75081c76bfc677e1941fdc2577709280f77
M: 5e33b75081c76bfc677e1941fdc2577709280f77 192.168.31.150:
slots:- ( slots) master
additional replica(s)
S: dad167c467186794e5095b58a0f43e443ff692fb 192.168.31.150:
slots: ( slots) slave
replicates 880a2b0671d0ff15192e758ff7204ccf15f52cd0
S: fa3775cbcdd0512de4fe2c208de1046b5369e0b3 192.168.31.150:
slots: ( slots) slave
replicates a779c88a19a2582620d0a1ad3f90431f92f91af5
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All slots covered.

能看到3主3从,说明集群成功了。

查看集群信息

# docker exec -it redis-7000 /bin/bash -c "redis-cli -p 7000 cluster nodes"
880a2b0671d0ff15192e758ff7204ccf15f52cd0 192.168.31.150:@ master - connected -
3b04d5b6bcd86efaaceb2002087729bcb9bb1c07 192.168.31.150:@ slave 5e33b75081c76bfc677e1941fdc2577709280f77 connected
5e33b75081c76bfc677e1941fdc2577709280f77 192.168.31.150:@ master - connected -
dad167c467186794e5095b58a0f43e443ff692fb 192.168.31.150:@ slave 880a2b0671d0ff15192e758ff7204ccf15f52cd0 connected
fa3775cbcdd0512de4fe2c208de1046b5369e0b3 192.168.31.150:@ slave a779c88a19a2582620d0a1ad3f90431f92f91af5 connected
a779c88a19a2582620d0a1ad3f90431f92f91af5 192.168.31.150:@ myself,master - connected -

测试写入和读取

# docker exec -it redis-7000 /bin/bash
127.0.0.1:> set a 123
-> Redirected to slot [] located at 192.168.31.150:
OK
192.168.31.150:> get a
“”
192.168.31.150:>

本文参考链接:
https://www.cnblogs.com/lianggp/articles/8136222.html
https://blog.csdn.net/qq_22211217/article/details/80436996

注意:参考链接中的redis-trib.rb,不能使用了。已经更新了!

所以,必须得用redis源码中的redis-trib.rb

docker redis4.0集群搭建的更多相关文章

  1. docker redis4.0 集群(cluster)搭建

    前言 redis集群对于很多人来说非常熟悉,在前些日子,我也有一位大兄弟也发布过一篇关于在阿里云(centOS7)上搭建redis 集群的文章,虽然集群搭建的文章在网上很多,我比较喜欢这篇文章的地方是 ...

  2. Docker Swarm redis 集群搭建

    Docker Swarm redis 集群搭建 环境1: 系统:Linux Centos 7.4 x64 内核:Linux docker 3.10.0-693.2.2.el7.x86_64 Docke ...

  3. Redis 3.0 集群搭建

    Redis 3.0 集群搭建 开启两个虚拟机 分别在两个虚拟机上开启3个Redis实例 3主3从两个虚拟机里的实例互为主备 下面分别在两个虚拟机上安装,网络设置参照codis集群的前两个主机 分别关闭 ...

  4. Redis 5.0 集群搭建

    Redis 5.0 集群搭建 单机版的 Redis 搭建 https://www.jianshu.com/p/b68e68bbd725 /usr/local/目录 mkdir redis-cluste ...

  5. Ubuntu 12.04下Hadoop 2.2.0 集群搭建(原创)

    现在大家可以跟我一起来实现Ubuntu 12.04下Hadoop 2.2.0 集群搭建,在这里我使用了两台服务器,一台作为master即namenode主机,另一台作为slave即datanode主机 ...

  6. Docker下ETCD集群搭建

    搭建集群之前首先准备两台安装了CentOS 7的主机,并在其上安装好Docker. Master 10.100.97.46 Node 10.100.97.64 ETCD集群搭建有三种方式,分别是Sta ...

  7. centos7/rhel7下安装redis4.0集群

    相关介绍:Redis从3.0版本开始支持集群! 集群一般由多个节点组成,节点数量至少6个才能保证组成完整高可用的集群. 每个节点需要开启配置文件中的cluster-enabled yes,让Redis ...

  8. centos下hadoop2.6.0集群搭建详细过程

    一 .centos集群环境配置 1.创建一个namenode节点,5个datanode节点 主机名 IP namenodezsw 192.168.129.158 datanode1zsw 192.16 ...

  9. redis3.0集群搭建

    生产环境中准备使用redis3.0集群了,花了一天时间研究了一下,下面记录一下集群搭建的过程. 服务器规划: 192.168.116.129    7000,7003 192.168.116.130 ...

随机推荐

  1. lg4820 书堆

    题目链接 题意概述:n本书,在桌子边缘堆放,求最长长度. 首先……我们需要一点初中物理知识来推一下规律. 下图是一本书的情况,一本书时书伸出1/2处于临界状态,显然. 两本书时,把两本书看作整体,则有 ...

  2. nginx 反向代理之 负载均衡

    Nginx通过upstream和proxy_pass实现了负载均衡.本质上也是Nginx的反向代理功能,只不过后端的server为多个. 案例一(简单的轮询): upstream www { serv ...

  3. 如何实现大麦场在线选座 svg js

    本实例来源于此网站,内有Demo,可查看 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  4. 「NOIP2016」换教室

    传送门 Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 $ 2n $ 节课程安排在 $ n $ 个时间段上.在第 $ i ...

  5. 如何设置select只读不可编辑且select的值可传递(摘自百度)

    selectname="role"id="role"οnfοcus="this.defaultIndex=this.selectedIndex;&qu ...

  6. R 语言处理excel为data.frame

    使用 R包 xlsx 或者 openxlsx 安装 install.packages("xlsx", repos="https://cloud.r-project.org ...

  7. MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!

    转:https://mp.weixin.qq.com/s/CEJFsDBizdl0SvugGX7UmQ 不知道从什么时候开始,网上流传着这么一个说法: MySQL的WHERE子句中包含 IS NULL ...

  8. (转)Ngx_Lua使用分享

    原文:https://www.cnblogs.com/yanzi-meng/p/9450999.html ngx_lua 模块详细讲解(基于openresty)---https://www.cnblo ...

  9. Android设置顶部banner背景透明度时影响全局背景问题

    项目中用到滑动界面使顶部title栏背景渐隐渐现的效果,即初始不滑动时的透明度为0,用了bannerle.getBackground().setAlpha(0); 但使用这个方法设置透明度是管用,返回 ...

  10. C# 动态创建EXE

    1.创建项目SaveExe或者修改代码中SaveExe名字为自己的项目 2.添加按钮调用CreateCodeEXE,即可实现编译生成一个新的exe即 复制了自身的exe生成一个新的exe(目的就是新生 ...