工作中 CentOS 的一些笔记 03

工作中 CentOS 的一些笔记 03

工作中 CentOS 的一些笔记 03,其实大部分都是 Linux 通用。

[TOC]

Elasticsearch

安装

下载压缩版的 es 并解压运行:

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.0-linux-x86_64.tar.gz # 下载
tar -xzvf elasticsearch-7.8.0-linux-x86_64.tar.gz # 解压

# 编辑 .bashrc,添加以下 ES 环境变量:
export ES_PATH="/home/bolitao/apps/elasticsearch-7.8.0"
export PATH=$ES_PATH/bin:$PATH

es 启动过程可能会出现以下错误:

max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[2]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured

进行以下设置:

  • vim config/elasticsearch.yml 
    
    # 设置以下行
    network.host: 0.0.0.0
    # 取消注释以下行:
    node.name: node-1
    # 添加以下行:
    cluster.initial_master_nodes: ["node-1"]
    
  • sudo vim /etc/sysctl.conf
    # 添加以下行;
    vm.max_map_count=655360
    
    # 加载参数:
    sudo sysctl -p
    

放行防火墙端口:

sudo firewall-cmd --zone=public --permanent --add-port=5601/tcp # kibana 端口
sudo firewall-cmd --zone=public --permanent --add-port=9200/tcp # es 通信端口
sudo firewall-cmd --reload

运行 es:

./elasticsearch-7.8.0-linux-x86_64./bin/elasticsearch

验证 ES 运行状态:

curl 192.168.188.130:9200


StatusCode        : 200
StatusDescription : OK
Content           : {
                      "name" : "node-1",
                      "cluster_name" : "elasticsearch",
                      "cluster_uuid" : "Qse9DW45TE2XhdsUfvk2fg",
                      "version" : {
                        "number" : "7.8.0",
                        "build_flavor" : "default",
                        "build_type" : "tar"...
RawContent        : HTTP/1.1 200 OK
...

Kibana 是 Elasticsearch 的数据可视化和管理工具,安装如下:

wget https://artifacts.elastic.co/downloads/kibana/kibana-7.8.0-linux-x86_64.tar.gz # 下载
tar -xzvf kibana-7.8.0-linux-x86_64.tar.gz # 解压


# 在 .bashrc 添加如下环境变量:
export KIBANA_PATH="/opt/kibana"
export PATH=$KIBANA_PATH/bin:$PATH

允许远程访问:

vim kibana-7.8.0-linux-x86_64/config/kibana.yml

# 设置以下行并重启 kibana
server.host: "0.0.0.0"

验证 Kibana 运行状态:

image-20200713164757882

相关操作

  • 查询健康度:

    GET /_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
    1594630302 08:51:42  elasticsearch green           1         1     10  10    0    0        0             0                  -                100.0%
    
  • 新增数据:

    PUT /megacorp/employee/1
    {
        "first_name" : "John",
        "last_name" :  "Smith",
        "age" :        25,
        "about" :      "I love to go rock climbing",
        "interests": [ "sports", "music" ]
    }
    
    # 返回数据如下:
    {
      "_index" : "megacorp",
      "_type" : "employee",
      "_id" : "1",
      "_version" : 8,
      "result" : "updated",
      "_shards" : {
        "total" : 2,
        "successful" : 1,
        "failed" : 0
      },
      "_seq_no" : 9,
      "_primary_term" : 1
    }
    
  • 获得一条数据:

    GET /megacorp/employee/1
    
    {
      "_index" : "megacorp",
      ...
      "found" : true,
      "_source" : {
        "first_name" : "John",
        "last_name" : "Smith",
        "age" : 25,
        "about" : "I love to go rock climbing",
        "interests" : [
          "sports",
          "music"
        ]
      }
    }
    
  • 删除数据:

    DELETE /megacorp/employee/1
    
    {
      "_index" : "megacorp",
      "_type" : "employee",
      "_id" : "1",
      "_version" : 15,
      "result" : "deleted", // 这是操作结果
      "_shards" : {
        "total" : 2,
        "successful" : 1,
        "failed" : 0
      },
      "_seq_no" : 16,
      "_primary_term" : 1
    }
    
  • 搜索数据:

    GET /megacorp/employee/_search?q=last_name:Smith # 搜索 lastName 为 Smith 的雇员
    
    {
      "took" : 322,
      "timed_out" : false,
      ...
      "hits" : {
        "total" : {
          "value" : 1,
          "relation" : "eq"
        },
        "max_score" : 0.18232156,
        "hits" : [
          {
            ...
            "_source" : {
              "first_name" : "Jane",
              "last_name" : "Smith",
              ...
              ]
            }
          }
        ]
      }
    }
    
  • 全文搜索(模糊搜索):

    GET /megacorp/employee/_search
    {
        "query" : {
            "match" : {
                "about" : "rock climbing"
            }
        }
    }
    
    // 结果如下:
    {
      ...
      "hits" : {
        "total" : {
          "value" : 2,
          "relation" : "eq"
        },
        "max_score" : 0.8900273,
        "hits" : [
          {
            "_index" : "megacorp",
            "_type" : "employee",
            "_id" : "1",
            "_score" : 0.8900273,
            "_source" : {
              "first_name" : "John",
              "last_name" : "Smith",
              "age" : 25,
              "about" : "I love to go rock climbing",
              ...
            }
          },
          {
            "_score" : 0.29837534,
            "_source" : {
              "first_name" : "Jane",
              "last_name" : "Smith",
              "about" : "I like to collect rock albums",
              ...
          }
        ]
      }
    }
    

    从结果中可以看出,about 相关程度更高的结果 _score 字段的值更高。

PostgreSQL

安装

根据 PostgreSQL 官方文档 PostgreSQL: Linux downloads (other),二进制压缩包和 EDB 安装器方式都不再提供 10 以后的版本:

image-20200713091043953

image-20200713091058600

官方推荐使用对应发行版的包管理器进行安装,对于 RedHat 系发行版,按以下步骤安装 PostgreSQL 12:

sudo yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm # 导入 pgsql 软件仓库
sudo yum install postgresql12-server # 安装 pgsql 12
sudo /usr/pgsql-12/bin/postgresql-12-setup initdb # 初始化 DB
# 以下是命令对应的输出:
Initializing database ... OK

sudo systemctl start postgresql-12 # 启动 pgsql
sudo systemctl status postgresql-12 # 查看 pgsql 运行状态
# 以下是命令对应的输出:
● postgresql-12.service - PostgreSQL 12 database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql-12.service; disabled; vendor preset: disabled)
   Active: active (running) since 一 2020-07-13 09:20:55 CST; 7s ago
     Docs: https://www.postgresql.org/docs/12/static/
  Process: 2476 ExecStartPre=/usr/pgsql-12/bin/postgresql-12-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
 Main PID: 2482 (postmaster)
    Tasks: 8
   Memory: 18.0M
   CGroup: /system.slice/postgresql-12.service
           ...

配置 pgsql 密码:

sudo su - postgres
psql -c "alter user postgres with password '123'" # 设置 postgres 密码为 123

允许远程访问:

sudo vim /var/lib/pgsql/12/data/postgresql.conf
# 修改以下字段
listen_addresses = '*'

sudo vim /var/lib/pgsql/12/data/pg_hba.conf
# 文件末尾添加以下行:
host all all 0.0.0.0/0 md5
# 修改以下行,将 peer 改为 md5
local   all             all                                     md5

sudo systemctl restart postgresql-12 # 重启服务

配置防火墙,放行 pgsql 相关服务:

sudo firewall-cmd --add-service=postgresql12 --permanent --zone=public
sudo firewall-cmd --reload # 重载防火墙

在宿主机使用 psql 命令行访问虚拟机的 PostgreSQL:

PS C:\Users> psql -h 192.168.188.130 -W -U postgres -p 5432
口令:
psql (12.3)
输入 "help" 来获取帮助信息.

postgres=#

控制访问文件说明

  • ident:通过联系客户端上的ident服务器获取客户端的操作系统用户名,并检查它是否与请求的数据库用户名匹配。 Ident 身份验证只能用于 TCP / IP 连接,为本地连接指定时,将使用对等身份验证
  • peer:从操作系统获取客户端的操作系统用户名,并检查它是否与请求的数据库用户名匹配,仅适用于本地连接
  • md5:执行 SCRAM-SHA-256 或 MD5 身份验证以验证用户的密码。

Linux 额外学习

journalctl

从尾部滚动查看 systemd 日志:sudo journalctl -f

查看某个由 systemd 管理的服务的日志:sudo journalctl --unit xxx

比如查看 Tengine 的日志:

➜ sudo journalctl --unit nginx
-- Logs begin at 一 2020-07-13 08:21:13 CST, end at 一 2020-07-13 08:42:21 CST. --
7月 13 08:21:21 localhost.localdomain systemd[1]: Starting Tengine/nginx...
7月 13 08:21:21 localhost.localdomain nginx[1195]: nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
7月 13 08:21:21 localhost.localdomain nginx[1195]: nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
7月 13 08:21:21 localhost.localdomain systemd[1]: Started Tengine/nginx.

查看错误时常用的 sudo journalctl -xe 方法:-x 表示提供有用的帮助,-e 表示从尾部开始读。

PostgreSQL 补充

相关操作

  • psql -h <ip> -W -U <用户> -p <端口> -d <数据库>:连接某 ip 机器上的 pgsql,-W 选项表示使用自动密码提示

  • 创建用户

    postgres=# create user bolitao with password '123'; # 创建 bolitao  用户
    CREATE ROLE
    
    postgres=# create database testdb owner bolitao; # 创建 testdb 库,所有权赋给 bolitao
    CREATE DATABASE
    
    postgres=# grant all privileges on database testdb to bolitao; # 将对 testdb 的所有权限赋给 bolitao
    GRANT
    

    之后便可用 psql 以 bolitao 用户身份访问 testdb 数据库:

    psql -U bolitao -W -d testdb
    
  • 查看所有库 \l

    testdb=> \l
                                         数据库列表
       名称    |  拥有者  | 字元编码 |  校对规则   |    Ctype    |       存取权限
    -----------+----------+----------+-------------+-------------+-----------------------
     postgres  | postgres | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 |
     template0 | postgres | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/postgres          +
               |          |          |             |             | postgres=CTc/postgres
     template1 | postgres | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/postgres          +
               |          |          |             |             | postgres=CTc/postgres
     testdb    | bolitao  | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =Tc/bolitao          +
               |          |          |             |             | bolitao=CTc/bolitao
    (4 行记录)
    
  • 查看表及其结构:

    -- \d:列出当前数据库的所有表格
    testdb=> \d
                   关联列表
     架构模式 |  名称   |  类型  | 拥有者
    ----------+---------+--------+---------
     public   | user_tb | 数据表 | bolitao
    (1 行记录)
    
    -- \d [table_name]:列出某一张表格的结构
    testdb=> \d user_tb;
                     数据表 "public.user_tb"
     栏位 |         类型          | 校对规则 | 可空的 | 预设
    ------+-----------------------+----------+--------+------
     name | character varying(30) |          |        |
     age  | integer               |          |        |
    
  • PostgreSQL 遵循 SQL 标准,对表、数据的常用增删改查语法和 MySQL、SQL Server 无异

数据备份和恢复

PostgreSQL 官方提供的备份 cli 工具是 pg_dump,数据恢复工具是 pg_restore

  • 备份库:

    pg_dump -U bolitao testdb > test.sql # 将 testdb 库的数据备份至 test.sql 文件
    
  • 备份特定表(-t 参数):

    pg_dump -U bolitao -t user_tb testdb > user_tb.sql # 将 testdb 的 user_tb 表数据备份至 user_tb.sql 文件
    
  • 恢复数据(使用 psql):

    psql -U postgres -d testdb2 -f test.sql # 将 test.sql 备份的库数据恢复到 testdb2 库
    psql -U postgres -d testdb2 -f user_tb.sql # 将备份的表数据恢复到 testdb2 库
    

FastDFS

单机模式安装

安装编译和运行依赖:

sudo yum install git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim -y

安装 libfastcommon:

cd /usr/local/src
sudo git clone https://github.com/happyfish100/libfastcommon.git --depth 1
cd libfastcommon
sudo ./make.sh # 编译
sudo ./make.sh install # 安装

安装 FastDFS:

cd ..
sudo git clone https://github.com/happyfish100/fastdfs.git --depth 1
cd fastdfs
sudo ./make.sh && sudo ./make.sh install # 编译并安装
# 配置文件准备
sudo cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
sudo cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
sudo cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf # 客户端文件,测试用
sudo cp /usr/local/src/fastdfs/conf/http.conf /etc/fdfs/ # 供 nginx 访问使用
sudo cp /usr/local/src/fastdfs/conf/mime.types /etc/fdfs/ # 供 nginx 访问使用

为 nginx 编译 fastDFS插件:

# 下载插件
cd ~/source
git clone https://github.com/happyfish100/fastdfs-nginx-module.git --depth 1
sudo cp fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs

# 重新编译 Tengine
cd /home/bolitao/tengine-2.3.2

# 设置编译选项,新增 fastdfs 插件
./configure --user=app \
--group=app \
--with-jemalloc=/home/bolitao/jemalloc-5.2.1 \
--add-module=./modules/ngx_http_upstream_check_module \
--add-module=/home/bolitao/source/fastdfs-nginx-module/src

make

停止并重新安装 Tengine:

sudo systemctl stop nginx
sudo make install

# 查看 nginx 信息,检查是否有 FastDFS 插件
➜  tengine-2.3.2 sudo /usr/local/nginx/sbin/nginx -V
Tengine version: Tengine/2.3.2
...
configure arguments: --user=app --group=app --with-jemalloc=/home/bolitao/jemalloc-5.2.1 --add-module=./modules/ngx_http_upstream_check_module --add-module=/home/bolitao/source/fastdfs-nginx-module/src

修改 tracker 配置:

sudo vim /etc/fdfs/tracker.conf

# 修改以下内容
port=22122  # tracker 服务器端口
base_path=/home/dfs  # 存储日志和数据的根目录

修改 storage 配置:

sudo vim /etc/fdfs/storage.conf

# 修改以下内容
port=23000  # storage 服务端口
base_path=/home/dfs  # 数据和日志文件存储根目录
store_path0=/home/dfs  # 第一个存储目录
tracker_server=192.168.15.130:22122  # tracker 服务器 IP 和端口
http.server_port=8888  # http 访问文件的端口(和 nginx 中保持一致)

防火墙放行:

sudo firewall-cmd --zone=public --permanent --add-port=22122/tcp
sudo firewall-cmd --zone=public --permanent --add-port=23000/tcp
sudo firewall-cmd --zone=public --permanent --add-port=8888/tcp
sudo firewall-cmd --reload

启动 tracker 和 storage:

sudo /etc/init.d/fdfs_trackerd start
sudo /etc/init.d/fdfs_storaged start

测试客户端:

sudo vim /etc/fdfs/client.conf

# 修改以下内容
base_path=/home/dfs
tracker_server=192.168.15.130:22122    # tracker 服务器 IP 和端口

# 进行文件上传测试
➜ sudo fdfs_upload_file /etc/fdfs/client.conf /home/bolitao/apps/apache-tomcat-9.0.37/BUILDING.txt
group1/M00/00/00/wKi8gl8NE5yAFQc7AABKJvC0Vqw094.txt

上传文件后数据保存路径如下图所示:

image-20200714101816810

配置 nginx 访问:

sudo vim /etc/fdfs/mod_fastdfs.conf

# 修改以下内容:
tracker_server=192.168.15.130:22122
url_have_group_name=true
store_path0=/home/dfs

# 配置 nginx:
sudo vim /usr/local/nginx/conf/nginx.conf

# 添加以下配置:
server {
    listen       8888;    ## 该端口和 storage.conf 中的 http.server_port 相同
    server_name  localhost;
    location ~/group[0-9]/ {
        ngx_fastdfs_module;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    root   html;
    }
}

sudo /usr/local/nginx/sbin/nginx -t # 测试 nginx 配置无误
sudo systemctl restart nginx.service # 重启 Tengine

测试:通过宿主机访问刚在上传的文件(地址为 http://192.168.188.130:8888/group1/M00/00/00/wKi8gl8NE5yAFQc7AABKJvC0Vqw094.txt ),发现如下图所示(如果是二进制文件则会直接弹出下载):

image-20200714102037023

集群安装和配置

准备三台服务器,其 IP 为 192.168.15.130、192.168.15.131、192.168.15.132(简记为 130、131、132)。三台服务器均已安装 FastDFS tracker、FastDFS storage、FastDFS client 和 Tengine。

  1. 修改三台机器的 tracker 配置:

    sudo vim /etc/fdfs/tracker.conf
    
    # 修改以下内容
    port=22122  # tracker 服务器端口
    base_path=/home/dfs  # 存储日志和数据的根目录
    
  2. 修改三台机器的 storage 配置:

    sudo vim /etc/fdfs/storage.conf
    
    # 修改以下配置
    tracker_server = 192.168.15.130:22122
    tracker_server = 192.168.15.131:22122
    tracker_server = 192.168.15.132:22122
    port=23000
    base_path=/home/dfs
    store_path0=/home/dfs
    http.server_port=8888
    

    重启 tracker 和 storage 服务,检查是否 storage 服务器是否登记到 tracker:

    sudo /etc/init.d/fdfs_trackerd restart # 重启 tracker 服务
    sudo /etc/init.d/fdfs_storaged restart # 重启 storage 服务
    
    sudo /usr/bin/fdfs_monitor /etc/fdfs/storage.conf # 检查服务状态
    # 以下是输出,省略部分非关键信息
    ...
    tracker server is 192.168.15.132:22122
    
    group count: 1
    
    Group 1:
    group name = group1
    ...
            Storage 1:
                    id = 192.168.15.130
                    ip_addr = 192.168.15.130  ACTIVE
                    http domain =
                    version = 6.06
                    join time = 2020-07-14 10:08:26
                    up time = 2020-07-14 15:57:34
    ...
            Storage 2:
                    id = 192.168.15.131
                    ip_addr = 192.168.15.131  ACTIVE
                    http domain =
                    version = 6.06
    ...
            Storage 3:
                    id = 192.168.15.132
                    ip_addr = 192.168.15.132  ACTIVE
                    http domain =
                    version = 6.06
    

    可以看到三台存储服务器都处于激活状态,多运行几次 fdfs_monitor 命令会发现 tracker server 有所变换,即多个 tracker 的切换功能也是生效的。

  3. 测试 client,修改 client 配置文件:

    sudo vim /etc/fdfs/client.conf
    
    # 需要修改的内容如下:
    base_path=/home/moe/dfs
    tracker_server = 192.168.15.130:22122
    tracker_server = 192.168.15.131:22122
    tracker_server = 192.168.15.132:22122
    

    测试 client 文件上传:

    fdfs_upload_file /etc/fdfs/client.conf /home/bolitao/apps/screenfetch/screenfetch-dev
    # 返回上传的文件位置和文件名:
    group1/M00/00/00/wKgPgl8Nau-AcXEFAAPBDqCqwtI9997099
    

    由于三台 storage 处于同一 group,组内文件互备,所以可以在三台存储服务器中发现上传的文件:

    ls -l /home/dfs/data/00/00 # 列出文件
    # 以下是命令输出:
    -rw-r--r-- 1 root root 246030 7月  14 16:21 wKgPgl8Nau-AcXEFAAPBDqCqwtI9997099
    
  4. 配置 nginx 访问,修改服务器的 /etc/fdfs/mod_fastdfs.conf 文件:

    tracker_server = 192.168.15.130:22122
    tracker_server = 192.168.15.131:22122
    tracker_server = 192.168.15.132:22122
    url_have_group_name=true
    store_path0=/home/dfs
    

    在 nginx 中添加以下 server:

    server {
        listen       8888;    ## 该端口为storage.conf中的http.server_port相同
        server_name  localhost;
        location ~/group[0-9]/ {
            ngx_fastdfs_module;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
        root   html;
        }
    }
    

    重启三台 nginx 后,可在三台服务器下载文件,比如访问 http://192.168.15.130:8888/group1/M00/00/00/wKgPgl8Nau-AcXEFAAPBDqCqwtI9997099(或其他两个 host),会弹出下载对话框:

    image-20200714163319953

备注:这里配置了三台服务器既作 tracker 服务器也作存储服务器。实际运用时更多情况是将 tracker 和 storage 划分,tracker 用作负载均衡和调度,storage 用来存储,如下图所示:

11

基本操作

  • tracker 服务管理:

    sudo /etc/init.d/fdfs_trackerd start # 启动 tracker 服务
    sudo /etc/init.d/fdfs_trackerd restart # 重启动 tracker 服务
    sudo /etc/init.d/fdfs_trackerd stop # 停止 tracker 服务
    sudo chkconfig fdfs_trackerd on # 自启动 tracker 服务
    
  • storage 服务管理:

    sudo /etc/init.d/fdfs_storaged start # 启动 storage 服务
    sudo /etc/init.d/fdfs_storaged restart # 重启 storage 服务
    sudo /etc/init.d/fdfs_storaged stop # 停止 storage 服务
    sudo chkconfig fdfs_storaged on # 自启动 storage 服务
    
  • 检查集群(会输出所有服务器的信息):

    sudo /usr/bin/fdfs_monitor /etc/fdfs/storage.conf
    # 以下是命令输出:
    [sudo] bolitao 的密码:
    [2020-07-14 10:24:49] DEBUG - base_path=/home/dfs, connect_timeout=5, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=1, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0
    
    server_count=1, server_index=0
    
    tracker server is 192.168.188.130:22122
    
    group count: 1
    
    Group 1:
    group name = group1
    disk total space = 48,096 MB
    disk free space = 44,515 MB
    trunk free space = 0 MB
    storage server count = 1
    active server count = 1
    storage server port = 23000
    storage HTTP port = 8888
    store path count = 1
    subdir count per path = 256
    current write server index = 0
    current trunk file id = 0
    ...
    
  • 上传:使用 fdfs_upload_file 命令,命令跟的第一个参数表示客户端配置文件,第二个参数表示要上传的文件,比如:

    sudo fdfs_upload_file /etc/fdfs/client.conf /home/bolitao/apps/apache-tomcat-9.0.37/BUILDING.txt
    
  • 下载:使用 fdfs_download_file 命令进行下载,第一个参数是客户端配置文件,第二个参数是要下载的文件,比如:

    fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKi8gl8NE5yAFQc7AABKJvC0Vqw094.txt
    
  • 删除:使用 fdfs_delete_file 命令进行文件删除,第一个参数是配置文件,第二个参数是要删除的文件,比如:

    fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKi8gl8NE5yAFQc7AABKJvC0Vqw094.txt
    
    # 再次下载该文件
    fdfs_download_file /etc/fdfs/client.conf 
    group1/M00/00/00/wKi8gl8NE5yAFQc7AABKJvC0Vqw094.txt
    # 提示文件不存在
    [2020-07-14 10:39:16] ERROR - file: tracker_proto.c, line: 50, server: 192.168.188.130:23000, response status 2 != 0
    [2020-07-14 10:39:16] ERROR - file: ../client/storage_client.c, line: 598, fdfs_recv_header fail, result: 2
    download file fail, error no: 2, error info: No such file or directory
    
  • 设置多个组:

    1. 修改 /etc/fdfs/storage.conf 文件中:

      • store_path_count 的值
      • 新增 store_path,比如 store_path1store_path2
    2. 修改 mod_fastdfs.conf 文件:

      • store_path_count 的值

      • store_pathx 的值

      • 仿照 group 添加更多 group,比如:

        [group1]
        group_name=group1
        storage_server_port=23000
        store_path_count=3
        store_path0=/home/dfs/data/group1/M00
        store_path1=/home/dfs/data/group1/M01
        
        [group2]
        group_name=group2
        storage_server_port=23000
        store_path_count=3
        store_path0=/home/dfs/data/group2/M00
        store_path1=/home/dfs/data/group2/M01
        
    3. 修改 nginx 反向代理配置:

      location ~/group[0-9]/M00 {
          root /home/dfs/data/group1
          ngx_fastdfs_module;
      }
      
      location ~/group[0-9]/M01 {
          root /home/dfs/data/group2
          ngx_fastdfs_module;
      }
      

Kafka

安装(单机模式)

下载并解压:

wget https://mirror.bit.edu.cn/apache/kafka/2.5.0/kafka_2.12-2.5.0.tgz
tar -xzf kafka_2.12-2.5.0.tgz
cd kafka_2.12-2.5.0

修改 Kafka 配置,允许删除 topic:

vim config/server.properties

# 修改/在文件末添加如下行:
delete.topic.enable = true

为当前用户添加环境变量:

vim ~/.bashrc # 或者是 ~/.zshrc

# 添加以下内容:
export KAFKA_PATH="/home/bolitao/apps/kafka_2.12-2.5.0"
export PATH=$KAFKA_PATH/bin:$PATH

# 刷新
source ~/.bashrc

将 Kafka 注册为系统服务:

sudo vim /etc/systemd/system/kafka.service

# systemd 配置文件内容
[Unit]
Requires=zookeeper.service
After=zookeeper.service

[Service]
Type=simple
User=bolitao
ExecStart=/bin/sh -c '/home/bolitao/apps/kafka_2.12-2.5.0/bin/kafka-server-start.sh /home/bolitao/apps/kafka_2.12-2.5.0/config/server.properties > /home/bolitao/apps/kafka_2.12-2.5.0/logs/kafka.log 2>&1'
ExecStop=/home/kafka/kafka/bin/kafka-server-stop.sh
Restart=on-abnormal

[Install]
WantedBy=multi-user.target

启动 ZooKeeper:

sudo systemctl start zookeeper.service

启动 Kafka 服务:

sudo systemctl start kafka # 启动服务
sudo journalctl -u kafka # 查看 kafka 启动日志
less /home/bolitao/apps/kafka_2.12-2.5.0/logs/kafka.log # 查看 kafka 运行日志

集群安装和操作

为了便于操作,本节使用单机多实例方式进行集群操作。

  1. 设置多份配置文件

    cp server.properties server-1.properties
    cp server.properties server-2.properties
    

    配置文件内容分别设置如下:

    # server-1 的配置
    broker.id=1
    listeners=PLAINTEXT://:9093
    log.dirs=/tmp/kafka-logs-1
    
    # server-2 的配置
    broker.id=2
    listeners=PLAINTEXT://:9094
    log.dirs=/tmp/kafka-logs-2
    
  2. 启动新的两个 Kafka 实例

    kafka-server-start.sh ./server-1.properties
    kafka-server-start.sh ./server-2.properties
    
  3. 加上上一步,共有 3 个 kafka 实例,之后创建一个 replication-factor 为 3 的 Topic,topic 名为 my-replicated-topic

    kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 3 --partitions 1 --topic my-replicated-topic
    # 以下是命令输出:
    Created topic my-replicated-topic.
    
  4. 查看 9092 端口的 my-replicated-topic 描述:

    kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic my-replicated-topic
    # 以下是命令输出:
    Topic: my-replicated-topic      PartitionCount: 1       ReplicationFactor: 3    Configs: segment.bytes=1073741824
            Topic: my-replicated-topic      Partition: 0    Leader: 1       Replicas: 1,0,2 Isr: 1,0,2
    

    leader 负责给定分区的所有读写操作的节点,在上面的输出中可以看到 ldeade 为 1。

    replicas 是复制的节点列表,主节点也会在这个列表里。

    isr 全意 "in-sync" replicas,正常运行且同步状态已和 leader 一致的 replicas 将会出现在 isr 列表。partition leader 的重新选举操作会在 isr 节点中进行。

  5. 使用生产者发布一些信息:

    kafka-console-producer.sh --bootstrap-server localhost:9092 --topic my-replicated-topic
    
    >my test message 1
    >my test message 2
    
  6. 使用消费者查看信息:

    kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic my-replicated-topic
    
    my test message 1
    my test message 2
    
  7. 测试集群容错性,杀死刚才作为 leader、id 为 1 的 kafka 进程:

    ps aux | grep server-1.propertie
    bolitao    3691  2.4 21.7 4747716 404952 pts/0  Sl+  14:50   0:37 /usr/lib/jvm/jdk1.8.0_251/bin/java...
    ...
    
    kill -9 3691
    
  8. 之后再次查看 my-replicated-topic 的描述:

    kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic my-replicated-topic
    # 以下是命令行输出:
    Topic: my-replicated-topic      PartitionCount: 1       ReplicationFactor: 3    Configs: segment.bytes=1073741824
            Topic: my-replicated-topic      Partition: 0    Leader: 0       Replicas: 1,0,2 Isr: 0,2
    

    可以看到 Leader 已被选举为 0,Isr 中 1 已掉线,目前跟上同步进度且仍存活的节点为 0 和 2

  9. 重新运行消费者,使用 --from-beginning 选项从头消费数据,可以看到即使之前 id 为 1 的主节点下线,消费者仍能够获取信息,没有造成数据丢失:

    kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic my-replicated-topic
    
    
    my test message 1
    my test message 2
    

其他基本操作

  • 创建一个 topic:

    kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic TestTopic
    # 输出如下:
    Created topic TestTopic.
    
  • 生产者发布一条 string 到 TestTopic

    echo "Hello, World" | kafka-console-producer.sh --broker-list localhost:9092 --topic TestTopic > /dev/null
    
  • 消费者处理一条消息,使用 --from-beginning 选项可以让消费者获取之前 Topic 的消息:

    kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic TestTopic --from-beginning
    
    # 会有如下输出:
    Hello, World
    
    # 当使用 CTRL+C 停止该消费者时,会提示共处理了 TestTopoc 中的消息条数:
    Processed a total of 1 messages
    
  • 关于集群的操作学习在上一节已有部分笔记

网络

netstat

--numeric , -n
    Show numerical addresses instead of trying to determine symbolic host, port or user names.
-l, --listening
    Show only listening sockets.  (These are omitted by default.)
-p, --program
    Show the PID and name of the program to which each socket belongs.
--udp, -u
--tcp, -t
-a, --all
	Show both listening and non-listening (for TCP this means established connections) sockets. With the --interfaces  option, show interfaces that are not up
-o, --timers
	Include information related to networking timers.
  1. netstat -nlptp | grep port

    查看状态为 listening 的 TCP、UDP 连接。

    netstat -nlptu | grep 3306
    tcp6       0      0 :::3306                 :::*                    LISTEN      2910/mysqld
    
  2. netstat -ap | grep appName

    查看某应用占用的端口。

    netstat -ap | grep mysql
    tcp   6247793      0 localhost.localdo:43546 172.18.20.105:mysql     ESTABLISHED 2910/mysqld
    tcp6       0      0 [::]:mysql              [::]:*                  LISTEN      2910/mysqld
    tcp6       0      0 localhost.localdo:mysql 172.18.20.105:6858      ESTABLISHED 2910/mysqld
    tcp6       0      0 localhost.localdo:58079 172.18.20.105:mysql     ESTABLISHED 17100/java
    unix  2      [ ACC ]     STREAM     LISTENING     20294    2910/mysqld          /tmp/mysql.sock
    
  3. netstat -an | grep port

    查看某端口的使用情况。

    netstat -an | grep 3306
    tcp   6247793      0 172.18.20.106:43546     172.18.20.105:3306      ESTABLISHED
    tcp6       0      0 :::3306                 :::*                    LISTEN
    tcp6       0      0 172.18.20.106:3306      172.18.20.105:6858      ESTABLISHED
    tcp6       0      0 172.18.20.106:58079     172.18.20.105:3306      ESTABLISHED
    

ss

-t, --tcp
	Display TCP sockets.
-u, --udp
	Display UDP sockets.
-a, --all
	Display both listening and non-listening (for TCP this means established connections) sockets.
-n, --numeric
    Do not try to resolve service names.
-l, --listening
    Display only listening sockets (these are omitted by default).
-p, --processes
    Show process using socket.
  1. ss -atu
  2. ss -nlptu
  3. ss -ap
  4. ss -np

lsof

Redis

Cluster

/app/soft/redis-5.0.5/bin/redis-cli -a password@redis --cluster create 172.18.20.116:6379 172.18.20.117:6379 172.18.20.118:6379 --cluster-replicas 0

image-20200904102735186

加载评论