• REDIS_PORT=8004

ports:

  • ‘8004:8004’

  • ‘18004:18004’

redis5:

image: publicisworldwide/redis-cluster

restart: always

volumes:

  • /data/redis/8005/data:/data

environment:

  • REDIS_PORT=8005

ports:

  • ‘8005:8005’

  • ‘18005:18005’

redis6:

image: publicisworldwide/redis-cluster

restart: always

volumes:

  • /data/redis/8006/data:/data

environment:

  • REDIS_PORT=8006

ports:

  • ‘8006:8006’

  • ‘18006:18006’

创建文件后,直接启动服务

窗口模式

docker-compose up

后台进程

docker-compose up -d

查看启动的进程

[root@localhost redis-cluster]# docker-compose ps

Name Command State Ports


rediscluster_redis1_1 /usr/local/bin/entrypoint. … Up

rediscluster_redis2_1 /usr/local/bin/entrypoint. … Up

rediscluster_redis3_1 /usr/local/bin/entrypoint. … Up

rediscluster_redis4_1 /usr/local/bin/entrypoint. … Up

rediscluster_redis5_1 /usr/local/bin/entrypoint. … Up

rediscluster_redis6_1 /usr/local/bin/entrypoint. … Up

状态为Up,说明服务均已启动,镜像无问题。

注意:以上镜像不能设置永久密码,其实redis一般是内网访问,可以不需密码。

二、redis容器集群配置

上面只是启动了6个redis容器,并没有设置集群,通过下面的命令可以设置集群。

docker run --rm -it inem0o/redis-trib create --replicas 1 172.19.165.222:8001 172.19.165.222:8002 172.19.165.222:8003 172.19.165.222:8004 172.19.165.222:8005 172.19.165.222:8006

这里同样使用了另一个镜像inem0o/redis-trib,执行时会自动下载。

日志如下

[root@localhost disconf]# docker run --rm -it inem0o/redis-trib create --replicas 1 172.19.165.222:8001 172.19.165.222:8002 172.19.165.222:8003 172.19.165.222:8004 172.19.165.222:8005 172.19.165.222:8006

Unable to find image ‘inem0o/redis-trib:latest’ locally

latest: Pulling from inem0o/redis-trib

a2b2998a36ab: Pull complete

a3ed95caeb02: Pull complete

46ab6b64c08e: Pull complete

3d82c3ac2025: Pull complete

Digest: sha256:0b89d25b387f70ef1c54605bdf061dd86e0833dbc0e2149390570b8b372278f8

Status: Downloaded newer image for inem0o/redis-trib:latest

Creating cluster

Performing hash slots allocation on 6 nodes…

Using 3 masters:

172.19.165.222:8001

172.19.165.222:8002

172.19.165.222:8003

Adding replica 172.19.165.222:8004 to 172.19.165.222:8001

Adding replica 172.19.165.222:8005 to 172.19.165.222:8002

Adding replica 172.19.165.222:8006 to 172.19.165.222:8003

M: 67d9a6bb6875f3a0f9a53e5bb05ddeca8e656950 172.19.165.222:8001

slots:0-5460 (5461 slots) master

M: 206626063f31dcd7e69010ce13c258e786197f1e 172.19.165.222:8002

slots:5461-10922 (5462 slots) master

M: e9924018d95772b8ff535f6bc0605a6630837069 172.19.165.222:8003

slots:10923-16383 (5461 slots) master

S: 548f4e65fbab8dcde8aac187849d50983d68599d 172.19.165.222:8004

replicates 67d9a6bb6875f3a0f9a53e5bb05ddeca8e656950

S: 0a5c799c1f8fed083c50902639fc354e4c25aa8c 172.19.165.222:8005

replicates 206626063f31dcd7e69010ce13c258e786197f1e

S: 94e2530ddd05b0e9eb3e71a9616342bd6647a5e6 172.19.165.222:8006

replicates e9924018d95772b8ff535f6bc0605a6630837069

Can I set the above configuration? (type ‘yes’ to accept): yes

Nodes configuration updated

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.19.165.222:8001)

M: 67d9a6bb6875f3a0f9a53e5bb05ddeca8e656950 172.19.165.222:8001

slots:0-5460 (5461 slots) master

1 additional replica(s)

S: 94e2530ddd05b0e9eb3e71a9616342bd6647a5e6 172.19.165.222:8006@18006

slots: (0 slots) slave

replicates e9924018d95772b8ff535f6bc0605a6630837069

S: 0a5c799c1f8fed083c50902639fc354e4c25aa8c 172.19.165.222:8005@18005

slots: (0 slots) slave

replicates 206626063f31dcd7e69010ce13c258e786197f1e

M: e9924018d95772b8ff535f6bc0605a6630837069 172.19.165.222:8003@18003

slots:10923-16383 (5461 slots) master

1 additional replica(s)

M: 206626063f31dcd7e69010ce13c258e786197f1e 172.19.165.222:8002@18002

slots:5461-10922 (5462 slots) master

1 additional replica(s)

S: 548f4e65fbab8dcde8aac187849d50983d68599d 172.19.165.222:8004@18004

slots: (0 slots) slave

replicates 67d9a6bb6875f3a0f9a53e5bb05ddeca8e656950

[OK] All nodes agree about slots configuration.

Check for open slots…

Check slots coverage…

[OK] All 16384 slots covered.

可以看到设置了3个Master,3个Slave,若想测试下集群,可以参考【Redis-Cluster集群

只需二步就完成了集群的部署,但上面是使用了别人的镜像,若是要自己创建镜像该如何呢?

手动创建镜像

编写Dockerfile

#基础镜像

FROM redis

#修复时区

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

RUN echo ‘Asia/Shanghai’ >/etc/timezone

#环境变量

ENV REDIS_PORT 8000

#ENV REDIS_PORT_NODE 18000

#暴露变量

EXPOSE $REDIS_PORT

#EXPOSE $REDIS_PORT_NODE

#复制

COPY entrypoint.sh /usr/local/bin/

COPY redis.conf /usr/local/etc/

#for config rewrite

RUN chmod 777 /usr/local/etc/redis.conf

RUN chmod +x /usr/local/bin/entrypoint.sh

#入口

ENTRYPOINT [“/usr/local/bin/entrypoint.sh”]

#命令

CMD [“redis-server”, “/usr/local/etc/redis.conf”]

编写shell文件entrypoint.sh

#!/bin/sh

#只作用于当前进程,不作用于其创建的子进程

set -e

#$0–Shell本身的文件名 $1–第一个参数 $@–所有参数列表

allow the container to be started with --user

if [ “ 1 " = ′ r e d i s − s e r v e r ′ − a " 1" = 'redis-server' -a " 1"=redisservera"(id -u)” = ‘0’ ]; then

sed -i ‘s/REDIS_PORT/’$REDIS_PORT’/g’ /usr/local/etc/redis.conf

chown -R redis . #改变当前文件所有者

exec gosu redis “ 0 " " 0" " 0""@” #gosu是sudo轻量级”替代品”

fi

exec “$@”

编写redis.conf

#端口

port REDIS_PORT

#开启集群

cluster-enabled yes

#配置文件

cluster-config-file nodes.conf

cluster-node-timeout 5000

#更新操作后进行日志记录

appendonly yes

#设置主服务的连接密码

masterauth

#设置从服务的连接密码

requirepass

注意:

  • requirepass和masterauth不能启用,否则redis-trib创建集群失败。

  • protected-mode 保护模式是禁止公网访问,但是不能设置密码和bind ip。

以上编写了3个文件,其实可以创建镜像了,不过也可以在docker-compose中自动创建。

编写docker-compose.yml文件

version: ‘3’

services:

redis1:

build: ./

restart: always

volumes:

  • /data/redis/8001/data:/data

environment:

  • REDIS_PORT=8001

ports:

  • ‘8001:8001’ #服务端口

  • ‘18001:18001’ #集群端口

redis2:

build: ./

restart: always

volumes:

  • /data/redis/8002/data:/data

environment:

  • REDIS_PORT=8002

ports:

  • ‘8002:8002’

  • ‘18002:18002’

redis3:

build: ./

restart: always

volumes:

  • /data/redis/8003/data:/data

environment:

  • REDIS_PORT=8003

ports:

  • ‘8003:8003’

  • ‘18003:18003’

redis4:

build: ./

restart: always

volumes:

  • /data/redis/8004/data:/data

environment:

  • REDIS_PORT=8004

ports:

  • ‘8004:8004’

  • ‘18004:18004’

redis5:

build: ./

restart: always

volumes:

  • /data/redis/8005/data:/data

environment:

  • REDIS_PORT=8005

先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以扫码领取!

img

总结

我个人认为,如果你想靠着背面试题来获得心仪的offer,用癞蛤蟆想吃天鹅肉形容完全不过分。想必大家能感受到面试越来越难,想找到心仪的工作也是越来越难,高薪工作羡慕不来,却又对自己目前的薪资不太满意,工作几年甚至连一个应届生的薪资都比不上,终究是错付了,错付了自己没有去提升技术。

这些面试题分享给大家的目的,其实是希望大家通过大厂面试题分析自己的技术栈,给自己梳理一个更加明确的学习方向,当你准备好去面试大厂,你心里有底,大概知道面试官会问多广,多深,避免面试的时候一问三不知。

大家可以把Java基础,JVM,并发编程,MySQL,Redis,Spring,Spring cloud等等做一个知识总结以及延伸,再去进行操作,不然光记是学不会的,这里我也提供一些脑图分享给大家:

希望你看完这篇文章后,不要犹豫,抓紧学习,复习知识,准备在明年的金三银四拿到心仪的offer,加油,打工人!

总结

我个人认为,如果你想靠着背面试题来获得心仪的offer,用癞蛤蟆想吃天鹅肉形容完全不过分。想必大家能感受到面试越来越难,想找到心仪的工作也是越来越难,高薪工作羡慕不来,却又对自己目前的薪资不太满意,工作几年甚至连一个应届生的薪资都比不上,终究是错付了,错付了自己没有去提升技术。

这些面试题分享给大家的目的,其实是希望大家通过大厂面试题分析自己的技术栈,给自己梳理一个更加明确的学习方向,当你准备好去面试大厂,你心里有底,大概知道面试官会问多广,多深,避免面试的时候一问三不知。

大家可以把Java基础,JVM,并发编程,MySQL,Redis,Spring,Spring cloud等等做一个知识总结以及延伸,再去进行操作,不然光记是学不会的,这里我也提供一些脑图分享给大家:

[外链图片转存中…(img-GUOKFum9-1711364366747)]

[外链图片转存中…(img-7kma2CZa-1711364366748)]

[外链图片转存中…(img-X8yBA3gz-1711364366748)]

希望你看完这篇文章后,不要犹豫,抓紧学习,复习知识,准备在明年的金三银四拿到心仪的offer,加油,打工人!
需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!

Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐