elasticsearch command

  1. 查看ES健康状态

    1
    2
    3
    [root@10 ~]# curl '10.0.3.40:9200/_cat/health?v'  
    epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
    1489221736 16:42:16 ssp green 3 3 662 331 0 0 0 0 - 100.0%
  2. 查看集群节点

    1
    2
    3
    4
    5
    [root@10 ~]# curl '10.0.3.40:9200/_cat/nodes?v'  
    host ip heap.percent ram.percent load node.role master name
    10.0.3.40 10.0.3.40 49 97 0.89 d m 10.0.3.40
    10.0.3.41 10.0.3.41 58 98 0.71 d m 10.0.3.41
    10.0.3.42 10.0.3.42 61 97 1.09 d * 10.0.3.42
  3. 查看集群索引信息

    1
    2
    3
    4
    [root@10 ~]# curl '10.0.3.40:9200/_cat/indices?v'  
    health status index pri rep docs.count docs.deleted store.size pri.store.size
    green open index_1 5 1 12935206 0 10.5gb 5.2gb
    green open index_2 5 1 21408160 0 16.6gb 8.3gb
  4. 查看单条索引

    1
    2
    [root@10 soft]# curl -XGET http://10.0.3.40:9200/new-index?v
    [root@10 soft]# curl -XGET http://10.0.3.40:9200/new-index?pretty
  5. 关闭和打开索引

    1
    2
    curl -XPOST http://10.0.3.40:9200/new-index/_open
    curl -XPOST http://10.0.3.40:9200/new-index/_close
  6. 删除索引

    1
    curl -XDELETE http://10.0.3.40:9200/new-index
  7. 创建索引

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //简单方法
    curl -XPUT http://10.0.3.40:9200/new-index

    //创建索引加参数
    curl -XPUT http://10.0.3.40:9200/new-index -d '
    {
    "settings":{
    "index":{
    "number_of_shards":3,
    "number_of_replicas":2
    }
    }
    }
    '
  8. 查看分片

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [wisdom@10 ~]$ curl -XGET '10.0.3.41:9200/_cat/shards'|grep v2-inbound-request-2017.03
    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed
    100 26082 100 26082 0 0 61893 0 --:--:-- --:--:-- --:--:-- 61952
    v2-inbound-request-2017.03 1 r STARTED 25071632 35.2gb 10.0.3.41 10.0.3.41
    v2-inbound-request-2017.03 1 p STARTED 25071643 35.2gb 10.0.3.40 10.0.3.40
    v2-inbound-request-2017.03 3 p STARTED 25107804 35.3gb 10.0.3.41 10.0.3.41
    v2-inbound-request-2017.03 3 r STARTED 25107796 35.3gb 10.0.3.42 10.0.3.42
    v2-inbound-request-2017.03 2 r STARTED 25098807 35.2gb 10.0.3.42 10.0.3.42
    v2-inbound-request-2017.03 2 p STARTED 25098799 35.2gb 10.0.3.40 10.0.3.40
    v2-inbound-request-2017.03 4 p STARTED 25108295 35.3gb 10.0.3.41 10.0.3.41
    v2-inbound-request-2017.03 4 r STARTED 25108301 35.3gb 10.0.3.42 10.0.3.42
    v2-inbound-request-2017.03 0 r STARTED 25105055 35.3gb 10.0.3.42 10.0.3.42
    v2-inbound-request-2017.03 0 p STARTED 25105050 35.3gb 10.0.3.40 10.0.3.40

samba conf

samba 全局设置变量

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
[global]
samba服务器的全局设置,对整个服务器有效。

workgroup
语法:workgtoup = <工作组群>;
预设:workgroup = MYGROUP
说明:设定 Samba Server 的工作组
例:workgroup = workgroup 和WIN2000S设为一个组,可在网上邻居可中看到共享。

server string
语法:server string = <说明>;
预设:sarver string = Samba Server
说明:设定 Samba Server 的注释
其他:支持变量 t%-访问时间 I%-客户端IP m%-客户端主机名 M%-客户端域名 S%-客户端用户名
例:server string = this is a Samba Server 设定出现在Windows网上邻居的 Samba Server 注释为 this is a Samba Server

hosts allow
语法:hosts aoolw = <IP地址>; ...
预设:; host allow = 192.168.1. 192.168.2. 127.
说明:限制允许连接到 Samba Server 的机器,多个参数以空格隔开。表示方法可以为完整的IP地址,如 192.168.0.1 网段,如 192.168.0.
例:hosts allow = 192.168.1. 192.168.0.1 表示允许 192.168.1 网段的机器网址为 192.168.0.1 的机器连接到自己的 samba server

printcap name
语法:printcap name = <打印机配置文件>;
预设:printcap name = /etc/printcap
说明:设定 samba srever 打印机的配置文件
例:printcap name = /etc/printcap 设定 samba srever 参考 /etc/printcap 档的打印机设定。

load printers
语法:load printers = <yes/no>;
预设:load printers = yes
说明:是否在开启 samba server 时即共享打印机。

printing
语法:printing = <打印机类型>;
预设:printing = lprng
说明:设定 samba server 打印机所使用的类型,为目前所支持的类型。

guest account
语法:guert account = <帐户名称>;
预设:guert account = pcguest
说明:设定访问 samba server 的来宾帐户(即访问时不用输入用户名和密码的帐户),若设为pcguest的话则为默认为"nobody"用户。
例:guert account = andy 设定设定访问 samba server 的来宾帐户以andy用户登陆,则此登陆帐户享有andy用户的所有权限。

log file
语法:log file = <日志文件>;
预设:log file = /var/log/samba/%m.log
说明:设定 samba server 日志文件的储存位置和文件名(%m代表客户端主机名)

max log size
语法:max log size = <??KB>;
预设:max log size = 0
说明:设定日子文件的最大容量,单位KB 这里的预设值0代表不做限制。

security
语法:security = <等级>;
预设:security = user
说明:设定访问 samba server 的安全级别共有四种:
share---不需要提供用户名和密码。
user----需要提供用户名和密码,而且身份验证由 samba server 负责。
server--需要提供用户名和密码,可指定其他机器(winNT/2000/XP)或另一台 samba server作身份验证。
domain--需要提供用户名和密码,指定winNT/2000/XP域服务器作身份验证。

password server
语法:password server = <IP地址/主机名>;
预设:password server = <NT-Server-Name>;
说明:指定某台服务器(包括windows 和 linux)的密码,作为用户登入时验证的密码。
其他:此项需配合 security = server时,才可设定本参数。

password level
语法:password level = <位数>;
username level = <位数>;
预设:password level = 8

username level
username level = 8
说明:设定用户名和密码的位数,预设为8位字符。

encrypt passwords
语法:encrypt passwords = <yes/no>;
预设:encrypt passwords = yse
说明:设定是否对samba的密码加密。

smb passwd file
语法:smb passwd file = <密码文件>;
预设:smb passwd file = /etc/samba/smbpasswd
说明:设定samba的密码文件。

local master
语法:local master = <yes/no>;
预设:local master = no
说明:设定 samba server 是否要担当LMB角色(LMB负责收集本地网络的Browse List资源),通常无特殊原因设为no

os level
语法:os level = <数字>;
预设:os level = 33
说明:设定 samba server的os level. os level从 0 到 255 . winNT的os level为33, win95/98的os level 是 1 .若要拿samba server 当LMB或DMB则它的os level至少要大于NT的33以上。

domain master
语法:domain master = <yes/no>;
预设:domain master = yes
说明:设定 samba server 是否要担当DMB角色(DMB会负责收集其他子网的Browse List资源),通常无特殊原因设为no

preferred master
语法:preferred master = <yes/no>;
预设:preferred master = yes
说明:设定 samba server 是否要担当PDC角色(PDC会负责追踪网络帐户进行的一切变更),通常无特殊原因设为no,(同一网段内不可有两个PDC,他们会每5分钟抢主控权一次)

wins support
语法:wins support = <yes/no>;
预设:wins support = yes
说明:设定samba server 是否想网络提供WINS服务,通常无特殊原因设为no。除非所处网络上没有主机提供WINS服务且需要此台samba server提供WINS服务是才设yes,其他 wins support 和 wins server 只能选择一个

wins server
语法:wins server = <IP地址>;
预设:wins server = w.x.y.z
说明:设定samba server 是否要使用别台主机提供的WINS服务,通常无特殊原因设为no。除非所处网络上有一台主机提供WINS服务才要设yes,其他 wins support 和 wins server
例:wins server = 192.168.0.1 表示samba server要使用192.168.0.1提供的WINS服务

samba 共享目录设置

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[homes]
comment = Home Directories
browseable = no
writable = yes
valid users = %S

使用者本身的"家"目录,当使用者以samba使用者身份登入samba server后,samba server底下会看到自己的家目录,目录名称是使用者自己的帐号

[printers]
comment = All Printers
path = /var/spool/samba
browseable = no
guest ok = no
writable = no
printable = yes
设置了samba服务器中打印共享资源的属性,samba服务器除了可以提供文件共享,还可以提供打印共享


[分享的资源名称]
<指令1>; = (参数)
<指令2>; = (参数)
要提供分享资源时,须先把欲分享的资源以 [ ] 符号括住,底下通常会带指令和参数来表示此资源的设定和存取权限等,详情如下:

comment---------注释说明
path------------分享资源的完整路径名称,除了路径要正确外,目录的权限也要设对
browseable------是yes/否no在浏览资源中显示共享目录,若为否则必须指定共享路径才能存取
printable-------是yes/否no允许打印
hide dot ftles--是yes/否no隐藏隐藏文件
public----------是yes/否no公开共享,若为否则进行身份验证(只有当security = share 时此项才起作用)
guest ok--------是yes/否no公开共享,若为否则进行身份验证(只有当security = share 时此项才起作用)
read only-------是yes/否no以只读方式共享当与writable发生冲突时也writable为准
writable--------是yes/否no不以只读方式共享当与read only发生冲突时,无视read only
vaild users-----设定只有此名单内的用户才能访问共享资源(拒绝优先)(用户名/@组名)
invalid users---设定只有此名单内的用户不能访问共享资源(拒绝优先)(用户名/@组名)
read list-------设定此名单内的成员为只读(用户名/@组名)
write list------若设定为只读时,则只有此设定的名单内的成员才可作写入动作(用户名/@组名)
create mask-----建立文件时所给的权限
directory mask--建立目录时所给的权限
force group-----指定存取资源时须以此设定的群组使用者进入才能存取(用户名/@组名)
force user------指定存取资源时须以此设定的使用者进入才能存取(用户名/@组名)
allow hosts-----设定只有此网段/IP的用户才能访问共享资源,allow hosts = 网段 except IP
deny hosts------设定只有此网段/IP的用户不能访问共享资源

mysql index options

  1. 删除索引

    1
    2
    3
    mysql> DROP INDEX index_name ON talbe_name
    mysql> ALTER TABLE table_name DROP INDEX index_name
    mysql> ALTER TABLE table_name DROP PRIMARY KEY
  2. 查看索引

    1
    2
    mysql> show index from tblname;
    mysql> show keys from tblname;
  3. 索引类型

    1
    2
    3
    在创建索引时,可以规定索引能否包含重复值.如果不包含,则索引应该创建为PRIMARY KEY或UNIQUE索引.对于单列惟一性索引,这保证单列不包含重复的值.对于多列惟一性索引,保证多个值的组合不重复.

    PRIMARY KEY索引和UNIQUE索引非常类似.事实上,PRIMARY KEY索引仅是一个具有名称PRIMARY的UNIQUE索引.这表示一个表只能包含一个PRIMARY KEY,因为一个表中不可能具有两个同名的索引.
    1
    ALTER TABLE students ADD PRIMARY KEY (sid)
  4. 创建索引

    1
    2
    3
    4
    5
    6
    7
    8
    //ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引
    ALTER TABLE table_name ADD INDEX index_name (column_list)
    ALTER TABLE table_name ADD UNIQUE (column_list)
    ALTER TABLE table_name ADD PRIMARY KEY (column_list)

    //CREATE INDEX可对表增加普通索引或UNIQUE索引
    CREATE INDEX index_name ON table_name (column_list)
    CREATE UNIQUE INDEX index_name ON table_name (column_list)

nfs exports command

NFS exports 命令使用

1
2
3
4
5
6
7
如果修改了/etc/exports文件后不需要重新激活nfs,只要重新扫描一次/etc/exports文件,并且重新将设定加载即可:
# exportfs [-aruv]
参数说明如下。
* -a:全部挂载(或卸载)/etc/exports文件内的设定。
* -r:重新挂载/etc/exports中的设置,此外同步更新/etc/exports及/var/lib/nfs/xtab中的内容。
* -u:卸载某一目录。
* -v:在export时将共享的目录显示在屏幕上。

samba install

samba 安装

  1. 关闭selinux

    1
    2
    [root@10 ~]# setenforce 0
    [root@10 ~]# sed -i s/'SELINUX=enforcing'/'SELINUX=disabled'/g /etc/selinux/config
  2. 关闭防火墙

    1
    2
    [root@10 ~]# systemctl stop firewalld.service
    [root@10 ~]# systemctl disable firewalld.service
  3. samba 安装

    1
    [root@localhost ~]# yum -y install samba samba-client
  4. 创建共享目录

    1
    2
    [root@10 ~]# mkdir -p /mnt/data/samba/elasticsearch
    [root@10 ~]# chmod 777 /mnt/data/samba/elasticsearch
  5. samba 配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    [root@10 ~]# cp /etc/samba/{smb.conf,smb.conf.bak}
    [root@10 ~]# vim /etc/samba/smb.conf ==>追加
    [elasticsearch]
    comment = elasticsearch share
    path = /mnt/data/samba/elasticsearch
    hosts allow = 10.0.1. 10.0.2. 10.0.3. 10.0.4.
    browseable = no
    guest ok = no
    writable = yes
  6. 创建访问账号

    1
    2
    3
    4
    5
    [root@10 ~]# useradd -s /sbin/nologin smbuser
    [root@10 ~]# smbpasswd -a smbuser
    New SMB password: //123qwe`
    Retype new SMB password:
    Added user smbuser.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //添加账号并设置密码
    smbpasswd -a smbuser

    //删除smb账号
    smbpasswd -x smbuser

    //禁用smb账号
    smbpasswd -d smbuser

    //启用smb账号
    smbpasswd -e smbuser
  7. 启动smb服务

    1
    [root@10 ~]# systemctl start smb
    1
    2
    3
    4
    5
    [root@10 ~]# netstat -lntp|grep smbd
    tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN 5949/smbd
    tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 5949/smbd
    tcp6 0 0 :::445 :::* LISTEN 5949/smbd
    tcp6 0 0 :::139 :::* LISTEN 5949/smbd
  8. 客户端安装samba-client

    1
    [root@10 ~]# yum -y install samba-client
  9. 客户端查看共享资源

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    [root@10 ~]# smbclient -L //10.0.2.115
    Enter root's password: //查看共享信息,不需要密码,直接按回车键
    Anonymous login successful
    Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.4.4]

    Sharename Type Comment
    --------- ---- -------
    print$ Disk Printer Drivers
    IPC$ IPC IPC Service (Samba 4.4.4)
    Anonymous login successful
    Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.4.4]

    Server Comment
    --------- -------

    Workgroup Master
    --------- -------
  10. 客户端查看认证用户共享目录

    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
    [root@10 ~]# smbclient -U smbuser //10.0.2.115/elasticsearch
    Enter smbuser's password:
    Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.4.4]
    smb: \> ls
    . D 0 Sat Mar 11 15:27:59 2017
    .. D 0 Sat Mar 11 15:27:59 2017

    1048064000 blocks of size 1024. 1048031024 blocks available
    smb: \> help
    ? allinfo altname archive backup
    blocksize cancel case_sensitive cd chmod
    chown close del dir du
    echo exit get getfacl geteas
    hardlink help history iosize lcd
    link lock lowercase ls l
    mask md mget mkdir more
    mput newer notify open posix
    posix_encrypt posix_open posix_mkdir posix_rmdir posix_unlink
    print prompt put pwd q
    queue quit readlink rd recurse
    reget rename reput rm rmdir
    showacls setea setmode scopy stat
    symlink tar tarmode timeout translate
    unlock volume vuid wdel logon
    listconnect showconnect tcon tdis tid
    logoff .. !
    smb: \> quit
  11. 客户端挂载和卸载共享目录

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [root@10 ~]# mkdir -p /mnt/ops/elasticsearch
    [root@10 ~]# chmod 777 /mnt/ops/elasticsearch
    [root@10 ~]# mount -t cifs //10.0.2.115/elasticsearch /mnt/ops/elasticsearch -o username=smbuser,password=123qwe\`

    或者:

    [root@10 ~]# mkdir -p /mnt/ops/elasticsearch
    [root@10 ~]# chmod 777 /mnt/ops/elasticsearch
    [root@10 ~]# vim /etc/fstab
    //10.0.2.115/elasticsearch /mnt/ops/elasticsearch cifs defaults,username=smbuser,password=123qwe` 0 0
    [root@10 ~]# mount -a

    [root@10 ~]# df -h |grep elasticsearch
    //10.0.2.115/elasticsearch 1000G 33M 1000G 1% /mnt/ops/elasticsearch

    [root@10 ~]# umount /mnt/ops/elasticsearch
  12. 拓展:不同用户访问不同目录(授权)

    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
    28
    29
    30
    31
    32
    //创建两个组
    groupadd G1
    groupadd G2

    //创建三个用户
    useradd -s /sbin/nologin -g G1 U1
    useradd -s /sbin/nologin -g G1 U2
    useradd -s /sbin/nologin -g G2 U3

    //设置smb 密码
    smbpasswd -a U1
    smbpasswd -a U2
    smbpasswd -a U3

    //配置文件设置
    [test1]
    comment = Only U1 and U2 access
    path = /tmp/test1
    hosts allow = 10.0.1. 10.0.2. 10.0.3. 10.0.4.
    browseable = yes
    guest ok = no
    writable = yes
    write list = @G1

    [test2]
    comment = Only u3 access
    path = /tmp/test1
    hosts allow = 10.0.1. 10.0.2. 10.0.3. 10.0.4.
    browseable = no
    guest ok = no
    writable = yes
    write list = @G2

nfs install

NFS 简介

1
2
3
4
5
6
7
NFS是Network File System的缩写,即网络文件系统

NFS是一种使用于分散式文件系统的协定,功能是通过网络让不同的机器,不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类Unix系统间实现磁盘文件共享的一种方法.

NFS的基本原则是"允许不同的客户端及服务端通过一组RPC分享相同的文件系统",它是独立于操作系统,允许不同硬件及操作系统的系统共同进行文件的分享.

NFS在文件传送或信息传送过程中依赖于RPC协议.RPC,远程过程调用(Remote Procedure Call)是能使客户端执行其他系统中程序的一种机制.NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使用了一些其它的传输协议.而这些传输协议用到这个RPC功能的.可以说NFS本身就是使用RPC的一个程序.或者说NFS也是一个RPC SERVER.所以只要用到NFS的地方都要启动RPC服务,不论是NFS SERVER或者NFS CLIENT.这样SERVER和CLIENT才能通过RPC来实现PROGRAM PORT的对应.可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传输

NFS 安装

  1. NFS 安装

    1
    2
    // NFS 服务端 和 客户端
    [root@10 ~]# yum -y install nfs-utils rpcbind
    1
    2
    3
    * nfs-utils  Nfs-utils软件包提供了rpc.nfsd和rpc.mountd两个RPC守护进程
    * rpcbind 远程过程调用服务
    * nfs-ganesha* NFS-Ganesha是一个基于NFSv3\v4\v4.1的文件服务器,运行在大多数Linux发行版的用户模态下,同时也支持9p.2000L协议.它支持的运行平台包括Linux,BSD variants和POSIX-compliant Unixes
  2. NFS 常用文件或目录

    1
    2
    3
    4
    5
    * /etc/exports           NFS服务的主要配置文件
    * /usr/sbin/exportfs NFS服务的管理命令
    * /usr/sbin/showmount 客户端的查看命令
    * /var/lib/nfs/etab 记录NFS分享出来的目录的完整权限设定值
    * /var/lib/nfs/xtab 记录曾经登录过的客户端信息

NFS 配置

  1. 服务端:创建存放数据目录

    1
    2
    [root@10 ~]# mkdir -p /mnt/data/nfs/elasticsearch
    [root@10 ~]# chmod 777 /mnt/data/nfs/elasticsearch
  2. 服务端:修改配置文件/etc/exports

    1
    2
    [root@10 ~]# vim /etc/exports
    /mnt/data/nfs/elasticsearch 10.0.3.0/24(rw,sync,no_root_squash,no_all_squash)
    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
    28
    29
    30
    /etc/exports文件内容格式:
    <输出目录> [客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)]

    * 输出目录 共享目录位置
    * 客户端IP:
    1.指定ip地址:1.1.1.1
    2.指定网段:1.1.1.0/24,1.1.1.0/255.255.255.0
    3.指定主机域名:a.b.com
    4.指定部分主机域名:*.b.com
    5.所有主机:*
    * 客户端选项:选项用来设置输出目录的访问权限,用户映射
    1.访问权限:
    * ro 只读访问
    * rw 读写访问
    2.用户映射选项:
    * all_squash 将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody)
    * no_all_squash 与all_squash取反(默认设置)
    * root_squash 将root用户及所属组都映射为匿名用户或用户组(默认设置)
    * no_root_squash 与rootsquash取反
    * anonuid=xxx 将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx)
    * anongid=xxx 将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx)
    3.其它选项
    * secure 限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置)
    * insecure 允许客户端从大于1024的tcp/ip端口连接服务器
    * sync 将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性
    * async 将数据先保存在内存缓冲区中,必要时才写入磁盘
    * wdelay 检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置)
    * no_wdelay 若有写操作则立即执行,应与sync配合使用
    * subtree 若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置)
    * no_subtree 即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率
  3. 服务端:启动服务和开机自启动

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    //重启(修改完配置文件后)
    [root@10 ~]# systemctl restart rpcbind
    [root@10 ~]# systemctl restart nfs
    或者:
    //重新加载配置文件
    [root@10 ~]# exportfs -r


    //启动
    [root@10 ~]# systemctl start rpcbind
    [root@10 ~]# systemctl start nfs

    //开机启动项
    [root@10 ~]# systemctl enable rpcbind
    [root@10 ~]# systemctl enable nfs
  4. 服务端:检查NFS是否启动成功

    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
    28
    [root@10 ~]# rpcinfo -p
    program vers proto port service
    100000 4 tcp 111 portmapper
    100000 3 tcp 111 portmapper
    100000 2 tcp 111 portmapper
    100000 4 udp 111 portmapper
    100000 3 udp 111 portmapper
    100000 2 udp 111 portmapper
    100024 1 udp 53483 status
    100024 1 tcp 50192 status
    100005 1 udp 20048 mountd
    100005 1 tcp 20048 mountd
    100005 2 udp 20048 mountd
    100005 2 tcp 20048 mountd
    100005 3 udp 20048 mountd
    100005 3 tcp 20048 mountd
    100003 3 tcp 2049 nfs
    100003 4 tcp 2049 nfs
    100227 3 tcp 2049 nfs_acl
    100003 3 udp 2049 nfs
    100003 4 udp 2049 nfs
    100227 3 udp 2049 nfs_acl
    100021 1 udp 38395 nlockmgr
    100021 3 udp 38395 nlockmgr
    100021 4 udp 38395 nlockmgr
    100021 1 tcp 53778 nlockmgr
    100021 3 tcp 53778 nlockmgr
    100021 4 tcp 53778 nlockmgr
    1
    2
    3
    4
    5
    6
    7
    注意:
    我们只输入了一条启动NFS服务的命令,它额外的启动了3个服务:quotas,daemon,mountd(启动portmap服务)又是怎么回事?

    首先,NFS文件系统要提供服务单靠本身的NFS服务是不够的,还需要调用其它服务,这个其它服务就是RPC(remote procedure call,远程过程调用)服务和portmap服务.由于NFS服务本身不提供文件传输功能,我们要远程使用NFS文件系统就需要RPC服务的支持,而portmap服务用来为RPC服务进行动态端口分配和映射,所以portmap服务也是NFS服务所必须的.正是因为NFS的运行必须要使用RPC服务,所以一般把NFS服务看作RPC服务的一种,开启NFS服务其实就是在开启RPC服务.REDHAT安全指南在讲portmap服务时就说:"portmap服务是用于RPC服务(如NIS和NFS)的动态端口分配守护进程",明显把NFS和NIS(network information service)看成了RPC服务的其中两个应用.

    NFS使用了RPC的哪些服务呢? rpc.nfsd服务 和 rpc.mountd服务
    明白了这点,我们就明白为什么在开启nfs服务时,系统除了开启NFS services还开启了rpc.nfsd和rpc.mountd,而至于NFS quotas是用来管理目录配额的,它并不是必需的.这也就明白了安装NFS服务时所需要的两个软件包nfs-utils和portmap: Nfs-utils软件包提供了rpc.nfsd和rpc.mountd两个RPC的daemon(守护进程)程序,而portmap软件包提供了portmap程序
  5. 客户端:检查共享目录列表

    1
    2
    3
    [root@10 ~]# showmount -e 10.0.2.115
    Export list for 10.0.2.115:
    /mnt/data/nfs/elasticsearch 10.0.3.0/24
  6. 客户端:创建挂载点

    1
    2
    [root@10 ~]# mkdir -p /mnt/ops/elasticsearch
    [root@10 ~]# chmod 777 /mnt/ops/elasticsearch
  7. 客户端:挂在共享目录

    1
    2
    3
    4
    5
    6
    //显示指定NFS服务器的客户端以及服务器端在客户端的挂载点
    showmount –a IP
    //显示指定NFS服务器在客户端的挂载点
    showmount –d IP

    rpcinfo -p 10.10.209.148
  8. 客户端挂载目录

    1
    [root@10 ~]# mount.nfs -t nfs 10.0.2.115:/mnt/data/nfs/elasticsearch /mnt/ops/elasticsearch -o proto=tcp -o nolock

elasticsearch backup and restore

elasticsearch 备份说明

1
2
3
4
Elasticsearch的备份分两步:
1.创建一个仓库
备份数据之前,要创建一个仓库来保存数据,仓库的类型支持共享文件系统,Amazon S3,HDFS和Azure Cloud
2.备份指定索引

elasticsearch 备份

  1. elasticsearch 创建一个仓库

    1
    2
    3
    //查看当前所有仓库
    [root@10 ~]# curl -XGET http://10.0.3.41:9200/_snapshot/_all?pretty
    { }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //创建一个仓库
    [wisdom@10 ~]$ curl -XPUT '10.0.3.41:9200/_snapshot/esbackup' -d '
    > {
    > "type": "fs",
    > "settings": {
    > "location": "/mnt/ops/elasticsearch",
    > "compress" : "true",
    > "max_snapshot_bytes_per_sec" : "80mb",
    > "max_restore_bytes_per_sec" : "80mb"
    > }
    > }'
    {"acknowledged":true}
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // 使用POST来修改配置
    [wisdom@10 ~]$ curl -XPUT '10.0.3.41:9200/_snapshot/esbackup' -d '
    > {
    > "type": "fs",
    > "settings": {
    > "max_snapshot_bytes_per_sec" : "100mb",
    > "max_restore_bytes_per_sec" : "100mb"
    > }
    > }'
    {"acknowledged":true}
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //查看当前仓库信息
    [wisdom@10 ~]$ curl -XGET http://10.0.3.41:9200/_snapshot/esbackup?pretty
    {
    "esbackup" : {
    "type" : "fs",
    "settings" : {
    "location" : "/mnt/ops/elasticsearch",
    "max_restore_bytes_per_sec" : "80mb",
    "compress" : "true",
    "max_snapshot_bytes_per_sec" : "80mb"
    }
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //查看当前所有仓库信息
    [wisdom@10 ~]$ curl -XGET http://10.0.3.41:9200/_snapshot/_all?pretty
    {
    "esbackup" : {
    "type" : "fs",
    "settings" : {
    "location" : "/mnt/ops/elasticsearch",
    "max_restore_bytes_per_sec" : "80mb",
    "compress" : "true",
    "max_snapshot_bytes_per_sec" : "80mb"
    }
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    //查看仓库是否创建成功
    [wisdom@10 ~]$ curl -XPOST http://10.0.3.41:9200/_snapshot/esbackup/_verify?pretty
    {
    "nodes" : {
    "j0bxQZGZSbW1lNoD9d2WHQ" : {
    "name" : "10.0.3.41"
    },
    "lhlUZILyRAm2Mtmp8czEOw" : {
    "name" : "10.0.3.42"
    },
    "DKfbgvGYTNO48BdMI3eeQA" : {
    "name" : "10.0.3.40"
    }
    }
    }
    1
    2
    3
    4
    5
    //删除仓库
    [root@10 ~]# curl -XDELETE http://10.0.3.40:9200/_snapshot/esbackup?pretty
    {
    "acknowledged" : true
    }
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    补充: 一个权限错误
    [wisdom@10 ~]$ curl -XPUT '10.0.3.41:9200/_snapshot/es' -d '
    {
    "type": "fs",
    "settings": {
    "location": "/mnt/ops/elasticsearch",
    "max_snapshot_bytes_per_sec" : "80mb",
    "max_restore_bytes_per_sec" : "80mb"
    }
    }'
    {"error":{"root_cause":[{"type":"access_denied_exception","reason":"access_denied_exception: /mnt/ops/elasticsearch/tests-ggM3LzbjTn2d0pWjwj7WpQ/master.dat-temp"}],"type":"repository_verification_exception","reason":"[es] path is not accessible on master node","caused_by":{"type":"access_denied_exception","reason":"access_denied_exception: /mnt/ops/elasticsearch/tests-ggM3LzbjTn2d0pWjwj7WpQ/master.dat-temp"}},"status":500}

    问题解决:
    1. 查看test目录
    [root@10 ~]# ls -l /mnt/ops/elasticsearch/
    total 0
    drwxr-xr-x 2 1001 1001 0 Mar 12 03:10 tests-ggM3LzbjTn2d0pWjwj7WpQ

    2. 我使用的是普通用户wisdom启动的elasticsearch,三台es的uid和gid都是1000
    [wisdom@10 ~]$ tail /etc/passwd|grep wisdom
    wisdom:x:1000:1000::/home/wisdom:/bin/bash

    此时,我们已经发现问题,创建的test目录的权限是1001,和我们使用的用户对不上号

    3. 1001是什么用户?经排查是samba的权限账号
    //Samba server:
    [root@10 ~]# tail /etc/passwd|grep 1001
    smbuser:x:1001:1001::/home/smbuser:/sbin/nologin

    //查看ES集群挂载点
    [root@10 ~]# cat /etc/fstab |grep elasticsearch
    //10.0.2.115/elasticsearch /mnt/ops/elasticsearch cifs defaults,username=smbuser,password=xxxxxx 0 0

    至此,问题已经找到. 解决就很快了.

    4. 在Samba服务器上创建UID和GID与三台ES主机中ES启动用户相同的用户
    //Samba server:
    [root@10 ~]# useradd -u 1000 -g 1000 wisdom
    [root@10 ~]# smbpasswd -a wisdom

    //ES集群
    [root@10 ~]# umount /mnt/ops/elasticsearch
    [root@10 ~]# vim /etc/fstab |grep elasticsearch
    //10.0.2.115/elasticsearch /mnt/ops/elasticsearch cifs defaults,username=wisdom,password=xxxxxx 0 0
    [root@10 ~]# mount -a
    [root@10 ~]# smbclient -U wisdom //10.0.2.115/elasticsearch

    5. 重新创建仓库,成功
  2. elasticsearch 备份索引

    1
    2
    3
    一个仓库可以包含多个快照(snapshots),快照可以存所有的索引,部分索引或者一个单独的索引

    注意: 快照只会备份正在运行open状态的索引!!!
    1
    2
    3
    4
    5
    6
    7
    //备份所有索引到一个快照中
    [wisdom@10 ~]$ curl -XPUT http://10.0.3.40:9200/_snapshot/esbackup/snapshot_all
    直接返回{"accepted":true},然后备份在后台执行

    or:
    [wisdom@10 ~]$ curl -XPUT http://10.0.3.40:9200/_snapshot/esbackup/snapshot_all?wait_for_completion=true
    只有备份完成后,才会显示{"accepted":true}
    1
    2
    3
    //备份部分索引
    [wisdom@10 ~]$ curl -XPUT http://10.0.3.40:9200/_snapshot/esbackup/snapshot_index -d '{ "indices": "index_1,index_2" }'
    会将索引index_1和index_2备份到快照snapshot_index中
    1
    2
    3
    //备份单个索引
    [wisdom@10 ~]$ curl -XPUT http://10.0.3.40:9200/_snapshot/esbackup/snapshot_index_1 -d '{ "indices": "index_1" }'
    会将索引index_1备份到快照snapshot_index_1中
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    //查看快照信息
    [wisdom@10 ~]$ curl -XGET http://10.0.3.41:9200/_snapshot/esbackup/snapshot_index_1?pretty
    {
    "snapshots" : [ {
    "snapshot" : "snapshot_index_1",
    "version_id" : 2030399,
    "version" : "2.3.3",
    "indices" : [ "snapshot_index_1" ],
    "state" : "SUCCESS",
    "start_time" : "2017-03-11T20:53:11.478Z",
    "start_time_in_millis" : 1489265591478,
    "end_time" : "2017-03-11T20:53:46.128Z",
    "end_time_in_millis" : 1489265626128,
    "duration_in_millis" : 34650,
    "failures" : [ ],
    "shards" : {
    "total" : 5,
    "failed" : 0,
    "successful" : 5
    }
    } ]
    }
    1
    2
    //查看所有快照信息
    [wisdom@10 ~]$ curl -XGET http://10.0.3.41:9200/_snapshot/esbackup/_all?pretty
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    //查看快照状态信息
    [wisdom@10 ~]$ curl -XGET http://10.0.3.41:9200/_snapshot/esbackup/snapshot_index_1/_status?pretty
    {
    "snapshots" : [ {
    "snapshot" : "snapshot_index_1",
    "repository" : "esbackup",
    "state" : "SUCCESS",
    "shards_stats" : {
    "initializing" : 0,
    "started" : 0,
    "finalizing" : 0,
    "done" : 5,
    "failed" : 0,
    "total" : 5
    },
    "stats" : {
    "number_of_files" : 497,
    "processed_files" : 497,
    "total_size_in_bytes" : 2141849055,
    "processed_size_in_bytes" : 2141849055,
    "start_time_in_millis" : 1489265591607,
    "time_in_millis" : 34498
    },
    "indices" : {
    "snapshot_index_1" : {
    "shards_stats" : {
    "initializing" : 0,
    "started" : 0,
    "finalizing" : 0,
    "done" : 5,
    "failed" : 0,
    "total" : 5
    },
    "stats" : {
    "number_of_files" : 497,
    "processed_files" : 497,
    "total_size_in_bytes" : 2141849055,
    "processed_size_in_bytes" : 2141849055,
    "start_time_in_millis" : 1489265591607,
    "time_in_millis" : 34498
    },
    "shards" : {
    "0" : {
    "stage" : "DONE",
    "stats" : {
    "number_of_files" : 94,
    "processed_files" : 94,
    "total_size_in_bytes" : 429108117,
    "processed_size_in_bytes" : 429108117,
    "start_time_in_millis" : 1489265591663,
    "time_in_millis" : 12916
    }
    },
    "1" : {
    "stage" : "DONE",
    "stats" : {
    "number_of_files" : 82,
    "processed_files" : 82,
    "total_size_in_bytes" : 429223456,
    "processed_size_in_bytes" : 429223456,
    "start_time_in_millis" : 1489265591607,
    "time_in_millis" : 32220
    }
    },
    "2" : {
    "stage" : "DONE",
    "stats" : {
    "number_of_files" : 115,
    "processed_files" : 115,
    "total_size_in_bytes" : 428510263,
    "processed_size_in_bytes" : 428510263,
    "start_time_in_millis" : 1489265591615,
    "time_in_millis" : 34152
    }
    },
    "3" : {
    "stage" : "DONE",
    "stats" : {
    "number_of_files" : 97,
    "processed_files" : 97,
    "total_size_in_bytes" : 427697132,
    "processed_size_in_bytes" : 427697132,
    "start_time_in_millis" : 1489265591619,
    "time_in_millis" : 34261
    }
    },
    "4" : {
    "stage" : "DONE",
    "stats" : {
    "number_of_files" : 109,
    "processed_files" : 109,
    "total_size_in_bytes" : 427310087,
    "processed_size_in_bytes" : 427310087,
    "start_time_in_millis" : 1489265591611,
    "time_in_millis" : 34494
    }
    }
    }
    }
    }
    } ]
    }
    1
    2
    //删除快照
    [wisdom@10 ~]$ curl -XDELETE http://10.0.3.41:9200/_snapshot/esbackup/snapshot_index_1

elasticsearch 恢复

1
2
//恢复快照
[wisdom@10 ~]$ curl -XPOST http://10.0.3.41:9200/_snapshot/esbackup/snapshot_index_1/_restore
1
2
3
4
5
6
7
8
9
10
11
//恢复快照中指定索引
[wisdom@10 ~]$ curl -XPOST http://10.0.3.41:9200/_snapshot/esbackup/snapshot_index_1/_restore -d '
{
"indices": "index_1",
"rename_pattern": "index_(.+)",
"rename_replacement": "restored_index_$1"
}'
说明:
* indices表示只恢复索引index_1
* 参数rename_pattern和rename_replacement 用来正则匹配要恢复的索引,并且重命名
* 和备份一样,api会立刻返回值,然后在后台执行恢复,使用wait_for_completion 标记强制同步执行
1
2
3
//查看恢复状态
[wisdom@10 ~]$ curl -XGET http://10.0.3.41:9200/_recovery/snapshot_index_1
[wisdom@10 ~]$ curl -XGET http://10.0.3.41:9200/_recovery/
1
2
//取消恢复过程(不管是已经恢复完,还是正在恢复)直接删除索引即可
[wisdom@10 ~]$ curl -XDELETE http://10.0.3.41:9200/_recovery/snapshot_index_1

kafka broker config

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
############################# System #############################
#唯一标识在集群中的ID,要求是正数。
broker.id=0
#服务端口,默认9092
port=9092
#监听地址,不设为所有地址
host.name=debugo01

# 处理网络请求的最大线程数
num.network.threads=2
# 处理磁盘I/O的线程数
num.io.threads=8
# 一些后台线程数
background.threads = 4
# 等待IO线程处理的请求队列最大数
queued.max.requests = 500

# socket的发送缓冲区(SO_SNDBUF)
socket.send.buffer.bytes=1048576
# socket的接收缓冲区 (SO_RCVBUF)
socket.receive.buffer.bytes=1048576
# socket请求的最大字节数。为了防止内存溢出,message.max.bytes必然要小于
socket.request.max.bytes = 104857600

############################# Topic #############################
# 每个topic的分区个数,更多的partition会产生更多的segment file
num.partitions=2
# 是否允许自动创建topic ,若是false,就需要通过命令创建topic
auto.create.topics.enable =true
# 一个topic ,默认分区的replication个数 ,不能大于集群中broker的个数。
default.replication.factor =1
# 消息体的最大大小,单位是字节
message.max.bytes = 1000000

############################# ZooKeeper #############################
# Zookeeper quorum设置。如果有多个使用逗号分割
zookeeper.connect=debugo01:2181,debugo02,debugo03
# 连接zk的超时时间
zookeeper.connection.timeout.ms=1000000
# ZooKeeper集群中leader和follower之间的同步实际
zookeeper.sync.time.ms = 2000

############################# Log #############################
#日志存放目录,多个目录使用逗号分割
log.dirs=/var/log/kafka

# 当达到下面的消息数量时,会将数据flush到日志文件中。默认10000
#log.flush.interval.messages=10000
# 当达到下面的时间(ms)时,执行一次强制的flush操作。interval.ms和interval.messages无论哪个达到,都会flush。默认3000ms
#log.flush.interval.ms=1000
# 检查是否需要将日志flush的时间间隔
log.flush.scheduler.interval.ms = 3000

# 日志清理策略(delete|compact)
log.cleanup.policy = delete
# 日志保存时间 (hours|minutes),默认为7天(168小时)。超过这个时间会根据policy处理数据。bytes和minutes无论哪个先达到都会触发。
log.retention.hours=168
# 日志数据存储的最大字节数。超过这个时间会根据policy处理数据。
#log.retention.bytes=1073741824

# 控制日志segment文件的大小,超出该大小则追加到一个新的日志segment文件中(-1表示没有限制)
log.segment.bytes=536870912
# 当达到下面时间,会强制新建一个segment
log.roll.hours = 24*7
# 日志片段文件的检查周期,查看它们是否达到了删除策略的设置(log.retention.hours或log.retention.bytes)
log.retention.check.interval.ms=60000

# 是否开启压缩
log.cleaner.enable=false
# 对于压缩的日志保留的最长时间
log.cleaner.delete.retention.ms = 1 day

# 对于segment日志的索引文件大小限制
log.index.size.max.bytes = 10 * 1024 * 1024
#y索引计算的一个缓冲区,一般不需要设置。
log.index.interval.bytes = 4096

############################# replica #############################
# partition management controller 与replicas之间通讯的超时时间
controller.socket.timeout.ms = 30000
# controller-to-broker-channels消息队列的尺寸大小
controller.message.queue.size=10
# replicas响应leader的最长等待时间,若是超过这个时间,就将replicas排除在管理之外
replica.lag.time.max.ms = 10000
# 是否允许控制器关闭broker ,若是设置为true,会关闭所有在这个broker上的leader,并转移到其他broker
controlled.shutdown.enable = false
# 控制器关闭的尝试次数
controlled.shutdown.max.retries = 3
# 每次关闭尝试的时间间隔
controlled.shutdown.retry.backoff.ms = 5000

# 如果relicas落后太多,将会认为此partition relicas已经失效。而一般情况下,因为网络延迟等原因,总会导致replicas中消息同步滞后。如果消息严重滞后,leader将认为此relicas网络延迟较大或者消息吞吐能力有限。在broker数量较少,或者网络不足的环境中,建议提高此值.
replica.lag.max.messages = 4000
#leader与relicas的socket超时时间
replica.socket.timeout.ms= 30 * 1000
# leader复制的socket缓存大小
replica.socket.receive.buffer.bytes=64 * 1024
# replicas每次获取数据的最大字节数
replica.fetch.max.bytes = 1024 * 1024
# replicas同leader之间通信的最大等待时间,失败了会重试
replica.fetch.wait.max.ms = 500
# 每一个fetch操作的最小数据尺寸,如果leader中尚未同步的数据不足此值,将会等待直到数据达到这个大小
replica.fetch.min.bytes =1
# leader中进行复制的线程数,增大这个数值会增加relipca的IO
num.replica.fetchers = 1
# 每个replica将最高水位进行flush的时间间隔
replica.high.watermark.checkpoint.interval.ms = 5000

# 是否自动平衡broker之间的分配策略
auto.leader.rebalance.enable = false
# leader的不平衡比例,若是超过这个数值,会对分区进行重新的平衡
leader.imbalance.per.broker.percentage = 10
# 检查leader是否不平衡的时间间隔
leader.imbalance.check.interval.seconds = 300
# 客户端保留offset信息的最大空间大小
offset.metadata.max.bytes = 1024

#############################Consumer #############################
# Consumer端核心的配置是group.id、zookeeper.connect
# 决定该Consumer归属的唯一组ID,By setting the same group id multiple processes indicate that they are all part of the same consumer group.
group.id
# 消费者的ID,若是没有设置的话,会自增
consumer.id
# 一个用于跟踪调查的ID ,最好同group.id相同
client.id = <group_id>

# 对于zookeeper集群的指定,必须和broker使用同样的zk配置
zookeeper.connect=debugo01:2182,debugo02:2182,debugo03:2182
# zookeeper的心跳超时时间,查过这个时间就认为是无效的消费者
zookeeper.session.timeout.ms = 6000
# zookeeper的等待连接时间
zookeeper.connection.timeout.ms = 6000
# zookeeper的follower同leader的同步时间
zookeeper.sync.time.ms = 2000
# 当zookeeper中没有初始的offset时,或者超出offset上限时的处理方式 。
# smallest :重置为最小值
# largest:重置为最大值
# anything else:抛出异常给consumer
auto.offset.reset = largest

# socket的超时时间,实际的超时时间为max.fetch.wait + socket.timeout.ms.
socket.timeout.ms= 30 * 1000
# socket的接收缓存空间大小
socket.receive.buffer.bytes=64 * 1024
#从每个分区fetch的消息大小限制
fetch.message.max.bytes = 1024 * 1024

# true时,Consumer会在消费消息后将offset同步到zookeeper,这样当Consumer失败后,新的consumer就能从zookeeper获取最新的offset
auto.commit.enable = true
# 自动提交的时间间隔
auto.commit.interval.ms = 60 * 1000

# 用于消费的最大数量的消息块缓冲大小,每个块可以等同于fetch.message.max.bytes中数值
queued.max.message.chunks = 10

# 当有新的consumer加入到group时,将尝试reblance,将partitions的消费端迁移到新的consumer中, 该设置是尝试的次数
rebalance.max.retries = 4
# 每次reblance的时间间隔
rebalance.backoff.ms = 2000
# 每次重新选举leader的时间
refresh.leader.backoff.ms

# server发送到消费端的最小数据,若是不满足这个数值则会等待直到满足指定大小。默认为1表示立即接收。
fetch.min.bytes = 1
# 若是不满足fetch.min.bytes时,等待消费端请求的最长等待时间
fetch.wait.max.ms = 100
# 如果指定时间内没有新消息可用于消费,就抛出异常,默认-1表示不受限
consumer.timeout.ms = -1

#############################Producer#############################
# 核心的配置包括:
# metadata.broker.list
# request.required.acks
# producer.type
# serializer.class

# 消费者获取消息元信息(topics, partitions and replicas)的地址,配置格式是:host1:port1,host2:port2,也可以在外面设置一个vip
metadata.broker.list

#消息的确认模式
# 0:不保证消息的到达确认,只管发送,低延迟但是会出现消息的丢失,在某个server失败的情况下,有点像TCP
# 1:发送消息,并会等待leader 收到确认后,一定的可靠性
# -1:发送消息,等待leader收到确认,并进行复制操作后,才返回,最高的可靠性
request.required.acks = 0

# 消息发送的最长等待时间
request.timeout.ms = 10000
# socket的缓存大小
send.buffer.bytes=100*1024
# key的序列化方式,若是没有设置,同serializer.class
key.serializer.class
# 分区的策略,默认是取模
partitioner.class=kafka.producer.DefaultPartitioner
# 消息的压缩模式,默认是none,可以有gzip和snappy
compression.codec = none
# 可以针对默写特定的topic进行压缩
compressed.topics=null
# 消息发送失败后的重试次数
message.send.max.retries = 3
# 每次失败后的间隔时间
retry.backoff.ms = 100
# 生产者定时更新topic元信息的时间间隔 ,若是设置为0,那么会在每个消息发送后都去更新数据
topic.metadata.refresh.interval.ms = 600 * 1000
# 用户随意指定,但是不能重复,主要用于跟踪记录消息
client.id=""

# 异步模式下缓冲数据的最大时间。例如设置为100则会集合100ms内的消息后发送,这样会提高吞吐量,但是会增加消息发送的延时
queue.buffering.max.ms = 5000
# 异步模式下缓冲的最大消息数,同上
queue.buffering.max.messages = 10000
# 异步模式下,消息进入队列的等待时间。若是设置为0,则消息不等待,如果进入不了队列,则直接被抛弃
queue.enqueue.timeout.ms = -1
# 异步模式下,每次发送的消息数,当queue.buffering.max.messages或queue.buffering.max.ms满足条件之一时producer会触发发送。
batch.num.messages=200

kafka add topic replicats

kafka修改topic的replicats数量(添加)

  1. 修改前检查

    1
    2
    3
    4
    penn@ubuntu:~$ /mnt/app/kafka.1/bin/kafka-topics.sh --zookeeper 10.0.2.15:2181/kafka --describe --topic test-1
    Topic:test-1 PartitionCount:2 ReplicationFactor:2 Configs:
    Topic: test-1 Partition: 0 Leader: 4 Replicas: 4,3 Isr: 3,4
    Topic: test-1 Partition: 1 Leader: 3 Replicas: 3,4 Isr: 3,4
  2. 编写json文件,将partition的副本由2个扩大到4个

    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
    penn@ubuntu:~$ cat increate_replica_partition.json
    {
    "partitions": [
    {
    "topic": "test-1",
    "partition": 0,
    "replicas": [
    1,
    2,
    3,
    4
    ]
    },
    {
    "topic": "test-1",
    "partition": 1,
    "replicas": [
    1,
    2,
    3,
    4
    ]
    }
    ],
    "version": 1
    }
  3. 执行副本集扩容

    1
    2
    3
    4
    5
    penn@ubuntu:~$ /mnt/app/kafka.1/bin/kafka-reassign-partitions.sh --zookeeper 10.0.2.15:2181/kafka --reassignment-json-file ./increate_replica_partition.json --execute
    Current partition replica assignment
    {"version":1,"partitions":[{"topic":"test-1","partition":1,"replicas":[3,4]},{"topic":"test-1","partition":0,"replicas":[4,3]}]}
    Save this to use as the --reassignment-json-file option during rollback
    Successfully started reassignment of partitions.
  4. 修改后检查

    1
    2
    3
    4
    5
    6
    7
    8
    9
    penn@ubuntu:~$ /mnt/app/kafka.1/bin/kafka-reassign-partitions.sh --zookeeper 10.0.2.15:2181/kafka --reassignment-json-file ./increate_replica_partition.json --verify
    Status of partition reassignment:
    Reassignment of partition [test-1,0] completed successfully
    Reassignment of partition [test-1,1] completed successfully

    penn@ubuntu:~$ /mnt/app/kafka.1/bin/kafka-topics.sh --zookeeper 10.0.2.15:2181/kafka --describe --topic test-1
    Topic:test-1 PartitionCount:2 ReplicationFactor:4 Configs:
    Topic: test-1 Partition: 0 Leader: 4 Replicas: 1,2,3,4 Isr: 3,4,2,1
    Topic: test-1 Partition: 1 Leader: 3 Replicas: 1,2,3,4 Isr: 3,4,2,1

kafka修改topic的replicats数量(缩减)

  1. 缩容前检查

    1
    2
    3
    4
    penn@ubuntu:~$ /mnt/app/kafka.1/bin/kafka-topics.sh --zookeeper 10.0.2.15:2181/kafka --describe --topic test-1
    Topic:test-1 PartitionCount:2 ReplicationFactor:4 Configs:
    Topic: test-1 Partition: 0 Leader: 1 Replicas: 1,2,3,4 Isr: 3,4,2,1
    Topic: test-1 Partition: 1 Leader: 1 Replicas: 1,2,3,4 Isr: 3,4,2,1
  2. 缩容json

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    penn@ubuntu:~$ cat increate_replica_partition.json
    {
    "partitions": [
    {
    "topic": "test-1",
    "partition": 0,
    "replicas": [
    1,
    2
    ]
    },
    {
    "topic": "test-1",
    "partition": 1,
    "replicas": [
    1,
    2
    ]
    }
    ],
    "version": 1
    }
  3. 执行json

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    penn@ubuntu:~$ /mnt/app/kafka.1/bin/kafka-reassign-partitions.sh --zookeeper 10.0.2.15:2181/kafka --reassignment-json-file ./increate_replica_partition.json --execute
    Current partition replica assignment
    {"version":1,"partitions":[{"topic":"test-1","partition":1,"replicas":[1,2,3,4]},{"topic":"test-1","partition":0,"replicas":[1,2,3,4]}]}
    Save this to use as the --reassignment-json-file option during rollback
    Successfully started reassignment of partitions.

    4. 缩减后检查
    ```bash
    penn@ubuntu:~$ /mnt/app/kafka.1/bin/kafka-topics.sh --zookeeper 10.0.2.15:2181/kafka --describe --topic test-1 Topic:test-1 PartitionCount:2 ReplicationFactor:2 Configs:
    Topic: test-1 Partition: 0 Leader: 1 Replicas: 1,2 Isr: 2,1
    Topic: test-1 Partition: 1 Leader: 1 Replicas: 1,2 Isr: 2,1

kafka migrate and scale

迁移和扩容

1
2
3
迁移和扩容需要满足两点:
1.将指定topic迁移到集群内新增的node上
2.将topic指定的partition迁移到新增的node上
  1. 测试数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    penn@ubuntu:~$ /mnt/app/kafka.1/bin/kafka-topics.sh --zookeeper 10.0.2.15:2181/kafka --create --replication-factor 2 --partitions 2 --topic test-1
    Created topic "test-1".
    penn@ubuntu:~$ /mnt/app/kafka.1/bin/kafka-topics.sh --zookeeper 10.0.2.15:2181/kafka --create --replication-factor 2 --partitions 2 --topic test-2
    Created topic "test-2".

    penn@ubuntu:~$ /mnt/app/kafka.1/bin/kafka-topics.sh --zookeeper 10.0.2.15:2181/kafka --list
    test-1
    test-2

    penn@ubuntu:~$ /mnt/app/kafka.1/bin/kafka-topics.sh --zookeeper 10.0.2.15:2181/kafka --describe --topic test-1
    Topic:test-1 PartitionCount:2 ReplicationFactor:2 Configs:
    Topic: test-1 Partition: 0 Leader: 2 Replicas: 2,1 Isr: 2,1
    Topic: test-1 Partition: 1 Leader: 1 Replicas: 1,2 Isr: 1,2

    penn@ubuntu:~$ /mnt/app/kafka.1/bin/kafka-topics.sh --zookeeper 10.0.2.15:2181/kafka --describe --topic test-2
    Topic:test-2 PartitionCount:2 ReplicationFactor:2 Configs:
    Topic: test-2 Partition: 0 Leader: 2 Replicas: 2,1 Isr: 2,1
    Topic: test-2 Partition: 1 Leader: 1 Replicas: 1,2 Isr: 1,2

    通过上面我们看到,我们创建了2个topic,它们存放在1和2两个broker上,此时我们添加第三个broker,并将test-1 topic迁移到3和4broker上
  2. 准备迁移json

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //创建migration-test-topic.json文件,并写入要迁移都topic
    penn@ubuntu:~$ cat migration-test-topic.json
    {
    "topics": [
    {
    "topic": "test-1"
    }
    ],
    "version": 1
    }
  3. 根据json文件生成迁移JSON语句

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //根据上面的migration-test-topic.json文件生成迁移JSON语句
    penn@ubuntu:~$ /mnt/app/kafka.1/bin/kafka-reassign-partitions.sh --zookeeper 10.0.2.15:2181/kafka --topics-to-move-json-file ./migration-test-topic.json --broker-list "3,4" --generate
    Current partition replica assignment
    {"version":1,"partitions":[{"topic":"test-1","partition":1,"replicas":[1,2]},{"topic":"test-1","partition":0,"replicas":[2,1]}]}
    Proposed partition reassignment configuration
    {"version":1,"partitions":[{"topic":"test-1","partition":1,"replicas":[3,4]},{"topic":"test-1","partition":0,"replicas":[4,3]}]}


    //将JSON保存到文件
    penn@ubuntu:~$ cat move-to-new-broker.json //将下面都json写入到新文件中
    {"version":1,"partitions":[{"topic":"test-1","partition":1,"replicas":[3,4]},{"topic":"test-1","partition":0,"replicas":[4,3]}]}
    1
    2
    3
    4
    5
    //补充:一个错误
    penn@ubuntu:~$ /mnt/app/kafka.1/bin/kafka-reassign-partitions.sh --zookeeper 10.0.2.15:2181/kafka --topics-to-move-json-file ./migration-test-topic.json --broker-list "3" --generate
    Partitions reassignment failed due to replication factor: 2 larger than available brokers: 1
    org.apache.kafka.common.errors.InvalidReplicationFactorException: replication factor: 2 larger than available brokers: 1
    报错原因: 是因为要迁移都topic有两个replica,所以在添加新的broker的个数最好是replica指定数的倍数
  4. 对topic进行迁移

    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
    //迁移前检查
    penn@ubuntu:~$ /mnt/app/kafka.1/bin/kafka-reassign-partitions.sh --zookeeper 10.0.2.15:2181/kafka --reassignment-json-file ./move-to-new-broker.json --verify
    Status of partition reassignment:
    ERROR: Assigned replicas (1,2) don't match the list of replicas for reassignment (3,4) for partition [test-1,1]
    ERROR: Assigned replicas (2,1) don't match the list of replicas for reassignment (4,3) for partition [test-1,0]
    Reassignment of partition [test-1,1] failed
    Reassignment of partition [test-1,0] failed

    //迁移
    penn@ubuntu:~$ /mnt/app/kafka.1/bin/kafka-reassign-partitions.sh --zookeeper 10.0.2.15:2181/kafka --reassignment-json-file ./move-to-new-broker.json --execute
    Current partition replica assignment
    {"version":1,"partitions":[{"topic":"test-1","partition":1,"replicas":[1,2]},{"topic":"test-1","partition":0,"replicas":[2,1]}]}
    Save this to use as the --reassignment-json-file option during rollback
    Successfully started reassignment of partitions.

    //迁移后检查
    penn@ubuntu:~$ /mnt/app/kafka.1/bin/kafka-reassign-partitions.sh --zookeeper 10.0.2.15:2181/kafka --reassignment-json-file ./move-to-new-broker.json --verify
    Status of partition reassignment:
    Reassignment of partition [test-1,1] completed successfully
    Reassignment of partition [test-1,0] completed successfully

    penn@ubuntu:~$ /mnt/app/kafka.1/bin/kafka-topics.sh --zookeeper 10.0.2.15:2181/kafka --describe --topic test-1
    Topic:test-1 PartitionCount:2 ReplicationFactor:2 Configs:
    Topic: test-1 Partition: 0 Leader: 4 Replicas: 4,3 Isr: 3,4
    Topic: test-1 Partition: 1 Leader: 3 Replicas: 3,4 Isr: 3,4