首页 文章 精选 留言 我的

精选列表

搜索[集群],共10007篇文章
优秀的个人博客,低调大师

Docker部属Nsq集群

用一了段时间NSQ还是很稳定的。除了稳定,还有一个特别值的说的就是部署非常简单。总想写点什么推荐给大家使用nsq来做一些东西。但是就是因为他太简单易用,文档也比较简单易懂。一直不知道要写啥!!!!! nsq官网:http://nsq.io/ 为了容灾需要对nsqd多机器部属,有了Docker后,快速扩还是很方便的。 部署完后我会用go和c#写一些代码方便大家学习。 准备工作: 》两台服务器:192.168.0.49; 192.168.0.105. 》需要在两台机器上安装好Docker 》两台机器上镜像的拉取 docker pull nsqio/nsq 我们在105上启动lookup, nsqd和客户端都需要连接这个lookup。 docker run --name lookupd -p 4160:4160 -p 4161:4161 nsqio/nsq /nsqlookupd 在105和49上启动nsqd, lookup的地址要写105 docker run --name nsqd -p 4150:4150 -p 4151:4151 nsqio/nsq /nsqd --broadcast-address=192.168.0.105 --lookupd-tcp-address=192.168.0.105:4160 docker run --name nsqd -p 4150:4150 -p 4151:4151 nsqio/nsq /nsqd --broadcast-address=192.168.0.49 --lookupd-tcp-address=192.168.0.105:4160 到了这一步就可以写代码发送和接收信息了。但是还有一个管理系统需要启动一下。nsqadmin docker run --name nsqadmin -p 4171:4171 nsqio/nsq /nsqadmin --lookupd-http-address=192.168.0.105:4161 用浏览器看一下管理端:http://192.168.0.105:4171/nodes。找开Nodes标签里面有两个节点。192.168.0.105 和 192.168.0.49。其他的你可以点开看看。 我用go语言 简单写一个发送信息的例子: go使用的库是go-nsq地址 :github.com/nsqio/go-nsq func main() { config := nsq.NewConfig() // 随便给哪个ip发都可以 //w1, _ := nsq.NewProducer("192.168.0.105:4150", config) w1, _ := nsq.NewProducer("192.168.0.49:4150", config) err1 := w1.Ping() if err1 != nil { log.Fatal("should not be able to ping after Stop()") return } defer w1.Stop() topicName := "publishtest" msgCount := 2 for i := 1; i < msgCount; i++ { err1 := w1.Publish(topicName, []byte("测试测试publis test case")) if err1 != nil { log.Fatal("error") } } } 可以尝试给49和105都发送一次试试。再看一下我们的管理页面: publishtest被ip105和49都发送过。但是还没有channel: 客户端golang代码 package main import ( "fmt" "github.com/nsqio/go-nsq" "log" "os" "os/signal" "strconv" "time" "sync" ) func main() { topicName := "publishtest" msgCount := 2 for i := 0; i < msgCount; i++ { //time.Sleep(time.Millisecond * 20) go readMessage(topicName, i) } //cleanup := make(chan os.Signal, 1) cleanup := make(chan os.Signal) signal.Notify(cleanup, os.Interrupt) fmt.Println("server is running....") quit := make(chan bool) go func() { select { case <- cleanup: fmt.Println("Received an interrupt , stoping service ...") for _, ele := range consumers { ele.StopChan <- 1 ele.Stop() } quit <- true } }() <-quit fmt.Println("Shutdown server....") } type ConsumerHandle struct { q *nsq.Consumer msgGood int } var consumers []*nsq.Consumer = make([]*nsq.Consumer, 0) var mux *sync.Mutex = &sync.Mutex{} func (h *ConsumerHandle) HandleMessage(message *nsq.Message) error { msg := string(message.Body) + " " + strconv.Itoa(h.msgGood) fmt.Println(msg) return nil } func readMessage(topicName string, msgCount int) { defer func() { if err := recover(); err != nil { fmt.Println("error: ", err) } }() config := nsq.NewConfig() config.MaxInFlight = 1000 config.MaxBackoffDuration = 500 * time.Second //q, _ := nsq.NewConsumer(topicName, "ch" + strconv.Itoa(msgCount), config) //q, _ := nsq.NewConsumer(topicName, "ch" + strconv.Itoa(msgCount) + "#ephemeral", config) q, _ := nsq.NewConsumer(topicName, "ch"+strconv.Itoa(msgCount), config) h := &ConsumerHandle{q: q, msgGood: msgCount} q.AddHandler(h) err := q.ConnectToNSQLookupd("192.168.0.105:4161") //err := q.ConnectToNSQDs([]string{"192.168.0.105:4161"}) //err := q.ConnectToNSQD("192.168.0.49:4150") //err := q.ConnectToNSQD("192.168.0.105:4415") if err != nil { fmt.Println("conect nsqd error") log.Println(err) } mux.Lock() consumers = append(consumers, q) mux.Unlock() <-q.StopChan fmt.Println("end....") } 本文转自lpxxn博客园博客,原文链接:http://www.cnblogs.com/li-peng/p/7729174.html,如需转载请自行联系原作者 运行一下,会启动两个终端: 用我们的发送代码发送信息,再看我们的客户端 c#使用的库为NsqSharp.Core地址为: https://github.com/tonyredondo/NsqSharp 简单客户端代码为: class Program { static void Main() { // Create a new Consumer for each topic/channel var consumerCount = 2; var listC = new List<Consumer>(); for (var i = 0; i < consumerCount; i++) { var consumer = new Consumer("publishtest", $"channel{i}" ); consumer.ChangeMaxInFlight(2500); consumer.AddHandler(new MessageHandler()); consumer.ConnectToNsqLookupd("192.168.0.105:4161"); listC.Add(consumer); } var exitEvent = new ManualResetEvent(false); Console.CancelKeyPress += (sender, eventArgs) => { eventArgs.Cancel = true; listC.ForEach(x => x.Stop()); exitEvent.Set(); }; exitEvent.WaitOne(); } } public class MessageHandler : IHandler { /// <summary>Handles a message.</summary> public void HandleMessage(IMessage message) { string msg = Encoding.UTF8.GetString(message.Body); Console.WriteLine(msg); } /// <summary> /// Called when a message has exceeded the specified <see cref="Config.MaxAttempts"/>. /// </summary> /// <param name="message">The failed message.</param> public void LogFailedMessage(IMessage message) { // Log failed messages } }

优秀的个人博客,低调大师

Kafka Docker集群搭建

1. Zookeeper下载 http://apache.org/dist/zookeeper/ http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz 2.Kafka下载 http://apache.org/dist/kafka/ http://mirror.bit.edu.cn/apache/kafka/0.10.0.0/kafka_2.10-0.10.0.0.tgz 3,Zookeeper的Docker镜像制作 可以直接使用Zookeeper镜像 docker pull zookeeper 也可以自己使用Dockerfile制作 #基础镜像使用java,这样可以免于设置java环境 FROM java #作者 MAINTAINER Bonker <bonker@foxmail.com> #定义工作目录 ENV WORK_PATH /opt/zkcluster/zkconf #定义zookeeper文件夹名称 ENV ZOOKEEPER_PACKAGE_NAME zookeeper-3.4.9 #创建工作目录 RUN mkdir -p $WORK_PATH #把zookeeper压缩文件复制到工作目录 COPY ./$ZOOKEEPER_PACKAGE_NAME.tar.gz $WORK_PATH/ #解压缩 RUN tar -xvf $WORK_PATH/$ZOOKEEPER_PACKAGE_NAME.tar.gz -C $WORK_PATH/ #删除压缩文件 RUN rm $WORK_PATH/$ZOOKEEPER_PACKAGE_NAME.tar.gz #给shell赋予执行权限 RUN chmod a+x $WORK_PATH/$ZOOKEEPER_PACKAGE_NAME/bin/zkServer.sh RUN mv $WORK_PATH/$ZOOKEEPER_PACKAGE_NAME/conf/zoo_sample.cfg $WORK_PATH/$ZOOKEEPER_PACKAGE_NAME/conf/zoo.cfg ENTRYPOINT $WORK_PATH/$ZOOKEEPER_PACKAGE_NAME/bin/zkServer.sh start-foreground #ENTRYPOINT ["/bin/sh -c",$WORK_PATH/$ZOOKEEPER_PACKAGE_NAME/bin/zkServer.sh] #CMD [start-foreground] 构建zookeeper docker build -t bonker/zookeeper:3.4.9 . 运行docker docker run -d -p 2181:2181 --name zookeeper3.4.9 bonker/zookeeper:3.4.9 4,Kafka的Docker镜像制作 编写执行脚本kafkaStart.sh sed -i "s/broker.id=0/broker.id=$BROKER_ID/g" $WORK_PATH/$KAFKA_PACKAGE_NAME/config/server.properties $WORK_PATH/$KAFKA_PACKAGE_NAME/bin/kafka-server-start.sh $WORK_PATH/$KAFKA_PACKAGE_NAME/config/server.properties 编写Dockerfile #基础镜像使用java,这样可以免于设置java环境 FROM java #作者 MAINTAINER Bonker <bonker@foxmail.com> #定义工作目录 ENV WORK_PATH /usr/local/work #定义kafka文件夹名称 ENV KAFKA_PACKAGE_NAME kafka_2.10-0.10.0.0 #创建工作目录 RUN mkdir -p $WORK_PATH #把kafka压缩文件复制到工作目录 COPY ./$KAFKA_PACKAGE_NAME.tgz $WORK_PATH/ #把kafka执行脚本复制到工作目录 COPY ./kafkaStart.sh $WORK_PATH/ #给shell赋予执行权限 RUN chmod a+x $WORK_PATH/kafkaStart.sh #解压缩 RUN tar -xvf $WORK_PATH/$KAFKA_PACKAGE_NAME.tgz -C $WORK_PATH/ #删除压缩文件 RUN rm $WORK_PATH/$KAFKA_PACKAGE_NAME.tgz #执行sed命令修改文件,将连接zk的ip改为link参数对应的zookeeper容器的别名 RUN sed -i 's/zookeeper.connect=localhost:2181/zookeeper.connect=zkhost:2181/g' $WORK_PATH/$KAFKA_PACKAGE_NAME/config/server.properties #执行sed命令修改文件,改变brokerId #RUN sed -i "s/broker.id=0/broker.id=$BROKER_ID/g" $WORK_PATH/$KAFKA_PACKAGE_NAME/config/server.properties #CMD $WORK_PATH/$KAFKA_PACKAGE_NAME/bin/kafka-server-start.sh $WORK_PATH/$KAFKA_PACKAGE_NAME/config/server.properties CMD $WORK_PATH/kafkaStart.sh 构建kafka docker build -t bonker/kafka:2.10-0.10.0.0 . 5,安装docker-compose 安装python-pip yum -y install epel-release yum -y install python-pip 安装docker-compose pip install docker-compose 待安装完成后,执行查询版本的命令,即可安装docker-compose docker-compose version 6,运行Dokcer容器 编写docker-compose.yml version: '2' services: zk_server: image: bonker/zookeeper:3.4.9 restart: always kafka_server: image: bonker/kafka:2.10-0.10.0.0 ports: - "9091:9092" environment: BROKER_ID: 1 links: - zk_server:zkhost restart: always message_producer: image: bonker/kafka:2.10-0.10.0.0 ports: - "9092:9092" environment: BROKER_ID: 2 links: - zk_server:zkhost restart: always message_consumer: image: bonker/kafka:2.10-0.10.0.0 ports: - "9093:9092" environment: BROKER_ID: 3 links: - zk_server:zkhost restart: always 启动容器 现在打开终端,在docker-compose.yml所在目录下执行docker-compose up -d,即可启动所有容器 作者:Bonker 出处:http://www.cnblogs.com/Bonker QQ:519841366 "> 本页版权归作者和博客园所有,欢迎转载,但未经作者同意必须保留此段声明, 且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利

优秀的个人博客,低调大师

kubernetes集群问题排查

版权声明:本文为博主原创文章,未经博主允许不得转载。如需转载请联系本人,并标明出处和作者。 本文CSDN博客地址:http://blog.csdn.net/huwh_/article/details/71308301 1.查看系统Event事件 [plain] view plain copy kubectldescribepod<PodName>--namespace=<NAMESPACE> 该命令可以显示Pod创建时的配置定义、状态等信息和最近的Event事件,事件信息可用于排错。例如当Pod状态为Pending,可通过查看Event事件确认原因,一般原因有几种: 没有可用的Node可调度 开启了资源配额管理并且当前Pod的目标节点上恰好没有可用的资源 正在下载镜像(镜像拉取耗时太久) kubectl describe还可以查看其它k8s对象:NODE,RC,Service,Namespace,Secrets。 1.1.Pod kubectl describe pod <PodName> --namespace=<NAMESPACE> 1.2.NODE kubectl describe NODE [plain] view plain copy Name:runtime2.foshan2.wae.haplat.net Labels:kubernetes.io/hostname=runtime2.foshan2.wae.haplat.net,namespace/test=true CreationTimestamp:Fri,01Apr201617:34:16+0800 Phase: Conditions: TypeStatusLastHeartbeatTimeLastTransitionTimeReasonMessage ────────────────────────────────────────────────────────── ReadyTrueSat,08Apr201714:15:41+0800Sun,26Mar201708:58:04+0800KubeletReadykubeletispostingreadystatus OutOfDiskFalseSat,08Apr201714:15:41+0800Fri,01Apr201617:34:16+0800KubeletHasSufficientDiskkubelethassufficientdiskspaceavailable Addresses:221.5.100.100,221.5.100.100 Capacity: memory:134975102976 pods:40 cpu:32 SystemInfo: MachineID:120de474f77e4d75a670a74eea6d1e45 SystemUUID:1C929431-8D94-11E1-BD1D-001E6744D094 BootID:2a154beb-86e4-40e3-acce-4f83b1ea5ed2 KernelVersion:3.10.0-229.20.1.el7.x86_64 OSImage:CentOSLinux7(Core) ContainerRuntimeVersion:docker://1.8.2-el7.centos KubeletVersion:v1.1.1-wae2-12 Kube-ProxyVersion:v1.1.1-wae2-12 ExternalID:runtime2.foshan2.wae.haplat.net Non-terminatedPods:(6intotal) NamespaceNameCPURequestsCPULimitsMemoryRequestsMemoryLimits ─────────────────────────────────────────────────────────────── acpacp-ui-1-4-0-16j3a4(12%)4(12%)8589934592(6%)8589934592(6%) acpacp-ui-1-4-1-kou204(12%)4(12%)8589934592(6%)8589934592(6%) acpacp-ui-api-1-4-0-u3w4f4(12%)4(12%)8589934592(6%)8589934592(6%) cloud-eyecloud-eye-dim2-1-6-6-1-9g16i4(12%)4(12%)34359738368(25%)34359738368(25%) cloud-wstcloud-wst-ceba-1-12-0-1-hjdk22(6%)2(6%)8589934592(6%)8589934592(6%) cms-fdcms-fd-schedule-3-9-1-3-wzqa18(25%)8(25%)21474836480(15%)21474836480(15%) Allocatedresources: (Totallimitsmaybeover100%,i.e.,overcommitted.Moreinfo:http://releases.k8s.io/HEAD/docs/user-guide/compute-resources.md) CPURequestsCPULimitsMemoryRequestsMemoryLimits ────────────────────────────────────────────────── 26(81%)26(81%)90194313216(66%)90194313216(66%) Noevents. 1.3.RC kubectl describe rc --namespace=rmp [plain] view plain copy [root@node5~]#kubectldescriberc--namespace=rmp Name:rmp-web-2-15-3-1 Namespace:rmp Image(s):registry.wae.haplat.net/rmp/rmp-web:2.15.3-1 Selector:app=rmp-web,appVersion=2.15.3-1 Labels:app=rmp-web,appVersion=2.15.3-1,env=product,zone=foshan2 Replicas:1current/1desired PodsStatus:1Running/0Waiting/0Succeeded/0Failed Novolumes. Noevents. 1.4.NAMESPACE kubectl describe NAMESPACE [plain] view plain copy [root@node5~]#kubectldescribeNAMESPACE Name:acp Labels:<none> Status:Active ResourceQuotas ResourceUsedHard --------- cpu2420 memory5153960755253687091200 persistentvolumeclaims010 pods610 replicationcontrollers610 resourcequotas11 secrets210 services610 Noresourcelimits. 1.5.Service kubectl describe Service --namespace=rmp [plain] view plain copy [root@node5~]#kubectldescribeService--namespace=rmp Name:rmp-web-2-15-3-1 Namespace:rmp Labels:app=rmp-web,appVersion=2.15.3-1,waeEnv=product,waeZone=foshan2 Selector:app=rmp-web,appVersion=2.15.3-1 Type:ClusterIP IP:10.254.201.163 Port:port-l7-tcp-8080/TCP Endpoints:10.0.68.240:80 SessionAffinity:None Noevents. 2.查看容器日志 1、查看指定pod的日志 kubectl logs <pod_name> kubectl logs -f <pod_name> #类似tail -f的方式查看 2、查看上一个pod的日志 kubectl logs -p <pod_name> 3、查看指定pod中指定容器的日志 kubectl logs <pod_name> -c <container_name> [root@node5 ~] # kubectl logs --help Print the logs for a container in a pod. If the pod has only one container, the container name is optional. Usage: kubectl logs [-f] [-p] POD [-c CONTAINER] [flags] Aliases: logs, log Examples: # Return snapshot logs from pod nginx with only one container $ kubectl logs nginx # Return snapshot of previous terminated ruby container logs from pod web-1 $ kubectl logs -p -c ruby web-1 # Begin streaming the logs of the ruby container in pod web-1 $ kubectl logs -f -c ruby web-1 # Display only the most recent 20 lines of output in pod nginx $ kubectl logs -- tail =20 nginx # Show all logs from pod nginx written in the last hour $ kubectl logs --since=1h nginx 3.查看k8s服务日志 3.1.journalctl 在Linux系统上systemd系统来管理kubernetes服务,并且journal系统会接管服务程序的输出日志,可以通过systemctl status <xxx>或journalctl -u <xxx> -f来查看kubernetes服务的日志。 其中kubernetes组件包括: kube-apiserver kube-controller-manager Pod扩容相关或RC相关 kube-scheduler Pod扩容相关或RC相关 kubelet Pod生命周期相关:创建、停止等 etcd 3.2.日志文件 也可以通过指定日志存放目录来保存和查看日志 --logtostderr=false:不输出到stderr --log-dir=/var/log/kubernetes:日志的存放目录 --alsologtostderr=false:设置为true表示日志输出到文件也输出到stderr --v=0:glog的日志级别 --vmodule=gfs*=2,test*=4:glog基于模块的详细日志级别 4.常见问题 4.1.Pod状态一直为Pending kubectl describe <pod_name> --namespace=<NAMESPACE> 查看该POD的事件。 正在下载镜像但拉取不下来(镜像拉取耗时太久)[一般都是该原因] 没有可用的Node可调度 开启了资源配额管理并且当前Pod的目标节点上恰好没有可用的资源 解决方法: 查看该POD所在宿主机与镜像仓库之间的网络是否有问题,可以手动拉取镜像 删除POD实例,让POD调度到别的宿主机上 4.2.Pod创建后不断重启 kubectl get pods中Pod状态一会running,一会不是,且RESTARTS次数不断增加。 一般原因为容器启动命令不是阻塞式命令,导致容器运行后马上退出。 非阻塞式命令: 本身CMD指定的命令就是非阻塞式命令 将服务启动方式设置为后台运行 解决方法: 1、将命令改为阻塞式命令(前台运行),例如:zkServer.sh start-foreground 2、Java运行程序的启动脚本将 nohup xxx &的nobup和&去掉,例如: nohup $JAVA_HOME/bin/java $JAVA_OPTS -cp $CLASSPATH com.cnc.open.processor.Main & 改为: $JAVA_HOME/bin/java $JAVA_OPTS -cp $CLASSPATH com.cnc.open.processor.Main 文章参考: 《Kubernetes权威指南》

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册