搜索词>>acme.sh 耗时0.0030
  • acme.sh 获取let's encrypt免费ssl证书https

    acme.sh 获取let's encrypt免费ssl证书httpsacme.sh 获取let's encrypt免费ssl证书https
  • centos 检查tomcat服务是否在线shell脚本

    该脚本主要用于检查tomcat进程是否在线,如果不在线就启动tomcat服务#!/bin/sh res=`ps -ef|grep /home/xqlee/tomcat/bin/bootstrap.jar |awk '{if($0~"/usr该脚本主要用于检查tomcat进程是否在线,如果不在线就启动tomcat服务#!/bin/sh res=`ps -ef|grep /home/xqlee/tomcat/bin/bootstrap.jar |awk '{if($0~"/usr/bin/java") print $2}'` echo $res if [ -z "$res" ]; then cd /home/xqlee/tomcat/bin/ && ./startup.sh fi 简单说明:首先是通过ps命令获取到tomcat名称相关的进程信息然后通过awk命令来截取tomcat服务的进程号判断进程号是否存在,不存在则启动tomcat服务​​​​​​​
  • Python教程-Python找到最大的N(前N个)或最小的N个项目

    Python示例使用heapq库中的nlargest()和nsmallest()函数从元素集合中找到最大(或最小)的N个元素​1.使用heapq模块的nlargest()和nsmallest()Python heapq模块可用于从集合中查找Python示例使用heapq库中的nlargest()和nsmallest()函数从元素集合中找到最大(或最小)的N个元素​1.使用heapq模块的nlargest()和nsmallest()Python heapq模块可用于从集合中查找N个最大或最小的项目。它具有两个功能来帮助–nlargest()nsmallest()1.1。在简单的可迭代对象中查找项目$title(example1.py) >>> import heapq >>> nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2] print(heapq.nlargest(3, nums)) >>> [42, 37, 23] print(heapq.nsmallest(3, nums)) >>> [-4, 1, 2]1.2。查找复杂的可迭代项$title(example2.py) >>> portfolio = [ {'name': 'IBM', 'shares': 100, 'price': 91.1}, {'name': 'AAPL', 'shares': 50, 'price': 543.22}, {'name': 'FB', 'shares': 200, 'price': 21.09}, {'name': 'HPQ', 'shares': 35, 'price': 31.75}, {'name': 'YHOO', 'shares': 45, 'price': 16.35}, {'name': 'ACME', 'shares': 75, 'price': 115.65} ] >>> cheap = heapq.nsmallest(3, portfolio, key=lambda s: s['price']) >> cheap >>> [ {'price': 16.35, 'name': 'YHOO', 'shares': 45}, {'price': 21.09, 'name': 'FB', 'shares': 200}, {'price': 31.75, 'name': 'HPQ', 'shares': 35} ] >>> expensive = heapq.nlargest(3, portfolio, key=lambda s: s['price']) >>> expensive >>> [ {'price': 543.22, 'name': 'AAPL', 'shares': 50}, {'price': 115.65, 'name': 'ACME', 'shares': 75}, {'price': 91.1, 'name': 'IBM', 'shares': 100} ]如果您只是想查找单个最小或最大项(N=1),则使用min()和max()函数的速度更快。Python教程 图像 小部件
  • rocketmq 官网下载安装及配置教程

    Apache rocketmq 官网下载、Apache rocketmq 安装和Apache rocketmq 配置。由于rocketmq是阿里捐赠给Apache的。目前3.x以下版本为阿里版本。4.x为Apache托管版本。这里要说的是Apache的4.x版本。<h2>引言</h2> <p>    本文将讲解从Apache rocketmq 官网下载、Apache rocketmq 安装和Apache rocketmq 配置。由于rocketmq是阿里捐赠给Apache的。目前3.x以下版本为阿里版本。4.x为Apache托管版本。这里要说的是Apache的4.x版本。操作系统环境为centos6/7<br /> 1.准备工作</p> 由于目前Apache没有提供直编译的下载文件。我们需要自己去GitHub下载源文件进行编译才能使用。因其环境是Java。所以需要使用jdk(注意必须是jdk,jre不能编译程序)<br /> 1.1需要的环境 <ul> <li>64位操作系统</li> <li>64位jdk1.8+</li> <li>maven 3.2+</li> <li>Git(用于下载源码。可手动下载则无需安装)</li> </ul> <h2>2.编译工作</h2> 2.1环境:  <br /> 由于我所使用的服务器上只有jre,也不想去服务器折腾编译环境所以我把编译工作放在了windows系统上。jdk的安装及配置可参考<a rel="" href="http://www.leftso.com/blog/35.html" rel="external nofollow" target="_blank">http://www.leftso.com/blog/35.html</a>。maven去 Apache官网下载编译好的版本。将maven的bin目录添加到windows系统的环境变量path中即可。该操作可以参考jdk的环境变量配置。<br /> 2.2rocketmq源码下载<br /> Apache rocketmq的源码GitHub地址为:https://github.com/apache/incubator-rocketmq/archive/rocketmq-all-4.1.0-incubating.tar.gz<br /> 下载后解压放在一个文件夹里面。<br /> 2.3编译<br /> 打开windows的cmd窗口。切换至解压后的rocketmq源文件根目录。执行命令: <pre> <code>mvn -Prelease-all -DskipTests clean install -U</code></pre> 这个步骤需要的时间可能有点长。因为maven需要下载相关的依赖文件。<br /> 直到出现以下内容则为编译成功:<br /> <img alt="编译rocketmq成功" class="img-thumbnail" src="/assist/images/blog/8783ac7f5bf148f582112bfcb11e592d.png" /> <h2>3.上传项目至服务器</h2>   为了偷懒。或者说保持和Apache操作一致。我将编译后的整个项目上传至服务。我存放路径为/user/local/rocketmq/incubator-rocketmq(可根据实际情况修改,incubator-rocketmq为项目的源码根目录) <h2>4.配置rocketmq内存</h2>   由于默认的rockertmq内存配置有点大。server的默认配置为4Gb,broker的默认配置为8Gb。测试机可能没有那么大的内存。则会导致各种启动失败。<br /> 切换至/usr/local/rocketmq/incubator-rocketmq/distribution/target/apache-rocketmq/bin目录。修改runserver.sh和runbroker.sh<br /> 使用vi打开runserver.sh并找到JVM Configuration配置将其修改:<br /> <img alt="jvm内存修改" class="img-thumbnail" src="/assist/images/blog/17ab176c3b7f452589d43f7e2554fab7.png" /><br /> 这里的值可以根据具体情况来修改。<br /> 同样打开文件runbroker.sh修改jvm参数<br /> <br /> 最后将整个目录文件添加可执行权限。 <pre> <code>chmod 755 *</code></pre> <h2>5.启动停止rockermq服务</h2> 5.1启动name server<br /> 命令: <pre> <code>nohup sh bin/mqnamesrv &</code></pre> 查看启动情况<br /> 命令: <pre> <code>tail -f ~/logs/rocketmqlogs/namesrv.log</code></pre> <img alt="name server start success" class="img-thumbnail" src="/assist/images/blog/cb003f6bdc7a40b086b4ce1c79e0054c.png" /><br /> 5.2启动broker服务<br /> <br /> 启动命令: <pre> <code>nohup sh bin/mqbroker -n localhost:9876 &</code></pre> <br /> 查看启用情况: <pre> <code>tail -f ~/logs/rocketmqlogs/broker.log </code></pre> <img alt="broker success" class="img-thumbnail" src="/assist/images/blog/aef78ae1961844ab92eb1887c0ba796f.png" /><br /> <br /> 5.3停止name server 或者broker<br /> 切换至/usr/local/rocketmq/incubator-rocketmq/distribution/target/apache-rocketmq/bin目录<br /> 停止name server命令: <pre> <code class="language-html">[root@localhost bin]# pwd /usr/local/rocketmq/incubator-rocketmq/distribution/target/apache-rocketmq/bin [root@localhost bin]# ./mqshutdown namesrv The mqnamesrv(3077) is running... Send shutdown request to mqnamesrv(3077) OK</code></pre> <br /> 停止broker命令: <pre> <code class="language-html">[root@localhost bin]# ./mqshutdown broker The mqbroker(3104) is running... Send shutdown request to mqbroker(3104) OK [1]- Exit 143 nohup sh bin/mqnamesrv (wd: /usr/local/rocketmq/incubator-rocketmq/distribution/target/apache-rocketmq) (wd now: /usr/local/rocketmq/incubator-rocketmq/distribution/target/apache-rocketmq/bin) [root@localhost bin]# </code></pre> <br />  
  • Linux shell(sh)编程纪要(持续更新)

    主要记录Linux系统中的shell脚本编程时。常遇到的一些语法用处记录。持续更新。<h2>1.shell中逻辑控制语句if用法</h2> 语法 <pre> <code class="language-bash">#1.简单if if [ 条件表达式 ];then #满足条件时执行 fi#结束if #2.if else if [ 条件表达式 ];then #满足条件时执行 else #不满足条件时执行 fi#结束if #3.if else if else if [ 条件表达式 ];then #满足上方条件时候执行 elif [ 条件表达式 ];then #满足上方条件时候执行 #... elif可有多个 else #上面的条件都不满足的在这里执行 fi#结束if </code></pre> <span style="color:#16a085"><strong>注意:条件两边的空格很重要。要确保方括号的空格。</strong></span><br /> <strong>判断语句常用条件</strong> <table cellspacing="0" class="table table-bordered table-hover" style="border-collapse:collapse; border:undefined; width:366pt"> <tbody> <tr> <td style="width:92pt">[ -f "somefile" ]</td> <td style="width:274pt">判断是否是一个文件</td> </tr> <tr> <td>[ -x "/bin/ls" ]</td> <td>判断/bin/ls是否存在并有可执行权限</td> </tr> <tr> <td>[ -n "$var" ]</td> <td>判断$var变量是否有值</td> </tr> <tr> <td>[ "$a" = "$b" ]</td> <td>判断$a和$b是否相等<img alt="yes" class="img-thumbnail" src="http://www.leftso.com/resources/framework/editor/ckeditor/plugins/smiley/images/thumbs_up.png" title="yes" /></td> </tr> <tr> <td>-r file</td> <td>用户可读为真</td> </tr> <tr> <td>-w file</td> <td>用户可写为真</td> </tr> <tr> <td>-x file</td> <td>用户可执行为真</td> </tr> <tr> <td>-f file</td> <td>文件为正规文件为真</td> </tr> <tr> <td>-d file</td> <td>文件为目录为真</td> </tr> <tr> <td>-c file</td> <td>文件为字符特殊文件为真</td> </tr> <tr> <td>-b file</td> <td>文件为块特殊文件为真</td> </tr> <tr> <td>-s file</td> <td>文件大小非0时为真<img alt="yes" class="img-thumbnail" src="http://www.leftso.com/resources/framework/editor/ckeditor/plugins/smiley/images/thumbs_up.png" title="yes" /></td> </tr> <tr> <td>-t file</td> <td>当文件描述符(默认为1)指定的设备为终端时为真</td> </tr> <tr> <td>-ne</td> <td>比较两个数字参数是否不相等</td> </tr> <tr> <td>-lt</td> <td>参数1是否小于参数2</td> </tr> <tr> <td>-le</td> <td>参数1是否小于等于参数2</td> </tr> <tr> <td>-gt</td> <td>参数1是否大于参数2</td> </tr> <tr> <td>-ge</td> <td>参数1是否大于等于参数2</td> </tr> <tr> <td>-f</td> <td>检查某文件是否存在(例如,if [ -f "filename" ])<img alt="yes" class="img-thumbnail" src="http://www.leftso.com/resources/framework/editor/ckeditor/plugins/smiley/images/thumbs_up.png" title="yes" /></td> </tr> <tr> <td>-d</td> <td>检查目录是否存在</td> </tr> </tbody> </table>   <h2>2.退出当前shell脚本</h2> 命令: <pre> <code class="language-bash">exit</code></pre> <br /> 使用介绍:<br /> 格式1: <pre> <code class="language-bash">exit</code></pre> 说明:退出。退出码不变,即为最后一个命令的退出码<br /> <br /> 格式2 <pre> <code class="language-bash">exit n</code></pre> 退出。设置退出码为n。<br /> <br /> 格式3 <pre> <code class="language-bash">exit $?</code></pre> 上一个命令的退出码。<br /> <br /> 退出码(exit status,或exit code)的约定: <ul> <li>0表示成功(Zero - Success)</li> <li>非0表示失败(Non-Zero  - Failure)</li> <li>2表示用法不当(Incorrect Usage)</li> <li>127表示命令没有找到(Command Not Found)</li> <li>126表示不是可执行的(Not an executable)</li> <li>>=128 信号产生</li> </ul>
  • zookeeper入门篇安装zookeeper以及配置zookeeper集群

    现在zookeeper在分布式上的流行程度不亚于spring在Java中的地位。本文主要讲解zookeeper的入门,即:安装zookeeper以及配置zookeeper集群<h2>一.为啥要编写这篇入门博客?</h2> <p>    在百度上基本能百度一大片的安装教程,为啥我还要写呢?不难发现很多博客讲得很好。但是有些细节地方还是欠缺说明。所以,这里参考了一些大牛的博客,整理的一篇zookeeper安装配置集群的博客。</p> <h2>二.什么是zookeeper?</h2> <ol> <li> <p>我们可以把Zookeeper理解为一个精简的文件系统(和Linux文件系统结构非常相似),其每一个节点称为znode,znode下可以存放子节点,也可以直接对节点进行赋值存值。</p> </li> <li> <p>Zookeeper被应用与一些集群上,提高集群的高可用。它可以帮助你避免单点故障,使你的系统更加可靠。</p> </li> <li> <p>Zookeeper的集群我们可以通俗的理解为,一个有Leader的团队,团队中各个成员的数据都是一致的。团队中的Leader采用选举算法推举,所以可以保证在Leader出现问题的时候,又会选举出新的Leader。(fast paxos 选举算法大家可以深入了解下)</p> </li> <li> <p>Zookeeper使用路径来描述节点,节点可以被看做是一个目录,也可以被看做是一个文件,它同时具有两者的特点。</p> </li> <li> <p>Zookeeper的Watch机制也是它的最大被应用的原因。当我们有很多客户端连接到Zookeeper时,当被设置了Watch的数据发生了改变的时候,则服务器将这个改变发送给设置了Watch的客户端,通知它们。所以我们经常用它来做业务系统的统一配置管理。<strong>使用zk的Watch要特别注意一点就是它的“一次性触发器”(最后的Java例子中有模拟这点)</strong>。</p> </li> </ol> <h2>三.安装准备</h2> <h3>1.下载zookeeper的安装包,其实是个压缩包</h3> 官网:<a href="http://zookeeper.apache.org/releases.html" rel="external nofollow" target="_blank">http://zookeeper.apache.org/releases.html</a> <br /> 下载:<a href="http://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.8/" rel="external nofollow" target="_blank">http://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.8/</a><br /> 版本:zookeeper-3.4.8.tar.gz(可根据自己需求下载相应的版本。这里只是一个使用案例,现在已经有3.4.10了以及3.5.x的beta版) <h3>2.JAVA运行环境安装</h3> linux上安装jre可以参照之前的一篇文章,<a rel="" href="http://www.leftso.com/blog/39.html" rel="" target="_blank">linux(centos)系统配置安装jdk</a>。如果已经安装则忽略该步骤。 <h3>3.将zookeeper文件包上传至服务器</h3> <h2>四.创建配置文件以及相关文件夹</h2> <h3>4.1创建目录/zookeeper/</h3> <pre> <code class="language-html">#mkdir /zookeeper/</code></pre> <h3>4.2解压zookeeper-3.4.8.tar.gz</h3> <pre> <code class="language-html">#tar -zxvf zookeeper-3.4.8.tar.gz</code></pre> <h3>4.3将解压后的zookeeper文件移动至/zookeeper目录下并重明明server1</h3> <pre> <code class="language-html">#mv zookeeper-3.4.8 /zookeeper/server1</code></pre> <h3>4.5切换至server1的conf目录创建zoo.cfg配置文件</h3> <pre> <code class="language-html">#cd /zookeeper/server1/conf/ #vi zoo.cfg</code></pre> <h3>4.6zoo.cfg内容</h3> <pre> <code class="language-html">tickTime=2000 initLimit=5 syncLimit=2 dataDir=/zookeeper/server1/data dataLogDir=/zookeeper/server1/log clientPort=2181 server.1=127.0.0.1:2888:3888 server.2=127.0.0.1:2889:3889 server.3=127.0.0.1:2890:3890</code></pre> <p><strong>说明:这里我要在同一台机器上配置3台server所以这配置了三条server信息。注意保证配置的端口未被占用。</strong></p> <h3><br /> 4.7zoo.cfg文件中参数说明</h3> <ul> <li><strong>tickTime</strong>:zookeeper中使用的基本时间单位, 毫秒值。 </li> <li><strong>initLimit</strong>:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个 tickTime 时间间隔数。这里设置为5表名最长容忍时间为 5 * 2000 = 10 秒。 </li> <li><strong>syncLimit</strong>:这个配置标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2 * 2000 = 4 秒。 </li> <li><strong>dataDir</strong> 和 <strong>dataLogDir</strong> 看配置就知道干吗的了,不用解释。 </li> <li><strong>clientPort</strong>:监听client连接的端口号,这里说的client就是连接到Zookeeper的代码程序。 </li> <li><strong>server</strong>.{myid}={ip}:{leader服务器交换信息的端口}:{当leader服务器挂了后, 选举leader的端口} </li> <li><strong>maxClientCnxns</strong>:对于一个客户端的连接数限制,默认是60,这在大部分时候是足够了。但是在我们实际使用中发现,在测试环境经常超过这个数,经过调查发现有的团队将几十个应用全部部署到一台机器上,以方便测试,于是这个数字就超过了。</li> </ul> <h3>4.8.创建data和log目录</h3> <pre> <code class="language-html">#mkdir -p /zookeeper/server1/data #mkdir -p /zookeeper/server1/log</code></pre> <h3>4.9创建data目录中的myid文件(必须)</h3> <pre> <code class="language-html">#cd /zookeeper/server1/data #echo 1>myid</code></pre> 好了到这里第一台的配置基本完成了。 <h2>4.10复制多台server</h2> <pre> <code class="language-html">#cp -r /zookeeper/server1 /zookeeper/server2 #cp -r /zookeeper/server1 /zookeeper/server3</code></pre> <p>注意修改2和3的配置文件zoo.cfg,修改的地方是clientPort=2181分别修改成,修改的地方是clientPort=2182,,修改的地方是clientPort=2183<br /> 配置清单:<br /> server1-->zoo.cfg:</p> <pre> <code class="language-html">tickTime=2000 initLimit=5 syncLimit=2 dataDir=/zookeeper/server1/data dataLogDir=/zookeeper/server1/log clientPort=2181 server.1=127.0.0.1:2888:3888 server.2=127.0.0.1:2889:3889 server.3=127.0.0.1:2890:3890</code></pre> server2-->zoo.cfg: <pre> <code class="language-html">tickTime=2000 initLimit=5 syncLimit=2 dataDir=/zookeeper/server2/data dataLogDir=/zookeeper/server2/log clientPort=2182 server.1=127.0.0.1:2888:3888 server.2=127.0.0.1:2889:3889 server.3=127.0.0.1:2890:3890</code></pre> server3-->zoo.cfg: <pre> <code class="language-html">tickTime=2000 initLimit=5 syncLimit=2 dataDir=/zookeeper/server3/data dataLogDir=/zookeeper/server3/log clientPort=2183 server.1=127.0.0.1:2888:3888 server.2=127.0.0.1:2889:3889 server.3=127.0.0.1:2890:3890</code></pre> <br /> server1 ->./data/myid <pre> <code class="language-html">1</code></pre> server2 ->./data/myid <pre> <code class="language-html">2</code></pre> server3 ->./data/myid <pre> <code class="language-html">3</code></pre> <br /> <strong>注意:myid一定要修改</strong> <h2>五.启动并测试</h2> <h3>5.1启动第一台zookeeper服务</h3> <pre> <code>#cd /zookeeper/server1/bin #./zkServer.sh start</code></pre> 查看日志内容 <pre> <code>vi /zookeeper/server1/bin/zookeeper.out</code></pre> 可以看到类似以下错误信息 <pre> <code class="language-html">java.net.ConnectException: Connection refused (Connection refused) at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:589) at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:381) at org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend(QuorumCnxManager.java:354) at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.process(FastLeaderElection.java:452) at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.run(FastLeaderElection.java:433) at java.lang.Thread.run(Thread.java:748) 2017-08-06 15:42:40,542 [myid:1] - INFO [WorkerSender[myid=1]:QuorumPeer$QuorumServer@149] - Resolved hostname: 127.0.0.1 to address: /127.0.0.1 2017-08-06 15:42:40,542 [myid:1] - WARN [WorkerSender[myid=1]:QuorumCnxManager@400] - Cannot open channel to 3 at election address /127.0.0.1:3890 </code></pre> 这是因为启动的时候zookeeper去找其他两台服务了,其他两台服务还没启动所以链接失败。 <h3>5.2接下来启动第二台zookeeper服务并观察日志</h3> <pre> <code class="language-html">#cd /zookeeper/server2/bin #./zkServer.sh start</code></pre> 可以看到错误信息比第一台启动的时候要少 <h3>5.3启动第三台zookeeper服务</h3> <pre> <code class="language-html">#cd /zookeeper/server3/bin #./zkServer.sh start</code></pre> 观察第三台的启动日志,已经没有错误。说明已经正常集群了。接下来将进行简单的测试<br /> <br /> <strong>提示:<span style="color:#ff0000">启动命令为./zkServer.sh start,默认读取的conf目录下的zoo.cfg如果需要自己指定配置文件路径则为./zkServer.sh start pathtoyourcfgFile</span></strong> <h3>5.4测试</h3> 随便进入一个zk目录,连接一个server测试。 <br />   <pre> <code class="language-html">#cd /zookeeper/server1/bin #.zkCli.sh -server 127.0.0.1:2181</code></pre> 如果你要连接别的服务器,请指定具体的IP地址。<br /> <br /> <strong>几个zookeeper基本命令说明:</strong>  <ul> <li>ls 查看指定节点中包含的子节点(如:ls / 或 ls /app1/server1) </li> <li>create 创建节点并赋值 </li> <li>get 读取节点内容 </li> <li>set 改变节点内容 </li> <li>delete 删除节点 </li> <li>注意zk中所有节点都基于路径确定,如你要删除 /app1/server1/nodeA 的命令为: </li> <li>delete /app1/server1/nodeA</li> </ul> <br /> 下面是几个基本命令操作使用: <pre> <code class="language-html">WatchedEvent state:SyncConnected type:None path:null [zk: 127.0.0.1:2181(CONNECTED) 0] ls / [zookeeper] [zk: 127.0.0.1:2181(CONNECTED) 1] create /zk "leftso.com" Created /zk [zk: 127.0.0.1:2181(CONNECTED) 2] get /zk leftso.com cZxid = 0x300000003 ctime = Sun Aug 06 15:55:17 PDT 2017 mZxid = 0x300000003 mtime = Sun Aug 06 15:55:17 PDT 2017 pZxid = 0x300000003 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 10 numChildren = 0 [zk: 127.0.0.1:2181(CONNECTED) 3] set /zk "www.leftso.com" cZxid = 0x300000003 ctime = Sun Aug 06 15:55:17 PDT 2017 mZxid = 0x300000004 mtime = Sun Aug 06 15:55:36 PDT 2017 pZxid = 0x300000003 cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 14 numChildren = 0 [zk: 127.0.0.1:2181(CONNECTED) 4] get /zk www.leftso.com cZxid = 0x300000003 ctime = Sun Aug 06 15:55:17 PDT 2017 mZxid = 0x300000004 mtime = Sun Aug 06 15:55:36 PDT 2017 pZxid = 0x300000003 cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 14 numChildren = 0 [zk: 127.0.0.1:2181(CONNECTED) 5] ls / [zk, zookeeper] [zk: 127.0.0.1:2181(CONNECTED) 6] delete /zk [zk: 127.0.0.1:2181(CONNECTED) 7] ls / [zookeeper] [zk: 127.0.0.1:2181(CONNECTED) 8] </code></pre> <br /> <br /> 到这里zookeeper的安装配置基本讲完,后面讲讲解Java中如何调用zookeeper<br /> <br />  
  • linux中samba客服端smbclient整合shell脚本

    linux中samba客服端smbclient整合shell脚本实现类似ftp脚本下载上传文件,Linux,samba,smbclientlinux中samba客服端smbclient整合shell脚本实现类似ftp脚本下载上传文件<br />   <pre> <code class="language-bash">#!/bin/bash localDir=/smb/media #smbclient //10.1.1.1/XiaoMi-usb0 -U guest%1 #其中上面的用户名和密码是guest%1 用户是guest 密码是1,链接操作 smbclient //10.1.1.1/XiaoMi-usb0 -U guest%1 <<- EOF #切换本地目录,类似ftp lcd $localDir #切换远程目录 cd 下载 prompt #下载需要下载的文件或匹配文件 mget $1 exit EOF</code></pre> <br /> 执行: <pre> <code class="language-bash">./download-route-samba.sh *速度与激情*.mkv</code></pre> <br /> 执行脚本将会把满足条件的文件全部download到本地。<br /> <br /> 脚本中的很多参数可以根据自身需要进行修改。<br /> <br /> 至次 samba客服端smbclient整合shell脚本实现脚本批处理自动处理等功能。<br /> <br />  
  • keepalived安装及配置使用keepalived监听端口

    keepalived安装及配置使用keepalived监听端口<h2><img alt="keepalived" class="img-thumbnail" src="/assist/images/blog/8eb5bf8739af46eca1ffa100e0b1bb8a.png" /></h2> <p>(keepalived双机网络图)<br />  </p> <h2>1.通过yum安装keepalived软件<br />  </h2> <pre> <code>yum install keepalived -y </code></pre> <h2><br /> 2.keepalived默认配置文件存放位置</h2> <pre> <code>/etc/keepalived/keepalived.conf</code></pre> <h2>3.keepalived配置文件详解</h2> <h3><strong>模式1</strong>:通过keepalived检查脚本,脚本检查应用的方式使用。</h3> 通过shell脚本检查应用的进程是否存在,如果不存在则停止keepalived服务,达到让本机失去抢占VIP的机会。剩下的其他机器根据优先级占用VIP;<br /> 注意:每个机器的优先级必须不同;每个机器状态默认均为BACKUP(BACKUP不会在高优先级启动的时候瞬间抢占VIP,主要用于数据库方面的数据同步,如果瞬间抢回中间未同步完全的数据将会出现问题); <pre> <code class="language-html">! Configuration File for keepalived global_defs { router_id 10086 #用户标识本节点的名称,通常为hostname } vrrp_script check_redis {#创建一个vrrp_script脚本,检查配置 script "/etc/keepalived/check_redis.sh" #在脚本中杀死keepalived的进程 interval 2 #检查脚本的频率,单位(秒) } vrrp_instance VI_1 { state BACKUP #配置为BACKUP节点,一般有三个配置可选MASTER(主机)、BACKUP(备机) nopreempt #不抢占模式,必须配合BACKUP。在配置了该模式后优先级则失去作用。谁先启动谁就是MASTER,失败后必须杀死当前keepalived进程,再次重启不会立即抢占资源。实际场合中推荐使用该方式而不是使用优先级的抢占模式。抢占模式会出现一些数据同步的问题。 interface eth0 #虚拟IP使用的网卡名称 virtual_router_id 51 #VRRP组名,多个节点的设置值必须一样,以指明各个节点属于同一个VRRP组 priority 90 #节点的优先级(1-254之间的值) advert_int 1 #组播信息发送间隔,多个节点设置必须一样 authentication {#设置验证信息,同一个组的多个节点设置必须一致 auth_type PASS auth_pass 1111 } virtual_ipaddress {#指定虚拟IP(即VIP)同一个组的多个节点必须设置一致 192.168.1.100 } track_script { check_redis #执行指定vrrp_script脚本 } }</code></pre> <p><strong>check_redis.sh脚本:</strong></p> <pre> <code class="language-bash">#!/bin/sh CHECK_PROCESS=`ps -C redis-server --no-heading| wc -l` if [ $CHECK_PROCESS -eq 0 ];then echo "Redis is stop" sleep 2 CHECK_PROCESS=`ps -C redis-server --no-heading| wc -l` if [ $CHECK_PROCESS -eq 0 ];then /etc/init.d/keepalived stop fi fi </code></pre> <h3><strong>check_port.sh脚本</strong><br />  </h3> <pre> <code class="language-bash">#!/bin/bash #keepalived 监控端口脚本 #使用方法: #在keepalived的配置文件中 #vrrp_script check_port {#创建一个vrrp_script脚本,检查配置 # script "/etc/keepalived/check_port.sh 6379" #配置监听的端口 # interval 2 #检查脚本的频率,单位(秒) #} CHK_PORT=$1 echo $CHK_PORT if [ "$CHK_PORT" != "" ];then PORT_PROCESS=`lsof -i:$CHK_PORT|wc -l` if [ $PORT_PROCESS -eq 0 ];then echo "Port $CHK_PORT Is Not Used,End." sleep 2 PORT_PROCESS=`lsof -i:$CHK_PORT|wc -l` if [ $PORT_PROCESS -eq 0 ];then /etc/init.d/keepalived stop fi fi else echo "Check Port Cant Be Empty!" fi</code></pre> <h3><br /> <strong>模式二:</strong>通过keepalived直接监听应用端口方式使用</h3> 配置文件:/etc/keepalived.conf <pre> <code class="language-bash">! Configuration File for keepalived global_defs { router_id 10086 } vrrp_script check_redis { script "</dev/tcp/127.0.0.1/6379" #修改最后的redis端口6379为自己需要监听的端口,理论上可以监听远程端口 interval 2 #检查脚本的频率,单位(秒) weight -30 #端口检查失败,优先级减少30,默认减少2[注意:两台主机配置的weight相同时候必须保证weight的值大于priority差值] } vrrp_instance VI_1 { state MASTER#BACKUP interface eth0 virtual_router_id 51 priority 95 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.100 192.168.2.110 } track_script { check_redis } }</code></pre> 每个主机配置的内容仅仅优先级不能相同,其他保持一致。这里默认使用的MASTER,所以在优先级高的节点恢复之后会立即抢占VIP。如果不希望立即抢回VIP则配置BACKUP,BACKUP则是当前VIP机器的keepalived服务挂掉再去寻找高优先级的主机。<br /> <br /> 整个过程可以通过一下命令查看日志: <pre> <code>tail -f /var/log/message</code></pre> <h2> </h2> <p><span style="color:#8e44ad"><strong>推荐使用脚本+非抢占模式使用</strong></span></p> <h2><br /> 4.开放防火墙端口</h2> <strong>注意:keepalived默认使用端口122进行通讯,必须开放112端口,或者停用防火墙.保证各个主机之间112端口的连通性</strong><br /> CentOS6中iptables配置开放112端口 <pre> <code class="language-html">#iptables -I INPUT -p 112 -j ACCEPT</code></pre> 保存规则并重启防火墙 <pre> <code>service iptables save service iptables restart</code></pre> <p>查看iptables端口开放情况</p> <pre> <code class="language-bash">[root@template keepalived]# iptables -L -n --line-numbers Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT 112 -- 0.0.0.0/0 0.0.0.0/0 2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 3 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 4 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 6 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) num target prot opt source destination 1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) num target prot opt source destination [root@template keepalived]# </code></pre> <h2><br /> 5.启动keepalived</h2> 启动命令: <pre> <code>service keepalived start</code></pre> 查看启用状态 <pre> <code>service keepalived status</code></pre> 设置开机启动 <pre> <code>chkconfig keepalived on</code></pre> <br /> <br /> keepalived其他详细配置说明 <p><strong>全局定义块</strong></p> <p>1、email通知(notification_email、smtp_server、smtp_connect_timeout):用于服务有故障时发送邮件报警,可选项,不建议用。需要系统开启sendmail服务,建议用第三独立监控服务,如用<a href="http://baike.baidu.com/link?url=eiaO-UZufjBG-j-e-nMS2RZrjxE_Xd2PpecyOrAq3sv0umvlhfpMlkR7pO-wEnpV4Vb2e7DWnZ9kKDfeh9YiDa" rel="external nofollow" target="_blank">nagios</a>全面监控代替。 <br /> 2、lvs_id:lvs负载均衡器标识,在一个网络内,它的值应该是唯一的。 <br /> 3、router_id:用户标识本节点的名称,通常为hostname <br /> 4、花括号{}:用来分隔定义块,必须成对出现。如果写漏了,keepalived运行时不会得到预期的结果。由于定义块存在嵌套关系,因此很容易遗漏结尾处的花括号,这点需要特别注意。</p> <p><strong>VRRP</strong><strong>实例定义块</strong></p> <ol start="1"> <li>vrrp_sync_group:同步vrrp级,用于确定失败切换(FailOver)包含的路由实例个数。即在有2个负载均衡器的场景,一旦某个负载均衡器失效,需要自动切换到另外一个负载均衡器的实例是哪</li> <li>group:至少要包含一个vrrp实例,vrrp实例名称必须和vrrp_instance定义的一致</li> <li>vrrp_instance:vrrp实例名 <br /> <strong>1> state</strong>:实例状态,只有MASTER 和 BACKUP两种状态,并且需要全部大写。抢占模式下,其中MASTER为工作状态,BACKUP为备用状态。当MASTER所在的服务器失效时,BACKUP所在的服务会自动把它的状态由BACKUP切换到MASTER状态。当失效的MASTER所在的服务恢复时,BACKUP从MASTER恢复到BACKUP状态。 <br /> <strong>2> interface</strong>:对外提供服务的网卡接口,即VIP绑定的网卡接口。如:eth0,eth1。当前主流的服务器都有2个或2个以上的接口(分别对应外网和内网),在选择网卡接口时,一定要核实清楚。 <br /> <strong>3>mcast_src_ip</strong>:本机IP地址 <br /> <strong>4>virtual_router_id</strong>:虚拟路由的ID号,每个节点设置必须一样,可选择IP最后一段使用,相同的 VRID 为一个组,他将决定多播的 MAC 地址。 <br /> <strong>5> priority</strong>:节点优先级,取值范围0~254,MASTER要比BACKUP高 <br /> <strong>6>advert_int</strong>:MASTER与BACKUP节点间同步检查的时间间隔,单位为秒 <br /> <strong>7>lvs_sync_daemon_inteface</strong>:负载均衡器之间的监控接口,类似于 HA HeartBeat的心跳线。但它的机制优于 Heartbeat,因为它没有“裂脑”这个问题,它是以优先级这个机制来规避这个麻烦的。在 DR 模式中,lvs_sync_daemon_inteface与服务接口interface使用同一个网络接口 <br /> <strong>8> authentication</strong>:验证类型和验证密码。类型主要有 PASS、AH 两种,通常使用PASS类型,据说AH使用时有问题。验证密码为明文,同一vrrp实例MASTER与BACKUP使用相同的密码才能正常通信。 <br /> <strong>9>smtp_alert</strong>:有故障时是否激活邮件通知 <br /> <strong>10>nopreempt</strong>:禁止抢占服务。默认情况,当MASTER服务挂掉之后,BACKUP自动升级为MASTER并接替它的任务,当MASTER服务恢复后,升级为MASTER的BACKUP服务又自动降为BACKUP,把工作权交给原MASTER。当配置了nopreempt,MASTER从挂掉到恢复,不再将服务抢占过来。 <br /> <strong>11>virtual_ipaddress</strong>:虚拟IP地址池,可以有多个IP,每个IP占一行,不需要指定子网掩码。注意:这个IP必须与我们的设定的vip保持一致。</li> </ol> <p>keepalived.conf配置文件中加入以下内容</p> <p>1.notify_master“想要执行的脚本路径” #表示当切换到master状态时,要执行的脚本</p> <p>2.notify_backup “想要执行的脚本路径”#表示当切换到backup状态时,要执行的脚本</p> <p>3.notify_fault“想要执行的脚本路径”#表示切换出现故障时要执行的脚本</p> <br />  
  • java基础ArrayList与LinkedList的区别以及使用场景

    本文组要摘录了网上各位大佬的总结。作为笔记搜录。尽量详细的讲解ArrayList与LinkedList的区别以及在何时选择那个用。<h2>一.ArrayList与LinkedList的区别</h2>  说法一: <ol> <li>因为Array是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。Array获取数据的时间复杂度是O(1),但是要新增或者删除数据却是开销很大的,因为这需要重排数组中的所有数据。</li> <li>相对于ArrayList,LinkedList插入是更快的。因为LinkedList不像ArrayList一样,不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一个新的数组,这是ArrayList最坏的一种情况,时间复杂度是O(n),而LinkedList中插入或删除的时间复杂度仅为O(1)。ArrayList在插入或sh数据删除需要更新索引(除了插入数组的尾部)。</li> <li>LinkedList需要更多的内存,因为ArrayList的每个索引的位置是实际的数据,而LinkedList中的每个节点中存储的是实际的数据和前后节点的位置</li> </ol> 说法二: <ol> <li>ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 </li> <li>对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 </li> <li>对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。 </li> </ol> 以上说法均为正确。 <h2>二.ArrayList与LinkedList的使用场景</h2> LinkedList: <ul> <li> 你的应用不会随机访问数据。因为如果你需要LinkedList中的第n个元素的时候,你需要从第一个元素顺序数到第n个数据,然后读取数据。</li> <li> 你的应用更多的插入和删除元素,更少的读取数据。因为插入和删除元素不涉及重排数据,所以它要比ArrayList要快。</li> </ul> ArrayList: <ul> <li>你的应用需要随机访问数据,基本不会在list中插入或者删除元素</li> </ul>
  • 猫盘刷群晖 DS119J

    前言上一篇文章猫盘1T版拆机讲述了猫盘如何简单的拆机,本文主要是针对猫盘刷黑群晖进行讲解前言上一篇文章猫盘1T版拆机讲述了猫盘如何简单的拆机,本文主要是针对猫盘刷黑群晖进行讲解。​猫盘刷机资源下载刷机么,肯定先要下载一些刷机工具拉。猫盘刷群晖工具下载 解压密码:ifok猫盘开始刷机步骤一: 把flash_all.bin放入u盘中,u盘必须为fat32步骤二: 猫盘接上串口,U盘也插上,通电时狂按回车,输入下列命令setenv bootargs "console=ttyMV0,115200 root=/dev/mmcblk0p1 rootwait rw init=/bin/sh" ext4load mmc 0:1 0x1000000 boot/armada-3720-customer0.dtb ext4load mmc 0:1 0x2000000 boot/Image booti 0x2000000 - 0x1000000 进入无需登陆的shell,输入下列命令mount -t proc /proc mount /dev/mmcblk0p2 /media mount /dev/sda1 /mnt cp -f /mnt/flash_all.bin /media umount /media umount /mnt 直接拔电后在插电,狂按回车,输入下列命令(最后两个命令所需时间比较长,慢慢等)ext4load mmc 0:2 0x1000000 flash_all.bin sf probe sf erase 0x0 0x800000 sf write 0x1000000 0x0 0x800000 到这里flash固件就刷好了,可以拔电了!通过u盘系统刷入debian系统后再刷入群晖 1. 把固件烧录到u盘推荐使用Etcher这个软件,先把disk.img.bz2里的镜像disk.img解压出来,然后直接烧录到u盘就行2. 进入u盘系统,安装debian到emmc猫盘插上u盘,按住复位上电。在串口能看到输出,登录系统,账号root,密码debian,执行下列命令./install_debian_mmc 3. 进入emmc的debian系统安装群晖先把格式化好的硬盘插上!!!上边装好后,记得拔掉u盘,同样也是按住复位键上电,就能进入emmc的debian,同样在串口操作。先登录,然后执行下列命令(所需时间较长,慢慢等)./formatdisk ./install_syno 4. 重新插下电就行了5. 最后还要改下mac和sn,教程放下面的百度网盘里了串口全程都不用拔!!!串口全程都不用拔!!!串口全程都不用拔!!!