ES部署

  1. ES部署
    1. 一、配置网卡(无网环境忽略此条)
    2. 二、配置本地yum源(有网环境忽略此条)
      1. 注意:
    3. 三、关闭防火墙及selinux
      1. 注意:
    4. 四、安装docker
      1. 注意:
    5. 五、开启docker服务
    6. 六、安装java(部署es 的依赖)
      1. 本地安装java
    7. 七、读取镜像(根据实际情况)
    8. 八、如果需要docker-compose启动
  • 搜索的部署
    1. 一、部署集群
      1. 注意:
      2. 如果没有操作权限,则执行:
    2. 当不使用es远程词典时:
      1. 说明:
      2. 添加自定义同义词
  • 二、修改集群配置
  • 三、启动集群
  • 四、搜索部署
    1. 注意:
  • 添加删除字段
    1. 注意:
  • 五、查询启动结果
  • 六、数据量查询
  • 七、search-guard为es集群配置auth
    1. 1、安装search-guard插件和ssl插件
      1. 查询es的版本
      2. 安装search-guard
      3. 安装search-guard-ssl
      4. 注意:
    2. 2、生成es证书文件
      1. 下载search-guard源码工具,生成证书的工具
      2. 修改ca配置
      3. 修改sh文件
      4. 生成证书,运行example.sh
    3. 3、配置es,启动search-guard
      1. 将生成的各个节点的证书,分别copy到各个节点上
      2. 修改es的配置文件config/elaticsearch.yml
      3. 启动es
    4. 4、将search-guard的配置写入es中
      1. 以上配置生成的命令为
    5. 5、添加es用户及密码
      1. 生成md5加密密码
      2. 添加用户及密码
      3. 添加用户的权限
      4. 重新将配置写入es中生效
    6. 6、测试
  • 八、x-pack为es集群配置auth
    1. 1、要求
    2. 2、安装x-pack
    3. 3、对elasticsearch、logstash、kibana分别设置登录密码(默认es用户名为elastic,logstash用户名为logstash_system,kibana用户名为kibana)
    4. 4、配置./config/elasticsearch.yml
    5. 5、测试访问
    6. 6、x-pack默认账号密码
    7. 注意:
    1. ES部署
      1. 一、配置网卡(无网环境忽略此条)
      2. 二、配置本地yum源(有网环境忽略此条)
        1. 注意:
      3. 三、关闭防火墙及selinux
        1. 注意:
      4. 四、安装docker
        1. 注意:
      5. 五、开启docker服务
      6. 六、安装java(部署es 的依赖)
        1. 本地安装java
      7. 七、读取镜像(根据实际情况)
      8. 八、如果需要docker-compose启动
  • 搜索的部署
    1. 一、部署集群
      1. 注意:
      2. 如果没有操作权限,则执行:
    2. 当不使用es远程词典时:
      1. 说明:
      2. 添加自定义同义词
  • 二、修改集群配置
  • 三、启动集群
  • 四、搜索部署
    1. 注意:
  • 添加删除字段
    1. 注意:
  • 五、查询启动结果
  • 六、数据量查询
  • 七、search-guard为es集群配置auth
    1. 1、安装search-guard插件和ssl插件
      1. 查询es的版本
      2. 安装search-guard
      3. 安装search-guard-ssl
      4. 注意:
    2. 2、生成es证书文件
      1. 下载search-guard源码工具,生成证书的工具
      2. 修改ca配置
      3. 修改sh文件
      4. 生成证书,运行example.sh
    3. 3、配置es,启动search-guard
      1. 将生成的各个节点的证书,分别copy到各个节点上
      2. 修改es的配置文件config/elaticsearch.yml
      3. 启动es
    4. 4、将search-guard的配置写入es中
      1. 以上配置生成的命令为
    5. 5、添加es用户及密码
      1. 生成md5加密密码
      2. 添加用户及密码
      3. 添加用户的权限
      4. 重新将配置写入es中生效
    6. 6、测试
  • 八、x-pack为es集群配置auth
    1. 1、要求
    2. 2、安装x-pack
    3. 3、对elasticsearch、logstash、kibana分别设置登录密码(默认es用户名为elastic,logstash用户名为logstash_system,kibana用户名为kibana)
    4. 4、配置./config/elasticsearch.yml
    5. 5、测试访问
    6. 6、x-pack默认账号密码
    7. 注意:
  • ES部署

    一、配置网卡(无网环境忽略此条)

    1
    2
    3
    4
    5
    6
    vi /etc/sysconfig/network-scripts/ifcfg-*

    BOOTPROTO=static # 修改为静态网路,可以不修改
    ONBOOT=yes

    systemctl restart network

    二、配置本地yum源(有网环境忽略此条)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    mkdir /centos7		#存放本地yum源

    mount /iso ./tmp #将iso镜像挂载到本地文件中

    cp -vrf ./tmp/* /centos7 #将挂载后到本地文件copy到本地yum源文件中

    cd /etc/yum.repos.d

    mv ./CentOS-* /root/tmp #移除yum到网络源信息

    vi yum.repo #编写本地yum
    [centos7-yum]
    name="yum.local"
    baseurl=file:///centos7
    gpgcheck=0
    enabled=1

    yum clean all #刷新缓存

    rm -rf /var/cache/yum

    yum list #显示数据则表示本地yum配置成功

    yum install net-tools #安装net-tools,查看ifconfig
    注意:

    ​ 本地挂载完镜像之后,如果还要使用该文件的话,必须先umount该文件,否则会报错,提示权限不够

    三、关闭防火墙及selinux

    1
    2
    3
    4
    5
    6
    7
    systemctl disable firewalld
    systemctl stop firewalld

    vi /etc/sysconfig/selinux
    SELINUX=disabled
    setenforce 0
    getenforce
    注意:

    ​ 安装docker时可以不用关闭,当es进行集群部署时,必须关闭,否则集群无法生效

    四、安装docker

    1
    2
    3
    4
    5
    scp docker.zip root@ip:~	#没网手动copy
    unzip docker.zip
    cd docker
    sh setup_without_container-selinux-2.9 #虚拟机/实体机
    # 服务器,直接联网安装,不赘述

    setup_without_container-selinux-2.9.sh 脚本内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #auto-mount
    yum clean all
    yum makecache
    yum remove -y docker-engine
    mkdir -p /data/tmp
    chmod -R 777 /data/tmp
    mkdir -p /data/sys/var/docker
    chmod -R 777 /data/sys/var/docker
    ln -s /data/sys/var/docker /var/lib/docker
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    echo "vm.max_map_count=655360" >> /etc/sysctl.conf && sysctl -p
    yum install -y net-tools
    useradd -d /data/duser -m duser
    echo "duser:5VSDHai4" |chpasswd
    echo "duser ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
    rpm -ivh container-selinux-2.9-4.el7.noarch.rpm
    yum install -y ./docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm
    usermod -aG docker duser
    rm -fr ./*
    cd ../
    rm -fr docker_install docker_install.tar.gz
    注意:

    ​ sh脚本可以根据具体情况进行修改

    ​ 当出现无法安装成功,且提示rpm安装问题时,在rpm安装命令之后,加 —nodeps —force ,意思为不考虑分析包之间的依赖关系,即可安装成功

    五、开启docker服务

    1
    2
    3
    4
    systemctl start docker
    systemctl enable docker
    systemctl status docker
    docker version #查询是否开启docker

    六、安装java(部署es 的依赖)

    1
    java -version	#查看是否有java,如果有,忽略以后步骤
    本地安装java

    http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

    1
    2
    3
    4
    5
    6
    mkdir /usr/java
    cp jdk-8u171-linux-x64.rpm /usr/java
    cd /usr/java
    chmod +x jdk-8u171-linux-x64.rpm
    rpm -ivh jdk-8u171-linux-x64.rpm
    java -version

    七、读取镜像(根据实际情况)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    docker load -i image.tar	#如果是zip的镜像,则先unziip成tar文件
    docker images

    # 启动容器,并且将本地的文件目录挂载至容器data目录下
    docker run -itd -p 8888:8888 -v /data/origin_file:/data/duser/patent_similaruty/data/origin_file --name patent_preprocess patent_preprocess:1.1 bash

    #进入容器
    docker exec -it patent_preprocess bash

    #停止容器
    docker stop patent_preprocess

    八、如果需要docker-compose启动

    安装并使用docker-compose

    方法一:

    使用curl命令下载

    1
    2
    3
    curl -L https://github.com/docker/compose/releases/download/1.24.0/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose

    chmod +x /usr/local/bin/docker-compose

    方法二:

    使用pip命令下载

    1
    2
    3
    4
    5
    yum -y install epel-release

    yum -y install python-pip

    pip install docker-compose

    搜索的部署

    一、部署集群

    user用户下

    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
    unzip elasticsearch_bak.zip	#解压引擎文件
    # 修改默认的配置文件
    cd elasticsearch_bak/config
    vi elasctsearch.yml
    cluster.name: es-zl #修改集群名,所有节点配置的该名称必须一样
    node.name: es-46 #修改每个节点的名称,必须不同,以区分每个节点
    node.master:true #是否可作为主节点
    path.data: /data/es_data #es数据存放的位置
    network.host:127.17.30.46 #每个节点的ip地址
    http.port: 9200 #节点的端口,必须相同,默认9200

    bootstrap.memory_lock: true
    bootstrap.system_call_filter: false #内存锁定,防止swap使es产生内存交互
    discovery.zen.ping.unicast.hosts:["127.17.30.44","127.17.30.45",,] #集群master节点的ip,不需要所有节点的ip,其他节点只要能与任意一个master节点通讯,即可加入到该集群当中
    discovery.zen.minimum_master_nodes:2 #当2个有资格成为主节点的从节点认为主节点挂了,则进行重新选主,一般设置为(n/2)+1,防止es出现脑裂情况
    gateway.recover_after_nodes: 3 #节点数量达到多少之后,进行数据恢复处理
    http.cors.enabled: true
    http.cors.allow-origin: "*"

    vi yvm.options
    -Xms16g #默认为2g,可根据服务器内存,自行修改

    #通过一下命令查看内存
    cat /proc/cpuinfo | grep 'cpu cores' | wc -l #查看cpu核数
    cat /proc/meminfo | grep MemTotal #只查看内存
    free -h #查看内存的使用
    df -h #查看硬盘存储
    注意:

    ​ 该操作必须在每台服务器上都要部署,并不能在root用户下操作,要在user下操作,如果没有usr用户,则创建

    如果没有操作权限,则执行:
    1
    2
    3
    # root下,将文件权限设置为duser用户可操作
    chown duser *
    chgrp duser *

    当不使用es远程词典时:

    修改elasticsearch-5.3.0/plugins/ik/config/IKAnalyzer.cfg.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
    <comment>IK Analyzer 扩展配置</comment>
    <!--用户可以在这里配置自己的扩展字典 -->
    <entry key="ext_dict">custom/mydict.dic;custom/single_word_low_freq.dic</entry>
    <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords">custom/ext_stopword.dic</entry>
    <!--用户可以在这里配置远程扩展字典 -->
    <!-- <entry key="remote_ext_dict">http://10.172.80.229:9301/mydict.dic</entry> -->
    <!--用户可以在这里配置远程扩展停止词字典-->

    <!-- <entry key="remote_ext_stopwords">http://10.172.80.229:9301/stopword.dic</entry> -->
    </properties>

    说明:

    ​ 注释后两项即可

    添加自定义同义词

    替换config/synonyms.txt文件

    synonyms.txt文件内格式,所有同义词为一行,且用 “, ” 隔开

    二、修改集群配置

    root用户下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    vi /etc/security/limits.conf
    #添加一下语句
    * soft nofile 65536
    * hard nofile 65536
    * soft nproc 65536
    * hard nproc 65536
    duser soft memlock unlimited
    duser hard memlock unlimited

    vi /etc/sysctl.conf
    #修改以下语句
    vm.max_map_count=655360

    sysctl -p

    三、启动集群

    user用户下

    1
    2
    3
    4
    5
    cd elasticsearch_bak/bin
    ./elasticsearch -d #后台启动集群
    curl 172.17.30.45:9200/_cat/nodes #查看所有节点,*为主节点

    # 启动不了时候,查看es-log

    四、搜索部署

    user用户下的操作

    1
    2
    3
    4
    5
    6
    7
    8
    vi index_search_mapping.sh
    #修改的ip和端口与集群一样
    curl -XPUT "http://10.25.114.90:9200/index"
    {
    settings": {
    "number_of_shards": 6, #主分片数量,一般为 服务器总核数
    "number_of_replicas": 2, #副本分片的数量,防止数据丢失
    }
    注意:

    ​ 分词器anslyzer可以根据实际情况进行修改、删除和添加

    添加删除字段

    ​ 当需要添加字段时,只要在以下位置添加即可

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    "mappings": {
    "index": {
    "properties": {
    "id": {
    "type": "keyword"
    },
    "": { #需要添加的字段名
    "type":"" #添加的字段的约束条件
    }
    }
    }
    }
    注意:

    ​ 修改某个文件的字段之前,需要先删除该文件的core

    ​ 重新启动搜索时,也需要进行以下步骤

    1
    2
    3
    curl -XDELETE "http://172.19.30.45:9200/index"
    #修改完之后,重新运行该文件
    sh index_search_mapping.sh

    五、查询启动结果

    1
    2
    3
    4
    curl http://ip:9200/index?pretty		#查询字段
    curl http://ip:9200/_cat/nodes #查询节点
    curl http://ip:9200/_cat/health #查询加群健康,green
    curl http://ip:9200/_cat/shards #查询集群分片状态

    六、数据量查询

    1
    2
    3
    4
    5
    6
    7
    curl http://ip:9200/one_index/_stats	#查询某一个index下的数据量
    curl http://ip:9200/one_index,two_index/_stats #查询多个index的数据量,使用,隔开
    curl http://ip:9200/_all/_stats #查询所有index下的数据量

    # 返回search、fetch、get、index、bulk、segment、counts

    curl http://ip:9200/_cat/count/index #只查询某个index下的文档数,如果不加index,则查询所有的index的文档总数

    七、search-guard为es集群配置auth

    1、安装search-guard插件和ssl插件

    查询es的版本
    1
    2
    3
    curl ip:9200

    # 结果中的number数据即代表版本号
    安装search-guard

    https://repo1.maven.org/maven2/com/floragunn/search-guard-5

    找到对应的版本,下载即可

    或者使用命令行下载,es目录下

    1
    bin/elasticsearch-plugin install -b com.floragunn:search-guard-5:5.3.0-12
    安装search-guard-ssl

    https://repo1.maven.org/maven2/com/floragunn/search-guard-ssl

    命令行

    1
    bin/elasticsearch-plugin install -b com.floragunn:search-guard-ssl:5.3.0-22
    注意:

    当es版本较高时,可能并不需要这两个都存在,取search-guard即可

    2、生成es证书文件

    下载search-guard源码工具,生成证书的工具
    1
    git clone https://github.com/floragunncom/search-guard-ssl.git
    修改ca配置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    cd search-guard-ssl/example-pki-scripts/etc/

    vi root-ca.conf # 根证书配置
    0.domainComponent = "www.test.com” # 域名
    1.domainComponent = "www.test.com" # 域名
    organizationName = "Test" # 组织名称
    organizationalUnitName = "Test Root CA" # 组织单位名称
    commonName = "Test Root CA" # 通用名称

    vi signing-ca.conf # 签名证书配置
    0.domainComponent = "www.test.com” # 域名
    1.domainComponent = "www.test.com" # 域名
    organizationName = "Test" # 组织名称
    organizationalUnitName = "Test Signing CA" # 组织单位名称
    commonName = "Test Signing CA" # 通用名称

    注意:

    ​ 以上信息填写,必须保证和生成证书时信息一致

    修改sh文件

    返回example-pki-scripts目录下,修改example.sh文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash

    set -e

    ./clean.sh

    ./gen_root_ca.sh 12345678 12345678

    ./gen_node_cert.sh 0 12345678 12345678&& ./gen_node_cert.sh 1 12345678 12345678 && ./gen_node_cert.sh 2 12345678 12345678

    ./gen_client_node_cert.sh test 12345678 12345678

    ./gen_client_node_cert.sh test 12345678 12345678

    参数说明:

    ./gen_root_ca.sh 12345678 12345678

    第一个参数为CA_PASS,即CA密码(根证书密码)

    第二个参数为TS_PASS,即TS密码(truststore,信任证书密码)

    ./gen_node_cert.sh 0 12345678 12345678

    第一个参数为node编号,生成证书后的文件名为node-0*

    第二个参数为KS_PASS(keystore文件密码)

    第三个参数为CA_PASS

    ./gen_client_node_cert.sh test 12345678

    第一个参数为客户端节点名称,生成证书后的文件名为test*

    第二个参数为KS_PASS

    第三个参数为CA_PASS

    生成证书,运行example.sh
    1
    2
    3
    sh example.sh

    # 在当前目录下会生成证书文件

    3、配置es,启动search-guard

    将生成的各个节点的证书,分别copy到各个节点上
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 将node-0-keystore.jks和truststore.jks复制到es的config目录下

    cp node-0-keystore.jks ~/elasticsearch/config/
    cp truststore.jks ~/elasticsearch/config/

    # 将test-keystore.jks和truststore.jks复制到es的plugins/search-guard-2/sgconfig目录下

    cp test-keystore.jks ~/elasticsearch/plugins/search-guard-2/sgconfig/
    cp truststore.jks ~/elasticsearch/plugins/search-guard-2/sgconfig/

    注意:

    ​ 保持证书的一致性,因此只需要在一台机器上生成CA证书即可

    修改es的配置文件config/elaticsearch.yml

    在之前修改的基础上,增加如下配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    # 配置ssl
    searchguard.ssl.transport.enabled: true
    searchguard.ssl.transport.keystore_filepath: node-0-keystore.jks
    searchguard.ssl.transport.keystore_password: 12345678
    searchguard.ssl.transport.truststore_filepath: truststore.jks
    searchguard.ssl.transport.truststore_password: 12345678
    searchguard.ssl.transport.enforce_hostname_verification: false
    searchguard.ssl.transport.resolve_hostname: false

    # 配置https
    # http配置,这里我只是为了测试方便,配置完,应该设置为true
    searchguard.ssl.http.enabled: false
    searchguard.ssl.http.keystore_filepath: node-0-keystore.jks
    searchguard.ssl.http.keystore_password: 12345678
    searchguard.ssl.http.truststore_filepath: truststore.jks
    searchguard.ssl.http.truststore_password: 12345678

    # CN为生成CA证书时填写的信息,即./gen_client_node_cert.sh test 12345678 命令的第一个参数
    searchguard.authcz.admin_dn:
    - CN=test, OU=client, O=client, L=Test, C=DE
    启动es

    4、将search-guard的配置写入es中

    添加权限

    1
    chmod -R 777 plugins/search-guard-5/tools/sgadmin.sh

    配置格式

    1
    ./plugins/search-guard-5/tools/sgadmin.sh -cn clustername -h hostname -cd plugins/search-guard-5/sgconfig -ks plugins/search-guard-5/sgconfig/admin-keystore.jks -kspass password -ts plugins/search-guard-5/sgconfig/truststore.jks -tspass password -nhnv

    注意:

    ​ clustername为集群的名称

    ​ hostname为elasticsearch.yml 文件中 network.host 的值

    ​ password生成证书设置的密码

    以上配置生成的命令为
    1
    ./plugins/search-guard-5/tools/sgadmin.sh -cn es-nlp -h 192.168.124.18 -cd plugins/search-guard-5/sgconfig -ks plugins/search-guard-5/sgconfig/test-keystore.jks -kspass 12345678 -ts plugins/search-guard-5/sgconfig/truststore.jks -tspass 12345678 -nhnv

    5、添加es用户及密码

    生成md5加密密码
    1
    2
    3
    4
    5
    6
    7
    chmod -R 777 plugins/search-guard-2/tools/hash.sh

    cd plugins/search-guard-2/tools/

    plugins/search-guard-2/tools/hash.sh -p 123456

    # 保存生成的hash密码
    添加用户及密码
    1
    2
    3
    4
    5
    6
    7
    vim plugins/search-guard-5/sgconfig/sg_internal_users.yml

    sunww:
    hash: 加密后的字符串
    # password: 123456

    # 最后一行时password提示,防止忘记
    添加用户的权限
    1
    2
    3
    4
    5
    6
    7
    8
    vim plugins/search-guard-5/sgconfig/sg_roles_mapping.yml

    ag_all_access:
    users:
    - admin
    - sunww

    # 添加所有权限给sunww用户
    重新将配置写入es中生效
    1
    ./plugins/search-guard-5/tools/sgadmin.sh -cn es-nlp -h 192.168.124.18 -cd plugins/search-guard-5/sgconfig -ks plugins/search-guard-5/sgconfig/test-keystore.jks -kspass 12345678 -ts plugins/search-guard-5/sgconfig/truststore.jks -tspass 12345678 -nhnv

    6、测试

    1
    2
    3
    4
    5
    curl http://sunww:123456@127.0.0.1:9200

    curl -u sunww:123456 http://127.0.0.1:9200

    curl --user sunww:123456 http://127.0.0.1:9200

    八、x-pack为es集群配置auth

    1、要求

    es的版本必须为6.X及以上,5.X的es配置x-pack只能通过api修改密码

    1
    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.3.tar.gz
    2、安装x-pack
    1
    ./bin/elasticsearch-plugin install x-pack
    3、对elasticsearch、logstash、kibana分别设置登录密码(默认es用户名为elastic,logstash用户名为logstash_system,kibana用户名为kibana)
    1
    ./bin/x-pack/setup-passwords interactive

    注意:

    ​ 此时的es必须时启动状态

    4、配置./config/elasticsearch.yml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # es6.X配置:
    http.cors.enabled: true
    http.cors.allow-origin: '*'
    http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type

    # es5.X配置
    xpack.graph.enabled #设置为false以禁用X-Pack图形功能。
    xpack.ml.enabled #设置为false以禁用X-Pack机器学习功能。
    xpack.monitoring.enabled #设置为false以禁用X-Pack监视功能。
    xpack.reporting.enabled     #设置为false以禁用X-Pack报告功能。
    xpack.security.enabled      #设置为false以禁用X-Pack安全功能。
    xpack.watcher.enabled       #设置为false以禁用Watcher。
    5、测试访问
    1
    curl -u elastic:password ip:port
    6、x-pack默认账号密码
    1
    2
    账号:elastic
    密码:changeme
    注意:

    ​ x-pack只有一个月的使用时间,适合poc使用


    转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 zoubinbf@163.com

    ×

    喜欢就点赞,疼爱就打赏