基于Docker,安装kafka。
docker pull wurstmeister/zookeeper
docker pull wurstmeister/kafka
docker-compose.yml windows 注意修改相应的IP、主题
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
depends_on: [ zookeeper ]
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1
KAFKA_CREATE_TOPICS: "test:1:1"
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
# 服务打包
docker-compose build
# 启动docker镜像服务
docker-compose up -d
# 进入容器
docker exec -it kafka_kafka_1 bash
# 启动生产者,可生产数据
bash-4.4# $KAFKA_HOME/bin/kafka-console-producer.sh --topic=test --broker-list kafka_kafka_1:9092
>ni
>haha
# 新建窗口,启动消费者(可查看生产的数据)
bash-4.4# $KAFKA_HOME/bin/kafka-console-consumer.sh --bootstrap-server kafka_kafka_1:9092 --from-beginning --topic test
ni
haha
# 启动后端管理(展示不能展示,Windows下路径)
docker run -itd --name=kafka-manager -p 9000:9000 -e ZK_HOSTS="127.0.0.1:2181" sheepkiller/kafka-manager
注: 安装docker-compose (注意版本号:github)
curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
Kafka-manager出现错误,Yikes! Ask timed out on [ActorSelection[Anchor(akka://kafka-manager-system/)
解决办法:启动kafka-manager后台管理时,修改zk 的ip地址 ,将127.0.01 修改为实际IP
docker run -itd --name=kafka-manager -p 9000:9000 -e ZK_HOSTS="127.0.0.1:2181" sheepkiller/kafka-manager
https://github.com/wurstmeister/kafka-docker/blob/master/Dockerfile
容器运用比较广泛,微服务、CI。
基础: docker version 、docker info 、docker-compose version …
#创建并启动nginxTest实例,并在nginx运行
docker run -d -p 8090:80 --name nginxTest nginx
#移除服务
docker rm -f nginxTest
#停止服务
docker stop nginxTest
docker start nginxTest
docker restart nginxTest
#查看正在运行的服务
docker ps
#查看所有的服务
docker ps -a
#获取本地镜像
docker images
docker search xx
#移除镜像
命令:docker rmi imagename/image ID
强制移除: docker rmi -f imagename/image ID
#创建自己的镜像 --->通过Dockerfile 生成镜像 (进入Dockerfile目录)
docker build -t xxx(仓库地址) .
#如:centos 默认是最新的
docker pull centos
内网环境如何打包迁移镜像文件
# 1.拉取指定版本文件预览服务
docker pull keking/kkfileview:4.1.0
# 2. 将镜像保存在本地
docker save -o kkfileview-4.1.0.tar 200d92888da0
#3. 将镜像通过fz 或者其他工具下载到windows本地桌面
#
# 4. 将文件上传到其他服务器
#
# 5. 将文件加载到镜像仓库中
docker load -i kkFileView-4.1.0.tar
# 6. 运行
docker run -it -p 8012:8012 keking/kkfileview:4.1.0
#进入Docker实例
@ @ 未创建镜像以前,则可使用: docker run -it 镜像 /bin/bash
@ @ 未创建镜像以前,则可使用: docker run -it 镜像 /bin/sh
xushijiandeiMac:~ xushijian$ docker exec -it 服务名称 /bin/bash
root@d5a08d34f2db:/#
xushijiandeiMac:~ xushijian$ docker exec -it centos:latest
[root@e94d4fd27cc7 /]#
#查看Docker容器信息
docker inspect [containerName]
#Docker -> 刷新配置
#针对某一服务:
docker exec -it strength_strength_1 curl -d "" "http://127.0.0.1:31002/refresh"
#查看并调用内部服务:
#1.先进入内部服务: internal 的服务中<返回值异常、请求方法名称(RequestMapping)、多检查几次>
docker exec -it 服务名 bin/bash
#2.再调用接口(具体参数细化集合,多个参数)
如: curl -d "companyName=测试公司&companyId=100" "http://127.0.01:30301/internal//company/company/addMaterialCompany.json"
#Docker 日志维护(删除日志)
docker inspect [containerName] | grep LogPath | cut -d ':' -f 2 | cut -d ',' -f 1 | xargs echo | xargs truncate -s 0
#(1)如:(只能清除当前日志,如果包含多个日志文件,则其它文件不能删除)
docker inspect eureka_config_1 | grep LogPath | cut -d ':' -f 2 | cut -d ',' -f 1 | xargs echo | xargs truncate -s 0
#(2)实时查看docker容器日志
$ sudo docker logs -f -t --tail 行数 容器名
#例:实时查看docker容器名为eureka_config_1的最后10行日志
$ sudo docker logs -f -t --tail 10 eureka_config_1
shell 脚本删除 docker 日志文件 (==将eureka_config_1 修改成其它的容器名==)
#!/bin/bash
# set your containers base path
containersPath=/var/lib/docker/containers
# get container id by container name 需要调整名称 2022-02-23
containerName=eureka_config_1
# clear current log file
docker inspect ${containerName} | grep LogPath | cut -d ':' -f 2 | cut -d ',' -f 1 | xargs echo | xargs truncate -s 0
#get containerId
containerId=`docker inspect -f '' ${containerName} 2> /dev/null`
if [ ! ${containerId} ];then
echo "container doesn't exist."
exit 2
fi
echo ${containerId}
#clear current log file
#cat /dev/null > ${containersPath}/${containerId}/${containerId}-json.log*
# delete old log file
rm -rf ${containersPath}/${containerId}/${containerId}-json.log.*
备注:
(1) 添加权限 chmod 777 clearDockerLog.sh
(2) xargs 用法 https://www.cnblogs.com/wangqiguo/p/6464234.html
(3) cut 用法 http://blog.csdn.net/u011003120/article/details/52190187
通过部署Harbor搭建镜像的私有仓库,维护自己的镜像。(类比:maven 的仓库 nexus等)
image —> Dockerfile【推荐】
image —> container commit 生成新image 【不推荐,无image Layer生成过程】
# 以交互式方式运行官方基础镜像
# docker run -it vim-centos centos
# yum install vim
# vim-centos 启动时名称
docker commit my-centos vim-centos
监控container工具: weavescope [也可container运行]
# 内存资源 100M, 共享CPU,10的配比 ,如果是20 ,则为 10 的两倍
docker run -d --name my-tomcat --mermory 100M --cpu-shares 10 -p 8080:8080 tomcat
# 查看内存、CPU使用
docker stat my-tomcat
iptables 技术
# 查看网路方式 (bridge、host、null)
docker network ls
# 查看网络 桥接方式及网段
docker network inspect bridge
# 创建自己的网络,并查看网段 docker network inspect tomcat-net
docker network create tomcat-net
# 启动容器,指定网络。 可查看IP,在tomcat-net ip 网段中。
docker run -d tomcat-net01 --network tomcat-net
# 查看网段或网络命令
docker exec -it tomcat-net01 ip a
如何让docker0中的服务能连接自定义网端的服务呢?(不同namespace空间,通过network(bridge)方式连接起来)
- bridge 桥接网络方式
- link 线上很少用
# 将tomcat01 加入 tomcat-net 自定义的网络中,自动添加域名解析
docker network connect tomcat-net tomcat01
自定义网络好处?
解决ip问题变化问题(每次重新运行容器)
可以使用网络名访问
# mysql集群实战
docker run -d --name mysql01 --network my-network msyql
docker run -d --name mysql02 --network my-network msyql
docker run -d --name mysql03 --network my-network msyql
# 可以通过网络名访问 my-netwrok:3306/dbName 访问
ping my-network
2.1 多级网络通讯技术
overlay -> vxlan (主机之间不能使用相同的ip)
容器运用比较广泛,微服务、CI。
常见概念理解:容器(软件包)、Docker(容器管理平台)、K8s(容器集群管理、分布式容器管理平台)、Ingress
docker run -d -p 80:80 --name nginx
-v C:/Users/xusj/Git/:/Users/xusj/Git/:rw
-v C:/Users/xusj/nginx/vhosts/:/etc/nginx/conf.d/:ro
registry.cn-hangzhou.aliyuncs.com/xusj_repo/nginx
# 涉及认证、Git、 挂载
docker run -d -p 80:80 -p 443:443 --name nginx -v /etc/letsencrypt/archive/blogyw.meizhangzheng.com/:/etc/letsencrypt/archive/blogyw.meizhangzheng.com/:rw -v /usr/meizhangzheng/git/:/usr/meizhangzheng/git/:rw -v /usr/meizhangzheng/nginx/vhosts/:/etc/nginx/conf.d/:ro meizhangzheng/nginx
# mysql 启动类,并配置挂载路径
docker run -itd -p 3307:3306 --name test_mysql -v /usr/local/mysqlData/test/conf:/etc/mysql -v /usr/local/mysqlData/test/data:/var/lib/mysql -v /usr/local/mysqlData/test/mysql-files:/var/lib/mysql-files/ -e MYSQL_ROOT_PASSWORD=123456 mysql
docker run -d -p 8761:8761 --name eureka registry.cn-hangzhou.aliyuncs.com/xusj_repo/eurekaservice
容器运用比较广泛,微服务、CI。
基础: docker version 、docker info 、docker-compose version …
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
https://www.runoob.com/docker/centos-docker-install.html
# yum-utils
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
# sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 移除旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# list version
yum list docker-ce --showduplicates | sort -r
# install Docker Engin Community
sudo yum install docker-ce docker-ce-cli containerd.io
# set startup
sudo systemctl enable docker
# start
systemctl start docker
https://blog.csdn.net/qq_28323595/article/details/120202744
# 1. 设置存储库
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 2. 安装最新版本docker engin 和 containerd.io
sudo yum install docker-ce docker-ce-cli containerd.io
(本地设置最大堆内存,VisualVM的HeapDump 功能分析 或者基于IDEA 的 JProfiler分析)
1.在开发环境上,基于k8s 构建的服务,需要使用XXL-job调用, IJobHandler方式 (识别Bean、需要注册该服务到xxl-job)
(1)自动识别容器内存限制(即可保证你的Java进程不会因为内存问题被容器Kill。) 默认1核4G 自动操作
-XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1
(2)为了尽快分析定位问题,调小内存限制,尽快抛异常。设置JVM启动参数: 手动设置(-Xms -Xmx) ```java
java -Dspring.profiles.active=dev -Xms128m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -verbose:gc -Xloggc:/data/logs/md-refresh-data-service/gc.log -jar /data/app.jar ```
注:遇到时间不同步问题(重启服务解决 或者启动ntp时间同步服务) ```java
com.xxl.rpc.util.XxlRpcException: The timestamp difference between admin and executor exceeds the limit. at ```
2.可以基本本机调式,将xxl-job 内容模拟为请求,然后通过jmeter 定时出发(并发测试);参考手动设置JVM -Xms -Xmx 方式,基于JProfiler 或VisualVM
常用方法:参考
生产上应用不断爆出内存溢出,造成服务自动重启,该服务业务逻辑就是对外提供接口和刷新数据到MongoDB(基于XXL-JOB bean模式的定时任务);
随着定时任务的执行,内存逐渐增加,GC少。
运维给出的内存使用信息(jmap -head
由于线上环境内存快满了,故本地模拟,复现该场景。为了尽快复现问题,本地设置启动参数为: -Xms128m -Xmx256m -XX:+HeapDumpOnOutOfMemoryError;xxl-job 设置每分钟跑一次(多个任务都设置为1分钟),大约10分钟就抛出内存溢出。
(基于IDEA的JProfiler插件)
查看大对象信息(内存溢出一般是基于大对象引发的)
双击查看大对象详情:
展开,查看详情:
最后分析出是基于MongoDB连接引发的;由于清理备份表每次都用0开始,然后清理至保存最后几份备份表,频繁操作mongodb,最终未释放掉相应的连接信息。
优化方案:单独写了算法,清理除保留最近几份的表以外的几份备份表即可(通过Apollo配置方式设置)