记一次mysql server 错误

由于一些错误操作导致mysql server 无法正常启动

tail /var/log/mysqld.log

查看错误日志:

ERROR 1286 (42000): Unknown table engine 'InnoDB'

InnoDB: stored checksum 1820380758, prior-to-4.0.14-form stored checksum 1820380758
InnoDB: Page lsn 2 3436109869, low 4 bytes of lsn at page end 3436109869
InnoDB: Page number (if stored to page already) 5,
InnoDB: space id (if created with >= MySQL-4.1.1 and stored already) 0
InnoDB: Page may be a transaction system page
InnoDB: Also the page in the doublewrite buffer is corrupt.
InnoDB: Cannot continue operation.
InnoDB: You can try to recover the database with the my.cnf
InnoDB: option:
InnoDB: innodb\_force\_recovery=6

修改/etc/my.cnf innodb_force_recovery=6 后重启mysql。 备份所有数据库:

mysqldump -A -uroot -p > all.sql

由于mysql server很久没升级了,而且用的是阿里云提供的安装脚本,我想完全删除再通过yum安装: 删除mysql客户端及服务端

yum remove mysql mysql-server

移除或备份mysql数据文件夹

mv /var/lib/mysql /var/lib/mysql\_old\_backup

Read More

flexiable.js 研究

最近公司有同事在移动端网页用到flexiable.js

     if (isIPhone) {
    // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
    if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {
    dpr = 3;
    } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)){
    dpr = 2;
    } else {
    dpr = 1;
    }
    } else {
    // 其他设备下,仍旧使用1倍的方案
    dpr = 1;
    }

此段代码如果ua不包含“iphone”,那么采用1dpr,理由是

淘宝的做法是只管iOS,安卓一律把dpr设为1,官方的说法是安卓的厂商会自己修改dpr,导致安卓上的 window. devicePixelRatio 是假的。

出处 但如果安卓的devicePixelRatio 是真实的且大于1则没有适用此方案。 再看另一处代码,

     if (metaEl) {
    console.warn('将根据已有的meta标签来设置缩放比例');
    var match = metaEl.getAttribute('content').match(/initial\-scale=([\d\.]+)/);
    if (match) {
    scale = parseFloat(match[1]);
    dpr = parseInt(1 / scale);
    }
    }

如果已经自己设置了meta viewport initial-scale=1.0 则scale为1,dpr也只能为1。 如果可根据devicePixelRatio动态设置initial-scale那么可解决1px边框的问题,但以上两种情况下scale只能为1. 再接着看另一处

    function refreshRem(){
    var width = docEl.getBoundingClientRect().width;
    if (width / dpr > 540) {
    width = 540 * dpr;
    }
    var rem = width / 10;
    docEl.style.fontSize = rem + 'px';
    flexible.rem = win.rem = rem;
    }

如果width / dpr > 540 则分辨率宽度按540处理,然而我们结合友盟指数来看,540已经不在友盟的统计范围,也就是排除在主流分辨率之外了。也就是说在目前主流分辨率下html font-size就是54px,并且这里存在的问题是参照值应该取设计稿的宽度(px)而不是固定540,如果想要灵活地根据设计稿来设置最大宽度可以使用hotcss,与flexiable是类似方案在meta上可设置max-width,且scss,less上也可以设置设计稿的宽度。 那么flexiable还适用于现在的开发么?结合hotcss所给出的案例地址还有网易新闻来看还是有几个案例在使用的,然而天猫和淘宝本身没在使用,那么此时想问为什么? 我先回答flexiable是怎么解决适配的问题吧 1,根据不同的dpr设置html元素的基础字号像素为单位,以此来达到在元素上设置rem为单位的尺寸时元素大小边距等的缩放。 2,由于1动态改变了html基础字号,我们又需要[data-dpr]来设置不同dpr下元素字号,这是为1解决的问题而产生的新问题买单。 3,根据不同的dpr设置scale,解决dpr>1时1px边框会比dpr=1时稍粗的问题,但是前面我们看到scale在大多数情况下就是1. 我们再来看看其他问题ios使用scale后,调用高德地图,地图也会被缩掉,怎么解决? 微信二维码识别相关 这两个问题最后给的解决办法还是将dpr设置为1来解决。 那么flexiable实际上的作用只有我上面列的三项中的第一项了。我再来回答为什么不用flexiable; 1,1像素边框的问题可以用

    .scale{
    position: relative;
    }
    .scale:after{
    content:"";
    position: absolute;
    bottom:0px;
    left:0px;
    right:0px;
    border-bottom:1px solid #ddd;
    -webkit-transform:scaleY(.5);
    -webkit-transform-origin:0 0;
    }

Read More

分布式测试平台构思

构思:salt + redis 结合一个python web framework来做 参考项目: saltobserver 用flask搭建用来展示salt redis returner的结果,采用gevent实时从redis里获取数据并发送给websocket client. 最初我想使用asyncio,我看到asyncio可以很方便的和tornaodo结合起来

from tornado.platform.asyncio import AsyncIOMainLoop

def main():
    tornado.options.parse\_config\_file("config.py")
    tornado.options.parse\_command\_line()
    AsyncIOMainLoop().install()
    application = Application()
    application.listen(options.port)
    loop = asyncio.get\_event\_loop()
    try:
        loop.run_forever()
    except KeyboardInterrupt:
        pass
    finally:
        loop.close()

tornado-redis 作者说如果使用redis pubsub推荐用他这个项目,项目的demo里有个sockjs demo 展示了如何使用tornado-redis构建公共聊天网站。 demo里用到了sockjs-tornado,然而这个是为了结合socketjs来使用的,也就是说同时处理一般的http请求和websocket,我并不考虑向下兼容的问题,那么

subscriber = tornadoredis.pubsub.SockJSSubscriber(tornadoredis.Client()) 

这个tornadoredis.pubsub.SockJSSubscriber类我是否用得到呢?这只是一个包装类,继承自BaseSubscriber重写了on_message发送广播给subscribers。
看来用不到,那么我大概可以用SocketIOSubscriber在tornado.websocket.WebSocketHandler处理subscribe,unsubscribe,重写on_message就好了。

原本我想使用asyncio同时我可以使用asyncio-redis 这样我web framework我可以用更简单的aiohttp,然而当我在服务器上测试用salt client发送指令时发现并不能兼容python3 https://github.com/saltstack/salt/issues/24750 那么综合下来可供我使用的有哪些呢
由于salt client暂时不支持python3,也就无法使用asyncio,aiohttp,那么我先用tornado这样以后支持也很方便切换过来。
SocketIOSubscriber的on_message会调用subscriber的on_message也就是在Handler里on_message,那么SocketIOSubscriber的on_message什么时候调用呢?当redis里有了新消息时。


今天是10月8日,昨天的雾霾消散了。发布这篇文章有一个多月了,这个构思走到了第一个版本,我把它放在了github,下面是预览。

assassin_preview

https://github.com/bung87/assassin 项目名称用了一款我喜爱的游戏的名字《刺客信条》。用两台机器配置了saltstack查看各种命令返回的数据结构,然后找来一些库解析结果,实现功能,尚未在正式环境跑过。 只有ping大致的做了数据可视化,用raphel.js实现了动画效果,然后包含ping,dig,traceroute都做了基本的表格形式的数据展示。 traceroute这个功能应该是选择一个节点去测试,由于兴趣也不是很浓,没做到这一步。 任务用jquery的deffered实现任务状态的更新,基于socket实现实时的客户端任务状态更新,完成了process状态的实现,需要根据任务开始前确定可用节点,及任务结束后确定返回结果的节点,设置超时,对比节点响应数等,这部分没做。

Read More

Kafka和Spark Streaming结合:代码示例和游戏状态

原文:http://www.michael-noll.com/blog/2014/10/01/kafka-spark-streaming-integration-example-tutorial/ OCT 1ST, 2014 Spark Streaming 作为一种实时数据处理工具近来越来越受到关注,与 Apache Storm 一起被提及。如果你问我,没和kafka结合而做实时数据处理的工具是不完整的,因此我添加了Spark Streaming的示例应用程序(kafka-storm-starter )以演示如何从kafka读取数据和写入数据到kafka,用Avro作为数据格式 Twitter Bijection 处理数据序列化。

什么是 Spark Streaming?

Spark StreamingApache Spark的子项目。Spark 是一个类似于Hadoop的批处理平台,Spark Streaming是一个运行在 Spark引擎之上的实时数据处理工具。

Spark Streaming vs. Apache Storm

Spark Streaming 的用例与Apache Storm密切相关。这无疑是当今最流行的实时大数据处理平台。Bobby Evans and Tom Graves of Yahoo! Engineering 最近在Spark and Storm at Yahoo!有一场讲座,他们比较这两个平台,包括关于什么时候、为什么选择其中一种。P. Taylor Goetz of HortonWorks 分享了一个标题为 Apache Storm and Spark Streaming Compared的幻灯片。 这是我个人非常简短的比较: Storm相对于Spark Streaming具有较高的行业认可度和更好的稳定性。在另一方面,Spark具有更易表达、更高层级API,可以说更易使用,如果你用Scala写你的Spark 应用的话(我更喜欢Spark API).但是别相信我的话,请查看上面提到的讲座和幻灯片。 Spark和Strom都是Apache的顶级项目,供应商已经开始使用其中一种或者两种共同使用在它们的商业服务,例如 HortonWorks (Storm, Spark) and Cloudera (Spark).

Excursus: Machines, cores, executors, tasks, and receivers in Spark

文章后面的单元讲了很多关于在Spark和Kafka的并行。你至少要基本理解Spark的一些技术才可以跟上这些单元里的讨论。

  • A Spark cluster contains 1+ worker nodes aka slave machines (simplified view; I exclude pieces like cluster managers here.)
  • A worker node can run 1+ executors.
  • An executor is a process launched for an application on a worker node, which runs tasks and keeps data in memory or disk storage across them. Each application has its own executors. An executor has a certain amount of cores aka “slots” available to run tasks assigned to it.
  • A task is a unit of work that will be sent to one executor. That is, it runs (part of) the actual computation of your application. The SparkContext sends those tasks for the executors to run. Each task occupies one slot aka core in the parent executor.
  • A receiver (API, docs) is run within an executor as a long-running task. Each receiver is responsible for exactly one so-called input DStream (e.g. an input stream for reading from Kafka), and each receiver – and thus input DStream – occupies one core/slot.
  • An input DStream: an input DStream is a special DStream that connects Spark Streaming to external data sources for reading input data. For each external data source (e.g. Kafka) you need one such input DStream implementation. Once Spark Streaming is “connected” to an external data source via such input DStreams, any subsequent DStream transformations will create “normal” DStreams.

在Spark的执行模型中,每个应用程序有自己的executors,which stay up for the duration of the whole application and run 1+ tasks in multiple threads. 这种分离的实现类似于Storm的执行模型。这种架构变得越来越复杂一旦你介绍cluster managers像YARN或者Mesos,这里我不深讲。看看Spark文档里的Cluster Overview深入了解。

Kafka和Spark Streaming结合

Read More

七牛云VS又拍云

安全性:

七牛:针对用户上传的数据,我们都会创建至少三副本并跨IDC存储到多个数据中心,保证数据的高可用性和可靠性。另,用户可通过七牛的身份验证机制设置不同的访问权限和访问级别。 又拍:跨机房三备份,确保数据绝对安全。

分发:

七牛:七牛遍布全球的500多个加速节点,自动选择离用户最近的节点,使得数据的上传下载速度均得到最优化。相较传统IDC,访问速度提升数倍。 又拍:分布全国60多个节点,全覆盖电信、联通、移动、教育网及地方宽带线路;区域就近上传下载;不限带宽峰值。又拍云存储,助你提速60%-300%。

数据处理:

图片:

七牛:

1、缩略图(多种规格缩放)

2、图文混排水印

3、自定义裁剪区域

Read More

安全运行Elasticsearch集群

Elasticsearch不进行认证或授权,留下了一个习题给开发者。本文给出了概述,当你配置Elasticsearch集群的安全设置时要记住,为用户提供(有限)权限访问群集,当你不一定能(完全)信任他们时。

Introduction

作为Elasticsearch的提供商,安全对于Found是非常重要的,我们需要保护我们的用户免受其他可能的恶意,还要保护我们的用户不会因为他们自身引起麻烦。 本文基于Elasticsearch in production(生产环境),我们介绍了许多(生产环境)相关的主题讨论。在本文中我们将扩大一些内容,并阐述当实际执行的时候需要记住哪些地方。 从本质上讲,你需要仔细的端详你发给Elasticsearch的请求;就像任何其他数据库。但与大多数其他数据库不同的是,Elasticsearch有一个功能,允许任意代码执行。这带来了一些有趣的挑战! 我们来看看在不同级别的信任(你可以给你的用户)带来的细微差别,风险;从任意一端完全访问发出请求,,对另一端只是参数预先定义的请求。

Responsibility

Elasticsearch不具有用户的概念。从本质上讲,任何人都可以发送任意请求到集群(他)是一个“超级用户”。

如果你曾使用过类似PostgreSQL的系统,你可以限制访问数据库的表,函数等等,拥有高粒度的访问控制系统,你可能会试图找到一种方来限制某些操作或某些indexes,目前,Elasticsearch并不认为这是自己的工作。Elasticsearch不具有用户的概念。从本质上讲,任何人都可以发送任意请求到集群并且是一个“超级用户”。这是一个合理的限制强加。有这么多的方式来实现不同的身份验证和授权方案,其中不少是紧密耦合的应用领域。 很多在这里的建议适用于搜索引擎和数据库比Elasticsearch等为好。我们的意思并不是意味着这些本质上是不安全的,还是批评他们的选择。它是一个完全合理的决定,离开安全给用户。但是,我们要提高对Elasticsearch安全相关的方面的认识。

Goals

按重要性排序,我们要做到以下几点:

  1. 防止执行任意代码的脚本功能的使用。如果我们不能这样做,别的仅仅是“security through obscurity”,可以被绕过。但禁用动态脚本引出了一些难题,。
  2. 限制谁可以访问什么:搜索和索引。这可以通过代理层实现。
  3. __阻止请求可以压倒集群,导致拒绝式服务。这是很难完全避免,如果任意的搜索请求是允许的。 __

为了开发的目的,我们也将看到_这些东西如何应用即使在本地_运行Elasticsearch 作为不同信任级别的一个例子,假设你为不同的客户安装了多个同一套CMS。你相信CMS不做疯狂的事情,但要求验证,并有单独的索引是个好主意,以确保万一。因此,您可以允许访问CMS做任意请求向其允许的indexes。 CMS虽然暴露于天下。它不接受任何随意的请求。它将搜索参数转换到正确的Elasticsearch请求,并将其发送到相应的索引。

Read More

[译文]hadoop的授权和身份验证

授权和身份验证在hadoop中是一个较易混淆的主题,首先也是最重要的事情是辨别在授权和身份验证之间这种细微而极其重要的差别,首先我们来定义这些术语: Authentication 身份验证的目的是确认当前所声称为某种身份的用户,确实是所声称的用户。 Authorization 授权的功能是定义资源的访问权限。 简单来说,身份验证是提供我是谁的一种方式,授权是决定我能做什么的方式。

身份验证

如果Hadoop的所有配置都是默认的话,Hadoop不会验证用户。这是一个重要的体现,因为它可以在企业的数据中心造成严重影响。让我们来看看这个例子. 假设用户Joe可以访问一个Hadoop集群。这个集群并没有任何Hadoop安全特性((Hadoop security features) 启用,这意味着不会尝试去验证用户的标识。这个集权的超级用户是hdfs,Joe没有用户hdfs的密码。然而Joe刚好有一个客户端机器,有一些配置可以让 Joe访问Hadoop集群,Joy心情不顺,执行以下命令:

sudo useradd hdfs

sudo -u hdfs hadoop fs -rmr /

集群执行以上工作,然后回头告诉你“Ok, hdfs, I deleted everything!”。 那么发生了什么?在一个非安全的集群,NameNode 和 JobTracker不会需要任何身份验证。如果你发起一个请求,声称你是hdfs或者mapred, NN/JT都会说“ok, I believe that,”允许你做任何hdfs 或mapred可以做的事。 Hadoop有能力要求身份验证,以Kerberos的形式。Kerberos是一种身份验证的协议,用 “tickets” 允许节点标识自身,如果你想深入了解Kerberos,我强烈推荐看看这Wikipedia page. Hadoop可使用Kerberos协议确保当有人发出请求,他们真的是他们所说的。这种机制被用于在整个群集。在一个安全的Hadoop配置,所有的Hadoop守护进程使用Kerberos进行相互认证,这意味着,当两个守护进程相互交谈,他们每个确保其他守护进程是谁。此外,这允许的NameNode和JobTracker确保任何HDFS或MR请求被用适当的授权级别执行。

授权

授权跟验证是非常不同的。授权告诉我们任何给定的用户在Hadoop集群内可以做或不可以做的事,用户成功验证之后。在HDFS中,这主要是通过文件权限来制约。 HDFS文件权限与BSD文件的权限是非常相似的。如果你曾经使用ls-l在一个目录中,你可能已经看到这样的记录:

drwxr-xr-x 2 natty hadoop 4096 2012-03-01 11:18 foo

-rw-r–r– 1 natty hadoop 87 2012-02-13 12:48 bar

在最左侧,有一个字母字符串。第一个字母确定文件是否是一个目录或不是,然后有三组,每组三个字母。这些集表示所有者,组和其他用户的权限,而“RWX”读,写和执行权限,接下来“natty hadoop”部分表示该文件是由natty拥有,属于hadoop组。顺便说一句,一个规定的意图是-HDFS的语义是“尽可能类似Unix”。其结果是, certain HDFS operations follow BSD semantics, and others are closer to Unix semantics. 这里真正的问题是:什么是Hadoop的用户或组?答案是:他们是字符的字符串。仅此而已。 Hadoop的会很高兴地让你运行下面的命令

Read More

Cassandra:configuring internal authorization and authentication

configuring internal authorization

CassandraAuthorizer is one of many possible IAuthorizer implementations, and the one that stores permissions in the system_auth.permissions table to support all authorization-related CQL statements. Configuration consists mainly of changing the authorizer option in the cassandra.yaml to use the CassandraAuthorizer.

Procedure

1.In the cassandra.yaml file, comment out the default AllowAllAuthorizer and add the CassandraAuthorizer. authorizer: CassandraAuthorizer You can use any authenticator except AllowAll. 2.Configure the replication factor for the system_auth keyspace to increase the replication factor to a number greater than 1. 3.Adjust the validity period for permissions caching by setting the permissions_validity_in_ms option in the cassandra.yaml file. Alternatively, disable permission caching by setting this option to 0.

Configuring authentication

To configure Cassandra to use internal authentication, first make a change to the cassandra.yaml file and increase the replication factor of the system_auth keyspace, as described in this procedure. Next, start up Cassandra using the default user name and password (cassandra/cassandra), and start cqlsh using the same credentials. Finally, use these CQL statements to set up user accounts to authorize users to access the database objects:

  • ALTER USER

    ALTER USER user_name
    WITH PASSWORD ‘password’ ( NOSUPERUSER | SUPERUSER )

  • CREATE USER

    CREATE USER IF NOT EXISTS user_name _WITH PASSWORD ‘password’

     ( NOSUPERUSER_ | _SUPERUSER )_

Procedure

Read More

hive 快速配置

Download: Hive Releases 进入下载目录

 $ tar -xzvf hive-x.y.z.tar.gz
 cp hive-default.xml.template hive-site.xml

设置环境变量

$ export HIVE_HOME=/path/to/hive/home
$ export PATH=$HIVE_HOME/bin:$PATH #
$ export METASTORE_PORT=9083

Running Hive Hive uses Hadoop, so: you must have Hadoop in your path OR

export HADOOP_HOME=

In addition, you must create /tmp and /user/hive/warehouse (aka hive.metastore.warehouse.dir) and set them chmod g+w in HDFS before you can create a table in Hive. Commands to perform this setup:

  $ $HADOOP_HOME/bin/hadoop fs -mkdir       /tmp
  $ $HADOOP_HOME/bin/hadoop fs -mkdir       /user/hive/warehouse
  $ $HADOOP_HOME/bin/hadoop fs -chmod g+w   /tmp
  $ $HADOOP_HOME/bin/hadoop fs -chmod g+w   /user/hive/warehouse

Running HCatalog To run the HCatalog server from the shell in Hive release 0.11.0 and later:

  $ $HIVE_HOME/hcatalog/sbin/hcat_server.sh

Read More