Hubble Uncovers a Mysterious Hermit

Hubble Uncovers a Mysterious Hermit

一个人只有在独处时才能成为自己

谁要是不爱独处,那他就不爱自由

因为一个人在独处时才是真正自由的

在OpenStack平台的虚拟机上使用k8s搭建一个容器集群,一个Master节点和三个Node节点。这里通过 etcdctl 查询集群状态,出现了如下错误:

Error: client: etcd cluster is unavailable or misconfigured
error #0: x509: certificate signed by unknown authority
error #1: x509: certificate signed by unknown authority
error #2: x509: certificate signed by unknown authority

Solution:

刚开始是以为etcd的配置问题,但是查看etcd的状态,服务是起来的。

[root@k6770v bin]# systemctl status etcd.service
● etcd.service - Etcd Server
Loaded: loaded (/usr/lib/systemd/system/etcd.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2016-06-28 15:02:55 CST; 1 months 0 days ago
Main PID: 24622 (etcd)
CGroup: /system.slice/etcd.service
└─24622 /usr/bin/etcd

这个问题是因为没有加载ssl参数,现在这个线上是走ssl认证的,不能直接etcdctl set和get,这里模拟一下ssl认证:

[root@k6770v ssl]# etcdctl --ca-file=/etc/kubernetes/ssl/ca.crt --cert-file=/etc/kubernetes/ssl/etcd-client.crt --key-file=/etc/kubernetes/ssl/etcd-client.key set testkey Hello,etcd
Hello,etcd

Given a binary tree and a sum, find all root-to-leaf paths where each path’s sum equals the given sum.

Solution:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector> pathSum(TreeNode* root, int sum) {
    vector > collect;  
    vector solution;  
    if(root!=NULL)  
        GetPath(root, sum, 0, solution, collect);  
    return collect;  
}  

void GetPath(TreeNode* node, int sum, int cal, vector& solution, vector >& collect)  {   
    solution.push_back(node->val);  
    cal += node->val;  
    if(cal == sum && node->left == NULL && node->right == NULL)  
    {  
        collect.push_back(solution);        
    }  
    else  
    {      
        if(node->left != NULL)  
        {        
          GetPath(node->left, sum, cal, solution, collect);        
        }  
        if(node->right != NULL)  
        {        
          GetPath(node->right, sum, cal, solution, collect);  
        }  
    }  
    solution.pop_back();  
    cal -= node->val;  
    return;  
    }
};

导师交代下来一个yum源提供http api展现rpm包信息的任务,已经有一个webpy + memcache的bata版本了,但是现在需要把它改成go/python + redis的多线程方案,下面就分析一下memcacheredis的主要区别。

1、Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等。
2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。
3、虚拟内存–Redis当物理内存用完时,可以将一些很久没用到的value交换到磁盘
4、过期策略–memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如expire设定,例如expire name 10
5、分布式–设定memcache集群,利用magent做一主多从;redis可以做一主多从。都可以一主一从
6、存储数据安全–memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化)
7、灾难恢复–memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复
8、Redis支持数据的备份,即master-slave模式的数据备份。

A galaxy fit to burst

A galaxy fit to burst

世界上好人不多,不过你是最重要的一个

你要是愿意,我就永远爱你

你要是不愿意,我就永远相思

–Wang Xiaobo, T’aimer comme la vie

今天来公司写完周报,无聊又刷了几道题,这道题给我印象很深,虽然逻辑简单,但是代码相当优美.

Given two binary strings, return their sum (also a binary string).

For example,
a = "11"
b = "1"
Return "100".

Solution:

/*Split the whole step into two binary characters added and carry. 
In fact all similar additions can be disassembled like this.*/
class Solution {
public:
    string addBinary(string a, string b) {
        string result = "";
        int c = 0;
        int i = a.size()-1;
        int j = b.size()-1;
        
        while(i>=0 || j>=0 || c==1)
        {
            c += i >= 0 ? a[i--] - '0' : 0;
            c += j >= 0 ? b[j--] - '0' : 0;
            result = char(c%2 + '0') + result;
            c /= 2;
        }
        return result;
    }
};

etcd作为一个受到ZooKeeper与doozer启发而催生的项目,除了拥有与之类似的功能外,更专注于以下四点。
简单:基于HTTP+JSON的API让你用curl就可以轻松使用。
安全:可选SSL客户认证机制。
快速:每个实例每秒支持一千次写操作。
可信:使用Raft算法充分实现了分布式。

分布式系统中的数据分为控制数据和应用数据。etcd的使用场景默认处理的数据都是控制数据,对于应用数据,只推荐数据量很小,但是更新访问频繁的情况。

应用场景有如下几类:
场景一:服务发现(Service Discovery)
场景二:消息发布与订阅
场景三:负载均衡
场景四:分布式通知与协调
场景五:分布式锁、分布式队列
场景六:集群监控与Leader竞选

举个最简单的例子,如果你需要一个分布式存储仓库来存储配置信息,并且希望这个仓库读写速度快、支持高可用、部署简单、支持http接口,那么就可以使用etcd。

目前,cloudfoundry使用etcd作为hm9000的应用状态信息存储,kubernetes用etcd来存储docker集群的配置信息等。

via: etcd, 从应用场景到实现原理的全方位解读

A peak element is an element that is greater than its neighbors.

Given an input array where num[i] ≠ num[i+1], find a peak element and return its index.

The array may contain multiple peaks, in that case return the index to any one of the peaks is fine.

You may imagine that num[-1] = num[n] = -∞.

For example, in array [1, 2, 3, 1], 3 is a peak element and your function should return the index number 2.

Note: Your solution should be in logarithmic complexity.

Solution:

class Solution {
public:
    int findPeakElement(vector& num) {
        int n = num.size();
        if(n == 1) 
        {
            return 0;
        }

        int start = 0;
        int end = n - 1;
        int mid = 0;

        while(start <= end) { mid = start + (end - start) / 2; if((mid == 0 || num[mid] >= num[mid - 1]) && (mid == n - 1 || num[mid] >= num[mid + 1])) // mid is peak
            {
                return mid;
            } else if(mid > 0 && num[mid-1] > num[mid]) // mid is left
            {
                end = mid - 1;
            } else // mid is right 
            {
                start = mid + 1;
            }
        }
        return mid;
    } 
};