002、ElasticSearch集群部署
本文最后更新于 67 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com

ElasticSearch集群部署

一.集群脚本准备

1.配置免密登录

[root@elk101.oldboyedu.com ~]# ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
[root@elk101.oldboyedu.com ~]# 
[root@elk101.oldboyedu.com ~]# ssh-copy-id  elk101.oldboyedu.com 
[root@elk101.oldboyedu.com ~]# 
[root@elk101.oldboyedu.com ~]# ssh-copy-id  elk101.oldboyedu.com  
[root@elk101.oldboyedu.com ~]# 
[root@elk101.oldboyedu.com ~]# ssh-copy-id  elk101.oldboyedu.com  
[root@elk101.oldboyedu.com ~]# 

2.编写rsync集群同步脚本

[root@elk101.oldboyedu.com ~]# vim /usr/local/sbin/data_rsync.sh 
[root@elk101.oldboyedu.com ~]# 
[root@elk101.oldboyedu.com ~]# cat /usr/local/sbin/data_rsync.sh 
#!/bin/bash

if  [ $# -ne 1 ];then
   echo "仅支持一个路径参数."
   exit
fi 

# 判断文件是否存在
if [ ! -e $1 ];then
    echo "[ $1 ] dir or file not find!"
    exit
fi

# 获取父路径
fullpath=`dirname $1`

# 获取子路径
basename=`basename $1`

# 进入到父路径
cd $fullpath

for ((host_id=102;host_id<=103;host_id++))
  do
    # 使得终端输出变为绿色
    tput setaf 2
    echo ===== elk${host_id}.oldboyedu.com: $basename =====
    # 使得终端恢复原来的颜色
    tput setaf 7
    # 将数据同步到其他两个节点
    rsync -az $basename  `whoami`@elk${host_id}.oldboyedu.com:$fullpath
    if [ $? -eq 0 ];then
      echo "命令执行成功!"
    fi
done
[root@elk101.oldboyedu.com ~]# 

三.部署ElasticSearch集群

1.解压elasticsearch软件包并配置环境变量

[root@elk101.oldboyedu.com ~]# tar zxf elasticsearch-7.12.1-linux-x86_64.tar.gz -C /oldboy/softwares/
[root@elk101.oldboyedu.com ~]# 
[root@elk101.oldboyedu.com ~]# cd /oldboy/softwares/
[root@elk101.oldboyedu.com /oldboy/softwares]# 
[root@elk101.oldboyedu.com /oldboy/softwares]# ll
总用量 0
drwxr-xr-x. 9 root  root  155 4月  21 05:00 elasticsearch-7.12.1
lrwxrwxrwx. 1 root  root   12 5月  16 11:56 jdk -> jdk1.8.0_291
drwxr-xr-x. 8 10143 10143 273 4月   8 03:26 jdk1.8.0_291
[root@elk101.oldboyedu.com /oldboy/softwares]#
[root@elk101.oldboyedu.com /oldboy/softwares]# ln -sv elasticsearch-7.12.1 elasticsearch
"elasticsearch" -> "elasticsearch-7.12.1"
[root@elk101.oldboyedu.com /oldboy/softwares]#
[root@elk101.oldboyedu.com /oldboy/softwares]# ll elasticsearch/
总用量 556
drwxr-xr-x.  2 oldboy oldboy   4096 4月  21 05:01 bin  # 存储的是一些可执行的脚本文件。
drwxr-xr-x.  3 oldboy oldboy    199 5月  16 15:02 config  # 存储的是配置文件
drwxr-xr-x.  9 oldboy oldboy    107 4月  21 05:01 jdk  # ES内置的OpenJDK环境,通常情况下我们都不会去使用,而是使用咱们自己部署的。
drwxr-xr-x.  3 oldboy oldboy   4096 4月  21 05:00 lib  # 存放依赖包的目录,基本上都是一些jar包文件。
-rw-r--r--.  1 oldboy oldboy   3860 4月  21 04:54 LICENSE.txt
drwxr-xr-x.  2 oldboy oldboy     30 5月  16 14:42 logs  # 存放日志的目录。
drwxr-xr-x. 60 oldboy oldboy   4096 4月  21 05:01 modules  # 存储模块的目录。
-rw-r--r--.  1 oldboy oldboy 545323 4月  21 04:58 NOTICE.txt
drwxr-xr-x.  2 oldboy oldboy      6 4月  21 04:58 plugins  # 存储插件的目录。
-rw-r--r--.  1 oldboy oldboy   2710 4月  21 04:54 README.asciidoc
[root@elk101.oldboyedu.com /oldboy/softwares]# 
[root@elk101.oldboyedu.com /oldboy/softwares]# vim /etc/profile.d/es.sh
[root@elk101.oldboyedu.com /oldboy/softwares]# 
[root@elk101.oldboyedu.com /oldboy/softwares]# cat /etc/profile.d/es.sh
#!/bin/bash

export ES_HOME=/oldboy/softwares/elasticsearch
export PATH=$PATH:$ES_HOME/bin
[root@elk101.oldboyedu.com /oldboy/softwares]# 
[root@elk101.oldboyedu.com /oldboy/softwares]# source /etc/profile.d/es.sh
[root@elk101.oldboyedu.com /oldboy/softwares]#

2.创建普通用户并修改文件属主权限

[root@elk101.oldboyedu.com ~]# useradd oldboy
[root@elk101.oldboyedu.com ~]# 
[root@elk101.oldboyedu.com ~]# chown oldboy:oldboy -R /oldboy/softwares/elasticsearch-7.12.1
[root@elk101.oldboyedu.com ~]# 
[root@elk101.oldboyedu.com ~]# mkdir -pv /oldboy/data/elsticsearch
mkdir: 已创建目录 "/oldboy/data/elsticsearch"
[root@elk101.oldboyedu.com ~]# 
[root@elk101.oldboyedu.com ~]# chown oldboy:oldboy /oldboy/data/elsticsearch
[root@elk101.oldboyedu.com ~]# 
[root@elk101.oldboyedu.com ~]# ll /oldboy/data/elsticsearch/ -d
drwxr-xr-x. 2 oldboy oldboy 6 5月  16 14:52 /oldboy/data/elsticsearch/
[root@elk101.oldboyedu.com ~]# 
[root@elk101.oldboyedu.com ~]# mkdir -pv /oldboy/logs/elsticsearch
[root@elk101.oldboyedu.com ~]# 
[root@elk101.oldboyedu.com ~]# ll -d /oldboy/logs/elsticsearch
drwxr-xr-x. 2 root root 4096 5月  16 14:43 /oldboy/logs/elsticsearch
[root@elk101.oldboyedu.com ~]# 
[root@elk101.oldboyedu.com ~]# chown oldboy:oldboy /oldboy/logs/elsticsearch
[root@elk101.oldboyedu.com ~]# 
[root@elk101.oldboyedu.com ~]# ll -d /oldboy/logs/elsticsearch
drwxr-xr-x. 2 oldboy oldboy 4096 5月  16 14:43 /oldboy/logs/elsticsearch
[root@elk101.oldboyedu.com ~]# 

3.修改ES配置文件,配置文件解释

单机版配置文件:
    [root@elk101.oldboyedu.com /oldboy/softwares/elasticsearch/config]# vim elasticsearch.yml 
    [root@elk101.oldboyedu.com /oldboy/softwares/elasticsearch/config]# 
    [root@elk101.oldboyedu.com /oldboy/softwares/elasticsearch/config]# egrep ^[a-z] elasticsearch.yml 
    cluster.name: oldboy-linux
    node.name: elk101.oldboyedu.com
    path.data: /oldboy/data/elasticsearch
    path.logs: /oldboy/logs/elasticsearch
    network.host: 0.0.0.0
    discovery.seed_hosts: ["elk101.oldboyedu.com"]
    cluster.initial_master_nodes: ["elk101.oldboyedu.com"]
    [root@elk101.oldboyedu.com /oldboy/softwares/elasticsearch/config]# 

集群版配置文件:
    [oldboy@elk101.oldboyedu.com ~]$ egrep -v "^$|^#" /oldboy/softwares/elasticsearch/config/elasticsearch.yml 
    cluster.name: oldboy-linux
    node.name: elk101.oldboyedu.com
    path.data: /oldboy/data/elasticsearch
    path.logs: /oldboy/logs/elasticsearch
    network.host: 0.0.0.0
    discovery.seed_hosts: ["elk101.oldboyedu.com","elk102.oldboyedu.com","elk103.oldboyedu.com"]
    cluster.initial_master_nodes: ["elk101.oldboyedu.com","elk102.oldboyedu.com","elk103.oldboyedu.com"]
    [oldboy@elk101.oldboyedu.com ~]$ 

配置文件参数说明:
    cluster.name:
        指定节点名称。
    node.name:
        节点名称,在同一个集群中,集群内要唯一。
    node.master:
        指定当前节点是否可以成为主节点。
    node.data:
        指定当前节点是否可以成为数据节点。
    network.host:
        指定可以访问的ES的主机的网络IP,说白了就是绑定ElasticSearch的地址。
    http.port:
        指定http协议RESTful端口。
    transport.tcp.port:
        指定elasticsearch集群间组件的通信端口。
    discovery.zen.ping.unicast.hosts:
        ES 7.x 已经弃用了该参数,但为了兼容性,其已经是有效的。指定所有master角色的单播节点,
        如果不指定数据传输端口(transport.tcp.port),默认的端口为9300。
    discovery.seed_hosts:
        ES 7.x新增的配置,此设置以前称为discovery.zen.ping.unicast.hosts。
        它的旧名称已被弃用,但为了保持向后兼容性,它继续有效。对旧名称的支持将在以后的版本中删除。
    discovery.zen.minimum_master_nodes:
        指定成为master角色最低限度的票数,假设集群的数量为N,则该数字通常设置为"N / 2 + 1",
    cluster.initial_master_nodes:
        ES 7.x新增的配置,设置全新集群中符合主机要求的节点的初始集合。
        默认情况下,该列表为空,这意味着该节点希望加入已经被引导的集群。 
        在开发模式下,如果未配置发现设置,则此步骤由节点本身自动执行。
        由于此自动引导本质上是不安全的,因此当您在生产模式下启动全新集群时,必须明确列出符合条件的节点的名称或IP地址,这些节点的投票应在第一次选举中计算。
    cluster.routing.allocation.cluster_concurrent_rebalance:
        允许控制在集群范围内允许多少并发分片重新平衡,默认为2。生产环境可以适当调大,比如等于你服务器的CPU核心数。
        请注意,由于群集中的不平衡,此设置仅控制并发碎片重定位的数量。此设置不限制由于分配过滤或强制感知而导致的碎片重定位。
    cluster.routing.allocation.node_concurrent_incoming_recoveries:
        一个节点上允许进行多少并发的传入分片恢复。传入恢复是在节点上分配目标分片(很可能是副本,除非重新分配分片)的恢复,默认为2。
    cluster.routing.allocation.node_concurrent_outgoing_recoveries:
        一个节点上允许进行多少并发的传出分片恢复。传出恢复是指在节点上分配了源分片(很可能是主分片,除非重新分配分片)的恢复。默认为2。
    cluster.routing.allocation.node_concurrent_recoveries:
        同时设置cluster.routing.allocation.node_concurrent_incoming_recoveries和cluster.routing.allocation.node_concurrent_outgoing_recoveries。
        生产环境可以适当调大,比如等于你服务器的CPU核心数。
    cluster.routing.allocation.node_initial_primaries_recoveries
        虽然副本的恢复是通过网络进行的,但节点重启后未分配的主数据库的恢复将使用本地磁盘中的数据。
        这些操作应该很快,以便可以在同一节点上并行发生更多的初始主要恢复。默认为4。生产环境可以适当调大,比如等于你服务器的CPU核心数。
    http.cors.enabled:
        如果启用了HTTP端口,那么此属性会指定是否允许跨源REST请求。
    http.cors.allow-origin:
        如果http.cors.enabled的值为true,那么该属性会指定允许REST请求来自何处。
    http.max_content_length
        指定最大的数据传输大小。
    gateway.recover_after_nodes:
        只要有这么多数据或master节点已加入集群,就可以进行恢复。
    network.tcp.no_delay:
        启用或禁用TCP无延迟设置。默认为true。
    network.tcp.keep_alive:
        配置SO_KEEPALIVE此套接字的选项,该选项确定是否发送TCP keepalive探针。

    参考链接:
        https://www.elastic.co/guide/en/elasticsearch/reference/current/settings.html
        https://www.elastic.co/guide/en/elasticsearch/reference/current/important-settings.html
        https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery-settings.html
        https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-gateway.html
        https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-network.html

4.调优集群的初始化参数

(1)修改文件描述符的最大打开数量

[root@elk101.oldboyedu.com ~]# vim /etc/security/limits.d/es.conf 
[root@elk101.oldboyedu.com ~]# 
[root@elk101.oldboyedu.com ~]# cat /etc/security/limits.d/es.conf 
# Add by yinzhengjie for Elasticsearch
*          soft    nofile    65535
*          hard    nofile    65535
[root@elk101.oldboyedu.com ~]#

温馨提示:
    需要重启当前会话方能生效,可以使用"ulimit -Hn","ulimit -Sn"查看文件打开数量。

(2)修改虚拟内存区域映射大小

[root@elk101.oldboyedu.com ~]# vim /etc/sysctl.d/es.conf 
[root@elk101.oldboyedu.com ~]# 
[root@elk101.oldboyedu.com ~]# cat /etc/sysctl.d/es.conf 
vm.max_map_count=262144
[root@elk101.oldboyedu.com ~]# 
[root@elk101.oldboyedu.com ~]# sysctl -p /etc/sysctl.d/es.conf  # 必须操作
vm.max_map_count = 262144
[root@elk101.oldboyedu.com ~]# 

5.启动ElasticSearch服务

[root@elk101.oldboyedu.com ~]# su -l oldboy
上一次登录:日 5月 16 15:53:24 CST 2021pts/1 上
[oldboy@elk101.oldboyedu.com ~]$ 
[oldboy@elk101.oldboyedu.com ~]$ elasticsearch -h
warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME
Future versions of Elasticsearch will require Java 11; your Java version from [/oldboy/softwares/jdk1.8.0_291/jre] does not meet this r
equirement. Consider switching to a distribution of Elasticsearch with a bundled JDK. If you are already using a distribution with a bundled JDK, ensure the JAVA_HOME environment variable is not set.Starts Elasticsearch

Option                Description                                               
------                -----------                                               
-E <KeyValuePair>     Configure a setting                                       
-V, --version         Prints Elasticsearch version information and exits        
-d, --daemonize       Starts Elasticsearch in the background                    
-h, --help            Show help                                                 
-p, --pidfile <Path>  Creates a pid file in the specified path on start         
-q, --quiet           Turns off standard output/error streams logging in console
-s, --silent          Show minimal output                                       
-v, --verbose         Show verbose output                                       
[oldboy@elk101.oldboyedu.com ~]$ 
[oldboy@elk103.oldboyedu.com ~]$ elasticsearch -d
[oldboy@elk101.oldboyedu.com ~]$ 
[oldboy@elk101.oldboyedu.com ~]$ curl elk101.oldboyedu.com:9200   # 查看当前节点是否启动成功
{
  "name" : "elk101.oldboyedu.com",
  "cluster_name" : "oldboy-linux",
  "cluster_uuid" : "XBcIl64LT5CIRIZdUUjjvg",
  "version" : {
    "number" : "7.12.1",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "3186837139b9c6b6d23c3200870651f10d3343b7",
    "build_date" : "2021-04-20T20:56:39.040728659Z",
    "build_snapshot" : false,
    "lucene_version" : "8.8.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
[oldboy@elk101.oldboyedu.com ~]$ 
[oldboy@elk101.oldboyedu.com ~]$ ss -ntl
State       Recv-Q Send-Q                      Local Address:Port                                     Peer Address:Port       

...

LISTEN      0      128                                  [::]:9300                                             [::]:*         
LISTEN      0      128                                  [::]:9200                                             [::]:*            
...

[oldboy@elk101.oldboyedu.com ~]$ 
[oldboy@elk101.oldboyedu.com ~]$ curl elk101.oldboyedu.com:9200/_cat/nodes  # 查看集群的节点数量。
172.200.3.103 54 52 0 0.00 0.01 0.05 cdfhilmrstw - elk103.oldboyedu.com
172.200.3.101 44 56 0 0.08 0.03 0.05 cdfhilmrstw - elk101.oldboyedu.com
172.200.3.102 61 96 0 0.01 0.02 0.05 cdfhilmrstw * elk102.oldboyedu.com
[oldboy@elk101.oldboyedu.com ~]$ 

6.停止ElasticSearch服务

[root@elk101.oldboyedu.com ~]# jps
15760 Elasticsearch
16139 Jps
[root@elk101.oldboyedu.com ~]# 
[root@elk101.oldboyedu.com ~]# kill 15760
[root@elk101.oldboyedu.com ~]# 
[root@elk101.oldboyedu.com ~]# jps
16157 Jps
[root@elk101.oldboyedu.com ~]# 

四.安装PostMan工具

1.下载PostMan工具

下载地址:
    https://www.postman.com/downloads/

2.安装PostMan工具

双击运行安装后,注册用户即可。

五.ElasticSearch-head插件部署

1.ElasticSearch-head概述

    由于ElasticSearch官方并没有为ElasticSearch提供界面管理工具,仅仅是提供了后台的服务。Elas
ticSearch-head是一个为ElasticSearch开发的一个页面客户端工具,其源码托管于GitHub。

    GitHub地址:
        https://github.com/mobz/elasticsearch-head

    elasticsearch-head提供以下几种安装方式:
        (1)源码安装,通过npm run start启动;
        (2)通过docker安装;
        (3)通过chrome插件安装(需要"科学上网");
        (4)通过elasticsearch的plugin方式安装;

    温馨提示:
        随着Kibana组件的成熟,已经可以实现对ES集群的管理,因此ElasticSearch-head插件的作用在
逐步削弱,所以此处选择基于Google插件的方式进行部署。

2.ElasticSearch-head部署

    我这里就基于最简单的部署方式,直接使用Google浏览器插件部署。

    Google浏览器插件部署操作步骤如下:
        (1)先解压我给的压缩包;
        (2)点击浏览器的"扩展程序";
        (3)点击"加载已解压的扩展程序";
        (4)加载成功后,我们就可以正常使用该插件了;

六.今日作业

(1)部署ES集群;
(2)部署PostMan插件;
(3)安装ES-head插件;

# 调优,让他进程占用内存设置为256
[root@elk101.oldboyedu.com oldboy]#grep ^- /oldboy/softwares/elasticsearch/config/jvm.options
-Xms256m
-Xmx256m

# 查看修改情况
[root@elk101.oldboyedu.com ~]#jps 
26737 Elasticsearch
26904 Jps
[root@elk101.oldboyedu.com ~]#jmap -heap 26737

# 查看内容
[root@elk103.oldboyedu.com ~]#jmap -heap 26737|grep  MaxHeapSize 
   MaxHeapSize              = 268435456 (256.0MB)

七.部署elasticsearch可能会遇到的错误

1.java.lang.RuntimeException: can not run elasticsearch as root

解决方案:
    创建一个普通用户运行ES即可。但要注意权限信息。

2.Exception in thread "main" java.nio.file.AccessDeniedException: /oldboy/softwares/elasticsearch/config/jvm.options.d

问题原因:
    运行用户无权限访问ES的安装目录

解决方案:
    修改权限。

3.java.lang.IllegalStateException: Unable to access 'path.data' (/oldboy/data/elsticsearch)

问题原因:
    数据目录路径无权限访问。

解决方案:
    方案1:
        [root@elk101.oldboyedu.com ~]# mkdir -pv /oldboy/data/elsticsearch
        mkdir: 已创建目录 "/oldboy/data/elsticsearch"
        [root@elk101.oldboyedu.com ~]# 
        [root@elk101.oldboyedu.com ~]# chown oldboy:oldboy /oldboy/data/elsticsearch
        [root@elk101.oldboyedu.com ~]# 
        [root@elk101.oldboyedu.com ~]# ll /oldboy/data/elsticsearch/ -d
        drwxr-xr-x. 2 oldboy oldboy 6 5月  16 14:52 /oldboy/data/elsticsearch/
        [root@elk101.oldboyedu.com ~]# 

    方案2:
        对"/oldboy/data"这个路径的其它人的权限分配"w".

4.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

问题原因:
    未配置ES的discovery选项。

解决方案:
    修改配置文件的"discovery.seed_hosts"和"cluster.initial_master_nodes"。

5.max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]ERROR: Elasticsearch did not exit normally - check the logs at /oldboy/logs/elsticsearch/oldboy-linux.log

问题原因:
    最大虚拟内存区域太低。

解决方案:
[root@elk101.oldboyedu.com ~]# sysctl -q vm.max_map_count
vm.max_map_count = 65530
[root@elk101.oldboyedu.com ~]# 
[root@elk101.oldboyedu.com ~]# vim /etc/sysctl.d/es.conf
[root@elk101.oldboyedu.com ~]# 
[root@elk101.oldboyedu.com ~]# cat /etc/sysctl.d/es.conf
vm.max_map_count=262144
[root@elk101.oldboyedu.com ~]# 
[root@elk101.oldboyedu.com ~]# sysctl -p /etc/sysctl.d/es.conf  # 加载配置文件,全局会话立即生效!
vm.max_map_count = 262144
[root@elk101.oldboyedu.com ~]# 
[root@elk101.oldboyedu.com ~]# sysctl -q vm.max_map_count
vm.max_map_count = 262144
[root@elk101.oldboyedu.com ~]# 

6.max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]ERROR: Elasticsearch did not exit normally - check the logs at /oldboy/logs/elsticsearch/oldboy-linux.log

问题原因:
    最大的文件描述符设置过低,可通过"ulimit -Hn"查看硬限制。

解决方案:(配置后需要重启当前会话方能生效!)
    [root@elk101.oldboyedu.com ~]# vim /etc/security/limits.d/es.conf
    [root@elk101.oldboyedu.com ~]# 
    [root@elk101.oldboyedu.com ~]# cat /etc/security/limits.d/es.conf
    # Add by yinzhengjie for Elasticsearch
    *          soft    nofile    65535
    *          hard    nofile    65535
    [root@elk101.oldboyedu.com ~]# 

7.max number of threads [3805] for user [oldboy] is too low, increase to at least [4096]

问题原因:
    线程数限制太低。

解决方案:
    [root@elk1 ~ 16:51:37]# cat /etc/security/limits.d/es.conf
    # Add by yinzhengjie for Elasticsearch

    ...

    *   soft    nproc   4096
    *   hard    nproc   4096
    [root@elk1 ~ 16:52:08]# 

8. setting [cluster.initial_master_nodes] contains duplicates: [elk101.oldboyedu.com, elk101.oldboyedu.com, elk101.oldboyedu.com]

问题原因:
    初始化master节点的名称一致。

解决方案:
    可以指定多个不同的master节点,也可以指定一个。

9.master not discovered yet, this node has not previously joined a bootstrapped

问题原因:
    尚未发现主节点,此节点以前未加入引导节点。

解决方案:
    请检查"cluster.initial_master_nodes"参数是否生效。

10.java.net.BindException: Cannot assign requested address

问题原因:
    绑定地址在当前服务器上找不到相关的接口.

解决方案:
    请检查ES的配置文件(elasticsearch.yml)中"network.host"是否指令了正确的IP地址.

1632996626816

后记: ----> 防坑小技巧

防坑小技巧:
    (1)不能使用root用户启动es服务;
    (2)给ES的安装目录授权相关的运行用户,该用户必须是一个普通用户哟;
    (3)配置文件是否些错误;
谨此笔记,记录过往。凭君阅览,如能收益,莫大奢望。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇