elastic data

修改配置

接口修改

1
2
3
4
5
6
7
8
9
10
11
12
# dev tools
PUT <index>
{
"settings" : {
"index" : {
"<name>" : <value>
}
}
}

# curl
curl -X PUT -u <user>:<password> "http://<host>:<port>/<index>" -d

索引配置

1
2
3
4
5
6
7
8
{
"settings" : {
"index" : {
"number_of_shards" : 5,
"number_of_replicas" : 5
}
}
}

boost - processing

Introduction

Boost Preprocessing Library 是 boost 定义的宏(macros)库,官方文档在这里

Data Types

Boost 的 Preprocess 库有四种数据类型,array、lists、sequences、tuples。

arrays

arrays 是包含两个元素的 tuple,第一个元素是 array 中元素的数量,第二个元素是包含 array 元素的 tuple。

定义

1
#define ARRAY (3, (a, b, c))

原语

lists

lists 是一个有头和尾的简单列表。头是一个元素,尾是另外一个 list 或者 BOOST_PP_NIL。

定义

1
#define LISTS (a, (b, (c, BOOST_PP_NIL)))

原语

sequences

sequences 是一组相邻的带括号的元素。

定义

1
#define SEQ (0)(1)(2)(3)

原语

tuples

元组是一个括号内用逗号分隔的元素列表。

定义

1
#define TUPLE (a, b, c)

原语

Reference

seq

BOOST_PP_SEQ_FOR_EACH

1
2
// 遍历 SEQ 中的每个元素,应用新的宏。
BOOST_PP_SEQ_FOR_EACH(macro, data, seq)
  • macro
    • 形如 macro(r, data, elem) 的宏。BOOST_PP_SEQ_FOR_EACH 遍历每个元素并使用该宏展开。
    • 元素
      • r:当前元素的索引(从 1 开始)
      • data:辅助数据
      • elem:当前元素
  • data: 辅助数据(可以不使用,使用 _ 作为占位符)
  • seq: 定义的序列

示例

1
2
3
4
5
6
7
8
9
10
11
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/seq/for_each.hpp>
#define SEQ (w)(x)(y)(z)
// cat
#define MACRO(r, data, elem) BOOST_PP_CAT(elem, data)
BOOST_PP_SEQ_FOR_EACH(MACRO, _, SEQ) // expands to w_ x_ y_ z_
// stringize
#define SIMPLE_SEQ (a)(b)(c)
#define MACRO(r, data, elem) BOOST_PP_STRINGIZE(r) BOOST_PP_STRINGIZE(data) BOOST_PP_STRINGIZE(elem)
std::string v = BOOST_PP_SEQ_FOR_EACH(MACRO, _, SIMPLE_SEQ); // v: 1_a2_b3_c
#undef MACRO

tuple

string

BOOST_PP_CAT

BOOST_PP_STRINGIZE

gRPC 的一些实践

gRPC 的一些想法

开源的 RPC 框架有很多,如果专注于 java,可以尝试 finagle,打造基于 java 的微服务系统可以考虑 dubbospring cloudspring cloud alibaba;如果是 c++ 可以尝试 thrift/pb + brpc;如果服务有跨语言调用的需求,可以考虑 thrift、gRPC。

相信,谷歌的背书 + 多语言 + pb & gRPC,会吸引很多人的注意,但是 gRPC 的一些坑还是要慢慢趟才行。

比如 ManagedChannel 默认的负载均衡是 pick_first。公司用了几年,虽然有了服务发现,但是创建 stub 时还是随机选择一个机器创建连接。如果服务端是 python,还要注意多个服务进程的负载均衡问题(python 服务一般会起多个进程,共用一个端口),因为 gRPC 的负载均衡是连接粒度的,如果客户端复用连接,那么就会出现请求全部集中在一个进程上面,这样至多使用机器的一个核心;这个问题简单一点可以通过创建多个连接,请求时随机选取来解决,比较好的解决方案是自定义 load balance,定义 subchannel 创建规则。

还有就是,gRPC 的文档并没有想象中那么多,就 java 来说,封装了大量的逻辑,有些甚至连代码注释说的都很模糊。

ManagedChannel

ManagedChannel 有很多内置的实现,常用的是 ManagedChannelImpl2,涉及到几个比较重用的概念。

linux lvm

LVM

对磁盘创建 lvm。

1
2
3
4
5
6
7
8
9
10
11
# 创建
$ pvcreate /dev/sda
$ vgcreate cinder-volumes /dev/sda

# 删除
## 移除卷
$ lvremove cinder--volumes-cinder--volumes--pool_tmeta
## 删除组
$ vgremove cinder-volumes
## 删除物理卷
$ pvremove /dev/sda

如果出现 pvcreate 时出现 execlude by a filter,检查 /etc/lvm/lvm.conf 下的 filters

1
filter = [ "a/sda/", "a/nvme/", "r/.*/" ]

如果想要接受一个块设备,使用类似下面的配置。

1
"a|.*|"

如果想要拒绝一个块设备,使用类似下面的配置。

1
"r|/dev/cdrom|"