<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] # HA的運作機制 1. hadoop-HA(high available)集群運作機制介紹 所謂HA,即高可用(`7*24`小時不中斷服務) 實現高可用最關鍵的是消除單點故障 hadoop-ha嚴格來說應該分成各個組件的HA機制——HDFS的HA、YARN的HA 2. HDFS的HA機制詳解 通過雙namenode消除單點故障 雙namenode協調工作的要點: A. 元數據管理方式需要改變: 內存中各自保存一份元數據 Edits日志只能有一份,只有Active狀態的namenode節點可以做寫操作 兩個namenode都可以讀取edits 共享的edits放在一個共享存儲中管理(qjournal和NFS兩個主流實現) B. 需要一個狀態管理功能模塊 實現了一個zkfailover,常駐在每一個namenode所在的節點 每一個zkfailover負責監控自己所在namenode節點,利用zk進行狀態標識 當需要進行狀態切換時,由zkfailover來負責切換 切換時需要防止brain split現象的發生 # HDFS-HA圖解 ![](https://box.kancloud.cn/f47c83f8199561c172e0c203ac695cc3_775x805.png) # HA集群的安裝部署 ## 集群節點規劃 集群部署節點角色的規劃(10節點): ~~~ server01 namenode zkfc > start-dfs.sh server02 namenode zkfc server03 resourcemanager > start-yarn.sh server04 resourcemanager server05 datanode nodemanager server06 datanode nodemanager server07 datanode nodemanager server08 journal node zookeeper server09 journal node zookeeper server10 journal node zookeeper ~~~ 集群部署節點角色的規劃(7節點): ~~~ server01 namenode zkfc > start-dfs.sh server02 namenode zkfc server03 resourcemanager > start-yarn.sh server04 resourcemanager server05 datanode nodemanager zookeeper journal node server06 datanode nodemanager zookeeper journal node server07 datanode nodemanager zookeeper journal node ~~~ 集群部署節點角色的規劃(3節點) ~~~ server01 namenode resourcemanager zkfc nodemanager datanode zookeeper journal node server02 namenode resourcemanager zkfc nodemanager datanode zookeeper journal node server03 datanode nodemanager zookeeper journal node ~~~ # 配置文件 core-site.xml ~~~ <configuration> <!-- 指定hdfs的nameservice為ns1 --> <property> <name>fs.defaultFS</name> <value>hdfs://ns1/</value> </property> <!-- 指定hadoop臨時目錄 --> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/app/hadoop-2.4.1/tmp</value> </property> <!-- 指定zookeeper地址 --> <property> <name>ha.zookeeper.quorum</name> <value>weekend05:2181,weekend06:2181,weekend07:2181</value> </property> </configuration> ~~~ hdfs-site.xml ~~~ configuration> <!--指定hdfs的nameservice為ns1,需要和core-site.xml中的保持一致 --> <property> <name>dfs.nameservices</name> <value>ns1</value> </property> <!-- ns1下面有兩個NameNode,分別是nn1,nn2 --> <property> <name>dfs.ha.namenodes.ns1</name> <value>nn1,nn2</value> </property> <!-- nn1的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.ns1.nn1</name> <value>weekend01:9000</value> </property> <!-- nn1的http通信地址 --> <property> <name>dfs.namenode.http-address.ns1.nn1</name> <value>weekend01:50070</value> </property> <!-- nn2的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.ns1.nn2</name> <value>weekend02:9000</value> </property> <!-- nn2的http通信地址 --> <property> <name>dfs.namenode.http-address.ns1.nn2</name> <value>weekend02:50070</value> </property> <!-- 指定NameNode的edits元數據在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://weekend05:8485;weekend06:8485;weekend07:8485/ns1</value> </property> <!-- 指定JournalNode在本地磁盤存放數據的位置 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/hadoop/app/hadoop-2.4.1/journaldata</value> </property> <!-- 開啟NameNode失敗自動切換 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 配置失敗自動切換實現方式 --> <property> <name>dfs.client.failover.proxy.provider.ns1</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- 配置隔離機制方法,多個機制用換行分割,即每個機制暫用一行--> <property> <name>dfs.ha.fencing.methods</name> <value> sshfence shell(/bin/true) </value> </property> <!-- 使用sshfence隔離機制時需要ssh免登陸 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/hadoop/.ssh/id_rsa</value> </property> <!-- 配置sshfence隔離機制超時時間 --> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> /configuration> ~~~ # 集群運維測試 HA集群中兩個namenode狀態的管理命令 ~~~ [root@mini2 hadoop-2.6.4]# bin/hdfs haadmin Usage: DFSHAAdmin [-ns <nameserviceId>] [-transitionToActive <serviceId> [--forceactive]] [-transitionToStandby <serviceId>] [-failover [--forcefence] [--forceactive] <serviceId> <serviceId>] [-getServiceState <serviceId>] [-checkHealth <serviceId>] [-help <command>] ~~~ 示例: 切換nn2為active ~~~ bin/hdfs haadmin -transitionToActive nn2 --forcemanual ~~~ ## Datanode動態上下線 Datanode動態上下線很簡單,步驟如下: * 準備一臺服務器,設置好環境 * 部署hadoop的安裝包,并同步集群配置 * 聯網上線,新datanode會自動加入集群 * 如果是一次增加大批datanode,還應該做集群負載重均衡 (`start-balancer.sh -threshold 8 ##指定磁盤利用率`) ## Namenode狀態切換管理 使用的命令上`hdfs haadmin` 可用 hdfs haadmin –help查看所有幫助信息 ![](https://box.kancloud.cn/5d664c18fc92e310ae889db85c291cfc_568x349.png) 可以看到,狀態操作的命令示例: 查看namenode工作狀態 ~~~ hdfs haadmin -getServiceState nn1 ~~~ 將standby狀態namenode切換到active ~~~ hdfs haadmin –transitionToActive nn1 ~~~ 將active狀態namenode切換到standby ~~~ hdfs haadmin –transitionToStandby nn2 ~~~ ## 數據塊的balance 啟動balancer的命令: `start-balancer.sh -threshold 8` 運行之后,會有Balancer進程出現: ![](https://box.kancloud.cn/d29e7f50299fd11bd7d9fa7b6f0ba2ad_384x154.png) 上述命令設置了Threshold為`8%`,那么執行balancer命令的時候,首先統計所有DataNode的磁盤利用率的均值,然后判斷如果某一個DataNode的磁盤利用率超過這個均值Threshold,那么將會把這個DataNode的block轉移到磁盤利用率低的DataNode,這對于新節點的加入來說十分有用。Threshold的值為1到100之間,不顯示的進行參數設置的話,默認是10。 ## HA下hdfs-api變化 客戶端需要nameservice的配置信息,其他不變 ~~~ /** * 如果訪問的是一個ha機制的集群 * 則一定要把core-site.xml和hdfs-site.xml配置文件放在客戶端程序的classpath下 * 以讓客戶端能夠理解hdfs://ns1/中 “ns1”是一個ha機制中的namenode對——nameservice * 以及知道ns1下具體的namenode通信地址 * @author * */ public class UploadFile { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://ns1/"); FileSystem fs = FileSystem.get(new URI("hdfs://ns1/"),conf,"hadoop"); fs.copyFromLocalFile(new Path("g:/eclipse-jee-luna-SR1-linux-gtk.tar.gz"), new Path("hdfs://ns1/")); fs.close(); } } ~~~ # 集群安裝 hadoop2.0已經發布了穩定版本了,增加了很多特性,比如HDFS HA、YARN等。最新的hadoop-2.6.4又增加了YARN HA 注意:apache提供的hadoop-2.6.4的安裝包是在32位操作系統編譯的,因為hadoop依賴一些C++的本地庫, 所以如果在64位的操作上安裝hadoop-2.6.4就需要重新在64操作系統上重新編譯 前期準備就不詳細說了 1.修改Linux主機名 2.修改IP 3.修改主機名和IP的映射關系 /etc/hosts ######注意######如果你們公司是租用的服務器或是使用的云主機(如華為用主機、阿里云主機等) `/etc/hosts`里面要配置的是內網IP地址和主機名的映射關系 4.關閉防火墻 5.ssh免登陸 6.安裝JDK,配置環境變量等 集群規劃: ~~~ 主機名 IP 安裝的軟件 運行的進程 hadoop00 192.168.1.200 jdk、hadoop NameNode、DFSZKFailoverController(zkfc) hadoop01 192.168.1.201 jdk、hadoop NameNode、DFSZKFailoverController(zkfc) hadoop02 192.168.1.202 jdk、hadoop ResourceManager hadoop03 192.168.1.203 jdk、hadoop ResourceManager hadoop04 192.168.1.204 jdk、hadoop DataNode、NodeManager hadoop05 192.168.1.205 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain hadoop06 192.168.1.206 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain hadoop07 192.168.1.207 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain ~~~ 說明: 1. 在hadoop2.0中通常由兩個NameNode組成,一個處于active狀態,另一個處于standby狀態。Active NameNode對外提供服務,而Standby NameNode則不對外提供服務,僅同步active namenode的狀態,以便能夠在它失敗時快速進行切換。 hadoop2.0官方提供了兩種HDFS HA的解決方案,一種是NFS,另一種是QJM。這里我們使用簡單的QJM。在該方案中,主備NameNode之間通過一組JournalNode同步元數據信息,一條數據只要成功寫入多數JournalNode即認為寫入成功。通常配置奇數個JournalNode 這里還配置了一個zookeeper集群,用于ZKFC(DFSZKFailoverController)故障轉移,當Active NameNode掛掉了,會自動切換Standby NameNode為standby狀態 2. hadoop-2.2.0中依然存在一個問題,就是ResourceManager只有一個,存在單點故障,hadoop-2.6.4解決了這個問題,有兩個ResourceManager,一個是Active,一個是Standby,狀態由zookeeper進行協調 安裝步驟: 1. 安裝配置zooekeeper集群(在hadoop05上) 解壓 ~~~ tar -zxvf zookeeper-3.4.5.tar.gz -C /home/hadoop/app/ ~~~ 修改配置 ~~~ cd /home/hadoop/app/zookeeper-3.4.5/conf/ cp zoo_sample.cfg zoo.cfg vim zoo.cfg ~~~ 修改:`dataDir=/home/hadoop/app/zookeeper-3.4.5/tmp` 在最后添加: ~~~ server.1=hadoop05:2888:3888 server.2=hadoop06:2888:3888 server.3=hadoop07:2888:3888 ~~~ 保存退出 然后創建一個tmp文件夾 ~~~ mkdir /home/hadoop/app/zookeeper-3.4.5/tmp echo 1 > /home/hadoop/app/zookeeper-3.4.5/tmp/myid ~~~ 將配置好的zookeeper拷貝到其他節點(首先分別在hadoop06、hadoop07根目錄下創建一個hadoop目錄:mkdir /hadoop) ~~~ scp -r /home/hadoop/app/zookeeper-3.4.5/ hadoop06:/home/hadoop/app/ scp -r /home/hadoop/app/zookeeper-3.4.5/ hadoop07:/home/hadoop/app/ ~~~ 注意:修改hadoop06、hadoop07對應`/hadoop/zookeeper-3.4.5/tmp/myid`內容 ~~~ hadoop06: echo 2 > /home/hadoop/app/zookeeper-3.4.5/tmp/myid hadoop07: echo 3 > /home/hadoop/app/zookeeper-3.4.5/tmp/myid ~~~ 2. 安裝配置hadoop集群(在hadoop00上操作) 解壓 ~~~ tar -zxvf hadoop-2.6.4.tar.gz -C /home/hadoop/app/ ~~~ 配置HDFS(hadoop2.0所有的配置文件都在$HADOOP_HOME/etc/hadoop目錄下) ~~~ #將hadoop添加到環境變量中 vim /etc/profile export JAVA_HOME=/usr/java/jdk1.7.0_55 export HADOOP_HOME=/hadoop/hadoop-2.6.4 export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin #hadoop2.0的配置文件全部在$HADOOP_HOME/etc/hadoop下 cd /home/hadoop/app/hadoop-2.6.4/etc/hadoop ~~~ 修改`hadoo-env.sh` ~~~ export JAVA_HOME=/home/hadoop/app/jdk1.7.0_55 ~~~ 2. 修改core-site.xml ~~~ <configuration> <!-- 指定hdfs的nameservice為ns1 --> <property> <name>fs.defaultFS</name> <value>hdfs://bi/</value> </property> <!-- 指定hadoop臨時目錄 --> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/app/hdpdata/</value> </property> <!-- 指定zookeeper地址 --> <property> <name>ha.zookeeper.quorum</name> <value>hadoop05:2181,hadoop06:2181,hadoop07:2181</value> </property> </configuration> ~~~ 3. 修改hdfs-site.xml ~~~ <configuration> <!--指定hdfs的nameservice為bi,需要和core-site.xml中的保持一致 --> <property> <name>dfs.nameservices</name> <value>bi</value> </property> <!-- bi下面有兩個NameNode,分別是nn1,nn2 --> <property> <name>dfs.ha.namenodes.bi</name> <value>nn1,nn2</value> </property> <!-- nn1的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.bi.nn1</name> <value>mini1:9000</value> </property> <!-- nn1的http通信地址 --> <property> <name>dfs.namenode.http-address.bi.nn1</name> <value>hadoop00:50070</value> </property> <!-- nn2的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.bi.nn2</name> <value>hadoop01:9000</value> </property> <!-- nn2的http通信地址 --> <property> <name>dfs.namenode.http-address.bi.nn2</name> <value>hadoop01:50070</value> </property> <!-- 指定NameNode的edits元數據在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop05:8485;hadoop06:8485;hadoop07:8485/bi</value> </property> <!-- 指定JournalNode在本地磁盤存放數據的位置 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/hadoop/app/hdpdata/journaldata</value> </property> <!-- 開啟NameNode失敗自動切換 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 配置失敗自動切換實現方式 --> <property> <name>dfs.client.failover.proxy.provider.bi</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- 配置隔離機制方法,多個機制用換行分割,即每個機制暫用一行--> <property> <name>dfs.ha.fencing.methods</name> <value> sshfence shell(/bin/true) </value> </property> <!-- 使用sshfence隔離機制時需要ssh免登陸 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/hadoop/.ssh/id_rsa</value> </property> <!-- 配置sshfence隔離機制超時時間 --> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> </configuration> ~~~ 4. 修改mapred-site.xml ~~~ <configuration> <!-- 指定mr框架為yarn方式 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> ~~~ 5. 修改yarn-site.xml ~~~ <configuration> <!-- 開啟RM高可用 --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!-- 指定RM的cluster id --> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yrc</value> </property> <!-- 指定RM的名字 --> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <!-- 分別指定RM的地址 --> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>hadoop03</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>hadoop04</value> </property> <!-- 指定zk集群地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>hadoop05:2181,hadoop06:2181,hadoop07:2181</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration> ~~~ 6. 修改slaves(slaves是指定子節點的位置,因為要在hadoop01上啟動HDFS、在hadoop03啟動yarn,所以hadoop01上的slaves文件指定的是datanode的位置,hadoop03上的slaves文件指定的是nodemanager的位置) ~~~ hadoop05 hadoop06 hadoop07 ~~~ 7. 配置免密碼登陸 首先要配置hadoop00到hadoop01、hadoop02、hadoop03、hadoop04、hadoop05、hadoop06、hadoop07的免密碼登陸 ~~~ #在hadoop01上生產一對鑰匙 ssh-keygen -t rsa #將公鑰拷貝到其他節點,包括自己 ssh-coyp-id hadoop00 ssh-coyp-id hadoop01 ssh-coyp-id hadoop02 ssh-coyp-id hadoop03 ssh-coyp-id hadoop04 ssh-coyp-id hadoop05 ssh-coyp-id hadoop06 ssh-coyp-id hadoop07 #配置hadoop02到hadoop04、hadoop05、hadoop06、hadoop07的免密碼登陸 #在hadoop02上生產一對鑰匙 ssh-keygen -t rsa #將公鑰拷貝到其他節點 ssh-coyp-id hadoop03 ssh-coyp-id hadoop04 ssh-coyp-id hadoop05 ssh-coyp-id hadoop06 ssh-coyp-id hadoop07 #注意:兩個namenode之間要配置ssh免密碼登陸,別忘了配置hadoop01到hadoop00的免登陸 在hadoop01上生產一對鑰匙 ssh-keygen -t rsa ssh-coyp-id -i hadoop00 ~~~ 將配置好的hadoop拷貝到其他節點 ~~~ scp -r /hadoop/ hadoop02:/ scp -r /hadoop/ hadoop03:/ scp -r /hadoop/hadoop-2.6.4/ hadoop@hadoop04:/hadoop/ scp -r /hadoop/hadoop-2.6.4/ hadoop@hadoop05:/hadoop/ scp -r /hadoop/hadoop-2.6.4/ hadoop@hadoop06:/hadoop/ scp -r /hadoop/hadoop-2.6.4/ hadoop@hadoop07:/hadoop/ ~~~ ~~~ ###注意:嚴格按照下面的步驟!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2.5啟動zookeeper集群(分別在hadoop05、hadoop06、tcast07上啟動zk) cd /hadoop/zookeeper-3.4.5/bin/ ./zkServer.sh start #查看狀態:一個leader,兩個follower ./zkServer.sh status 2.6手動啟動journalnode(分別在在hadoop05、hadoop06、hadoop07上執行) cd /hadoop/hadoop-2.6.4 sbin/hadoop-daemon.sh start journalnode #運行jps命令檢驗,hadoop05、hadoop06、hadoop07上多了JournalNode進程 2.7格式化namenode #在hadoop00上執行命令: hdfs namenode -format #格式化后會在根據core-site.xml中的hadoop.tmp.dir配置生成個文件,這里我配置的是/hadoop/hadoop-2.6.4/tmp,然后將/hadoop/hadoop-2.6.4/tmp拷貝到hadoop02的/hadoop/hadoop-2.6.4/下。 scp -r tmp/ hadoop02:/home/hadoop/app/hadoop-2.6.4/ ##也可以這樣,建議hdfs namenode -bootstrapStandby 2.8格式化ZKFC(在hadoop00上執行即可) hdfs zkfc -formatZK 2.9啟動HDFS(在hadoop00上執行) sbin/start-dfs.sh 2.10啟動YARN(#####注意#####:是在hadoop02上執行start-yarn.sh,把namenode和resourcemanager分開是因為性能問題,因為他們都要占用大量資源,所以把他們分開了,他們分開了就要分別在不同的機器上啟動) sbin/start-yarn.sh 到此,hadoop-2.6.4配置完畢,可以統計瀏覽器訪問: http://hadoop00:50070 NameNode 'hadoop01:9000' (active) http://hadoop01:50070 NameNode 'hadoop02:9000' (standby) 驗證HDFS HA 首先向hdfs上傳一個文件 hadoop fs -put /etc/profile /profile hadoop fs -ls / 然后再kill掉active的NameNode kill -9 <pid of NN> 通過瀏覽器訪問:http://192.168.1.202:50070 NameNode 'hadoop02:9000' (active) 這個時候hadoop02上的NameNode變成了active 在執行命令: hadoop fs -ls / -rw-r--r-- 3 root supergroup 1926 2014-02-06 15:36 /profile 剛才上傳的文件依然存在!!! 手動啟動那個掛掉的NameNode sbin/hadoop-daemon.sh start namenode 通過瀏覽器訪問:http://192.168.1.201:50070 NameNode 'hadoop01:9000' (standby) 驗證YARN: 運行一下hadoop提供的demo中的WordCount程序: hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar wordcount /profile /out ~~~ OK,大功告成!!! 測試集群工作狀態的一些指令 : ~~~ bin/hdfs dfsadmin -report 查看hdfs的各節點狀態信息 bin/hdfs haadmin -getServiceState nn1 獲取一個namenode節點的HA狀態 sbin/hadoop-daemon.sh start namenode 單獨啟動一個namenode進程 ./hadoop-daemon.sh start zkfc 單獨啟動一個zkfc進程 ~~~ # 代碼變化 ~~~ import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; /** * * 如果訪問的是HA集群,則一定需要把core-site.xml hdfs-site.xml配置文件放置到項目的classpath下 * 以便讓客戶端能夠理解hdfs://bi/ 中的bi是一個ha機制中的namenode----nameservice * 以及知道bi下面具體的namenode通信地址 * */ public class TestHaUpLoad { public static void main(String[] args) throws Exception{ Configuration configuration = new Configuration(); configuration.set("fs.defaultFS", "hdfs://bi/"); FileSystem fileSystem = FileSystem.get(new URI("hdfs://bi/"), configuration,"root"); fileSystem.copyFromLocalFile(new Path("D:/sparksql_textdata.csv"), new Path("/")); fileSystem.close(); } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看