作者: pbdatacn

  • [转]zookeeper应用场景

    分布式系统的运行是很复杂的,因为涉及到了网络通信还有节点失效等不可控的情况。下面介绍在最传统的master-workers模型,主要可以会遇到什么问题,传统方法是怎么解决以及怎么用zookeeper解决。

    场景1:Master节点管理
    集群当中最重要的是Master,所以一般都会设置一台Master的Backup。

    Backup会定期向Master获取Meta信息并且检测Master的存活性,一旦Master挂了,Backup立马启动,接替Master的工作自己成为Master,分布式的情况多种多样,因为涉及到了网络通信的抖动,针对下面的情况:

    Backup检测Master存活性传统的就是定期发包,一旦一定时间段内没有收到响应就判定Master Down了,于是Backup就启动,如果Master其实是没有down,Backup收不到响应或者收到响应延迟的原因是因为网络阻塞的问题呢?Backup也启动了,这时候集群里就有了两个Master,很有可能部分workers汇报给Master,另一部分workers汇报给后来启动的Backup,这下子服务就全乱了。
    Backup是定期同步Master中的meta信息,所以总是滞后的,一旦Master挂了,Backup的信息必然是老的,很有可能会影响集群运行状态。
    解决问题:

    Master节点高可用,并且保证唯一。
    Meta信息的及时同步

    zookeeper Master选举

    zookeeper会分配给注册到它上面的客户端一个编号,并且zk自己会保证这个编号的唯一性和递增性,N多机器中只需选出编号最小的Client作为Master就行,并且保证这些机器的都维护一个一样的meta信息视图,一旦Master挂了,那么这N机器中编号最小的胜任Master,Meta信息是一致的。

    场景2:配置文件管理

    集群中配置文件的更新和同步是很频繁的,传统的配置文件分发都是需要把配置文件数据分发到每台worker上,然后进行worker的reload,这种方式是最笨的方式,结构很难维护,因为如果集群当中有可能很多种应用的配置文件要同步,而且效率很低,集群规模一大负载很高。还有一种就是每次更新把配置文件单独保存到一个数据库里面,然后worker端定期pull数据,这种方式就是数据及时性得不到同步。

    解决问题:

    统一配置文件分发并且及时让worker生效

    zookeeper发布与订阅模型
    发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到ZK节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。例如全局的配置信息,服务式服务框架的服务地址列表等就非常适合使用。

    场景3:分布式锁

    在一台机器上要多个进程或者多个线程操作同一资源比较简单,因为可以有大量的状态信息或者日志信息提供保证,比如两个A和B进程同时写一个文件,加锁就可以实现。但是分布式系统怎么办?需要一个三方的分配锁的机制,几百台worker都对同一个网络中的文件写操作,怎么协同?还有怎么保证高效的运行?
    解决问题:

    高效分布式的分布式锁

    zookeeper分布式锁

    分布式锁主要得益于ZooKeeper为我们保证了数据的强一致性,zookeeper的znode节点创建的唯一性和递增性能保证所有来抢锁的worker的原子性。

    场景4:集群worker管理

    集群中的worker挂了是很可能的,一旦workerA挂了,如果存在其余的workers互相之间需要通信,那么workers必须尽快更新自己的hosts列表,把挂了的worker剔除,从而不在和它通信,而Master要做的是把挂了worker上的作业调度到其他的worker上。同样的,这台worker重新恢复正常了,要通知其他的workers更新hosts列表。传统的作法都是有专门的监控系统,通过不断去发心跳包(比如ping)来发现worker是否alive,缺陷就是及时性问题,不能应用于在线率要求较高的场景
    解决问题:

    集群worker监控

    zookeeper监控集群

    利用zookeeper建立znode的强一致性,可以用于那种对集群中机器状态,机器在线率有较高要求的场景,能够快速对集群中机器变化作出响应。

    转自:http://www.cnblogs.com/likehua/p/3999600.html

  • 通过lvm调整linux根分区大小

    因为在虚拟机里安装linux时,在选择分区设置时,选择默认,使用的是lvm管理。从服务器上下载docker镜像时,报磁盘空间不足,检查如下:
    root@pbdata:~# df -lh

    Filesystem Size Used Avail Use% Mounted on 
    /dev/mapper/pbdata--vg-root 2G 1.7G 200m 98% / 
    cgroup 1001M 0 1001M 0% /sys/fs/cgroup 
    udev 990M 4.0K 990M 1% /dev 
    tmpfs 201M 600K 200M 1% /run 
    none 5.0M 0 5.0M 0% /run/lock 
    none 1001M 0 1001M 0% /run/shm 
    none 100M 0 100M 0% /run/user 
    /dev/sda1 236M 37M 187M 17% /boot 
    /dev/mapper/pbdata--vg-lvData01 35G 59M 33G 1% /app 
    /dev/mapper/pbdata--vg-lvData00 30G 488M 28G 2% /opt 
    

    发现根分区磁盘容量不够,需要扩容。因为默认的使用了lvm管理,而且使用lvm技术可以扩大根分区,不破坏分区表。操作如下:
    1.查看当前lvm情况
    root@pbdata:~# pvs
    PV VG Fmt Attr PSize PFree
    /dev/sda5 pbdata-vg lvm2 a– 79.76g 11.3g

    可以看到还有11.3g的空间未被使用,直接扩展即可,对根分区增加11g的空间

    2:扩展LV:
    $ lvextend -L +11g /dev/mapper/pbdata–vg-root
    3.调整大小
    $ resize2fs /dev/mapper/pbdata–vg-root
    4.再次查看

    root@pbdata:~# df -lh
    Filesystem                       Size  Used Avail Use% Mounted on
    /dev/mapper/pbdata--vg-root       13G  1.7G   11G  14% /
    cgroup                          1001M     0 1001M   0% /sys/fs/cgroup
    udev                             990M  4.0K  990M   1% /dev
    tmpfs                            201M  600K  200M   1% /run
    none                             5.0M     0  5.0M   0% /run/lock
    none                            1001M     0 1001M   0% /run/shm
    none                             100M     0  100M   0% /run/user
    /dev/sda1                        236M   37M  187M  17% /boot
    /dev/mapper/pbdata--vg-lvData01   35G   59M   33G   1% /app
    /dev/mapper/pbdata--vg-lvData00   30G  488M   28G   2% /opt
    
  • ubuntu14.0.4 上的 docer 安装

    环境:ubuntu14.0.4 LTS server 64

    1.将源加入ubuntu的源中
    $vi /etc/apt/sources.list
    在最后添加
    deb https://get.docker.com/ubuntu docker main

    2.需要安装 apt-transport-https 支持,之后通过添加源来安装。
    #安装apt-transport-https
    $ sudo apt-get install apt-transport-https
    # 导入key
    $apt-key adv –keyserver hkp://keyserver.ubuntu.com:80 –recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9

    3.安装docker
    $apt-get update
    $apt-get install -y lxc-docker

    Get:3 https://get.docker.io/ubuntu/ docker/main lxc-docker-1.4.1 amd64 1.4.1 [4,420 kB]
    Get:4 https://get.docker.io/ubuntu/ docker/main lxc-docker amd64 1.4.1 [2,090 B]
    Fetched 4,525 kB in 4min 22s (17.2 kB/s)                                       
    Selecting previously unselected package aufs-tools.
    (Reading database ... 56766 files and directories currently installed.)
    Preparing to unpack .../aufs-tools_1%3a3.0+20111101-1ubuntu1_amd64.deb ...
    Unpacking aufs-tools (1:3.0+20111101-1ubuntu1) ...
    Selecting previously unselected package cgroup-lite.
    Preparing to unpack .../cgroup-lite_1.1.5_all.deb ...
    Unpacking cgroup-lite (1.1.5) ...
    Selecting previously unselected package lxc-docker-1.4.1.
    Preparing to unpack .../lxc-docker-1.4.1_1.4.1_amd64.deb ...
    Unpacking lxc-docker-1.4.1 (1.4.1) ...
    Selecting previously unselected package lxc-docker.
    Preparing to unpack .../lxc-docker_1.4.1_amd64.deb ...
    Unpacking lxc-docker (1.4.1) ...
    Processing triggers for man-db (2.6.7.1-1) ...
    Processing triggers for ureadahead (0.100.0-16) ...
    ureadahead will be reprofiled on next reboot
    Setting up aufs-tools (1:3.0+20111101-1ubuntu1) ...
    Setting up cgroup-lite (1.1.5) ...
    cgroup-lite start/running
    Setting up lxc-docker-1.4.1 (1.4.1) ...
    docker start/running, process 1985
    Processing triggers for ureadahead (0.100.0-16) ...
    Setting up lxc-docker (1.4.1) ...
    Processing triggers for libc-bin (2.19-0ubuntu6) ...
    

    5.查看状态

    root@pbdata:/home/ljy# ps -ef | grep docker
    root      1985     1  0 21:04 ?        00:00:00 /usr/bin/docker -d
    root      2063  1239  0 21:14 pts/0    00:00:00 grep --color=auto docker
    
  • VI 正则表达式删除行首的注释

    用JD-GUI反编译class后,得到的源文件行首都会有行号注释,如下:

    /* */ private MimeMessage mimeMsg;
    /* */ private Session session;
    /* */ private Properties props;
    /* 36 */ private String username = "";
    /* */
    /* 38 */ private String password = "";
    /* */ private Multipart mp;
    /* */
    

    有的时候,想直接用,看着注释很不舒服,用vi编辑器,使用正则表达式直接替换每行前的注释,如下:

    :%s/^\/[\*] *\d* *\*\///g

    OK!

  • OpenStack 的global-requirements.txt

    2014-12-22 09:25:31.395 | Syncing /opt/stack/nova/requirements.txt
    2014-12-22 09:25:31.395 | ‘amqplib’ is not in global-requirements.txt
    2014-12-22 09:25:31.427 | + exit_trap
    2014-12-22 09:25:31.428 | + local r=1
    2014-12-22 09:25:31.428 | ++ jobs -p
    2014-12-22 09:25:31.439 | + jobs=
    2014-12-22 09:25:31.439 | + [[ -n ” ]]
    2014-12-22 09:25:31.439 | + exit 1

     

    git://github.com/openstack/requirements.gitmaster

    
    

    alembic>=0.4.1
    amqplib>=0.6.1
    anyjson>=0.3.3
    argparse
    argcomplete>=0.6.8 # Apache-2.0
    Babel>=1.3
    boto>=2.12.0,!=2.13.0
    cffi
    cliff>=1.4.3
    cmd2>=0.6.7
    coinor.pulp>=1.0.4
    croniter>=0.3.4 # MIT License
    ddt>=0.4.0
    decorator>=3.4.0
    diskimage-builder
    Django>=1.4,<1.7
    django-bootstrap-form
    django_compressor>=1.3
    django_openstack_auth>=1.1.4
    dnspython>=1.9.4
    dogpile.cache>=0.5.3
    eventlet>=0.13.0
    extras
    falcon>=0.1.6,<0.2.0
    Flask>=0.10,<1.0
    futures>=2.1.3
    gear
    greenlet>=0.3.2
    happybase>=0.5,!=0.7
    httplib2>=0.7.5
    iso8601>=0.1.9
    Jinja2
    jsonpatch>=1.1
    jsonpath-rw>=1.2.0,<2.0
    jsonrpclib
    jsonschema>=2.0.0,<3.0.0
    kazoo>=1.3.1
    lesscpy>=0.9j
    kombu>=2.4.8
    lockfile>=0.8
    lxml>=2.3
    Mako>=0.4.0
    msgpack-python
    netaddr>=0.7.6
    netifaces>=0.5,!=0.10.0,!=0.10.1
    networkx>=1.8
    oauthlib>=0.6
    ordereddict
    oslo.config>=1.2.0
    oslo.messaging>=1.3.0
    oslo.rootwrap
    oslotest
    oslo.vmware>=0.3 # Apache-2.0
    os-apply-config
    os-collect-config
    os-refresh-config
    paramiko>=1.9.0
    passlib
    Paste
    PasteDeploy>=1.5.0
    pbr>=0.6,!=0.7,<1.0
    pecan>=0.4.5
    pexpect>=3.1 # ISC License
    Pillow==2.4.0 # MIT
    pip>=1.4
    posix_ipc
    PrettyTable>=0.7,<0.8
    psutil>=1.1.1,<2.0.0
    pyasn1
    pycadf>=0.4.1
    pycrypto>=2.6
    pyeclib>=0.9.2 # BSD
    pyghmi>=0.5.8
    pymongo>=2.4
    pyOpenSSL>=0.11
    pyparsing>=2.0.1
    pysnmp>=4.2.1,<5.0.0
    pystache
    # OpenStack clients. None of these should have an upper bound
    # as that has implications for testing in the gate. An exception
    # is currently being made for neutron client because of the need
    # for an incompatible change in their next release.
    python-ceilometerclient>=1.0.6
    python-cinderclient>=1.0.6
    python-designateclient>=1.0.0
    python-heatclient>=0.2.3
    python-glanceclient>=0.9.0
    python-ironicclient
    python-keystoneclient>=0.8.0
    python-memcached>=1.48
    python-neutronclient>=2.3.4,<3
    python-novaclient>=2.17.0
    python-openstackclient>=0.3.0
    python-saharaclient>=0.6.0
    python-swiftclient>=2.0.2
    python-troveclient>=1.0.4
    pytz>=2010h
    pyudev
    PyYAML>=3.1.0
    qpid-python
    requests>=1.1
    Routes>=1.12.3
    rtslib-fb>=2.1.39
    simplejson>=2.0.9
    six>=1.6.0
    sockjs-tornado>=1.0.0,<2.0.0
    # The SQLA requirement looks weird, but it’s here for a reason.
    # The version of pip shipped with distros treats 0.8beta1 (which is
    # on pypi) as < 0.8 so the “clear” version of this requirement, is
    # actually broken. The fix for this isn’t until pip 1.4.1, which is
    # way more current than what most distros have.
    SQLAlchemy>=0.7.8,<=0.9.99
    sqlalchemy-migrate>=0.9.1
    stevedore>=0.14
    suds>=0.4
    taskflow>=0.1.3,<0.3
    tripleo-image-elements
    warlock>=1.0.1,<2
    WebOb>=1.2.3
    websockify>=0.5.1,<0.6
    wheel
    wsgiref>=0.1.2
    WSME>=0.6
    xattr>=0.4
    XenAPI>=1.2
    # Testing tools below, which are typically in test-requires.txt

    cliff-tablib>=1.0
    configobj
    coverage>=3.6
    discover
    django-nose
    docutils==0.9.1
    feedparser
    fixtures>=0.3.14
    flake8==2.1.0
    hacking>=0.8.0,<0.9
    hgtools # dependency of pytest-runner that is only in setup_requires
    httpretty>=0.8.0
    keyring>=2.1
    mock>=1.0
    mox>=0.5.3
    mox3>=0.7.0
    MySQL-python
    nose
    nose-exclude
    nosehtmloutput>=0.0.3
    nosexcover
    openstack-doc-tools>=0.11
    openstack.nose_plugin>=0.7
    oslosphinx
    pep8==1.4.6,==1.5.6
    proboscis==1.2.5.3
    psycopg2
    pyflakes==0.8.1
    pylint==0.25.2
    pysendfile==2.0.0
    pysqlite
    python-ldap==2.3.13
    python-subunit>=0.0.18
    pyzmq==2.2.0.1
    redis
    selenium
    sphinx>=1.1.2,<1.2
    sphinxcontrib-docbookrestapi
    sphinxcontrib-httpdomain
    sphinxcontrib-pecanwsme>=0.8
    swift
    testrepository>=0.0.18
    testresources>=0.2.4
    testscenarios>=0.4
    testtools>=0.9.34
    trollius>=0.1.4
    unittest2
    WebTest>=2.0
    wsgi_intercept>=0.6.1 # MIT License
    zake>=0.0.15

    # External libraries not tested in the gate, but present here to synchronize
    # packaging efforts. These are required by projects to enable hardware- or
    # vendor-specific functionality.
    python-seamicroclient>=0.1.0,<2.0
    hp3parclient>=3.0,<4.0
    hplefthandclient>=1.0.0,<2.0.0

     

  • 解决查看android的API文档,联网时速度慢的问题

    查看android的API文档,SDK的目录下的docs下面的index.xml文件,就是打开本地API文档,打开的时候如果联网速度就很慢,没有联网速度就很快。
    用chrome,F12查看网络(Network)可以看到打开index.html的时候会加载google.com上的css和js,又因为google退出中国,因此导致慢了

    解决方法如下:
    在:C:\Windows\System32\drivers\etc\hosts文件中,添加如下部分:
    127.0.0.1 fonts.googleapis.com
    127.0.0.1 www.google.com
    保存后,可以看到速度的明显提升

  • Mybatis 打印sql

    网上的文章都是配置

    log4j.logger.org.apache.ibatis=debug
    log4j.logger.java.sql=debug

    就可以了,可是,实际情况还是不行,经过百般查找,最终原因是jar包不完整..

    解决方法:

    必须将 slf4j-api-xxx.jar, slf4j-log4j12-xxx.jar, log4j-over-slf4j-xxx.jar, log4j-xxx.jar (replace xxx by the version, for example 1.6.3) 添加到 classpath中才行,否则就是打印不出来,我的log4j配置文件就是少了个log4j-over-slf4j-xxx.jar就死活打印不出来,加上就好了

     

     

  • Linux ssh无法登陆

    安装了一个centos,设置好了网络,配好了dns,可以ping同其它机器,其他机器也可以ping通该机器,当我通过ssh连接到这个机器上时,提示:
    Connecting to 192.168.100.151:22…
    Could not connect to ‘192.168.100.151’ (port 22): Connection failed.

    第一反应是网络不通,又重新进行测试,可是,发现网络没有问题。继续排查其他问题,

    chkconfig –list | grep ssh
    发现全部是off,一下子知道问题的所在了,原来是ssh服务没有启动

    service sshd start

    再通过客户端ssh连接,登陆成功。

    通过这个事情可以知道,能ping通和是否SSH是没关系的。好多人都有这个误区。
    ssh和ping协议不同,是不同的服务。两者不在一个网络层级,两者使用的协议不一样。
    ping通不一定可以SSH,可以SSH不一定能ping通。ping通仅代表目标主机可以对icmp包做出响应。网络设置禁ping了,一样可以ssh。

    有点拗口,但是事实

  • 无题

    每天都是在忙忙碌碌
    回头想想 有多少是有用功
    无休止的为蝇头小利奔波
    一次次的觉醒 现实面前又不得低头
    理想与现实 成功与梦想
    盼望有伯乐 起期望着知音
    慢慢的消耗 慢慢的沉沦
    最终成为尘世的俗人
    不甘心 不甘心
    命运靠自己
    世间本无伯乐
    先有千里马 后有伯乐
    凡事靠自己 靠自己凡事
    I Do I Can

  • 分布式环境下的主键生成机制

    在分布式环境下,主键的唯一性就很重要。目前有的几种策略有:
    1.数据库的sequence机制
    2.单独的一台主键服务器
    3.自定义的主键生成机制

    数据库的sequence机制:
    能保证全局唯一,但是会对数据库的产生压力,尤其是在高并发的情况下,数据库的压力会很大,在项目中不使用

    单独的一台主键服务器:
    部署复杂,且网络之间有消耗,且该服务器异常后,会对整个系统产生影响,必须考虑单点故障

    自定义主键生产机制:
    目前项目中使用该策略生成主键。主要思想就是对每个服务器进行单独标识,在生产主键时,在每个服务器自身生成ID,在ID中加入该服务器的标识,这样,将分布式系统的压力分散到其中的每台服务器上。这种方法的缺点是:如果大规模的环境下,对每个服务器的标识比较麻烦,且如果需要产生流水号的ID,这种方法就不能支持.但目前项目中并未有该种要求,满足需求.

Copyright © 2014-2025 奋奋的愤愤 | 京ICP备14029030号-1