Mysql主從架構-主庫宕機如何恢復業務

      網友投稿 664 2025-04-01

      什么是分片

      高數據量和吞吐量的數據庫應用會對單機的性能造成較大壓力,大的查詢量會將單機的CPU耗盡,大的數據量對單機的存儲壓力較大,最終會耗盡系統的內存而將壓力轉移到磁盤IO上。

      MongoDB分片是使用多個服務器存儲數據的方法,以支持巨大的數據存儲和對數據進行操作。分片技術可以滿足MongoDB數據量大量增長的需求,當一臺MongoDB服務器不足以存儲海量數據或者不足以提供可接受的讀寫吞吐量時,我們就可以通過在多臺服務器上分割數據,使得數據庫系統能存儲和處理更多的數據。

      Mysql主從架構-主庫宕機如何恢復業務

      MongoDB分片優勢

      分片為應對高吞吐量與大數據量提夠了方法

      使用分片減少了每個分片需要處理的請求數,因此,通過水平擴展,群集可以提高自己的存儲容量。比如,當插入一條數據時,應用只需要訪問存儲這條數據的分片。

      使用分片減少了每個分片村存儲的數據

      分片的優勢在于提供類似線性增長的架構,提高數據可用性,提高大型數據庫查詢服務器的性能。當MongoDB單點數據庫服務器存儲成為瓶頸、單點數據庫服務器的性能成為瓶頸或需要部署大型應用以充分利用內存時,可以使用分片技術。

      MongoDB分片群集的組成

      Shard:分片服務器,用于存儲實際的數據塊,實際生產環境中一個shard server 角色可以由幾臺服務器組成一個Peplica Set 承擔,防止主機單點故障。

      Config Server:配置服務器,存儲了整個分片群集的配置信息,其中包括chunk信息。

      Routers:前端路由,客戶端由此接入,且讓整個群集看上去像單一數據庫,前端應用可以透明使用。

      環境準備

      系統版本:CenTos 7

      軟件版本:MongoDB4.0

      關閉防火墻及selinux

      systemctl?stop?firewalld.servicesetenforce?0

      部署MongoDB分片群集

      群集部署的搭建思路,利用三臺服務器,分別安裝MongoDB數據庫,每臺服務器創建五個實例(mongos、configs、shard1、shard2、shard3)。三臺不同的服務器上的相同名稱的實例,創建為一個復制集,分別包括主節點,副節點,仲裁節點。mongos不需創建復制集,config不需指定主副節點及仲裁節點,但是要創建復制集。三臺服務器的操作步驟略有差別,但是大多是都是重復操作,步驟完全一致。

      安裝MongoDB數據庫

      yum?install?openssl-devel?-y tar?zxf?mongodb-linux-x86_64-rhel70-4.0.0.tgz?-C?/usr/localmv?/usr/local/mongodb-linux-x86_64-rhel70-4.0.0?/usr/local/mongodb??//解壓即完成安裝

      路由服務器不存儲數據,因此就不需要創建數據存儲目錄,只需創建config、shard1、shaed2、shard3即可,日志文件創建完成之后還需要給予權限。

      mkdir?-p?/data/mongodb/logs/mkdir?/etc/mongodb/mkdir?/data/mongodb/config/mkdir?/data/mongodb/shard{1,2,3} touch?/data/mongodb/logs/shard{1,2,3}.log touch?/data/mongodb/logs/mongos.log touch?/data/mongodb/logs/config.logchmod?777?/data/mongodb/logs/*.log

      useradd?-M?-u?8000?-s?/sbin/nologin?mongochown?-R?mongo.mongo?/usr/local/mongodbchown?-R?mongo.mongo?/data/mongodb

      echo?"PATH=/usr/local/mongodb/bin:$PATH"?>>?/etc/profilesource?/etc/profile

      ulimit?-n?25000ulimit?-u?25000 sysctl?-w?vm.zone_reclaim_mode=0echo?never?>?/sys/kernel/mm/transparent_hugepage/enabledecho?never?>?/sys/kernel/mm/transparent_hugepage/defrag??//*注意*這些優化都是臨時的,重啟失效

      部署配置服務器

      #vim?/etc/mongodb/config.confpidfilepath?=?/data/mongodb//logs/config.pid???????????//pid文件位置dbpath?=?/data/mongodb/config/?????????????????????????????//數據文件存放位置logpath?=?/data/mongodb//logs/config.log???????????????//日志文件位置logappend?=?true?????????????????bind_ip?=?0.0.0.0?????????????????????????????????????????????????????//監聽地址port?=?30000???????????????????????????????????????????????????????????//端口號fork?=?true?replSet=configs??????????????????????????????????????????????????????//復制集名稱configsvr?=?truemaxConns=20000??????????????????????????????????????????????????//最大連接數

      scp?/etc/mongodb/config.conf?root@172.16.10.27:/etc/mongodb/scp?/etc/mongodb/config.conf?root@172.16.10.29:/etc/mongodb/

      mongod?-f?/etc/mongodb/config.conf??//三臺服務器操作一致

      mongo?--port?30000????????????????????//建議三臺服務器都進入數據庫,方便查看角色變更config={_id:"configs",members:[{_id:0,host:"172.16.10.26:30000"},{_id:1,host:"172.16.10.27:30000"},{_id:2,host:"172.16.10.29:30000"}]}????//創建復制集rs.initiate(config)????????????????//初始化復制集

      部署shard1分片服務器

      #vim?/etc/mongodb/shard1.confpidfilepath?=?/data/mongodb//logs/shard1.piddbpath?=?/data/mongodb/shard1/logpath?=?/data/mongodb//logs/shard1.loglogappend?=?truejournal?=?truequiet?=?truebind_ip?=?0.0.0.0port?=?40001fork?=?truereplSet=shard1shardsvr?=?truemaxConns=20000

      scp?/etc/mongodb/shard1.conf?root@172.16.10.27:/etc/mongodb/scp?/etc/mongodb/shard1.conf?root@172.16.10.29:/etc/mongodb/

      mongod?-f?/etc/mongodb/shard1.conf??//三臺服務器操作一致

      在shard分片服務器的創建中,需要注意的點是,不是在任一臺服務器上創建都能成功的,如果選擇在預先設置為仲裁節點的服務器上創建復制集會報錯。以shard1分片服務器為例,可以在172.16.10.26和172.16.10.27服務器上創建復制集,在172.16.10.29上創建則會失敗,因為在復制集創建之前,172.16.10.29已經被設置為仲裁節點。

      mongo?--port?40001????//建議三臺服務器都進入數據庫,方便查看角色變更use?admin config={_id:"shard1",members:[{_id:0,host:"172.16.10.26:40001",priority:2},{_id:1,host:"172.16.10.27:40001",priority:1},{_id:2,host:"172.16.10.29:40001",arbiterOnly:true}]} rs.initiate(config)

      部署shard2分片服務器

      #vim?/etc/mongodb/shard2.confpidfilepath?=?/data/mongodb//logs/shard2.piddbpath?=?/data/mongodb/shard2/logpath?=?/data/mongodb//logs/shard2.loglogappend?=?truejournal?=?truequiet?=?truebind_ip?=?0.0.0.0port?=?40002fork?=?truereplSet=shard2shardsvr?=?truemaxConns=20000

      scp?/etc/mongodb/shard2.conf?root@172.16.10.27:/etc/mongodb/scp?/etc/mongodb/shard2.conf?root@172.16.10.29:/etc/mongodb/

      mongod?-f?/etc/mongodb/shard2.conf??//三臺服務器操作一致

      mongo?--port?40002????//建議三臺服務器都進入數據庫,方便查看角色變更use?admin config={_id:"shard2",members:[{_id:0,host:"172.16.10.26:40002",arbiterOnly:true},{_id:1,host:"172.16.10.27:40002",priority:2},{_id:2,host:"172.16.10.29:40002",priority:1}]} rs.initiate(config)

      部署shard3分片服務器

      #vim?/etc/mongodb/shard3.confpidfilepath?=?/data/mongodb//logs/shard3.piddbpath?=?/data/mongodb/shard3/logpath?=?/data/mongodb//logs/shard3.loglogappend?=?truejournal?=?truequiet?=?truebind_ip?=?0.0.0.0port?=?40003fork?=?truereplSet=shard3shardsvr?=?truemaxConns=20000

      scp?/etc/mongodb/shard3.conf?root@172.16.10.27:/etc/mongodb/scp?/etc/mongodb/shard3.conf?root@172.16.10.29:/etc/mongodb/

      mongod?-f?/etc/mongodb/shard3.conf??//三臺服務器操作一致

      mongo?--port?40003????//建議三臺服務器都進入數據庫,方便查看角色變更use?adminconfig={_id:"shard3",members:[{_id:0,host:"172.16.10.26:40003",priority:1},{_id:1,host:"172.16.10.27:40003",arbiterOnly:true},{_id:2,host:"172.16.10.29:40003",priority:2}]} rs.initiate(config);

      部署路由服務器

      pidfilepath?=?/data/mongodb/logs/mongos.pidlogpath=/data/mongodb/logs/mongos.loglogappend?=?truebind_ip?=?0.0.0.0port?=?27017fork?=?trueconfigdb?=?configs/172.16.10.26:30000,172.16.10.27:30000,172.16.10.29:30000maxConns=20000

      scp?/etc/mongodb/mongos.conf?root@172.16.10.27:/etc/mongodb/scp?/etc/mongodb/mongos.conf?root@172.16.10.29:/etc/mongodb/

      mongos?-f?/etc/mongodb/mongos.conf??//三臺服務器操作一致*注意*這里是“mongos”而非“mongod”

      mongo????//因為默認端口即是27017,所以此處不接端口號mongos>?use?adminmongos>?sh.addShard("shard1/172.16.10.26:40001,172.16.10.27:40001,172.16.10.29:40001")mongos>?sh.addShard("shard2/172.16.10.26:40002,172.16.10.27:40002,172.16.10.29:40002")mongos>?sh.status()???????????//查看群集狀態//此處先添加兩各分片服務器,還有一個,待會添加

      測試服務器分片功能

      mongos>?use?config switched?to?db?config mongos>?db.settings.save({"_id":"chunksize","value":1})???//設置塊大小為1M是方便實驗,不然就需要插入海量數據WriteResult({?"nMatched"?:?0,?"nUpserted"?:?1,?"nModified"?:?0,?"_id"?:?"chunksize"?})

      mongos>?use?pythonswitched?to?db?pythonmongos>?show?collectionsmongos>?for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})}//在python庫的user表中循環寫入五萬條數據 WriteResult({?"nInserted"?:?1?})

      mongos>sh.enableSharding("python")//數據庫分片就有針對性,可以自定義需要分片的庫或者表,畢竟也不是所有數據都是需要分片操作的

      創建索引的規則是不能一致性太高,要具有唯一性,例如序號,比如性別這一類重復性太高的就不適合做索引

      mongos>?db.user.createIndex({"id":1})???//以”id“為索引

      mongos>?sh.shardCollection("python.user",{"id":1})

      mongos>?sh.status() ---?Sharding?Status?---? ????????????···省略內容??shards: ????????{??"_id"?:?"shard1",??"host"?:?"shard1/172.16.10.26:40001,172.16.10.27:40001",??"state"?:?1?} ????????{??"_id"?:?"shard2",??"host"?:?"shard2/172.16.10.27:40002,172.16.10.29:40002",??"state"?:?1?} ????????????···省略內容????????????????????????chunks: ????????????????????????????????shard1??3 ????????????????????????????????shard2??3 ????????????????????????{?"id"?:?{?"$minKey"?:?1?}?}?-->>?{?"id"?:?9893?}?on?:?shard1?Timestamp(2,?0)? ????????????????????????{?"id"?:?9893?}?-->>?{?"id"?:?19786?}?on?:?shard1?Timestamp(3,?0)? ????????????????????????{?"id"?:?19786?}?-->>?{?"id"?:?29679?}?on?:?shard1?Timestamp(4,?0)? ????????????????????????{?"id"?:?29679?}?-->>?{?"id"?:?39572?}?on?:?shard2?Timestamp(4,?1)? ????????????????????????{?"id"?:?39572?}?-->>?{?"id"?:?49465?}?on?:?shard2?Timestamp(1,?4)? ????????????????????????{?"id"?:?49465?}?-->>?{?"id"?:?{?"$maxKey"?:?1?}?}?on?:?shard2?Timestamp(1,?5)

      mongos>?use?admin switched?to?db?admin mongos>?sh.addShard("172.16.10.26:40003,172.16.10.27:40003,172.16.10.29:40003") mongos>?sh.status() ---?Sharding?Status?---? ???????????···省略內容??shards: ????????{??"_id"?:?"shard1",??"host"?:?"shard1/172.16.10.26:40001,172.16.10.27:40001",??"state"?:?1?} ????????{??"_id"?:?"shard2",??"host"?:?"shard2/172.16.10.27:40002,172.16.10.29:40002",??"state"?:?1?} ????????{??"_id"?:?"shard3",??"host"?:?"shard3/172.16.10.26:40003,172.16.10.29:40003",??"state"?:?1?} ???????????···省略內容????????????????????????chunks: ????????????????????????????????shard1??2 ????????????????????????????????shard2??2 ????????????????????????????????shard3??2 ????????????????????????{?"id"?:?{?"$minKey"?:?1?}?}?-->>?{?"id"?:?9893?}?on?:?shard3?Timestamp(6,?0)? ????????????????????????{?"id"?:?9893?}?-->>?{?"id"?:?19786?}?on?:?shard1?Timestamp(6,?1)? ????????????????????????{?"id"?:?19786?}?-->>?{?"id"?:?29679?}?on?:?shard1?Timestamp(4,?0)? ????????????????????????{?"id"?:?29679?}?-->>?{?"id"?:?39572?}?on?:?shard3?Timestamp(5,?0)? ????????????????????????{?"id"?:?39572?}?-->>?{?"id"?:?49465?}?on?:?shard2?Timestamp(5,?1)? ????????????????????????{?"id"?:?49465?}?-->>?{?"id"?:?{?"$maxKey"?:?1?}?}?on?:?shard2?Timestamp(1,?5)

      服務器又對數據進行重新分片,當你再次移除一個分片服務器,此時又會對數據再次進行分片處理,MongoDB對數據的處理非常靈活

      Mysql 大數據

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:偶發的el-select無法選擇的問題
      下一篇:單片機有前途嗎?學單片機先學什么?
      相關文章
      色偷偷亚洲第一综合| 亚洲AV成人精品日韩一区| 亚洲国产日韩a在线播放| 久久久亚洲AV波多野结衣| 亚洲综合亚洲综合网成人| 亚洲精品中文字幕无码A片老| 激情亚洲一区国产精品| 亚洲一级毛片在线观| 亚洲无限乱码一二三四区| 亚洲成人一级电影| 久久亚洲精品成人av无码网站| 亚洲国产精品一区| 亚洲高清在线mv| 亚洲一区在线视频| 自拍偷区亚洲国内自拍| 亚洲精品无码专区| 亚洲精品一卡2卡3卡四卡乱码| 久久精品熟女亚洲av麻豆 | 亚洲精品成人久久久| 亚洲精品乱码久久久久久不卡| 亚洲欧洲久久av| 亚洲三区在线观看无套内射| 久久99国产亚洲高清观看首页| 久久99国产亚洲精品观看| 91亚洲国产在人线播放午夜 | 亚洲AV无码专区日韩| 亚洲精品乱码久久久久久蜜桃| 狠狠综合久久综合88亚洲| 亚洲国产第一站精品蜜芽| 久久综合亚洲色一区二区三区| 亚洲a级在线观看| 亚洲aⅴ天堂av天堂无码麻豆| 亚洲av片一区二区三区| 亚洲香蕉网久久综合影视| 亚洲精品线在线观看| 亚洲人成高清在线播放| 亚洲日韩一中文字暮| 亚洲一区二区三区不卡在线播放| 亚洲中文字幕久久精品无码A| 国内成人精品亚洲日本语音| 久久影视综合亚洲|