设为首页 收藏本站
查看: 2833|回复: 0

[经验分享] Corosync+Pacemaker实现web集群高可用

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-12-11 09:15:18 | 显示全部楼层 |阅读模式
一、简介
高可用集群结构
wKioL1ZJYMOzDbpfAAIWxH7uKow510.jpg
a.Messaging Layer:信息层,心跳信息传输层。



b.RA(Resource Allocation):资源分配层。该层的核心组件叫CRM。


     1).CRM(Cluster Resources Manager):集群资源管理器,依赖于各自底层的Messaging Layer。高可用集群中任何资源都不应该自行启动,而是由CRM管理启动的,是由CRM做决策的。
     2).ha_aware:如果一个应用程序自己能够利用底层心跳信息传递层的功能完成集群事物决策的过程的软件就叫ha_aware。


     3).DC(Designated Coordinator):指定协调员 ,CRM上必须有一个资源被推举为管理者,它的工作是决策集群中的所有事物,当DC所在的主机挂了就会先选出一个新的DC,再由DC做出事物的决策。
    4).LRM(Local Resource Manager):本地资源管理层,该层是真正去把CRM层的决策去落实的层次。

    5).PE(Policy Engine):策略引擎,决定决策的引擎。所谓策略引擎就是将底层信息层收集的整个集群中所有节点上的信息进行整合,决定策略节点运行在哪个节点上,并通知其它节点上的资源管理器来实现资源的启动和关闭等操作的引擎。

    6).TE(Transition Engine):传输引擎,把PE做出的决策通告给对应节点的CRM的引擎。
    7).CIB(Cluster Information Base):集群信息库,集群信息都是通过XML文件来进行传输的。



c.RA(Resource Agent):资源代理。资源代理就是能够接收CRM的调度,用于实现在节点上对某一资源完成管理的工具,通常是一些脚本。
  
   1).LSB(linux standard base):/etc/init.d/*下的脚本就属于LSB
   2).OCF(Open Cluster Framework): / .isolation heartbeat linbit openstack pacemaker。开放集群架构,那些提供资源代理脚本的组织叫provider,pacemaker、linbit、heartbeat都是provider。
   3).service:一些系统的服务
   4).stonith(Shoot-The-Other-Node-In-The-Head[爆其他节点的头]):在某些情况下,可能会需要关闭节点的电源来保证共享数据的完整性或是完全地恢复资源。为此Pacemaker引入了STONITHd。在Pacemaker中,STONITH设备被当成资源(并且是在CIB中配置)从而轻松地监控,然而STONITHd会注意理解STONITH拓扑,比如它的客户端请求隔离一个节点,它会重启那个机器。
   5).systemd:一些系统的服务


Corosync:
         Corosync是集群管理套件的一部分,它在传递信息的时候可以通过一个简单的配置文件来定义信息传递的方式和协议等,是一组通信系统与附加功能中实现高可用性的应用程序。
官网:http://corosync.github.io/corosync/

Pacemaker:
          Pacemaker是一个集群资源管理器。它利用你喜欢的集群基础构件(OpenAIS 或heartbeat)提供的消息和成员管理能力来探测并从节点或资源级别的故障中恢复,以实现群集服务(亦称资源)的最大可用性。
    它可以做几乎任何规模的集群,并带有一个强大的依赖模式,让管理员能够准确地表达的群集资源之间的关系(包括顺序和位置)。
几乎任何可以编写的脚本,都可以作为管理起搏器集群的一部分。
    尤为重要的是Pacemaker不是一个heartbeat的工具,可能有人存在这样的误解。Pacemaker是一个延续CRM(亦称V2资源管理器)的项目。最初开发的项目是heartbeat,已经成为该项目的子项目。
官网:http://clusterlabs.org/wiki/Get_Pacemaker
官网wiki页:http://clusterlabs.org/wiki/Pacemaker

①Pacemaker本身由四个关键组件组成:
  a.CIB (集群信息基础)
  b.CRMd (集群资源管理守护进程)
  c.PEngine (PE or 策略引擎)
  d.STONITHd
wKioL1ZJXwiB3-BPAAJL4eJf3Pk686.jpg

②Pacemaker集群的种类
Pacemaker对环境没有特定要求,这使得它支持任何的冗余配置,包括 Active/Active, Active/Passive, N+1, N+M, N-to-1 and N-to-N。


Active/Passive冗余:
wKioL1ZJX5LCDgOmAAIBHKMuVmk869.jpg

N to N 冗余:
wKiom1ZJX0OyaxRSAAKhLt-KUrk014.jpg

二、安装

1
2
3
# yum install pacemaker pcs resource-agents   ##corosync作为依赖被安装
# wget -O /etc/yum.repos.d/network:ha-clustering:Stable.repo  http://download.opensuse.org/rep ... stering:Stable.repo        
# yum install pssh crmsh               ##安装pacemaker配置接口crmsh




三、配置corosync
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
# cd /etc/corosync/
# cp corosync.conf.example corosync.conf
# cat /etc/corosync/corosync.conf|grep -v "#"    ##配置主配置文件
totem {          ##图腾,定义集群中各节点的通信及参数
version: 2                   ##用于各节点通信的协议版本
crypto_cipher: none            ##密码:无
crypto_hash: none              ##密钥hash:无
interface {
ringnumber: 0               ##冗余环号,#环号码,集群中有多个节点,每个节点上有多个网卡,别的节点可以接收,同时我们本机的另一块网卡也可以接收,为了避免这些信息在这样的环状发送,因此要为这个网卡定义一个唯一的环号码,以避免心跳信息环发送。
bindnetaddr: 192.168.10.0        ##绑定心跳网段
mcastaddr: 239.255.1.1                ##心跳组播地址
mcastport: 5405                         ##心跳组播使用端口
ttl: 1                        ##表示只向外播一次
}
}
logging {
fileline: off                        ##指定要打印的行
to_stderr: no                         ##是否发送到标准错误输出
to_logfile: yes                           ##是否记录到日志文件
logfile: /var/log/cluster/corosync.log    ##定义日志文件路径
to_syslog: yes                               ##是否记录到系统日志
debug: off                            ##是否启动调试
timestamp: on                       ##是否打印时间戳
logger_subsys {                     ##日志的子系统
subsys: QUORUM
debug: off
}
}
quorum {                               ##法定票数子系统
        provider: corosync_votequorum
        expected_votes: 2  
        two_node: 1
}
service {
         ver: 1                   ##定义版本
         name: pacemaker       ##定义服务名
}
aisexec {                  ##表示启动corosync的ajs功能,以哪个用户的身份允许
         user:  root
         group: root
}
amf {                          ##定义编程接口相关
     mode: disabled
}




四、生成密钥文件key
    对于corosync而言,各节点之间通信需要安全认证,所有需要安全密钥,生成后会自动保存至
当前目录下,命名为authkey,权限为400。生成的密钥文件是1024字节的,但在这个生成密钥的
过程中,系统会调用/etc/random中的随机数,如果没有足够的熵,就是提示让我们狂敲键盘来弥补
随机数的不足,直至生成密钥。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# corosync-keygen
Corosync Cluster Engine Authentication key generator.
Gathering 1024 bits for key from /dev/random.
Press keys on your keyboard to generate entropy.
Press keys on your keyboard to generate entropy (bits = 40).
Press keys on your keyboard to generate entropy (bits = 104).
Press keys on your keyboard to generate entropy (bits = 168).
Press keys on your keyboard to generate entropy (bits = 232).
Press keys on your keyboard to generate entropy (bits = 296).
Press keys on your keyboard to generate entropy (bits = 360).
Press keys on your keyboard to generate entropy (bits = 424).
Press keys on your keyboard to generate entropy (bits = 488).
Press keys on your keyboard to generate entropy (bits = 552).
Press keys on your keyboard to generate entropy (bits = 624).
Press keys on your keyboard to generate entropy (bits = 688).
Press keys on your keyboard to generate entropy (bits = 752).
Press keys on your keyboard to generate entropy (bits = 816).
Press keys on your keyboard to generate entropy (bits = 888).
Press keys on your keyboard to generate entropy (bits = 952).
Press keys on your keyboard to generate entropy (bits = 1016).
Writing corosync key to /etc/corosync/authkey.




五、配置互信
①互信配置
HA-01:
1
2
# ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.10.133



HA-02::
1
2
# ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.10.132





②更改hosts
1
2
3
# cat /etc/hosts
192.168.10.132  node1
192.168.10.133  node2






③复制配置至其他节点并启用
1
2
3
4
5
# scp -p corosync.conf authkey root@node2:/etc/corosync/
# systemctl start pacemaker               ##开启pacemaker自动开启corosync
# systemctl status corosync
# systemctl status pacemaker
# ssh node2 -- systemctl start pacemaker




六、配置pacemaker
①禁用stonith
      corosync默认启用了stonith功能,而我们要配置的集群并没有stonith设备,因此在配置集群的全局属性时要对其禁用。
方法1:
1
2
3
4
5
6
7
8
9
10
11
12
13
# crm
crm(live)# configure                                 ##进入配置模式
crm(live)configure# property stonith-enabled=false     ##禁用stonith
crm(live)configure# verify                            ##校验
crm(live)configure# commit                             ##校验没有错误再提交
crm(live)configure# show                             ##查看当前配置
node 3232238212: node1
node 3232238213: node2
property cib-bootstrap-options: \
have-watchdog=false \
dc-version=1.1.13-a14efad \
cluster-infrastructure=corosync \
stonith-enabled=false



方法2:
1
# crm configure property stonith-enabled=false




②定义法定票数不够时应该做忽略操作
      法定票数(quorum, 票数>半数票数的集群成为满足法定票数)是为了避免集群分裂而出现的。在集群通信故障时,为了避免资源抢占,所以进行投票操作,只有具有法定票数的一方才有资格做为集群,不满足的一方就应该退出集群,但它放弃后并不代表服务停止,所以应该让其释放资源,关闭电源。stonith设备的用处就在于此。
方法1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# crm   
crm(live)# configure                                   
crm(live)configure# property no-quorum-policy=ignore
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# show
node 3232238212: node1
node 3232238213: node2
property cib-bootstrap-options: \
have-watchdog=false \
dc-version=1.1.13-a14efad \
cluster-infrastructure=corosync \
stonith-enabled=false \
no-quorum-policy=ignore



方法2:
1
# crm configure property no-quorum-policy=ignore




③防止资源在节点恢复后移动
    故障发生时,资源会迁移到正常节点上,但当故障节点恢复后,资源可能再次回到原来节点,
这在有些情况下并非是最好的策略,因为资源的迁移是有停机时间的,特别是一些复杂的应用。为了避免这种情况,可以根据需要,使用资源粘性策略。
方法1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# crm
crm(live)# configure
crm(live)configure# rsc_defaults resource-stickiness=100     ##设置资源粘性为100
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# show
node 3232238212: node1
node 3232238213: node2
property cib-bootstrap-options: \
have-watchdog=false \
dc-version=1.1.13-a14efad \
cluster-infrastructure=corosync \
stonith-enabled=false \
no-quorum-policy=ignore
rsc_defaults rsc-options: \
resource-stickiness=100



方法2:
1
# crm configure rsc_defaults resource-stickiness=100




④资源黏性值范围及其作用:
  0:默认选项。资源放置在系统中的最适合位置。这意味着当负载能力“较好”或较差的节点
变得可用时才转移资源。此选项的作用基本等同于自动故障回复,只是资源可能会转移到非之前活动的节点上;
  大于0:资源更愿意留在当前位置,但是如果有更合适的节点可用时会移动。值越高表示资源
越愿意留在当前位置;
    小于0:资源更愿意移离当前位置。绝对值越高表示资源越愿意离开当前位置;
    INFINITY:如果不是因节点不适合运行资源(节点关机、节点待机、达到migration-threshold或配置更改)而强制资源转移,资源总是留在当前位置。此选项的作用几乎等同于完全禁用自动故障回复;   
    -INFINITY:资源总是移离当前位置.
1
2
3
4
5
6
# crm status                           ##查看集群状态(初始,未配置)
Last updated: Mon Nov 16 15:03:25 2015        Last change: Mon Nov 16 15:01:16 2015 by root via cibadmin on node1
Stack: corosync
Current DC: node1 (version 1.1.13-a14efad) - partition with quorum
2 nodes and 0 resources configured
Online: [ node1 node2 ]




从集群状态信息中可以看到,节点node1和node2都在线,node1是DC且拥有法定票数,但是0 Rewources configured,集群中没有任何资源,所以接下来的任务就是使用pacemaker配置资源。


⑤配置资源

a.查看当前集群所支持的RA类型列表
1
2
3
4
5
6
7
8
9
10
11
12
13
# crm
crm(live)# ra                          ##进入RA(资源代理配置)模式
crm(live)ra# ?
classes        List classes and providers        ##查看RA类型
info           Show meta data for a RA               ##查看RA详细信息
list           List RA for a class (and provider)   ##查看指定类型(或提供商)的RA
providers      Show providers for a RA and a class   ##查看指定资源的提供商或类型
crm(live)ra# classes                     ##查看当前集群支持的RA类型
lsb
ocf / .isolation heartbeat linbit openstack pacemaker
service
stonith
systemd




b.查看某种类别下的所有资源代理的列表
1
2
3
4
5
# crm
crm(live)# ra
crm(live)ra# list lsb            ##注:/etc/init.d/*下的脚本就属于LSB
crm(live)ra# list ocf heartbeat
crm(live)ra# list ocf pacemaker





c.查看代理信息
格式:
1
# crm ra info [class:[provider:]]resource_agent



例子:
1
# crm(live)ra# info ocf:heartbeat:IPaddr




d.为集群创建IP地址资源
webip是要实现转移的,目的是为了实现一个节点出现故障时,webip可以转移到另一台备用服务器,
以实现web服务器高可用。
1
2
3
4
5
6
7
8
9
10
11
12
13
# crm
crm(live)# configure
crm(live)configure# primitive myip ocf:heartbeat:IPaddr params ip=192.168.10.222 op monitor interval=30s timeout=20s on-fail=restart
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# cd
crm(live)# status                       ##查看集群状态
Last updated: Mon Nov 16 15:03:25 2015        Last change: Mon Nov 16 15:01:16 2015 by root via cibadmin on node1
Stack: corosync
Current DC: node1 (version 1.1.13-a14efad) - partition with quorum
2 nodes and 1 resource configured
Online: [ node1 node2 ]
myip(ocf::heartbeat:IPaddr):Started node1     ##资源myip运行在node1上



注:
primitive:定义资源命令
myip:资源ID名,可自行定义
ocf:heartbeat:IPaddr:资源代理(RA)
params ip=192.168.10.222:定义VIP
op monitor:监控该资源
interval=30s:间隔时间
timeout=20s:超时时间
on-fail=restart:如服务非正常关闭,让其重启,如重启不了,再转移至其他节点

查看资源是否生效
1
# ip addr



wKiom1ZJdqWxIt4SAABSZj8xXps359.jpg

七、配置httpd并测试
①安装
1
2
# yum install httpd
# ssh node2 -- yum install httpd




②配置index.html
node1:
1
# echo "<h1>Web in node1<h1>">> /var/www/html/index.html



node2:
1
# echo "<h1>Web in node2<h1>">> /var/www/html/index.html




③配置httpd资源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# crm
crm(live)# configure
crm(live)configure# primitive WebSite ocf:heartbeat:apache params configfile=/etc/httpd/conf/httpd.conf op monitor op start timeout=60 op stop timeout=60
crm(live)configure# verify
crm(live)configure# commit
crm(live)# status
Last updated: Mon Nov 16 15:09:26 2015        Last change: Mon Nov 16 15:01:16 2015 by root via cibadmin on node1
Stack: corosync
Current DC: node1 (version 1.1.13-a14efad) - partition with quorum
2 nodes and 2 resources configured

Online: [ node1 node2 ]

myip  (ocf::heartbeat:IPaddr):    Started node1
WebSite   (ocf::heartbeat:apache):    Started node2



myip资源运行在node1,而WebSite资源则运行在node2上,因此我们要确保资源在同一节点运行。

注:
primitive:定义资源命令
WebSite:资源ID
ocf:heartbeat:apache:资源代理(RA)
op monitor :对此资源进行监控
op start timeout=60:启动超时时间
op stop timeout=60:停止超时时间


④确保资源在同一节点运行
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
# crm
crm(live)# configure
crm(live)configure# colocation website-with-ip inf: WebSite myip
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# show
node 3232238212: node1
node 3232238213: node2
primitive WebSite apache \
        params configfile="/etc/httpd/conf/httpd.conf" \
        op monitor interval=0 \
        op start timeout=60 interval=0 \
        op stop timeout=60 interval=0
primitive myip IPaddr \
        params ip=192.168.10.222 \
        op monitor interval=30s timeout=20s on-fail=restart
colocation website-with-ip inf: WebSite myip
property cib-bootstrap-options: \
        have-watchdog=false \
        dc-version=1.1.13-a14efad \
        cluster-infrastructure=corosync \
        stonith-enabled=false \
        no-quorum-policy=ignore \
rsc_defaults rsc-options: \
        resource-stickiness=100



注:
colocation:排列约束
website-with-ip:约束ID

inf:资源黏性


⑤控制资源的启动停止顺序
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
# crm
crm(live)# configure
crm(live)configure# order apache-after-ip mandatory: myip WebSite
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# show
node 3232238212: node1
node 3232238213: node2
primitive WebSite apache \
        params configfile="/etc/httpd/conf/httpd.conf" \
        op monitor interval=0 \
        op start timeout=60 interval=0 \
        op stop timeout=60 interval=0
primitive myip IPaddr \
        params ip=192.168.10.222 \
        op monitor interval=30s timeout=20s on-fail=restart
colocation website-with-ip inf: WebSite myip
order apache-after-ip Mandatory: myip WebSite
property cib-bootstrap-options: \
        have-watchdog=false \
        dc-version=1.1.13-a14efad \
        cluster-infrastructure=corosync \
        stonith-enabled=false \
        no-quorum-policy=ignore \
        last-lrm-refresh=1447658335
rsc_defaults rsc-options: \
        resource-stickiness=100



注:
order:顺序约束
apache-after-ip:约束ID
mandatory: 指定级别(三种级别:mandatory,强制;optional,可选;serialize,序列化)


⑥测试


a).查看资源运行状况

1
2
3
4
5
6
7
8
9
# crm status
Last updated: Mon Nov 16 16:11:26 2015Last change: Mon Nov 16 16:11:18 2015 by root via crm_attribute on node2
Stack: corosync
Current DC: node1 (version 1.1.13-a14efad) - partition with quorum
2 nodes and 2 resources configured
Node node2: standby
Online: [ node1 ]
myip(ocf::heartbeat:IPaddr):Started node1
WebSite(ocf::heartbeat:apache):Started node1



wKioL1ZJkmOif4K-AAAlLqJ498g114.jpg
wKioL1ZJkery3AEdAAA4cdNiJEU077.jpg
此时资源运行在node1上

b).进行故障转移
node1:
1
2
3
4
5
6
7
8
9
10
# crm node standby               ##将node1下线
# crm status
Last updated: Mon Nov 16 16:23:31 2015Last change: Mon Nov 16 16:23:22 2015 by root via crm_attribute on node1
Stack: corosync
Current DC: node1 (version 1.1.13-a14efad) - partition with quorum
2 nodes and 2 resources configured
Node node1: standby
Online: [ node2 ]
myip(ocf::heartbeat:IPaddr):Started node2
WebSite(ocf::heartbeat:apache):Started node2



此时资源myip和WebSite已运行在node2上。


node2:
wKiom1ZJlkSRCmJyAAAuesse7XQ615.jpg
1
2
3
4
5
6
7
8
9
# crm status
Last updated: Mon Nov 16 16:40:03 2015Last change: Mon Nov 16 16:38:37 2015 by root via crm_attribute on node1
Stack: corosync
Current DC: node1 (version 1.1.13-a14efad) - partition with quorum
2 nodes and 2 resources configured
Node node1: standby
Online: [ node2 ]
myip(ocf::heartbeat:IPaddr):Started node2
WebSite(ocf::heartbeat:apache):Started node2



wKioL1ZJlOmCoRbEAAA6y19RBTE964.jpg
已转移至node2

c).恢复节点
1
2
3
4
5
6
7
8
9
# crm node online            ##上线节点
# crm status
Last updated: Mon Nov 16 16:43:33 2015Last change: Mon Nov 16 16:41:26 2015 by root via crm_attribute on node1
Stack: corosync
Current DC: node1 (version 1.1.13-a14efad) - partition with quorum
2 nodes and 2 resources configured
Online: [ node1 node2 ]
myip(ocf::heartbeat:IPaddr):Started node2
WebSite(ocf::heartbeat:apache):Started node2



资源依然运行在node2上

:corosync命令
①语法

corosync-cfgtool [-i <interface ip>] -s] [-r] [-H] [service_name] [-k] [nodeid] [-a] [nodeid]
-s:显示当前节点信息
-a:显示指定节点IP地址
-k:根据node id来杀死某个节点
-R:重载corosync.conf配置文件
-H:关闭当前节点的corosync服务


②示例
1
2
3
4
5
6
7
8
# corosync-cfgtool -s      ##显示当前节点信息
Printing ring status.
Local node ID -1062729084
RING ID 0
id= 192.168.10.132
status= ring 0 active with no faults
# corosync-cfgtool -a node1             ##显示指定节点IP地址
192.168.10.132






运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-149492-1-1.html 上篇帖子: pdsh、ClusterSSH和mussh集群管理软件 下篇帖子: ha集群的安装部署
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表