中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MongoDB中復制集集群的原理是什么

發布時間:2021-07-19 11:15:56 來源:億速云 閱讀:182 作者:Leah 欄目:數據庫

這篇文章給大家介紹MongoDB中復制集集群的原理是什么,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

復制集介紹

MongoDB中的復制集(也被稱為副本)是一組維護相同數據集的mongod進程。副本集提供冗余性及和高可用,是所有生產部署的基礎。簡單來說,復制集有多臺MongoDB組成的一個集群,集群中有一個主節點(Primary)和N個副本節點(Secondary)等,它們有相同的數據庫,假如主MongoDB服務器或者MongoDB實例Down機之后,其它的副本服務器可以繼續提供服務,實現數據的高可用及可靠性。

復制集群架構

術語介紹:

術語類型描述
Primary主節點負責整個集群的讀寫操作,包含了所有改變操作的日志
Secondary備節點同步主服務器所有的數據,負責集群的讀取請求,主服務器宕機可以稱為主節點
Arbiter仲裁者在主節點宕機后只進行投票,不參與選舉,不同步主節點數據


MongoDB中復制集集群的原理是什么

此架構由一個Primary節點和兩個Secondary節點組成

1)Primary節點為主節點,所有的寫操作或者更改操作都只能從Primary節點中操作(復制集內的所有成員都可以接收讀操作,但是,默認情況下,應用程序將其讀操作指向主成員),主節點上所有的更改及寫操作都會記錄到oplog日志中。

2)兩臺Secondary節點復制Primary節點的oplog日志,通過異步的方式去執行oplog日志中的記錄來和Primary節點達到數據一致性。

3)oplog作用主要是記錄主節點的寫入操作,充當復制源。

MongoDB中復制集集群的原理是什么

4)如果Primary節點無故Down機之后,復制集集群會通過投票機制在兩臺Secondary中選舉一臺升級為Primary節點。

投票選舉機制

MongoDB節點之間維護心跳檢查,主節點選舉由心跳觸發。

心跳檢查 MongoDB復制集成員會向自己之外的所有成員發送心跳并處理響應信息,因此每個節點都維護著該節點看到的其它所有節點的狀態信息,節點根據自己的集群狀態判斷是否需要更新新的Primary。在實現的時候主要由兩個異步的過程分別處理心跳響應和超時,每個復制集成員都會在后臺運行與復制集所有節點的心跳線程,在以下幾種情況下會觸發狀態檢測過程:

•Secondary節點權重(Priority)比Primary節點高時,發起替換選舉;

•Secondary節點發現集群中沒有Primary時,發起選舉;

•Primary節點不能訪問到大部分成員時主動降級,降級操作會斷開連接,終止用戶請求等;

•復制集成員心跳檢測結果發生變化,比如某個節點掛了或者新增節點,發起重新投票選舉規則;

•超過4s沒有執行狀態檢測過程,發起替換選舉;

選舉發起 發起選舉的節點首先需要做一些條件判斷,維護主節點的有N個備用節點,備用節點中的所有節點都可能被選舉成為主節點,成為主節點前每個備節點都會檢測自身以及全局條件是否滿足,檢測條件如下:

1.是否看見復制集中是否有Majority在線

2.自身Priority是否大于0

3.自身不為arbiter

4.自身opTime不能落后于最新節點10s以上

5.自身存儲的集群程序按信息為最新

如果所有條件滿足,則將自身添加到主節點的備用列表中,否則,將自身從列表中移除

自身檢測

•MongoDB選舉需要獲得大多數投票才能通過,如果沒有節點投反對票,且獲得成票數超過有權投票節點總數的1/2,則能成為Primary。否則進入下一輪選舉。為避免陷入無限重復選舉,MongoDB建議復制集的成員個數為奇數,當Secondary為雙數時,可以增加一個Arbiter節點。

•選舉過程中,復制集沒有主節點,所有成員都是只讀狀態

•選舉過程很復雜,一般情況下需要5s左右進行選主。

•如果新選擇的主節點立刻掛掉,至少需要30s時間重新選主。

大多數的定義  假設復制集內投票成員數量為N,則大多數 = N/2 + 1 ,當復制集內存活成員數量不足大多數時,整個復制集將無法選舉出Primary,復制集將無法提供寫服務,處于只讀狀態。 我們按照上面的架構來舉例,三臺MongoDB,一臺Primary,兩臺Secondary,主節點掛了之后,只有兩臺Secondary可以投票,根據公式我們來算 “2/2 + 1 = 2”,也就是算大多數等于2,但是當復制集內存活的成員數量不足大多數時,我們的大多數為2,集群成員也為2,所以這兩臺集群成員會發起選舉投票機制,如果兩臺Secondary節點自身條件都滿足的情況下,則先發起選舉節點的成員成為Primary節點  

投票成員數大多數容忍失效數
110
220
321
431
532
642
743

復制集群成員說明

Secondary 正常情況下,復制集的Seconary會參與Primary選舉(自身也可能會被選為Primary),并從Primary同步最新寫入的數據,以保證與Primary存儲相同的數據。Secondary可以提供讀服務,增加Secondary節點可以提供復制集的讀服務能力,同時提升復制集的可用性。另外,Mongodb支持對復制集的Secondary節點進行靈活的配置,以適應多種場景的需求。

Arbiter Arbiter節點只參與投票,不能被選為Primary,并且不從Primary同步數據。比如你部署了一個2個節點的復制集,1個Primary,1個Secondary,任意節點宕機,復制集將不能提供服務了(無法選出Primary),這時可以給復制集添加一個Arbiter節點,即使有節點宕機,仍能選出Primary。Arbiter本身不存儲數據,是非常輕量級的服務,當復制集成員為偶數時,最好加入一個Arbiter節點,以提升復制集可用性。

Priority0 Priority0節點的選舉優先級為0,不會被選舉為Primary。比如你跨機房A、B部署了一個復制集,并且想指定Primary必須在A機房,這時可以將B機房的復制集成員Priority設置為0,這樣Primary就一定會是A機房的成員。(注意:如果這樣部署,最好將『大多數』節點部署在A機房,否則網絡分區時可能無法選出Primary)

Vote0 Mongodb 3.0里,復制集成員最多50個,參與Primary選舉投票的成員最多7個,其他成員(Vote0)的vote屬性必須設置為0,即不參與投票。

Hidden Hidden節點不能被選為主(Priority為0),并且對Driver不可見。因Hidden節點不會接受Driver的請求,可使用Hidden節點做一些數據備份、離線計算的任務,不會影響復制集的服務。

Delayed Delayed節點必須是Hidden節點,并且其數據落后與Primary一段時間(可配置,比如1個小時)。因Delayed節點的數據比Primary落后一段時間,當錯誤或者無效的數據寫入Primary時,可通過Delayed節點的數據來恢復到之前的時間點。

優先級為0復制集成員

MongoDB中復制集集群的原理是什么

此架構由一個Primary節點和兩個Secondary節點組成

1)此架構由一臺Primary主節點和兩臺Secondary備節點組成,其原理就是主從復制架構的原理,兩臺Secondary節點同樣通過oplog日志來與Primary主節點達成數據一致

2)與其不同的是在Data Center2節點上的Secondary備用節點的實例優先級priority為0,則不參與選舉,也不可能會成為Primary節點,將其優先級配置為0,主要是防止它成為主節點,這在多數據中心的部署特別有用。

3)優先級值范圍為 0-100(0表示不參與選舉),在復制集群中,優先級高的優先成為主節點,假如我們原來集群中有三臺節點,主節點優先級為2,其它兩臺備節點優先級為1,當我們新加入到集群一臺MongoDB實例,給它優先級設置為4,則該實例在加入集群后就會自動搶奪Primary到本機。

仲裁節點架構

MongoDB中復制集集群的原理是什么

上圖中,三個成員組成復制集群

一個主庫:負責整個集群的所有寫、更改操作

一個從庫:通過oplog日志來與主節點數據達成一致

一個Airbiter節點,在選舉中,只進行投票,不能成為主庫,而且不復制Primary的任何數據,因此這個架構中只能提供一個完成的副本Secondary,Arbiter只需要很少的資源,代價是有限的冗余和容錯,當Primary節點故障后,Aribiter將票數頭給Secondary,使其成為Primary節點,如果Primary節點再次故障后,集群將不可用,Arbiter節點也未存儲任何數據。

MongoDB中復制集集群的原理是什么

集群中還有其它的節點成員,但是我們用的比較少,所以此文章中沒有提到。可以自行查閱官方文檔:https://docs.mongodb.com/manual/core/replica-set-members/

復制集集群環境部署

環境說明

本次使用一臺設備多實例進行,如果你準備在多臺設備上部署,你需要考慮的如下:1)時鐘是否一致 2)網絡是否通暢 3)SElinux是否關閉或者策略放通 4)環境是否一致

[root@MongoDB ~]# lsb_release -a  LSB Version:    :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch Distributor ID:    CentOS  Description:    CentOS Linux release 7.6.1810 (Core)   Release:    7.6.1810  Codename:    Core  [root@MongoDB ~]# hostname -I  10.211.55.12 192.168.0.100 fdb2:2c26:f4e4:0:21c:42ff:fedf:4d85

前期準備

#創建用戶組  useradd mongod  echo 'abcdef' | passwd --stdin mongod  #下載MongoDB  wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.0.tgz  #添加文件打開數和mongod用戶進程連接數  cat >> /etc/security/limits.conf << EOF  * soft nofile 65536  * hard nofile 65536  mongod soft nproc 32768  mongod hard nproc 32768  EOF   #使下面兩個文件修改為never  echo never > /sys/kernel/mm/transparent_hugepage/enabled  echo never > /sys/kernel/mm/transparent_hugepage/defrag  #開機自動修改  cat >> /etc/rc.local << EOF  if test -f /sys/kernel/mm/transparent_hugepage/enabled;then      echo never > /sys/kernel/mm/transparent_hugepage/enabled  fi  if test -f /sys/kernel/mm/transparent_hugepage/defrag;then      echo never > /sys/kernel/mm/transparent_hugepage/defrag  fi  EOF  此步驟完成后  #官方給出MongoDB需要以下兩個庫的依賴  yum install libcurl openssl -y  #解壓并復制程序文件到bin目錄  mkdir /usr/local/mongodb  tar xf mongodb-linux-x86_64-rhel70-4.2.0.tgz  cp -rf mongodb-linux-x86_64-rhel70-4.2.0/bin/ /usr/local/mongodb/  chown -Rf mongod.mongod /usr/local/moongodb/  #添加程序環境  cat >> /etc/profile << EOF  export MONGODB_HOME=/usr/local/mongodb  export PATH=\$MONGODB/bin:\$PATH  EOF  source /etc/profile

環境配置

1)接下來使用mongod用戶來操作

su mongod

2)創建文件目錄

#!/bin/bash  for i in 27017 27018 27019      do      mkdir -p /usr/local/mongodb/$i/{conf,data,logs,run}  done

配置文件

編輯一臺配置文件,然后復制到其它實例,配置文件為yaml語法 關于以下配置文件詳解,請參考:”https://abcops.cn/mongodb-conf/“

cat > mongod.conf << EOF  systemLog:    destination: file    path: /usr/local/mongodb/27017/logs/mongodb.log    logAppend: true    verbosity: 0    logRotate: rename storage:    journal:      enabled: true    dbPath: /usr/local/mongodb/27017/data    directoryPerDB: true    engine: wiredTiger    wiredTiger:      engineConfig:        cacheSizeGB: 1        directoryForIndexes: true        journalCompressor: zlib      collectionConfig:        blockCompressor: zlib      indexConfig:        prefixCompression: true  processManagement:    fork: true    pidFilePath: /usr/local/mongodb/27017/run/mongod.pid  net:    port: 27017    bindIp: 10.211.55.12    maxIncomingConnections: 65536    wireObjectCheck: true    ipv6: false  replication:    oplogSizeMB: 4096    replSetName: abcops_repl  setParameter:    connPoolMaxShardedConnsPerHost: 200    connPoolMaxConnsPerHost: 200  EOF

復制配置文件到目錄中,并修改其端口及目錄位置

#!/bin/bash  for i in 27017 27018 27019      do          \cp /home/mongod/mongod.conf /usr/local/mongodb/$i/conf          sed -i "s/27017/$i/g" /usr/local/mongodb/$i/conf/mongod.conf  done

啟動MongoDB實例

啟動腳本如下

#!/bin/bash  for i in 27017 27018 27019      do          /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/$i/conf/mongod.conf  done

關閉腳本如下

#!/bin/bash  for i in 27017 27018 27019      do          /usr/local/mongodb/bin/mongod --shutdown -f /usr/local/mongodb/$i/conf/mongod.conf  done

三個實例啟動后,不代表復制集已經搭建成功了,還需要進行復制集初始化

配置復制集

連接任何一個實例都可以進行配置

這是我連接27017的實例  /usr/local/mongodb/bin/mongo --host 10.211.55.12 --port 27017
> use admin  > config={  _id:'abcops_repl',  members:[  {_id: 0, host: '10.211.55.12:27017',priority:2},  {_id: 1, host: '10.211.55.12:27018',priority:1},  {_id: 2, host: '10.211.55.12:27019',arbiterOnly:true},      ]  }  > rs.initiate(config)  #以上參數解析  use admin:進入admin數據庫  config:配置復制集  _id:'abcops_repl':指定復制集組名稱,與配置文件中的 replSetName 參數需要保持一致  members:規定的函數,不能更改  _id:設置組成員的ID編號,可以自定義,我這里為 0、1、2  host:指定加入復制集成員的IP地址及端口,我們在配置文件中指定了bindIp為10.211.55.12,這里就不能寫127.0.0.1,必須寫為bind_Ip指定的地址  priority:指定優先級0-100,優先級最高的成為Primary節點,優先級為可選選項,如果不指定默認都為1  arbiterOnly:是否開啟仲裁節點true/false  rs.initiate(config):初始化復制集配置

以上參數圖示如下,給你提供下參照

MongoDB中復制集集群的原理是什么

圖中開始為SECONDARY,代表復制集集群正在進行選舉Primary節點,大概5s左右,根據選舉機制選舉成功后,成為主節點的SECONDARY狀態變為PRIMARY

復制集常用命令

1)查看誰是主節點

abcops_repl:PRIMARY> db.isMaster()

2)查看當前復制集集群中成員的配置

abcops_repl:PRIMARY> rs.conf()

3)查看復制集集群成員狀態

abcops_repl:PRIMARY> rs.status()

4)新增節點到復制集 新增節點之前,該實例的配置中的replSetName復制集名稱,必須和集群一致

abcops_repl:PRIMARY> rs.add("10.211.55.12:27020")

5)新增仲裁節點

abcops_repl:PRIMARY> rs.addArb("10.211.55.12:27020")

6)從復制集內刪除節點

abcops_repl:PRIMARY> rs.remove("10.211.55.12:27020")

7)檢查oplog日志時間和大小

abcops_repl:PRIMARY> rs.printReplicationInfo()   configured oplog size:   4096MB  log length start to end: 2422secs (0.67hrs)  oplog first event time:  Wed Sep 11 2019 12:22:13 GMT+0800 (CST)  oplog last event time:   Wed Sep 11 2019 13:02:35 GMT+0800 (CST)  now:                     Wed Sep 11 2019 13:02:37 GMT+0800 (CST)

8)降級服務器 此操作只能在PRIMARY上操作 通過執行rs.stepDown命令將當前主服務器主動降級為備用節點,120單位為s,為120秒內這個實力不能把自己選為PRIMARY角色,120秒后由于它本身的優先級較高,所以會重新搶占PRIMARY節點。

abcops_repl:PRIMARY> rs.stepDown(120)

9)允許在Secondary節點可以進行查詢 在副本節點上操作

rs.slaveOk()

10)查看當前連接

db.getMongo()

修改優先級

修改27018的優先級為3,使其優先級超過27017實例,奪得PRIMARY角色,此操作需在PRIMARY上執行

abcops_repl:PRIMARY> config=rs.conf()  abcops_repl:PRIMARY> config.members[1].priority=3  3  abcops_repl:PRIMARY> rs.reconfig(config)  {      "ok" : 1,      "$clusterTime" : {          "clusterTime" : Timestamp(1568179129, 1),          "signature" : {              "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),              "keyId" : NumberLong(0)          }      },      "operationTime" : Timestamp(1568179129, 1)  } abcops_repl:PRIMARY> rs.conf()  abcops_repl:SECONDARY> db.isMaster()  #以上參數解析  config=rs.conf():將現有的配置讀取到變量中進行存儲  config.members[1].priority=3:修改變量中的值,1是指執行rs.conf()中看到節點的順序,不是ID號哦,rs.conf()看到的順序是從0開始排序,三個副本集排序就是0-3  rs.reconfig(config):將修改后的數據同步到配置,使修改生效  rs.conf():查看當前配置,可以看到優先級哦  db.isMaster():查看誰是Primary節點

復制測試

1)插入數據

#連接當前Primary節點  /usr/local/mongodb/bin/mongo --host 10.211.55.12 --port 27018  #進入abcops數據庫,在documents文檔中插入以下JSON格式的數據  abcops_repl:PRIMARY> use abcops  abcops_repl:PRIMARY> db.documents.insert(      {name: "xuweiliang",      age: 25,      Job: "DevOps"}  )  #查看documents文檔中的數據  abcops_repl:PRIMARY> db.documents.find()  { "_id" : ObjectId("5d78863768fbf9eac4704232"), "name" : "xuweiliang", "age" : 25, "Job" : "DevOps" }  #查看復制節點狀態  abcops_repl:PRIMARY> rs.printSlaveReplicationInfo()  source: 10.211.55.12:27017      syncedTo: Wed Sep 11 2019 13:30:42 GMT+0800 (CST)      0 secs (0 hrs) behind the primary

2)登錄Secondary節點查看

/usr/local/mongodb/bin/mongo --host 10.211.55.12 --port 27017  abcops_repl:SECONDARY> rs.slaveOk()         #運行副本節點可進行查詢  abcops_repl:SECONDARY> show dbs             #查看當前節點的數據庫  abcops  0.000GB  admin   0.000GB  config  0.000GB local   0.000GB  abcops_repl:SECONDARY> use abcops               #abcops數據庫已經從主節點同步至此  switched to db abcops  abcops_repl:SECONDARY> db.getCollectionNames()  #以下連續三個命令都是查看進入到abcops庫中的文檔命令  [ "documents" ]  abcops_repl:SECONDARY> show collections  documents  abcops_repl:SECONDARY> show tables  documents  abcops_repl:SECONDARY> db.documents.find()      #查看文檔中的內容  { "_id" : ObjectId("5d78863768fbf9eac4704232"), "name" : "xuweiliang", "age" : 25, "Job" : "DevOps" }

創建復制集中的賬戶

1)連接到主節點,創建用戶 以下創建的用戶及權限和角色請參考下面用戶權限說明

/usr/local/mongodb/bin/mongo --host 10.211.55.12 --port 27018  abcops_repl:PRIMARY> use admin  abcops_repl:PRIMARY> db.createUser( {          user:'abcops',          pwd:'123456',          roles:[ { role: "root", db: "admin" } ]      }  )  Successfully added user: {      "user" : "abcops",      "roles" : [          {              "role" : "root",              "db" : "admin"          }      ]  }  #查看所有創建的用戶信息  abcops_repl:PRIMARY> show users

用戶中權限的說明

權限說明
Read允許用戶讀取指定數據庫
readWrite允許用戶讀寫指定數據庫
dbAdmin允許用戶在指定數據庫中指定管理函數,如(索引創建、刪除、查看統計訪問system.profile)
userAdmin允許用戶向system.users集合寫入,可以找指定數據里面創建、刪除和管理用戶
clusterAdmin只在admin數據庫中可用,賦予用戶所有分片和復制集相關函數的管理權限
readAnyDatabase只在admin數據庫中可用,賦予用戶所有數據庫的讀權限
readWriteAnyDatabase只在admin數據庫中可用,賦予用戶所有數據庫的讀寫權限
userWriteAnyDatabase只在admin數據庫中可用,賦予用戶所有數據庫的userAdmin權限
dbAdminAnyDatabase只在admin數據庫中可用,賦予用戶所有數據庫的dbAdmin權限
root只在admin數據庫中可用,超級管理員

為復制集集群添加權限認證

復制集我們這里采用keyfile文件實現權限認證,并且副本集中的所有成員使用的keyfile必須一樣

添加安全認證配置

三臺實例必須都要配置

cat >> /usr/local/mongodb/27017/conf/mongod.conf << EOF  security:    authorization: enabled    clusterAuthMode: keyFile    keyFile: /usr/local/mongodb/27017/conf/keyfile    javascriptEnabled: true  EOF   cat >> /usr/local/mongodb/27018/conf/mongod.conf << EOF security:    authorization: enabled    clusterAuthMode: keyFile    keyFile: /usr/local/mongodb/27018/conf/keyfile    javascriptEnabled: true  EOF  cat >> /usr/local/mongodb/27019/conf/mongod.conf << EOF  security:    authorization: enabled    clusterAuthMode: keyFile    keyFile: /usr/local/mongodb/27019/conf/keyfile    javascriptEnabled: true  EOF

keyfile文件操作

1)生產keyfile文件

openssl rand -base64 90 > ./keyfile

2)復制keyfile文件到其它實例中

#!/bin/bash  for i in 27017 27018 27019      do          \cp /home/mongod/keyfile /usr/local/mongodb/$i/conf/  done

3)修改keyfile權限 keyfile文件權限必須為 X00 ,不能給 group 和 other 成員分配任何權限,否則實例無法啟動

#!/bin/bash  for i in 27017 27018 27019      do          chmod 400 /usr/local/mongodb/$i/conf/keyfile  done

4)重啟所有實例

#!/bin/bash  for i in 27017 27018 27019      do          /usr/local/mongodb/bin/mongod --shutdown -f /usr/local/mongodb/$i/conf/mongod.conf          sleep 3s          /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/$i/conf/mongod.conf  done

認證驗證

登錄驗證可以在連接的時候指定用戶名和密碼,也可以先連接到數據庫后再進行認證

1)登錄指定用戶密碼

/usr/local/mongodb/bin/mongo --host 10.211.55.12 --port 27018 --username abcops -p 123456  abcops_repl:PRIMARY> show dbs  abcops  0.000GB  admin   0.000GB  config  0.000GB  local   0.000GB

2)先登錄,后驗證

abcops_repl:PRIMARY> use admin                          #必須要先切換到admin庫中才可以進行進行驗證  switched to db admin  abcops_repl:PRIMARY> db.auth( 'abcops','123456' )       #認證用戶名及密碼,認證成功返回1,否則返回0  1  abcops_repl:PRIMARY> show dbs       abcops  0.000GB  admin   0.000GB  config  0.000GB  local   0.000GB  abcops_repl:PRIMARY> db  admin

3)在備庫進行驗證 備庫只能進行查詢,勿要在備庫上進行任何操作

/usr/local/mongodb/bin/mongo --host 10.211.55.12 --port 27017  abcops_repl:SECONDARY> rs.slaveOk()  abcops_repl:SECONDARY> use admin  switched to db admin  abcops_repl:SECONDARY> db.auth('abcops','123456')  1

客戶端驗證

我們可以找一臺SQL管理工具來連接該庫

MongoDB中復制集集群的原理是什么

可以看到我創建的abcops庫和一個文檔及三個字段

MongoDB中復制集集群的原理是什么

關于MongoDB中復制集集群的原理是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

和静县| 桃园市| 大庆市| 习水县| 沾化县| 秭归县| 余江县| 额尔古纳市| 信丰县| 六安市| 平山县| 长武县| 宣城市| 白山市| 榆林市| 长乐市| 渝中区| 文安县| 江源县| 巴彦淖尔市| 聊城市| 边坝县| 平安县| 兴山县| 邢台县| 乃东县| 静宁县| 富锦市| 安庆市| 平南县| 霍山县| 侯马市| 涞源县| 雷波县| 花垣县| 黄浦区| 喀喇| 永修县| 闻喜县| 宁南县| 迁西县|