Docker多机集群部署之Redis集群(redis-cluster)

一、环境说明:

宿主机:Win10

虚拟机工具:VMware Workstation 15

系统及版本:Ubuntu16.04

Docker版本:18.09.3

Redis image版本:5.0.4

涉及到的虚拟主机:(部署三个节点六个服务)

192.168.1.101 redis-9001 和 redis-9002

192.168.1.102 redis-9003 和 redis-9004

192.168.1.103 redis-9005 和 redis-9006


二、创建本地目录及所需配置文件(所有节点)

# 创建本地目录

mkdir -p /docker/redis


# 在 /docker/redis下创建配置文件redis-cluster.tmpl,内容如下:

# 开放的端口

port ${PORT}

# 关闭保护模式

protected-mode no

# 开启集群

cluster-enabled yes

# 集群配置文件(集群自己管理)

cluster-config-file nodes.conf

# 集群连接超时时间

cluster-node-timeout 15000

# 本机服务器地址

cluster-announce-ip 192.168.1.101

# 集群端口

cluster-announce-port ${PORT}

# 集群交互端口

cluster-announce-bus-port 1${PORT}

# 开启aof日志

appendonly yes

# 日志文件地址

logfile "./redis.log"


# 进入/docker/redis目录,生成conf、data文件夹和配置信息

# 说明:每个节点生产2个文件夹共6个,从9001到9006,每个文件夹下包含data和conf文件夹,同时conf里面有已经指定端口和ip的redis.conf配置文件

# 第一个节点(192.168.1.101):

for port in `seq 9001 9002`; do \

  mkdir -p ./${port}/conf \

  && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \

  && mkdir -p ./${port}/data; \

done


第二个节点(192.168.1.102):

for port in `seq 9003 9004`; do \

  mkdir -p ./${port}/conf \

  && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \

  && mkdir -p ./${port}/data; \

done

第三个节点(192.168.1.103):

for port in `seq 9005 9006`; do \

  mkdir -p ./${port}/conf \

  && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \

  && mkdir -p ./${port}/data; \

done


三、解决启动容器可能引起的警告问题(所有节点执行)

sysctl vm.overcommit_memory=1

sysctl -p 生效

echo never > /sys/kernel/mm/transparent_hugepage/enabled

并将这句指令添加到/etc/rc.local保证重启后依然生效


四、创建容器

# 所有节点创建自定义network(因为每个节点有两个redis容器,所以需要创建自定网络,如果每个主机只有一个redis容器则直接在创建容器时指定--net host即可)

docker network create redis-net


# 创建redis容器

# 第一个节点(192.168.1.101):

for port in `seq 9001 9002`; do \

  docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} \

  -v /docker/redis/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf:rw \

  -v /docker/redis/${port}/data:/data:rw \

  --restart always --name redis-${port} --net redis-net \

  --sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf; \

done


# 第二个节点(192.168.1.102):

for port in `seq 9003 9004`; do \

  docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} \

  -v /docker/redis/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf:rw \

  -v /docker/redis/${port}/data:/data:rw \

  --restart always --name redis-${port} --net redis-net \

  --sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf; \

done


# 第三个节点(192.168.1.103):

for port in `seq 9005 9006`; do \

  docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} \

  -v /docker/redis/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf:rw \

  -v /docker/redis/${port}/data:/data:rw \

  --restart always --name redis-${port} --net redis-net \

  --sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf; \

done

# 至此,容器创建成功


五、启动集群

docker run -it --link redis-9001:redis --net redis-net --rm redis redis-cli --cluster create 192.168.1.101:9001 192.168.1.101:9002 192.168.1.102:9003 192.168.1.102:9004 192.168.1.103:9005 192.168.1.103:9006 --cluster-replicas 1

# 出现如下信息表示启动成功:

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.


六、测试集群

# 进入容器

docker exec -it redis容器编号 bash

# 进入指定端口操作redis

redis-cli -p 9001


# 说明:

1、redis-cli -p 9001 -c 可以进入指定端口并且自动重定向操作redis:如果key-value值不存在9001对应的redis上,那么加上-c那个可以重定向取到值

2、如果要在slave容器上读取数据,需要加上readonly指令


# 查看整个集群部署状况

redis-cli --cluster check 192.168.1.101:9001


# 查看某个节点集群状态

redis-cli -p 9001

cluster info


集群管理参看博客

https://blog.51cto.com/8370646/2309693

查看整个集群部署状况

redis-cli --cluster check 192.168.1.101:9001

查看某个节点集群状态

redis-cli -p 9002

cluster info


七、注意点:

如果一直Waiting for the cluster to join ......

大部分是端口问题,除了开放集群的端口还要开放集群端口+10000端口来保证集群之间的通信

iptables -F 清除防火墙规则,测试使用,生产谨慎谨慎(详细根据自己业务配置)


redis集群管理参考博客 https://blog.51cto.com/8370646/2309693

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容