IdiotSky


  • Home

  • Categories

  • About

  • Archives

  • Tags

  • Books

  • Search

redis数据结构-链表

Posted on 14 Sep 17 | In redis

列表键的底层就是一个链表

链表节点

每个链表节点使用一个 adlist.h/listNode 结构来表示:

1
2
3
4
5
6
7
8
9
10
11
12
typedef struct listNode {

// 前置节点
struct listNode *prev;

// 后置节点
struct listNode *next;

// 节点的值
void *value;

} listNode;

多个 listNode 可以通过 prev 和 next 指针组成双端链表, 如图 3-1 所示。

Read more »

JVM杂谈之JIT

Posted on 14 Sep 17 | In java

Just In Time

Just in time编译,也叫做运行时编译,不同于 C / C++ 语言直接被翻译成机器指令,javac把java的源文件翻译成了class文件,而class文件中全都是Java字节码。那么,JVM在加载了这些class文件以后,针对这些字节码,逐条取出,逐条执行,这种方法就是解释执行。

还有一种,就是把这些Java字节码重新编译优化,生成机器码,让CPU直接执行。这样编出来的代码效率会更高。通常,我们不必把所有的Java方法都编译成机器码,只需要把调用最频繁,占据CPU时间最长的方法找出来将其编译成机器码。这种调用最频繁的Java方法就是我们常说的热点方法(Hotspot,说不定这个虚拟机的名字就是从这里来的)。

这种在运行时按需编译的方式就是Just In Time。

Read more »

openstack安装-neutron(二)

Posted on 14 Sep 17 | In openstack

take the place….

openstack安装-neutron(一)

Posted on 13 Sep 17 | In openstack

take the place….

redis数据结构-简单动态字符串

Posted on 13 Sep 17 | In redis

Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将 SDS 用作 Redis 的默认字符串表示。例如键(key)底层就是SDS,而值如果是字符串对象,那这个对象的底层也是个SDS

定义

每个 sds.h/sdshdr 结构表示一个 SDS 值:

1
2
3
4
5
6
7
8
9
10
11
12
13
struct sdshdr {

// 记录 buf 数组中已使用字节的数量
// 等于 SDS 所保存字符串的长度
int len;

// 记录 buf 数组中未使用字节的数量
int free;

// 字节数组,用于保存字符串
char buf[];

};

图 2-1 展示了一个 SDS 示例:

  • free 属性的值为 0 , 表示这个 SDS 没有分配任何未使用空间。
  • len 属性的值为 5 , 表示这个 SDS 保存了一个五字节长的字符串。
  • buf 属性是一个 char 类型的数组, 数组的前五个字节分别保存了 ‘R’ 、 ‘e’ 、 ‘d’ 、 ‘i’ 、 ‘s’ 五个字符, 而最后一个字节则保存了空字符 ‘\0’ 。

    SDS 遵循 C 字符串以空字符结尾的惯例, 保存空字符的 1 字节空间不计算在 SDS 的 len 属性里面, 并且为空字符分配额外的 1 字节空间, 以及添加空字符到字符串末尾等操作都是由 SDS 函数自动完成的, 所以这个空字符对于 SDS 的使用者来说是完全透明的。

遵循空字符结尾这一惯例的好处是, SDS 可以直接重用一部分 C 字符串函数库里面的函数。

举个例子, 如果我们有一个指向图 2-1 所示 SDS 的指针 s , 那么我们可以直接使用 stdio.h/printf 函数, 通过执行以下语句:

1
printf("%s", s->buf);

Read more »

openstack安装-nova(二)

Posted on 12 Sep 17 | In openstack

现在要开始安装compute服务了,前面一章都说了,虽然controller节点主要用来做控制服务节点的,如果做实验的话,可以用它的多余资源来充当一下compute节点,那么这个实验就可以有两台compute节点了。
开始安装吧。。。

安装和配置组件

安装包

1
$ apt install nova-compute

修改/etc/nova/nova.conf

  • 在[DEFAULT]区域,配置RabbitMQ
    1
    2
    3
    [DEFAULT]
    # ...
    transport_url = rabbit://openstack:RABBIT_PASS@controller

替换RABBIT_PASS为当时为RabbitMQ创建openstack用户时指定的密码

  • 在[api]和[keystone——authtoken]区域,配置keystone相关配置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    [api]
    # ...
    auth_strategy = keystone

    [keystone_authtoken]
    # ...
    auth_uri = http://controller:5000
    auth_url = http://controller:35357
    memcached_servers = controller:11211
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    project_name = service
    username = nova
    password = NOVA_PASS

替换NOVA_PASS为你创建nova用户时的密码

  • 在[DEFAULT]区域,配置my_ip

    1
    2
    3
    [DEFAULT]
    # ...
    my_ip = 192.168.199.11
  • 在[DEFAULT]区域,关掉防火墙和使用neutron

    1
    2
    3
    4
    [DEFAULT]
    # ...
    use_neutron = True
    firewall_driver = nova.virt.firewall.NoopFirewallDriver

以前nova是提供网络服务的,现在有了neutron之后,就不用了,所以这里要关掉先。

  • 在[vnc]区域,配置远程访问:

    1
    2
    3
    4
    5
    6
    [vnc]
    # ...
    enabled = True
    vncserver_listen = 0.0.0.0
    vncserver_proxyclient_address = $my_ip
    novncproxy_base_url = http://controller:6080/vnc_auto.html
  • 在[glance]区域,配置镜像访问接口:

    1
    2
    3
    [glance]
    # ...
    api_servers = http://controller:9292
  • 在[DEFAULT]区域,log_dir选项

  • 在[placement]区域,配置Placement API:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [placement]
    # ...
    os_region_name = RegionOne
    project_domain_name = Default
    project_name = service
    auth_type = password
    user_domain_name = Default
    auth_url = http://controller:35357/v3
    username = placement
    password = PLACEMENT_PASS

替换PLACEMENT_PASS为之前配置placement用户时候设置的密码

完成安装

配置虚拟机类型

执行以下命令:

1
$ egrep -c '(vmx|svm)' /proc/cpuinfo

如果返回多个,就代表你机子已经硬件支持kvm,所以不用配置什么
如果返回0,代表你机子不支持kvm,所以就需要修改为qemu

1
2
3
[libvirt]
# ...
virt_type = qemu

重启服务

1
$ service nova-compute restart

添加compute节点到cell数据库

以下操作只能在controller节点执行

  1. 执行以下命令:

    1
    2
    3
    4
    5
    6
    7
    8
    $ . admin-openrc

    $ openstack compute service list --service nova-compute
    +----+-------+--------------+------+-------+---------+----------------------------+
    | ID | Host | Binary | Zone | State | Status | Updated At |
    +----+-------+--------------+------+-------+---------+----------------------------+
    | 1 | node1 | nova-compute | nova | up | enabled | 2017-04-14T15:30:44.000000 |
    +----+-------+--------------+------+-------+---------+----------------------------+
  2. 发现compute节点

    1
    2
    3
    4
    5
    6
    7
    8
    # su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova

    Found 2 cell mappings.
    Skipping cell0 since it does not contain hosts.
    Getting compute nodes from cell 'cell1': ad5a5985-a719-4567-98d8-8d148aaae4bc
    Found 1 computes in cell: ad5a5985-a719-4567-98d8-8d148aaae4bc
    Checking host mapping for compute host 'compute': fe58ddc1-1d65-4f87-9456-bc040dc106b3
    Creating host mapping for compute host 'compute': fe58ddc1-1d65-4f87-9456-bc040dc106b3

如果你新加了个compute,必须要再执行一遍上面的命令,或者在nova的配置文件改一个合适的间隔来自动发现吧。

1
2
[scheduler]
discover_hosts_in_cells_interval = 300

总结

nova服务到这里已经都装完了,如果你controller也安装了compute的服务的话,那就有两台compute node了😄
接下来要进入重头戏的网络服务neutron的安装了👿

openstack安装-nova(一)

Posted on 11 Sep 17 | In openstack

nova是OpenStack一个核心服务,提供计算服务,主要负责虚拟机的各种操作,如启动,销毁,快照,还有选择合适的compute节点部署虚拟机。
nova中的服务有controller和compute之分,是一对多的关系,即一个controller可以有多个compute,所以一些controller服务要装到controller节点上,compute服务可以装到compute节点,也可以装到controller节点来让它充当一部分compute的能力。
由于nova涉及controller节点和compute节点的安装,所以分了两篇文章来讲解
这一篇先介绍怎么安装nova的controller服务在controller节点上。

准备

创建数据库

  • 用root用户权限执行mysql

    1
    $ mysql
  • 创建nova_api, nova,和nova_cell0数据库:

    1
    2
    3
    MariaDB [(none)]> CREATE DATABASE nova_api;
    MariaDB [(none)]> CREATE DATABASE nova;
    MariaDB [(none)]> CREATE DATABASE nova_cell0;
  • 赋予适合的权限给这些数据库

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' \
    IDENTIFIED BY 'NOVA_DBPASS';
    MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' \
    IDENTIFIED BY 'NOVA_DBPASS';

    MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' \
    IDENTIFIED BY 'NOVA_DBPASS';
    MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' \
    IDENTIFIED BY 'NOVA_DBPASS';

    MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' \
    IDENTIFIED BY 'NOVA_DBPASS';
    MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' \
    IDENTIFIED BY 'NOVA_DBPASS';

替换NOVA_DBPASS密码为合适的,下面会用到。

  • 退出mysql
Read more »

linux epoll原理

Posted on 11 Sep 17 | In linux

epoll是Linux下的一种IO多路复用技术,可以非常高效的处理数以百万计的socket句柄。

先看看使用c封装的3个epoll系统调用:

  • int epoll_create(int size)
    epoll_create建立一个epoll对象。参数size是内核保证能够正确处理的最大句柄数,多于这个最大数时内核可不保证效果。
  • int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
    epoll_ctl可以操作epoll_create创建的epoll,如将socket句柄加入到epoll中让其监控,或把epoll正在监控的某个socket句柄移出epoll。
  • int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout)
    epoll_wait在调用时,在给定的timeout时间内,所监控的句柄中有事件发生时,就返回用户态的进程。
Read more »

openstack安装-glance

Posted on 10 Sep 17 | In openstack

glance提供镜像服务使用户能够发现,注册和检索虚拟机镜像。它提供了一个 REST API,可让您查询虚拟机镜像元数据并检索实际镜像。您可以存储镜像在各种位置(从简单的文件系统到像OpenStack Object Storage这样的对象存储系统)。
为了简单起见,这里只是教你如何配置镜像服务,并把镜像保存到controller节点的文件目录里面,此目录为/var/lib/glance/images/。
这一章还是在controller节点操作。。。

准备

创建数据库

  • 用root用户权限执行mysql

    1
    $ mysql
  • 创建glance数据库

    1
    MariaDB [(none)]> CREATE DATABASE glance;
  • 赋予适合的权限给glance数据库

    1
    2
    3
    4
    MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' \
    IDENTIFIED BY 'GLANCE_DBPASS';
    MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' \
    IDENTIFIED BY 'GLANCE_DBPASS';

替换一下GLANCE_DBPASS为一个合适的密码,后面会用到

  • 退出mysql
    Read more »

openstack安装-keystone

Posted on 09 Sep 17 | In openstack

keystone 是openstack中所有service的权限管理和接口入口,所以先安装它
这一章都是在controller节点操作。。。

前提

  1. 切换到root用户,执行下面命令

    1
    $ mysql
  2. 创建keystone数据库:

    1
    MariaDB [(none)]> CREATE DATABASE keystone;
  3. 赋予合适权限给keystone数据库:

    1
    2
    3
    4
    MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' \
    IDENTIFIED BY 'KEYSTONE_DBPASS';
    MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' \
    IDENTIFIED BY 'KEYSTONE_DBPASS';

    用一个合适的密码覆盖KEYSTONE_DBPASS

  4. 退出数据库
Read more »
1…567…17
ejunjsh

ejunjsh

code freak

164 posts
25 categories
154 tags
RSS
GitHub Weibo Email FB Page
0%
© 2014 — 2019 ejunjsh
Powered by Hexo
|
Theme — NexT.Gemini