Zookeeper-扩展之殇

一、背景基于公司发展硬性需求,生产VM服务器要统一迁移到ZStack 虚拟化服务器。检查自己项目使用的服务器,其中zookeeper集群中招,所以需要进行迁移。 二、迁移计划为了使迁移不对业务产生影响,所以最好是采用扩容 -> 缩容 的方式进行。 说明:1.原生产集群为VM-1,VM-2,VM-3组成一个3节点的ZK集群;2.对该集群扩容,增加至6节点(新增ZS-1,ZS-2,ZS-3),进行数据同步完成;3.进行缩容,下掉原先来的三个节点(VM-1,VM-2,VM-3);4.替换nginx解析地址。OK! 目标很明确,过程也很清晰,然后开干。三、步骤 (过程已在测试环境验证无问题):对新增的三台服务器进行zk环境配置,和老集群配置一样即可,最好使用同一版本(版主使用的是3.4.6);对老节点的zoo.cfg 增加新集群的地址(逐一增加),然后对新增加节点逐一重启。 四、问题ZS-1 启动成功,zkServer.sh status 报错,用zkServer.sh status查看,反馈如下异常:[root@localhost bin]# ./zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /usr/zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfgError contacting service. It is probably not running.此时查看数据,数据同步正常ZS-1 数据同步正常,但是无法查看节点的状态信息;怀疑是因为老节点没有重启的原因;此时去查看原集群节点信息,发现原集群节点状态异常。经排查定位,原集群的状态一直处于异常状态。初步定位原因可能是原集群的选举存在异常,导致新节点无法正常纳入,继续排查。恢复集群初始状态,如果集群节点的状态一直没法正常查看。OK 继续定位...五、排查过程以下方法来自于网络: 可能有以下几个原因:第一、zoo.cfg文件配置:dataLogDir指定的目录未被创建。 1.zoo.cfg[root@SIA-215 conf]# cat zoo.cfg...dataDir=/app/zookeeperdata/datadataLogDir=/app/zookeeperdata/log...2.路径[root@SIA-215 conf]# cd /app/zookeeperdata/[root@SIA-215 zookeeperdata]# lltotal 8drwxr-xr-x 3 root root 4096 Apr 23 19:59 datadrwxr-xr-x 3 root root 4096 Aug 29 2015 log经排查 排除该因素。 第二、myid文件中的整数格式不对,或者与zoo.cfg中的server整数不对应。 [root@SIA-215 data]# cd /app/zookeeperdata/data[root@SIA-215 data]# cat myid 2[root@SIA-215 data]# 定位排查后排除不是该原因。 ...

May 29, 2019 · 2 min · jiezi

如何扩展Laravel

注册服务向容器中注册服务// 绑定服务$container->bind(’log’, function(){ return new Log();});// 绑定单例服务$container->singleton(’log’, function(){ return new Log();});扩展绑定扩展已有服务$container->extend(’log’, function(Log $log){ return new RedisLog($log);});ManagerManager实际上是一个工厂,它为服务提供了驱动管理功能。Laravel中的很多组件都使用了Manager,如:Auth、Cache、Log、Notification、Queue、Redis等等,每个组件都有一个xxxManager的管理器。我们可以通过这个管理器扩展服务。比如,如果我们想让Cache服务支持RedisCache驱动,那么我们可以给Cache服务扩展一个redis驱动:Cache::extend(‘redis’, function(){ return new RedisCache();});这时候,Cache服务就支持redis这个驱动了。现在,找到config/cache.php,把default选项的值改成redis。这时候我们再用Cache服务时,就会使用RedisCache驱动来使用缓存。Macro和Mixin有些情况下,我们需要给一个类动态增加几个方法,Macro或者Mixin很好的解决了这个问题。在Laravel底层,有一个名为Macroable的Trait,凡是引入了Macroable的类,都支持Macro和Mixin的方式扩展,比如Request、Response、SessionGuard、View、Translator等等。Macroable提供了两个方法,macro和mixin,macro方法可以给类增加一个方法,mixin是把一个类中的方法混合到Macroable类中。举个例子,比如我们要给Request类增加两个方法。使用macro方法时:Request::macro(‘getContentType’, function(){ // 函数内的$this会指向Request对象 return $this->headers->get(‘content-type’);});Request::macro(‘hasField’, function(){ return !is_null($this->get($name));});$contentType = Request::getContentstType();$hasPassword = Request::hasField(‘password’);使用mixin方法时:class MixinRequest{ public function getContentType(){ // 方法内必须返回一个函数 return function(){ return $this->headers->get(‘content-type’); }; } public function hasField(){ return function($name){ return !is_null($this->get($name)); }; }}Request::mixin(new MixinRequest());$contentType = Request::getContentType();$hasPassword = Request::hasField(‘password’);

April 14, 2019 · 1 min · jiezi

Zephir 简介

什么是 ZephirZephir 是一种中间语言,以接近 PHP 的语法来编写代码,然后转换成 PHP 扩展。安装要构建PHP扩展并使用Zephir,您需要满足以下要求 (以centos7 + php7.2 为例)编译环境官方示例以ubuntu,需要安装如下扩展sudo apt-get install git gcc make re2c php php-json php-dev libpcre3-dev build-essentialcentos yum安装yum install -y git gcc make re2c autoconf automake libtool pcre pcre-develyum groupinstall -y “Development Tools"某些库可能某些源没有,可以更换源或者下载源码安装php 扩展Zephir parser >= 1.1.0wget https://github.com/phalcon/php-zephir-parser/archive/v1.2.0.tar.gzmv v1.2.0.tar.gz php-zephir-parser-v1.2.0.tar.gztar -xvzf php-zephir-parser-v1.2.0.tar.gzcd php-zephir-parser-1.2.0//usr/local/php7/bin/phpize./configure –with-php-config=/usr/local/php7/bin/php-configmake && make installgmp (php源码中包含该扩展,默认情况下不安装)扩展安装方法大同小异,不另说明以源码编译的方式追加安装这两扩展,并配置ini文件extension=gmp.soextension=zephir_parser.so安装 Zephir下载最新版本,我们使用phar包cd /usr/local/binwget https://github.com/phalcon/zephir/releases/download/0.11.10/zephir.pharchmod 777 zephir.pharln -s /usr/local/bin/zephir.phar zephir检查是否安装成功zephir help安装成装显示如下图创建扩展初始化一个应用zephir init first生成如下两个目录和一个文件编写代码注意:在 Zephir中, 每个文件都必须包含一个类 (并且只有一个类)。 每个类都必须有一个命名空间, 并且目录结构必须与所使用的类和命名空间的名称相匹配。使用 phpstorm 作为IDE,安装 Zephir 插件。firstfirsthello.zepnamespace First;class Hello{ public function world() { echo “Hello world!”; } public function zephir() { echo “Hello Zephir!”; }}编译zephir build第一次执行,运气不好的话会失败。详细日志见 compile-errors.log 文件的内容。如果build成功,会自动生成 first.so 文件到 extension 目录 ,你需要编辑 php.ini 填加扩展测试一下<?phpecho First\Hello::world(), “\n”;就这样,你也会 PHP 扩展开发了附1:Available commands: init Initializes a Zephir extension builddev Generates/Builds/Installs a Zephir extension in development mode api Generates a HTML API based on the classes exposed in the extension clean Cleans any object files created by the extension generate Generates C code from the Zephir code without compiling it build Generates/Builds/Installs a Zephir extension stubs Generates stubs that can be used in a PHP IDE help Displays this help and exit fullclean Cleans any object files created by the extension (including files generated by phpize) compile Compile a Zephir extension install Installs the extension in the extension directory (may require root password) version Shows the Zephir version ...

February 25, 2019 · 1 min · jiezi

Chrome crx插件扩展离线安装方法 (兼容所有版本)

如果您已经是新版Chrome,会看到如下错误错误提示: 无法从该网站添加应用、扩展程序和用户脚本原因是:自从 Chrome 67 以后就不再支持,拖动安装crx插件的方法了。而目最新版本已经到了 Chrome 71 。 这里简单说一下,兼容所有chrome版本的插件离线安装的方法。一、下载插件使用插件可以极大提高chrome浏览器的用户体验,包括常用的去广告、划词翻译、office文件在线预览、还有一些开发者的调试工具等。插件下载地址 : 极简插件二、安装插件新版chrome的安装方法可以兼容所有版本的chrome浏览器。首先要下载插件伴侣下载地址:官方下载 备用下载打开以后的界面开始之前先退出chrome浏览器选择插件开始安装至此安装完成,打开chrome浏览器,去启用一下插件。点击【右上角3个点】 - 【更多工具】 - 【扩展程序】依次打开 【开发者模式】 和 【插件右下角的开关】 即可。大功告成另外找插件可以参考我之前发的文章:新站上线,分享10个最强chrome浏览器插件!瞬间开发效率加倍

January 18, 2019 · 1 min · jiezi