请选择 进入手机版 | 继续访问电脑版

[Erlang] 深入浅析RabbitMQ镜像集群原理

[复制链接]
查看147 | 回复34 | 2021-9-13 05:40:10 | 显示全部楼层 |阅读模式
目次

集群架构

RabbitMQ 集群是一个或多个节点的逻辑分组,集群中的每个节点都是对等的

每个节点共享全部 的用户,假造 主机,队列,交换器,绑定关系,运行时参数和其他分布式状态等信息。

一个高可用,负载均衡 的 RabbitMQ 集群架构应类似 下图:

在这里插入图片形貌

这里对上面的集群架构做一下表明 阐明 :

1)起首 一个基本的 RabbitMQ 集群不是高可用的

固然 集群共享队列,但在默认环境 下,消息只会被路由到某一个节点的符合条件的队列上,并不会同步到其他节点的类似 队列上。

假设消息路由到 node1 的 my-queue 队列上,但是 node1 忽然 宕机了,那么消息就会丢失

想要办理 这个题目 ,必要 开启队列镜像,将集群中的队列彼此之间举行 镜像,此时消息就会被拷贝到处于同一个镜像分组中的全部 队列上。

2)其次 RabbitMQ 集群本身并没有提供负载均衡 的功能

也就是说对于一个三节点的集群,每个节点的负载大概 都是不类似 的,想要办理 这个题目 可以通过硬件负载均衡 或者软件负载均衡 的方式

这里我们选择利用 HAProxy 来举行 负载均衡 ,当然也可以利用 其他负载均衡 中心 件,如LVS等。

HAProxy 同时支持四层和七层负载均衡 ,并基于单一历程 的变乱 驱动模子 ,因此它可以支持非常高的井发毗连 数。

3)接着假设我们只采用一台 HAProxy

那么它就存在显着 的单点故障的题目

以是 至少必要 两台 HAProxy ,同时这两台 HAProxy 之间必要 可以或许 自动 举行 故障转移,通常的办理 方案就是 KeepAlived 。

KeepAlived 采用 VRRP (Virtual Router Redundancy Protocol,假造 路由冗余协议) 来办理 单点失效的题目

它通常由一组一备两个节点构成 ,同一时间内只有主节点会提供对外服务,并同时提供一个假造 的 IP 地址 (Virtual Internet Protocol Address ,简称 VIP) 。

假如 主节点故障,那么备份节点会自动 接受 VIP 并成为新的主节点 ,直到原有的主节点恢复。

4)末了 ,任何想要毗连 到 RabbitMQ 集群的客户端

只必要 毗连 到假造 IP,而不必关心集群是何种架构。

搭建集群预备 :

1、预备 3个假造 机

  1. vi /etc/hostname #修改虚拟机名称 node1 node2 node3
复制代码
假造 机(机器)名称 node1 node2 node3
ip 192.168.0.101 192.168.0.102 192.168.0.103
安装 Erlang+RabbitMQ Erlang+RabbitMQ Erlang+RabbitMQ

2、设置node1、node2、node3的hosts

  1. vi /etc/hosts #修改虚拟机hosts node1 node2 node3
复制代码

文件内容:

  1. 192.168.0.101 node1
  2. 192.168.0.102 node2
  3. 192.168.0.103 node3
复制代码

安装Erlang:

由于RabbitMQ是基于Erlang(面向高并发的语言)语言开辟 ,以是 在安装RabbitMQ之前,必要 先安装Erlang。

1.选择Erlang和RabbitMQ版本,这里选择RabbitMQ3.9.x、Erlang24.0,查看对应版本   

2.Erlang官网下载Github下载

在这里插入图片形貌

3.更新基本体系 ,安装任何软件包之前,建议利用 以下下令 更新软件包和存储库

  1. yum -y update
复制代码

4、安装 tar

  1. yum install -y tar
复制代码

5、起首 要先安装GCC、 GCC-C++、 Openssl等依靠 模块:

  1. yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel
复制代码

6、再安装ncurses模块

  1. yum -y install ncurses-devel
  2. yum install ncurses-devel
复制代码

7、将安装包拷贝到linux下:

在这里插入图片形貌

8、解压ErLang安装包

  1. [root@node1 /]# cd /usr/local/ #先切换到安装包目录
  2. [root@nodel local]# ls #查看文件
  3. bin etc games include lib lib64 libexec otp_src_24.0 otp_src_24.0.tar.gz sbin share src
  4. [root@nodel local]# tar -xvf otp_src_24.0.tar.gz #解压文件
复制代码

9、创建安装的目次 /usr/local/erlang

  1. [root@node1 local]# mkdir erlang
  2. [root@node1 local]# ls
  3. bin erlang etc games include lib lib64 libexec otp_src_24.0 otp_src_24.0.tar.gz sbin share src
  4. [root@node1 local]#
复制代码

10、切换到解压后的目次

  1. [root@node1 local]# cd otp_src_24.0
  2. [root@node1 otp_src_24.0]# ls
  3. AUTHORS bootstrap configure.src erl-build-tool-vars.sh HOWTO LICENSE.txt Makefile.in otp_patch_apply otp_versions.table prebuilt.files system xcomp
  4. bin configure CONTRIBUTING.md erts lib make otp_build OTP_VERSION plt README.md TAR.include
  5. [root@node1 otp_src_24.0]#
复制代码

11、设置 安装路径

  1. ./configure --prefix=/usr/local/erlang --with-ssl --enable-threads --enable-smp-support --enable-kernel-poll --enable-hipe --without-javac
复制代码

erlang的编译必要 用到java环境,假如 不装,会报错如下,但不影响后续操作

在这里插入图片形貌

12、举行 编译安装

  1. make && make install
复制代码

13、查看安装

  1. [root@node1 local]# cd erlang/
  2. [root@node1 erlang]# ll
  3. total 4
  4. drwxr-xr-x. 2 root root 4096 Aug 7 23:30 bin
  5. drwxr-xr-x. 3 root root 19 Aug 7 23:30 lib
  6. [root@node1 erlang]#
复制代码

14、设置 环境变量

  1. vi /etc/profile
复制代码

加入一下设置 :

  1. ######### erlang #############
  2. PATH=$PATH:/usr/local/erlang/bin
  3. ########################################
复制代码

15、使设置 见效 :

  1. source /etc/profile
复制代码

16、直接输入 erl 、得到如下图得安装成功,输入 halt(). 退出

在这里插入图片形貌

安装RabbitMQ:

1、Github下载

在这里插入图片形貌

2、将安装包拷贝到linux下:

在这里插入图片形貌

3、解压到 /usr/local/ 目次 下

  1. [root@node1 local]# tar -xvf rabbitmq-server-generic-unix-3.9.3.tar.xz
  2. ******
  3. [root@node1 local]# ls
  4. bin etc include lib64 otp_src_24.0 rabbitmq_server-3.9.3 sbin src
  5. erlang games lib libexec otp_src_24.0.tar.gz rabbitmq-server-generic-unix-3.9.3.tar.xz share
复制代码

4、添加环境变量

  1. vi /etc/profile
复制代码

加入一下设置 :

  1. ######### RabbitMQ #############
  2. PATH=$PATH:/usr/local/rabbitmq_server-3.9.3/sbin
  3. ########################################
复制代码

5、使设置 见效 :

  1. source /etc/profile
复制代码

 

6、切换到解压后的目次

  1. [root@node1 local]# cd rabbitmq_server-3.9.3/
  2. [root@node1 rabbitmq_server-3.9.3]# ls
  3. escript LICENSE-APACHE2-excanvas LICENSE-erlcloud LICENSE-MIT-Erlware-Commons LICENSE-MIT-Sammy LICENSE-rabbitmq_aws
  4. etc LICENSE-APACHE2-ExplorerCanvas LICENSE-httpc_aws LICENSE-MIT-Flot LICENSE-MIT-Sammy060 plugins
  5. INSTALL LICENSE-APL2-Stomp-Websocket LICENSE-ISC-cowboy LICENSE-MIT-jQuery LICENSE-MPL sbin
  6. LICENSE LICENSE-BSD-base64js LICENSE-MIT-EJS LICENSE-MIT-jQuery164 LICENSE-MPL2 share
  7. LICENSE-APACHE2 LICENSE-BSD-recon LICENSE-MIT-EJS10 LICENSE-MIT-Mochi LICENSE-MPL-RabbitMQ
  8. [root@node1 rabbitmq_server-3.9.3]# cd sbin/
  9. [root@node1 sbin]# ls
  10. rabbitmqctl rabbitmq-defaults rabbitmq-diagnostics rabbitmq-env rabbitmq-plugins rabbitmq-queues rabbitmq-server rabbitmq-streams rabbitmq-upgrade
  11. [root@node1 sbin]#
复制代码

7、启动web管理插件

  1. [root@node1 sbin]# rabbitmq-plugins enable rabbitmq_management
  2. Enabling plugins on node rabbit@localhost:
  3. rabbitmq_management
  4. The following plugins have been configured:
  5. rabbitmq_management
  6. rabbitmq_management_agent
  7. rabbitmq_web_dispatch
  8. Applying plugin configuration to rabbit@localhost...
  9. The following plugins have been enabled:
  10. rabbitmq_management
  11. rabbitmq_management_agent
  12. rabbitmq_web_dispatch
  13. started 3 plugins.
复制代码

8、后台启动rabbitmq服务

  1. rabbitmq-server -detached
复制代码

9、启用了rabbitmq的管理插件,会有一个web管理界面,默认监听端口15672,将此端口在防火墙上打开,则可以访问web界面:

在这里插入图片形貌

利用 默认的用户 guest / guest (此也为管理员用户)登陆,会发现无法登陆,

报错:User can only log in via localhost。

那是由于 默认是限定 了guest用户只能在本机登陆,也就是只能登陆localhost:15672。

可以通过修改设置 文件rabbitmq.conf,取消这个限定 : loopback_users这个项就是控制访问的,

假如 只是取消guest用户的话,只必要 loopback_users.guest = false 即可。或者添加长途 用户

10、添加长途 用户

  1. # 添加用户
  2. rabbitmqctl add_user 用户名 密码
  3. # 设置用户角色,分配操作权限
  4. rabbitmqctl set_user_tags 用户名 角色
  5. # 为用户添加资源权限(授予访问虚拟机根节点的所有权限)
  6. rabbitmqctl set_permissions -p / 用户名 ".*" ".*" ".*"
复制代码

脚色 有四种:

  • administrator:可以登录控制台、查看全部 信息、并对rabbitmq举行 管理
  • monToring:监控者;登录控制台,查看全部 信息
  • policymaker:策略订定 者;登录控制台指定策略
  • managment:平凡 管理员;登录控制

这里创建用户rabbitadmin,暗码 rabbitadmin,设置administrator脚色 ,赋予全部 权限

  1. [root@node1 sbin]# rabbitmqctl add_user rabbitadmin rabbitadmin
  2. Adding user "rabbitadmin" ...
  3. Done. Don't forget to grant the user permissions to some virtual hosts! See 'rabbitmqctl help set_permissions' to learn more.
  4. [root@node1 sbin]# rabbitmqctl set_user_tags rabbitadmin administrator
  5. Setting tags for user "rabbitadmin" to [administrator] ...
  6. [root@node1 sbin]# rabbitmqctl set_permissions -p / rabbitadmin ".*" ".*" ".*"
  7. Setting permissions for user "rabbitadmin" in vhost "/" ...
  8. [root@node1 sbin]#
复制代码

11、登录,其他两台假造 机也是如上设置

在这里插入图片形貌

同步cookie:

1、怎样 查看cookie

  1. [root@node1 rabbitmq]# pwd
  2. /usr/local/rabbitmq_server-3.9.3/var/log/rabbitmq
  3. [root@node1 rabbitmq]# more rabbit\@node1.log
  4. ******
  5. 2021-08-14 21:11:06.883853-04:00 [info] <0.222.0> node : rabbit@node1
  6. 2021-08-14 21:11:06.883853-04:00 [info] <0.222.0> home dir : /root
  7. 2021-08-14 21:11:06.883853-04:00 [info] <0.222.0> config file(s) : (none)
  8. 2021-08-14 21:11:06.883853-04:00 [info] <0.222.0> cookie hash : baCpCWaCXrmkyZweJiNbVw==
  9. 2021-08-14 21:11:06.883853-04:00 [info] <0.222.0> log(s) : /usr/local/rabbitmq_server-3.9.3/var/log/rabbitmq/rabbit@node1.log
  10. 2021-08-14 21:11:06.883853-04:00 [info] <0.222.0> : /usr/local/rabbitmq_server-3.9.3/var/log/rabbitmq/rabbit@node1_upgrade.log
  11. 2021-08-14 21:11:06.883853-04:00 [info] <0.222.0> : <stdout>
  12. 2021-08-14 21:11:06.883853-04:00 [info] <0.222.0> database dir : /usr/local/rabbitmq_server-3.9.3/var/lib/rabbitmq/mnesia/rabbit@node1
复制代码

我的${home}目次 是/root,切换到root目次 下,该文件是一个潜伏 文件,必要 利用 ls -al 下令 查看

  1. [root@node1 ~]# pwd
  2. /root
  3. [root@node1 ~]# ls -la
  4. total 52
  5. dr-xr-x---. 2 root root 4096 Aug 14 21:10 .
  6. dr-xr-xr-x. 18 root root 4096 Nov 12 2020 ..
  7. -rw-------. 1 root root 993 Nov 7 2020 anaconda-ks.cfg
  8. -rw-------. 1 root root 14288 Aug 14 23:07 .bash_history
  9. -rw-r--r--. 1 root root 18 Dec 28 2013 .bash_logout
  10. -rw-r--r--. 1 root root 176 Dec 28 2013 .bash_profile
  11. -rw-r--r--. 1 root root 176 Dec 28 2013 .bashrc
  12. -rw-r--r--. 1 root root 100 Dec 28 2013 .cshrc
  13. -r--------. 1 root root 20 Aug 14 00:00 .erlang.cookie
  14. -rw-r--r--. 1 root root 129 Dec 28 2013 .tcshrc
  15. [root@node1 ~]#
复制代码

2、同步(拷贝.cookie时,各节点都必须克制 MQ服务,在node1上实行 长途 操作下令 )

  1. scp /root/.erlang.cookie root@node2:/root/
  2. scp /root/.erlang.cookie root@node3:/root/
复制代码

集群搭建:

1、启动RabbitMQ服务,顺带启动Erlang假造 机和RabbitMQ应用服务,在node1、node2、node3实行 下令

  1. rabbitmq-server -detached
复制代码

2、RabbitMQ 集群的搭建必要 选择此中 恣意 一个节点为基准,将别的 节点渐渐 加入。这里我们以 node1 为基准节点,将 node2 和 node3 加入集群。在 node2 和node3 上实行 以下下令 :

  1. # 1.停止服务
  2. rabbitmqctl stop_app
  3. # rabbitmqctl stop会将Erlang虚拟机关闭,rabbitmqctl stop_app只关闭RabbitMQ服务
  4. # 2.重置状态
  5. rabbitmqctl reset
  6. # 3.节点加入, 在一个node加入cluster之前,必须先停止该node的rabbitmq应用,即先执行stop_app
  7. # node2加入node1, node3加入node2
  8. rabbitmqctl join_cluster rabbit@node1
  9. # 4.启动服务
  10. rabbitmqctl start_app
复制代码

join_cluster 下令 有一个可选的参数 --ram ,该参数代表新加入的节点是内存节点,默认是磁盘节点。

假如 是内存节点,则全部 的队列、交换器、绑定关系、用户、访问权限和 vhost 的元数据都将存储在内存中,

假如 是磁盘节点,则存储在磁盘中。

内存节点可以有更高的性能,但其重启后全部 设置 信息都会丢失,

因此RabbitMQ 要求在集群中至少有一个磁盘节点,其他节点可以是内存节点。

当内存节点脱离 集群时,它可以将变更关照 到至少一个磁盘节点;

然后在其重启时,再毗连 到磁盘节点上获取元数据信息。

除非是将 RabbitMQ 用于 RPC 这种必要 超低耽误 的场景,

否则在大多数环境 下,RabbitMQ 的性能都是够用的,可以采用默认的磁盘节点的情势 。

别的 ,假如 节点以磁盘节点的情势 加入,则必要 先利用 reset 下令 举行 重置,然后才能加入现有聚集 ,重置节点会删除该节点上存在的全部 的汗青 资源和数据。

采用内存节点的情势 加入时可以略过 reset 这一步,由于 内存上的数据本身就不是持久化的

3、查看集群状态

此时可以在恣意 节点上利用 rabbitmqctl cluster_status 下令 查看集群状态,输出如下:

  1. [root@node1 ~]# rabbitmqctl cluster_status
  2. Cluster status of node rabbit@node1 ...
  3. Basics
  4. Cluster name: rabbit@node1
  5. Disk Nodes
  6. rabbit@node1
  7. rabbit@node2
  8. rabbit@node3
  9. Running Nodes
  10. rabbit@node1
  11. rabbit@node2
  12. rabbit@node3
  13. Versions
  14. rabbit@node1: RabbitMQ 3.9.3 on Erlang 24.0
  15. rabbit@node2: RabbitMQ 3.9.3 on Erlang 24.0
  16. rabbit@node3: RabbitMQ 3.9.3 on Erlang 24.0
  17. Maintenance status
  18. Node: rabbit@node1, status: not under maintenance
  19. Node: rabbit@node2, status: not under maintenance
  20. Node: rabbit@node3, status: not under maintenance
  21. Alarms
  22. Free disk space alarm on node rabbit@node3
  23. Network Partitions
  24. (none)
  25. Listeners
  26. Node: rabbit@node1, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
  27. Node: rabbit@node1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
  28. Node: rabbit@node1, interface: [::], port: 15672, protocol: http, purpose: HTTP API
  29. Node: rabbit@node2, interface: [::], port: 15672, protocol: http, purpose: HTTP API
  30. Node: rabbit@node2, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
  31. Node: rabbit@node2, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
  32. Node: rabbit@node3, interface: [::], port: 15672, protocol: http, purpose: HTTP API
  33. Node: rabbit@node3, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
  34. Node: rabbit@node3, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
  35. Feature flags
  36. Flag: drop_unroutable_metric, state: enabled
  37. Flag: empty_basic_get_metric, state: enabled
  38. Flag: implicit_default_bindings, state: enabled
  39. Flag: maintenance_mode_status, state: enabled
  40. Flag: quorum_queue, state: enabled
  41. Flag: stream_queue, state: enabled
  42. Flag: user_limits, state: enabled
  43. Flag: virtual_host_metadata, state: enabled
  44. [root@node1 ~]#
复制代码

4、UI 界面查看

在这里插入图片形貌

镜像队列:

1、镜像的设置 是通过 policy 策略的方式,以下令 的方式设置 或 UI界面设置

在这里插入图片形貌

2、参数阐明 :

  • Name:policy的名称
  • Pattern: queue的匹配模式(正则表达式)
  • priority:可选参数,policy的优先级
  • Definition:镜像定义,包括三个部分ha-mode、ha-params、ha-sync-mode
  • ha-mode:指明镜像队列的模式,有用 值为 all/exactly/nodes
  • all:表示在集群中全部 的节点上举行 镜像
  • exactly:表示在指定个数的节点上举行 镜像,节点的个数由ha-params指定
  • nodes:表示在指定的节点上举行 镜像,节点名称通过ha-params指定
  • ha-params:ha-mode模式必要 用到的参数
  • ha-sync-mode:举行 队列中消息的同步方式,有用 值为automatic(自动 )和manual(手动)

3、对队列名称以“queue_”开头的全部 队列举行 镜像,并在集群的两个节点上完成举行 ,policy的设置下令 为:

  1. [root@node1 ~]# rabbitmqctl set_policy ha-queue-two '^queue_' '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
  2. Setting policy "ha-queue-two" for pattern "^queue_" to "{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}" with priority "0" for vhost "/" ...
  3. [root@node1 ~]#
复制代码

4、在恣意 节点(我在node1节点)创建queue_testQueue队列,并查看镜像状态

在这里插入图片形貌

上图Node中的+1表示备份,下图中的Mirrors就是备份的节点,若node1宕机了node3就会代替node1继续提供服务

在这里插入图片形貌

测试:起首 关闭node1节点

在这里插入图片形貌

然后查看node3节点上的镜像状态,发如今 node2节点也举行 了备份,以此阐明 :就算整个集群只剩下一台机器了,依然能斲丧 队列内里 的消息

在这里插入图片形貌

5、复制系数

若ha-mode 的值为 all ,代表消息会被同步到全部 节点的类似 队列中,假如 你的集群有很多节点,那么此时复制的性能开销就比较大,此时必要 选择合适的复制系数。

通常可以遵照 过半写原则,即对于一个节点数为 n 的集群,只必要 同步到 n/2+1 个节点上即可。

6、集群的关闭与重启

没有一个直接的下令 可以关闭整个集群,必要 逐一举行 关闭。但是必要 保证在重启时,末了 关闭的节点开始 被启动。假如 第一个启动的不是末了 关闭的节点,那么这个节点会等待末了 关闭的谁人 节点启动,默认举行 10 次毗连 尝试,超时时间为 30 秒,假如 依然没有等到,则该节点启动失败。

这带来的一个题目 是,假设在一个三节点的集群当中,关闭的次序 为 node1,node2,node3,假如 node1 由于 故障临时 没法恢复,此时 node2 和 node3 就无法启动。想要办理 这个题目 ,可以先将 node1 节点举行 剔除,下令 如下:

  1. rabbitmqctl forget_cluster_node rabbit@node1 --offline
复制代码

此时必要 加上 -offline 参数,它答应 节点在自身没有启动的环境 下将其他节点剔除。

7、清除 集群

重置当前节点:

  1. # 1.停止服务
  2. rabbitmqctl stop_app
  3. # 2.重置集群状态
  4. rabbitmqctl reset
  5. # 3.重启服务
  6. rabbitmqctl start_app
复制代码

重新加入集群:

  1. # 1.停止服务
  2. rabbitmqctl stop_app
  3. # 2.重置状态
  4. rabbitmqctl reset
  5. # 3.节点加入
  6. rabbitmqctl join_cluster rabbit@node1
  7. # 4.重启服务
  8. rabbitmqctl start_app
复制代码

完成后重新检查 RabbitMQ 集群状态:

  1. rabbitmqctl cluster_status
复制代码

除了在当前节点重置集群外,还可在集群其他正常节点将节点踢出集群

  1. rabbitmqctl forget_cluster_node rabbit@node3
复制代码

8、变更节点范例

我们可以将节点的范例 从RAM更改为Disk,反之亦然。假设我们想要反转rabbit@node2和rabbit@node1的范例 ,将前者从RAM节点转换为磁盘节点,而后者从磁盘节点转换为RAM节点。为此,我们可以利用 change_cluster_node_type下令 。必须起首 克制 节点。

  1. # 1.停止服务
  2. rabbitmqctl stop_app
  3. # 2.变更类型 ram disc
  4. rabbitmqctl change_cluster_node_type disc
  5. # 3.重启服务
  6. rabbitmqctl start_app
复制代码

9、扫除 RabbitMQ 节点设置

  1. # 如果遇到不能正常退出直接kill进程
  2. systemctl stop rabbitmq-server
  3. # 查看进程
  4. ps aux|grep rabbitmq
  5. # 清除节点rabbitmq配置
  6. rm -rf /var/lib/rabbitmq/mnesia
复制代码

到此这篇关于深入浅析RabbitMQ镜像集群原理的文章就先容 到这了,更多干系 RabbitMQ镜像集群内容请搜刮 脚本之家从前 的文章或继续欣赏 下面的干系 文章渴望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 我要去2018 | 2021-9-15 22:19:53 | 显示全部楼层
admin楼主的帖子提神醒脑啊!
回复

使用道具 举报

avatar fzny61226 | 2021-9-22 18:02:54 | 显示全部楼层
精神病院在通缉admin楼主!
回复

使用道具 举报

avatar 凡八哥 | 2021-9-26 17:45:31 | 显示全部楼层
admin楼主的病已经好了百分之六十二了!
回复

使用道具 举报

avatar 淡然一笑wwc | 2021-10-3 20:18:30 | 显示全部楼层
admin楼主今年多大了?
回复

使用道具 举报

avatar 疑骨德秋忘 | 2021-10-9 05:09:04 | 显示全部楼层
东方不败还是灭绝师太啊?
回复

使用道具 举报

avatar 韭菜555 | 2021-10-10 05:47:46 | 显示全部楼层
论坛人气好旺!
回复

使用道具 举报

avatar AriesHun | 2021-10-11 12:02:25 | 显示全部楼层
支持一下!
回复

使用道具 举报

avatar 名人堂熊猫虞kk | 2021-10-11 14:35:00 | 显示全部楼层
看了这么多帖子,第一次看到这么高质量内容!
回复

使用道具 举报

avatar 胖胖龙龙灯 | 2021-10-11 15:47:50 | 显示全部楼层
无图无真相!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则