当前位置: 首页 > news >正文

做我男朋友的网站深圳优化公司

做我男朋友的网站,深圳优化公司,携程网网站推广方式,建设企业银行官方网站前言#xff1a; 前面整理了hadoop概念内容#xff0c;写了一些概念和本地部署和伪分布式两种#xff0c;比较偏向概念或实验#xff0c;今天来整理一下在项目中实际使用的一些知识点。 1、基础概念 1.1、完全分布式 Hadoop是一个开源的分布式存储和计算框架#xff0…前言 前面整理了hadoop概念内容写了一些概念和本地部署和伪分布式两种比较偏向概念或实验今天来整理一下在项目中实际使用的一些知识点。 1、基础概念 1.1、完全分布式 Hadoop是一个开源的分布式存储和计算框架主要用于处理大规模数据集。完全分布式是指Hadoop集群中的所有节点都担任特定角色包括数据存储节点DataNode、计算节点TaskTracker和主控节点NameNode和JobTracker。在完全分布式架构中数据被分散存储在多个数据节点上同时计算任务也可以分发到不同的计算节点上并行执行从而实现高性能的数据处理能力。完全分布式架构还具备高可靠性因为数据会被复制到多个节点上一旦某个节点发生故障数据仍然可通过其他节点获取。 Hadoop的完全分布式架构使其成为处理大规模数据的理想选择能够提供高性能、高可靠性和高扩展性。 特点 高可靠性数据被复制到多个节点即使某个节点发生故障数据仍然可用。高扩展性可以简单地通过增加节点来扩展集群的处理能力。并行处理能够将计算任务分发到多个节点上并行执行加快数据处理速度。分布式存储数据被分散存储在多个节点上避免了单点故障。 大概是下面这个意思 可以把Hadoop的完全分布式特点形象地比喻为这座工厂的运作方式。 在这座工厂中原材料被分散储存在不同的仓库里。 生产线上的每台机器都能够独立地进行加工和生产。 即使某个仓库出现问题或者某台机器需要维修整个工厂的生产仍然可以继续进行因为其他仓库和机器仍然可以独立运作。这种分布式的生产方式使得工厂具有高可靠性和高效率能够应对各种突发情况并保持持续的生产能力。 1.2、HA高可用 HAHigh Availability高可用性是系统能够在不间断地提供服务的情况下解决硬件故障、软件故障等各种问题让用户始终能够正常地使用系统。在Hadoop中HA主要指的是NameNode节点和ResourceManager节点的高可用。 对于NameNode节点Hadoop通过运行两个或多个NameNode节点来实现故障转移保证HDFS的高可用性。常见的实现方式包括Active-Standby模式和Active-Active模式确保在一个NameNode出现故障时能够无缝切换到其他节点维持系统连续性和可用性。 对于ResourceManager节点在YARN中实现RMHA同样采用Active-Standby模式或Active-Active模式以确保整个YARN集群在ResourceManager节点发生故障时能够自动切换并保持应用程序的正常执行和集群资源的有效利用。 datanamehe和nodemanager本身就是高可用的使用默认配置即可 hadoop HA是2.0版本后新添加的特性在Hadoop 1.x 中Namenode是集群的单点故障一旦Namenode出现故障整个集群将不可用重启或者开启一个新的Namenode才能够从中恢复。值得一提的是Secondary Namenode并没有提供故障转移的能力。集群的可用性受到影响表现在         当机器发生故障如断电时管理员必须重启Namenode才能恢复可用。 在日常的维护升级中需要停止Namenode也会导致集群一段时间不可用。 1.3、NameNode HA实现方法 1.    元数据管理方式需要改变 内存中各自保存一份元数据 Edits日志只有Active状态的NameNode节点可以做写操作 两个NameNode都可以读取Edits 共享的Edits放在一个共享存储中管理qjournal和NFS两个主流实现 2.    需要一个状态管理功能模块 实现了一个zkfailover常驻在每一个namenode所在的节点每一个zkfailover负责监控自己所在NameNode节点利用zk进行状态标识当需要进行状态切换时由zkfailover来负责切换切换时需要防止brain split脑裂现象的发生。 3.    必须保证两个NameNode之间能够ssh无密码登录 4.    隔离Fence即同一时刻仅仅有一个NameNode对外提供服务 HDFS-HA自动故障转移工作机制(下面红字更形象一些): 下面如何配置部署HA自动进行故障转移。自动故障转移为HDFS部署增加了两个新组件ZooKeeper和ZKFailoverControllerZKFC进程ZooKeeper是维护少量协调数据通知客户端这些数据的改变和监视客户端故障的高可用服务。HA的自动故障转移依赖于ZooKeeper的以下功能 1故障检测集群中的每个NameNode在ZooKeeper中维护了一个持久会话如果机器崩溃ZooKeeper中的会话将终止ZooKeeper通知另一个NameNode需要触发故障转移。 2现役NameNode选择ZooKeeper提供了一个简单的机制用于唯一的选择一个节点为active状态。如果目前现役NameNode崩溃另一个节点可能从ZooKeeper获得特殊的排外锁以表明它应该成为现役NameNode。 ZKFC是自动故障转移中的另一个新组件是ZooKeeper的客户端也监视和管理NameNode的状态。每个运行NameNode的主机也运行了一个ZKFC进程。 ZKFC负责 1健康监测ZKFC使用一个健康检查命令定期地ping与之在相同主机的NameNode只要该NameNode及时地回复健康状态ZKFC认为该节点是健康的。如果该节点崩溃冻结或进入不健康状态健康监测器标识该节点为非健康的。 2ZooKeeper会话管理当本地NameNode是健康的ZKFC保持一个在ZooKeeper中打开的会话。如果本地NameNode处于active状态ZKFC也保持一个特殊的znode锁该锁使用了ZooKeeper对短暂节点的支持如果会话终止锁节点将自动删除。 3基于ZooKeeper的选择如果本地NameNode是健康的且ZKFC发现没有其它的节点当前持有znode锁它将为自己获取该锁。如果成功则它已经赢得了选择并负责运行故障转移进程以使它的本地NameNode为Active。故障转移进程与前面描述的手动故障转移相似首先如果必要保护之前的现役NameNode然后本地NameNode转换为Active状态。 下面是一个形象的解释 想象一下你有一个家庭电器系统其中有两个主要的电源控制盒分别是A和B。每个电源控制盒都能够提供电力给整个家庭。但是你希望始终有一个电源控制盒处于活动状态以确保家庭电器的连续供电。 在这个例子中家庭电器系统的两个电源控制盒就类似于Hadoop集群中的两个NameNode节点在HA模式下工作。而ZKFC则扮演着一个类似于管理电源切换的角色。 现在我们引入ZooKeeper它就像是一个智能的电源监控器。ZooKeeper负责监视两个电源控制盒的状态并确保只有一个电源控制盒处于活动状态。 具体地ZooKeeper通过与所有电源控制盒进行通信监控它们的健康状况。如果某个电源控制盒发生故障或无法正常工作ZooKeeper会接收到相应的消息并发出警报。然后ZooKeeper会与其他正常工作的电源控制盒协商并最终选择一个新的活动电源控制盒。 ZooKeeper使用共享的存储来存储集群中的状态信息类似于记录电源控制盒的状态和切换信息的日志。这样当电源控制盒发生故障时新的活动电源控制盒可以从共享的存储中获取最新的状态信息并继续提供服务。 通过ZooKeeper的运行方式Hadoop集群中的NameNode HA机制得以实现。ZKFC作为ZooKeeper的客户端通过监控NameNode的健康状态并协调故障转移过程确保在NameNode发生故障时能够自动切换到备用的NameNode节点从而保证Hadoop集群的高可用性和数据的一致性。 1.4、NameNode HA数据共享方法 在Hadoop分布式文件系统HDFS中fsimage和editlog是两个关键的元数据文件用于存储文件系统的状态和变更记录。 fsimage文件系统镜像     fsimage是HDFS中的静态映像文件它记录了整个文件系统的命名空间和文件块的映射关系。fsimage文件包含了文件和目录的元数据信息如文件路径、权限、属性等以及每个文件块所在的数据节点等信息。fsimage文件在NameNode启动时加载到内存中用于恢复文件系统的初始状态。 editlog编辑日志     editlog是HDFS中的动态日志文件它记录了对文件系统的所有修改操作。每当有文件创建、重命名、删除或修改时对应的编辑操作都会被追加到editlog中。editlog文件按照顺序记录这些修改操作它是一个追加写入的日志文件不支持修改或删除已写入的记录。通过读取和应用editlog中的操作记录可以将文件系统从初始状态fsimage逐步恢复到当前状态。 具体的工作流程如下 当HDFS启动时NameNode首先加载fsimage文件到内存将文件系统恢复到最近一次保存的状态。NameNode开始读取editlog文件并将其中的操作逐个应用到内存中的文件系统状态以更新文件系统的元数据信息。在正常运行期间每当有文件系统的修改操作发生对应的操作会被追加到editlog文件确保数据的持久化和可恢复性。定期或手动触发的检查点操作会将当前的内存中的文件系统状态保存为新的fsimage文件并清空旧的editlog文件从而限制editlog的大小并加速恢复过程。 通过fsimage和editlog的结合使用HDFS能够实现高效的元数据管理和快速的系统恢复能力保证了文件系统的可靠性和可用性。 类似于mysql的binlog和中继日志的结合体 补充一下 JournalNode和editlog JournalNode负责存储NameNode的编辑日志editlog。当NameNode接收到文件系统的修改操作时会将这些操作写入本地的editlog文件并通过JournalNode进行复制。这样即使某个JournalNode节点发生故障其他正常运行的JournalNode节点仍然可以提供服务。而且如果某个JournalNode节点丢失了数据例如节点损坏其他节点上的数据副本可以被用来进行数据恢复JournalNode可以运行在每一个 dn节点 1.5、zookeeper ZooKeeper 是一个开源的分布式协调服务可以用于构建可靠的分布式系统。它提供了一个简单且高效的分布式协调基础用于协调和管理分布式应用程序的配置、命名服务、分布式锁、分布式队列等。 ZooKeeper 的主要作用如下 配置管理ZooKeeper 可以存储和管理分布式系统的配置信息应用程序可以通过监听 ZooKeeper 上的配置节点来感知配置的变化并做出相应的调整。 命名服务ZooKeeper 提供了一个层次化的命名空间应用程序可以在其中创建和维护有序的节点结构用于表示命名服务例如存储集群中各个节点的地址或其他重要信息。 分布式锁ZooKeeper 提供了分布式锁的实现多个进程可以使用 ZooKeeper 来协调访问共享资源的顺序从而实现分布式锁。 分布式队列ZooKeeper 的顺序节点特性可以用于实现分布式队列多个进程可以将数据写入 ZooKeeper 上的顺序节点然后按照节点的顺序读取数据实现简单的消息队列。 集群管理ZooKeeper 可以用于监控和管理分布式系统中各个节点的状态检测节点的故障并进行故障恢复从而提高系统的可用性和稳定性。 总之ZooKeeper 提供了一种可靠的分布式协调机制帮助开发人员构建可靠、高效、分布式的应用程序并解决分布式系统中的一致性、协调和管理问题。 zookeeper集群中服务器角色划分 角色描述领导者leader领导者负责投票的发起和决议更新系统状态学习者learner跟随者followerFollower 用于接收客户端请求并向客户端返回结果在选主过程中参与投票观察者observerObserver可以接收客户端连接它不参与 Leader 选举过程相反Observer 只同步 Leader 的状态以便能够更快地响应客户端的读请求。Observer 节点通常用于扩展集群的读能力而不会增加集群的写负载。客户端client请求发起方 1.6、个人总结部分 HA的必要性是做什么的HA实现 每一个node上部署zkfc监控NN状态 zookeeper参与选举至少三个节点必须是单数HA数据交换方法 通过journalnode进行交换“快照”保存在 fsimage操作保存在editlog恢复时先恢复快照再加载操作 2、部署规划 2.1、网络环境 ip角色所需软件192.168.189.137 NameNode ZKFC hd1 jdk hadoop2 192.168.189.138 NameNode ZKFC hd2 jdk hadoop2 192.168.189.139 ResourceManager hd3 jdk hadoop2 192.168.189.140 DataNode NodeManager JournalNode(数据交换用) QuorrumPeerMain(选举zookeeper) hd4 jdk hadoop2 zookeeper3.4 192.168.189.141 DataNode NodeManager JournalNode(数据交换用) QuorrumPeerMain(选举zookeeper) hd5 jdk hadoop2 zookeeper3.4 192.168.189.142 DataNode NodeManager JournalNode(数据交换用) QuorrumPeerMain(选举zookeeper) hd6 jdk hadoop2 zookeeper3.4  基础网络环境需要配置静态ip主机名域名解析ssh免密登录配置方式 2.2、jdk部署 [roothd1 ~]# tar xf jdk-8u202-linux-x64.tar.gz [roothd1 ~]# mv jdk1.8.0_202 /usr/local/jdk [roothd1 ~]# vim /etc/profile 2.3、zookeeper部署 hd{4..6}上安装zookeeper zookeeper下载地址 [roothd4 ~]# tar xf apache-zookeeper-3.7.2-bin.tar.gz [roothd4 ~]# ls anaconda-ks.cfg apache-zookeeper-3.7.2-bin apache-zookeeper-3.7.2-bin.tar.gz hadoop-2.10.2.tar.gz jdk-8u202-linux-x64.tar.gz mysql80-community-release-el9-5.noarch.rpm [roothd4 ~]# mv apache-zookeeper-3.7.2-bin /usr/local/zookeeper [roothd4 ~]# cd /usr/local/zookeeper/ [roothd4 zookeeper]# ls bin docs LICENSE.txt README.md conf lib NOTICE.txt README_packaging.md [roothd4 zookeeper]# cd conf/ [roothd4 conf]# ls configuration.xsl log4j.properties zoo_sample.cfg [roothd4 conf]# cp zoo_sample.cfg zoo.cfg [roothd4 conf]# vim zoo.cfg [roothd4 conf]# vim zoo.cfg # The number of milliseconds of each tick tickTime2000 # The number of ticks that the initial # synchronization phase can take initLimit10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir/opt/data dataLogDir/opt/data/log # the port at which the clients will connect clientPort2181server.1hd4:2888:3888 server.2hd5:2888:3888 server.3hd6:2888:3888保存退出向本机写入zookeeper的id编号 [roothd4 conf]# mkdir /opt/data [roothd4 conf]# echo 1 /opt/data/myid#hd4写1hd5写2以此类推 这里直接使用scp将已配置的zookeeper拷贝到hd5与hd6里面 [roothd4 ~]# scp -r /usr/local/zookeeper hd6:/usr/local 修改/etc/profile文件添加zookeeper export JAVA_HOME/usr/local/jdk export HADOOP_HOME/opt/hadoop export ZOOKEEPER_HOME/usr/local/zookeeper export PATH${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${ZOOKEEPER_HOME}/bin:$PATH这里直接使用scp将已配置的环境变量拷贝到hd5与hd6里面 [roothd4 bin]# scp /etc/profile hd5:/etc/profile profile 100% 2083 2.0MB/s 00:00 [roothd4 bin]# scp /etc/profile hd6:/etc/profile profile 100% 2083 1.2MB/s 00:00 source应用一下三个环境变量启动三台服务器的zookeeper [roothd4 ~]# zkServer.sh start ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Starting zookeeper ... STARTED 查看zookeeper状态 hd4:[roothd4 data]# zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Client port found: 2181. Client address: localhost. Client SSL: false. Mode: followerhd5:[roothd5 ~]# zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Client port found: 2181. Client address: localhost. Client SSL: false. Mode: leaderhd6:[roothd6 ~]# zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Client port found: 2181. Client address: localhost. Client SSL: false. Mode: follower 2.4、Hadoop部署 参考上一篇文章需要注意的是同步变量文件时需要保证前面配置的zookeeper变量不要受到影响同时添加hadoop的/sbin目录 hd{4..6} export JAVA_HOME/usr/local/jdk export HADOOP_HOME/opt/hadoop export ZOOKEEPER_HOME/usr/local/zookeeper export PATH${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:${ZOOKEEPER_HOME}/bin:$PATHhd{1..3} export JAVA_HOME/usr/local/jdk export HADOOP_HOME/opt/hadoop export PATH${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH3、完全分布式配置文件修改 3.1、hadoop-env.sh [roothd1 ~]# cd /opt/hadoop/etc/hadoop/ [roothd1 hadoop]# vim hadoop-env.sh export JAVA_HOME/usr/local/jdk#此处建议修改为路径模式原为变量模式启动可能报错 3.2、core-site.xml configuration!-- 指定hdfs的nameservice为ns1 --propertynamefs.defaultFS/namevaluehdfs://ns1/value/property!-- 指定hadoop临时目录 --propertynamehadoop.tmp.dir/namevalue/opt/data/tmp/value/property!-- 作为zookeeper客户端指定zookeeper地址 --propertynameha.zookeeper.quorum/namevalueha4:2181,hd5:2181,hd6:2181/value/property/configuration3.3、hdfs-site.xml configuration!-- 指定hdfs的nameservice为ns1需要和core-site.xml中保持一致 --propertynamedfs.nameservices/namevaluens1/value/property!-- ns1里面有两个namenode分别是nn1,nn2 --propertynamedfs.ha.namenodes.ns1/namevaluenn1,nn2/value/property!-- nn1的RPC通信地址 --propertynamedfs.namenode.rpc-address.ns1.nn1/namevaluehd1:9000/value/property!-- nn1的http通信地址 --propertynamedfs.namenode.http-address.ns1.nn1/namevaluehd1:50070/value/property!-- nn2的RPC通信地址 --propertynamedfs.namenode.rpc-address.ns1.nn2/namevaluehd2:9000/value/property!-- nn2的http通信地址 --propertynamedfs.namenode.http-address.ns1.nn2/namevaluehd2:50070/value/property!-- 指定namenode的元数据在journalnode上的存放位置 --propertynamedfs.namenode.shared.edits.dir/namevalueqjournal://hd4:8485;hd5:8485;hd6:8485/ns1/value/property!-- 指定journalnode在本地磁盘存放数据的位置 --propertynamedfs.journalnode.edits.dir/namevalue/opt/data/journal/value/property!-- 开启namenode失败自动切换 --propertynamedfs.ha.automatic-failover.enabled/namevaluetrue/value/property!-- 配置失败自动切换实现方式 --propertynamedfs.client.failover.proxy.provider.ns1/namevalueorg.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider/value/property!-- 配置隔离机制 --propertynamedfs.ha.fencing.methods/namevaluesshfence/value/property!-- 使用隔离机制时需要ssh免登录 --propertynamedfs.ha.fencing.ssh.private-key-files/namevalue/root/.ssh/id_rsa/value/property/configuration3.4、slaves 配置datanode节点的记录文件 [roothd1 hadoop]# vim slaves 清空原文件内容写入三个节点名 hd4 hd5 hd6 3.5、mapred-site.xml configuration!-- 指定mr框架为yarn方式 --propertynamemapreduce.framework.name/namevalueyarn/value/property/configuration3.6、yarn-site.xml configuration!-- 指定resourcemanager地址 --propertynameyarn.resourcemanager.hostname/namevaluehd3/value/property!-- 指定nodemanager启动时加载server的方式为shuffle server --propertynameyarn.nodemanager.aux-services/namevaluemapreduce_shuffle/value/property!-- Site specific YARN configuration properties --/configuration3.7、mapred-env.sh export JAVA_HOME/usr/local/jdk 3.8、yarn-env.sh export JAVA_HOME/usr/local/jdk 3.9、统一配置 使用for循环将配置好的文件分发到所有节点 for i in hd{2..6} do scp -r /opt/hadoop $i:/opt done 4、启动集群 4.1、在datanode节点3台启动zookeeper [roothd5 ~]# zkServer.sh start ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Starting zookeeper ... STARTED#所有zookeeper启动后检查启动状态 [roothd5 ~]# zkServer.sh status#使用jps可以看到选举进程 [roothd4 ~]# jps1804 QuorumPeerMain4.2、启动journalnode 在namenode上操作例如hd1 [roothd1 ~]# hadoop-daemons.sh start journalnode hd4: starting journalnode, logging to /opt/hadoop/logs/hadoop-root-journalnode-hd4.out hd5: starting journalnode, logging to /opt/hadoop/logs/hadoop-root-journalnode-hd5.out hd6: starting journalnode, logging to /opt/hadoop/logs/hadoop-root-journalnode-hd6.out在hd4上查看可以看到如下图所示 使用jps可以看到守护进程启动 [roothd4 ~]# jps 1804 QuorumPeerMain 1965 JournalNode 2047 Jps 4.3、格式化hdfs文件系统 在namenode上操作例如hd1 [roothd1 ~]# hdfs namenode -format 然后将临时文件夹拷贝到nn2 [roothd1 hadoop]# scp -r /opt/data hd2:/opt4.4、格式化zk 在namenode上操作例如hd1 注意最后的ZK为大写写错后不产生报错但是会影响后续运行 [roothd1 hadoop]# hdfs zkfc -formatZK 4.5、启动hdfs 在namenode上操作例如hd1 [roothd1 hadoop]# start-dfs.sh hd1,hd2如下所示 [roothd2 ~]# jps 2100 Jps 1724 NameNode 2029 DFSZKFailoverControllerhd3 [roothd3 ~]# jps 1673 Jpshd4,5,6 [roothd6 ~]# jps 2118 Jps 1611 QuorumPeerMain 1916 DataNode 1726 JournalNode4.6、启动yarn 在nodename上操作例如想让hd3成为resourcemanager则在hd3上启动 [roothd3 ~]# start-yarn.sh下面按照需求输入yes执行操作 hd3 [roothd3 ~]# jps 2112 Jps 1719 ResourceManager hd4,5,6 [roothd4 ~]# jps 1911 DataNode 1609 QuorumPeerMain 2393 Jps 2171 NodeManager 1725 JournalNode 5、集群验证及使用 5.1、操作步骤 [roothd1 ~]# vim test.txt [roothd1 ~]# cat test.txt tom jerry tom tom tom jerry spike spike #。。。。。。部分略。。。。。。。。。[roothd1 ~]# hdfs dfs -ls / [roothd1 ~]# hdfs dfs -mkdir /input [roothd1 ~]# hdfs dfs -ls / Found 1 items drwxr-xr-x - root supergroup 0 2024-05-23 20:06 /input [roothd1 ~]# hdfs dfs -put test.txt /input [roothd1 ~]# hdfs dfs -ls /input Found 1 items -rw-r--r-- 3 root supergroup 167 2024-05-23 20:07 /input/test.txt[roothd1 ~]# yarn jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.2.jar wordcount /input /output/00 #输出信息略[roothd1 ~]# hdfs dfs -ls /output/00 Found 2 items -rw-r--r-- 3 root supergroup 0 2024-05-23 20:10 /output/00/_SUCCESS -rw-r--r-- 3 root supergroup 139 2024-05-23 20:10 /output/00/part-r-00000 [roothd1 ~]# hdfs dfs -cat /output/00/part-r-00000 10.0.0.0 1 126.0.0.0 1 127.0.0.1 1 128.0.0.0 1 191.255.0.0 1 192.0.0.0 1 192.168.1.1 2 192.168.2.1 1 233.255.255.0 1 jerry 2 spike 2 tom 8 5.2、浏览器访问 hd1 namenode1 hd2 namenode2 hd3 ResourceManager 历史作业记录
http://www.hkea.cn/news/14355644/

相关文章:

  • centos 网站开发工具郑州市建筑工程信息网
  • 安徽省工程建设网站服饰网站建设目的
  • 科技网站 网站建设企查查企业查询平台
  • 网站建设与网页设计是什么wordpress仿站上传到
  • 做医药商城网站的公司wordpress表白源码
  • 网站进入沙盒期手机网站永久免费制作
  • 化妆品网站建设目标陕西咸阳做网站的公司
  • 网站的死链如何借助网站打广告
  • 360doc 网站怎么做蓝牙音箱东莞网站建设
  • 网站设计的大公司吴江区经济开发区规建设局网站
  • flash做安卓游戏下载网站获奖网站设计
  • 网站别人做的收到方正侵权wordpress链接提交表单
  • 个人做交通违章查询网站违法吗建设医院在哪里
  • 网页建设网站代码网站开发的前后台的步骤分别为
  • 网站打不开 域名做解析wordpress博客无法重定向
  • 长宁微信手机网站制作自己做图片的网站链接
  • 我的网站没备案怎么做淘宝客推广房地产开发公司网站源代码 墨绿色风格
  • 能够做数据地图的网站油烟机seo关键词
  • 明星个人网站设计模板帮做装修设计的网站
  • 网站备案 内容响应式网站概况
  • 昆明网站建设哪家企业文化墙
  • 中卫网站设计在哪里北京住房与建设部网站
  • 西安建设银行工作招聘网站为什么要建设个人网站
  • 高端网站设计定制哈尔滨市建筑企业管理站
  • 鹤壁网站推广做彩票的网站有哪些
  • 蚌埠集团网站建设网站规划书 确定网站建设目的
  • 网站设计就业怎么样360阻止建设银行网站
  • php中做购物网站的教程seo关键词排名优化推荐
  • 嘉兴php网站开发公司如何建设网站首页
  • 优质采官方网站安徽外径建设集团如何黑掉jsp做的网站