ElasticSearch集群搭建

由于ElasticSearch不同版本的配置有所不同,特指出本文所用版本为5.5.2.

安装配置

一、建立Linux用户【ES不允许直接使用root帐号】

1
2
3
4
5
6
7
8
groupadd app
useradd -g app elastic
passwd elastic
[pw:e1asticsearch]

mkdir /elastic
chown -R elastic:app /elastic
chmod 755 /elastic

建立用户并授权目录后使用新的用户进行后续操作。

二、下载解压并放到适当位置

解压命令:

tar -zxvf elasticsearch-5.5.2.tar.gz

三、修改配置文件

修改配置文件参数:

vim ./elasticsearch-5.5.2/config/elasticsearch.yml

1
2
3
4
5
6
7
8
9
10
# 集群名称,同一集群内必须设置相同的名称
cluster.name: 自定义
# 节点名称,同一集群内设置不同名称
node.name: 自定义
# host地址,可以为0.0.0.0,一般直接设置为本机IP
network.host: 本机IP
# 默认端口9200
http.port: 9200
# 集群内的机器IP,需要添加集群内节点通讯端口,端口默认为9300, 如 "127.0.0.1:9300"
discovery.zen.ping.unicast.hosts: ["","",""]

四、启动

使用一下命令启动,可添加参数-d后台启动:

1
./bin/elasticsearch [-d]

各类报错

一、 root用户启动

  • 报错信息:java.lang.RuntimeException: can not run elasticsearch as root

    解决方法:设置一个非root用户,用于管理elastic

二、 节点数不足

  • 报错信息:max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

    解决方法:

    1
    2
    3
    4
    5
    $ ulimit -Hn  # 查看硬限制
    $ vim /etc/security/limits.conf
    # 添加以下两行【elastic是用户名】:
    elastic soft nofile 65536
    elastic hard nofile 65536

    重新登录检查是否生效。

  • 报错信息:max number of threads [1024] for user [elastic] is too low, increase to at least [2048]

    解决方法:

    1
    2
    3
    4
    $ vim /etc/security/limits.d/xx-nproc.conf
    #【文件名会有所不同,且节点数不一定为1024,大于需求值就不需要改】
    # 修改:
    * soft nproc 1024 -> * soft nproc 2048
  • 报错信息:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

    解决方法:

    1
    2
    3
    4
    5
    $ vim /etc/sysctl.conf
    # 添加:
    vm.max_map_count=655360
    # 检查:
    $ sysctl -p

三、 使用公网IP无法访问/无法绑定路由

  • 原因:防火墙未开放端口

    解决方法(此处举例为CentOS7):

    1
    2
    3
    4
    5
    6
    # 添加9200端口开放传输:
    $ firewall-cmd --zone=public --add-port=9200/tcp --permanent
    # 添加9200端口开放集群通讯:
    $ firewall-cmd --zone=public --add-port=9300/tcp --permanent
    # 重启防火墙:
    $ firewall-cmd --reload

数据库UID的一种生成策略 [PostgreSQL]

本文提供一种PostgreSQL的UID生成策略,参考自Instagram公开的一种方案,除了可以确定产生的ID是唯一值以外,还有以下几种优点:

  • 生成的ID按照时间排序(但排序结果跟插入顺序不一定一致)
  • ID长度为64bit,不会过大
  • 支持数据库集群(通过定义分片ID保证不同分片之间生成的ID不会重复)

可以为数据库字段赋予默认值为下面的next_id()函数,即可为每条记录产生唯一的值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
-- CREATE SEQUENCE
CREATE SEQUENCE public.table_id_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1
CYCLE;

-- RESET VALUE OF SEQUENCE
SELECT setval('public.table_id_seq', 1, true);

-- CREATE FUNCTION
CREATE OR REPLACE FUNCTION public.next_id(OUT result bigint) AS $$
DECLARE
our_epoch bigint := 1451577600000;
now_millis bigint;
seq_id bigint;
shard_id int := 1;
BEGIN
SELECT nextval('public.table_id_seq') % 1024 INTO seq_id;
SELECT FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000) INTO now_millis;
result := (now_millis - our_epoch) << 23;
result := result | (shard_id << 10);
result := result | (seq_id);
END;
$$ LANGUAGE PLPGSQL;

第一部分SQL是创建一个循环的SEQUENCE,第二部分是用来重置SEQUENCE的值,第三部分是创建供调用的函数。其中函数部分,now_millis用来获取当前时间的毫秒值;our_epoch定义了一个指代业务开始的时间毫秒值,可自定义,为了降低毫秒数的初始值;shard_id是为分布式数据库定义的一个分片ID,每个数据库(分片)的ID不能一样,为了确保多个数据库(分片)之间不会生成相同的ID;seq_id是通过SEQUENCE生成的一个自增长的序列。具体数据存储如下:

  • 41bits存储毫秒时间
  • 13bits存储逻辑分片的ID
  • 10bits存储序列对1024求模的结果

可以让每个分片在每毫秒里能产生1024个唯一的ID,对RDBMS的性能来说是足够的。当然日后如果有并发量达到每秒10万以上的性能,也可以调整后面求模的数值并调整存储位的分布。

Tomcat的端口作用

Apache Tomcat是我们最常使用到的应用服务器,一般来说,Tomcat默认的配置已经足以支撑我们正常的使用,无需做更多的修改。但是当一台机器上需要启动多个Tomcat服务的时候,我们会发现服务因为端口冲突而启动失败,这时候我们就需要手动修改配置文件中的端口配置了。

Tomcat所使用到的端口主要包括4个,默认分别为8005、8080、8009和8443,其配置都在Tomcat目录的conf/server.xml里,下面分别对几个端口的作用进行说明:

  • 8005:Tomcat服务监听关闭操作的端口,多个服务时需要修改该端口以防止服务在其他Tomcat服务关闭的同时被关闭;
1
<Server port="8005" shutdown="SHUTDOWN">
  • 8080:Tomcat的连接端口;
1
2
3
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" server="APP Srv1.0"/>
  • 8009:Tomcat接受其他服务器转发过来的请求;
1
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
  • 8443:上面8080和8009端口接收到SSL请求的时候重定向的端口,修改时以上两处都要同时修改;

Linux上搭建Shadowsocks

说明

​为了搭建通畅的网络通道,首先需要一台境外的服务器/VPS,安装Linux系统(CentOS或者Ubuntu都行),配置不需要很高,最基础的就能用,重点是自己的常用设备和该服务器的网络连接延时要低,Linode等都有提供测试节点速度,可以先测下速度再决定买哪里的服务器。

服务器端配置

  • 需要安装的是python版本的shadowsocks,因此首先需要安装python及其包管理工具pip

    1
    2
    3
    4
    # Debian / Ubuntu:
    apt-get install python-pip
    # CentOS:
    yum install python-setuptools && easy_install pip
  • 执行安装

    1
    pip install shadowsocks
  • ​安装好后需要修改配置文件,创建/编辑配置文件 vim /etc/shadowsocks.json

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    {
    "server": "my_server_ip",
    "local_address": "127.0.0.1",
    "local_port": 1080,
    "port_password": {
    "8380": "password0",
    "8381": "password1",
    "8382": "password2",
    "8383": "password3"
    },
    "timeout": 300,
    "method": "aes-256-cfb"
    }
  • 具体各项配置说明

Field Explanation
server the ip of your server
local_address the address your local listens [127.0.0.1]
local_port local port
port_password password used for encryption
timeout in seconds
method encryption method, default: “aes-256-cfb”
fast_open use TCP_FASTOPEN, true / false
workers number of workers, available on Unix/Linux
  • 配置完后保存,启动Shadowsocks服务:

    1
    2
    3
    4
    5
    6
    7
    8
    # start:
    ssserver -c /etc/shadowsocks.json -d start
    # stop:
    ssserver -d stop
    # restart:
    ssserver -c /etc/shadowsocks.json -d restart
    # port listening:
    netstat -lnp
  • 如需设置开机自启动,只需把上面的启动命令加到 vi /etc/rc.local 里即可。

客户端配置

客户端直接到 GitHub 上下载,安装好后编辑服务器,填上服务器地址和 /etc/shadowsocks.json 配置文件里写的对应端口和密码等就能使用了,关于PAC可以直接选择从GFWList更新本地PAC,这里的GWFList是GitHub上一个开源项目,专门收集惨遭GFW毒手的ip,理论上是较全的PAC文件了。

加速

一、增加系统文件描述符的最大限数

  • vi /etc/security/limits.conf

    添加下面两行:

    1
    2
    soft nofile 51200
    hard nofile 51200
  • 保存后执行一下命令:ulimit -n 51200

二、使用ServerSpeeder进行TCP加速

ServerSpeeder

需要注意的是ServerSpeeder并非自持所有的内核,如非适用的内核可选择更换。

1
2
3
4
5
6
7
8
# install:
wget -N --no-check-certificate https://github.com/91yun/serverspeeder/raw/master/serverspeeder.sh && bash serverspeeder.sh
# uninstall:
chattr -i /serverspeeder/etc/apx* && /serverspeeder/bin/serverSpeeder.sh uninstall -f
# status:
/serverspeeder/bin/serverSpeeder.sh status
# start/stop/restart:
/serverspeeder/bin/serverSpeeder.sh start/stop/restart

Lombok介绍

简介

Lombok是一个能通过添加简单的注解来代替一些必须有但会让代码整体变得臃肿的代码,然后在编译的时候才把注解转换成对应代码的工具。

GitHub项目:Lombok

项目官网:HomePage

部分注解说明

注解 说明
@Getter/@Setter 可以用来标注Class或者Field,会为非静态Field提供Getter和Setter方法
@ToString 生成toString方法,默认会输出Class名和按顺序用逗号分隔输出Field
@EqualsAndHashCode 默认为所有非transient和非static的Field生成Equals和HashCode方法,也能指定Field
@NonNull 标注Field不能为null,会在Setter方法和构造方法里添加非空判断
@NoArgsConstructor 注解在Class上,生成一个无参构造方法
@RequiredArgsConstructor 注解在Class上,生成一个包含常量和标注了@NonNull的Field的参数的构造方法
@AllArgsConstructor 注解在Class上,生成一个全参的构造方法
@Data 包括@ToString、@EqualsAndHashCode、所有Field的@Getter、所有非final的Field的@Setter、@RequiredArgsConstructor几个注解的组合
@Log系列注解 使用不同类型的Log包来为标注的Class生成静态常量log

以上为比较常用的一些注解,当然还有其他的注解,以及部分注解可以通过添加参数或者修改配置文件的方式来修改生成代码的效果,具体可以到官网查阅。

一些个人看法

在某种程度上,Lombok是一个比较方便的工具,可以简化一些臃肿的代码,但是这并不是一个完美的工具,需要慎用。

  • 本工具的价值体现在编译前代码的简洁性上,对编译后的代码只会是有增无减,因此并不会为代码的运行效率带来提升,甚至会造成下降;
  • 在使用IDE进行开发时依赖于Lombok插件,如果没有安装插件代码会提示报错;
  • 并不便于开发人员阅读代码,尤其是不熟悉本工具的开发人员更是容易对代码产生疑惑;
  • 配置文件的生效方式类似于EditorConfig,如不做好管控容易造成混乱;
  • 即使是有多种参数和配置文件,也不一定能生成完全符合想法的代码,滥用注解会让代码更加凌乱;