1. 程式人生 > >Mysql 線上資料遷移的一點想法

Mysql 線上資料遷移的一點想法

馬上DBScale 就要設計線上動態節點新增這個功能了, 對此自己稍微想了點,記錄下。

線上資料節點新增分為2類:
1. 往主從複製的叢集中新增一個新的slave節點

    這個相對簡單,根據之前sqlproxy的實現經驗,主要步驟分為線下和線上兩部分:
    線下, a.選擇一個叢集中的slave節點 s,停止它的 sql thread (這種情況下dbscale會自動遮蔽這個節點)。
                b. 記錄slave節點 s執行到的master binlog位置(Relay_Master_Log_File, Exec_Master_Log_Pos)
                c. 通過備份工具或手工拷貝將該slave s的資料複製到新的slave節點上
                d. 恢復slave s的sql thread(當同步延遲減少到可接受範圍內時dbscale會重新啟用這個節點)
                e. 讓新slave節點  change master to 全域性的master節點,位置為步驟b中記錄的位置

    線上,  a. dbscale 上個全域性的系統鎖,將新slave的資訊新增進全域性的叢集拓撲元資料中
                b. 解除全域性系統鎖
                c. 當新slave的延遲減少到可接受範圍內是dbscale會啟用這個節點來提供服務

這個方案對系統的影響很小,主要是線上的全域性系統鎖,但那個很快就釋放了。 線下的操作可以由指令碼來完成。
通過把指令碼的呼叫整合到dbscale的管理介面中可以實現自動化處理。

2. 往一個sharding叢集中新增一個新的partition節點

     這個過程較為複雜。 sharding指的是對一張大表的sharding, 把一張大表分散到多個邏輯節點上,而邏輯節點可能部署在不同的物理機器上。
     首先是分割槽演算法的單調性,這裡主要指的是HASH分割槽演算法 (range分割槽的單調性很容易), 例如一致性HASH演算法, 可以參考下面這個連線:
     http://blog.csdn.net/sparkliang/article/details/5279393
     在確保了演算法的單調性之後,我們就可以確保往叢集中新增新節點的過程中發生的資料重新分佈只會是資料從舊的節點移到新的節點。
     這樣問題就簡化為如何線上地將一個partition中的部分資料遷移到一個新的partition中。

    假設一箇舊的partition 為p1, 新的partition為p2, p1的一個備份節點p3, p2 的備份節點p4
    線下:  建立p2和p4的主從複製關係, 然後通過dbscale的管理介面將它們加入叢集

    線上:  1.和之前一樣,將新的節點新增進叢集的時候會上一次全域性系統鎖。
                 2. 根據新的叢集拓撲計算出一個新的一致性HASH的環形分佈(我們假設舊的分佈為 hash1 新的為hash2)
                 3. dbscale 中斷p1 和p3之間的主從複製, 並記錄p3的執行到的master binlog位置
                 4. dbscale 模擬IO thread 從p1上根據步驟3記錄的位置開始拉取p1的binlog
                 5. dbscale 根據hash 2將拉取到的binlog中的event分為兩部分log1 和log2
                     log1為按照hash2應該落在p1節點的event, log2為按照hash2應該落在p2節點的event
                 6. dbscale根據hash 2將p3節點中相關的資料移動到p2 上
                 7. 當步驟6執行完, dbscale暫停從p1上拉取binlog,
                    

相關推薦

Mysql 線上資料遷移一點想法

馬上DBScale 就要設計線上動態節點新增這個功能了, 對此自己稍微想了點,記錄下。 線上資料節點新增分為2類: 1. 往主從複製的叢集中新增一個新的slave節點     這個相對簡單,根據之前sqlproxy的實現經驗,主要步驟分為線下和線上兩部分:     線下, a.選擇一個叢集中的slav

資料遷移Mysql 線上資料遷移一點想法

線上資料節點新增分為2類: 1. 往主從複製的叢集中新增一個新的slave節點     這個相對簡單,根據之前sqlproxy的實現經驗,主要步驟分為線下和線上兩部分:     線下, a.選擇一個叢集中的slave節點 s,停止它的 sql thread (這種情況下dbscale會自動遮蔽這個節點)。  

mysql database 資料遷移:mydumper與myloader

[[email protected] ~]# yum install glib2-devel mysql-devel zlib-devel pcre-devel openssl-devel cmake [[

sqlYog對mysql資料庫資料遷移

一   資料庫的遷移 1.找到要遷移的表,右擊"備份/匯出",點選備份表作為sql轉儲,繼續操作,就儲存好了相應資料 2.在資料直接執行,匯出的sql語句,將裡面的原資料庫database修改為現在的資料庫連線,就將資料重新建表並插入其中 二   外來excle匯入到

記一次MSSQL到MySQL資料遷移過程

工作中遇到一個需求 要將MSSQL資料庫中共計12張表的資料大概1000W行資料遷移到MySQL資料庫中,去年另一個同事負責這件事情,他採用的方法是先將MSSQL資料庫裡的資料生成同MySQL資料庫表結構一致的12張表,然後用我提供的一個delphi寫的一個工具來進行遷移。工具用的UniDAC的TCRBa

資料遷移線上資料遷移 :雙寫資料庫、搬歷史資料、切換寫入、灰度驗證(99.9999%)、刪除歷史

  線上資料遷移,是指將正在提供線上服務的資料,從一個地方遷移到另一個地方,整個遷移過程中要求不停機,服務不受影響。根據資料所處層次,可以分為cache遷移和儲存遷移;根據資料遷移前後的變化,又可以分為平移和轉移。 平移是指遷移前後資料組織形式不變,比如Mysql從1個例項擴充套件為4個例項,Redis

mysql大量資料遷移

http://blog.csdn.net/blakefez/article/details/51076588 最近有個需求,要把機器a上的一個數據庫遷移到機器b上,這個資料庫的資料有100多個G。所以,果斷拋棄用mysqldump的方法來遷移。這時候想到的就是直接複製檔案來

redis-migration:獨創的redis線上資料遷移工具

一、常見redis資料遷移方式 業內,常見的redis資料遷移方式有以下三種:aof(日誌檔案)、rdb(快照檔案)、replication(主從複製)。 其中,aof和rdb兩種方式適用於跨網路(網路隔離)的redis例項之間的資料遷移,通過:在源例項上執行指令(bgr

mysql 冷備資料庫將某個機子的mysql資料庫資料遷移到另一臺mysql資料庫

mysql冷備指的是指將mysql的配置檔案中datadir屬性所指定的相關資料資訊直接拷貝到另一個數據庫相應目錄下,就可以直接實現資料庫資料的遷移。 步驟: 一 關閉mysql服務 二開始拷貝檔案,備份。 mysql資料庫預設儲存模式是INNOB儲存模式,  主要拷

MySQL 不停服務 線上進行100億資料遷移切換

背景: 促銷庫壓力巨大,單例項已經不足以提供寫入效能,雖然有256個分表,但是經常io打滿,總資料量已經達到100億,單例項io已經支撐不住,所以方案是從促銷庫裡面遷移2張壓力大的業務分表到新的16個例項裡面,2張分表的個數大概是256個,剩餘的3000多

Mysql資料遷移出現使用者沒有指定

mysql建立使用者: CREATE USER 'itsm_451'@'%' IDENTIFIED BY '123456'; 賦值許可權 grant all privileges on *.* to [email protected]"%" identified

將oracle中的資料遷移mysql中,避免亂碼的方法

1.將oracle中的資料匯出成csv格式的檔案 將oracle中的查詢結果集,點選匯出,選擇csv。(匯出Excel格式非常非常慢,Excel匯入mysql中時,選擇65001 (UTF-8),中文不會亂碼) 2.用mysql資料庫管理工具navicat,點選到表選項(非具體表),點選

MySql如何進行資料遷移

資料庫進行遷移: 保證兩臺機器的Mysql版本一致,安裝配置基本一致(注意:這裡的資料檔案和庫表結構檔案都指定在同一目錄data下) 停止兩邊的Mysql服務(A伺服器--遷移-->C伺服器) 刪除B伺服器Mysql的data目錄下所有檔案 拷貝A伺服器Mysq

mysql + excel 校正線上資料

積分問題處理 1. 所有應補彙總 select driver_id, SUM(integral) from detail_score group by driver_id; 2. 原彙總積分 select driver_id, rank, integral from xx

django 連線MYSQL時,資料遷移時報:django.db.utils.InternalError: (1366, "Incorrect string value: '\\xE9\\x97\\xAE\\xE9\\xA2\\x98' for column 'na

django 連線MYSQL時,資料遷移時報:django.db.utils.InternalError: (1366, "Incorrect string value: '\\xE9\\x97\\xAE\\xE9\\xA2\\x98' for column 'name' at row 5") 這個問題是由

MySQL資料遷移到SQL Server

資料遷移的工具有很多,基本SSMA團隊已經考慮到其他資料庫到SQL Server遷移的需求了,所以已經開發了相關的遷移工具來支援。 此部落格主要介紹MySQL到SQL Server資料遷移的工具:SQL Server Migration Assistant for MySQL 的使用.

mysql建立資料庫命令,線上公文管理系統(officeonlinesystem),還有oracle,sqlserver的,歡迎參考學習

線上公文管理系統mysql資料庫建立語句 線上公文管理系統oracle資料庫建立語句 線上公文管理系統sqlserver資料庫建立語句 線上公文管理系統spring+springMVC+hibernate框架物件(javaBean,pojo)設計 線上公文管理

使用odbc實現mysql和sql之間的資料遷移

首先要確保你的Windows系統上已經安裝了mysql,安裝步驟可以參考: grant all privileges on *.* to 'root'@'你的host' identified by '

mysql資料遷移方法一

先找到遷移伺服器上的Data檔案,我安裝的是mysql5.7,預設安裝的路徑。那麼就是在C:\ProgramData\MySQL檔案裡面,先把隱藏檔案開啟。 這個Data檔案就是你的資料檔案;將你要遷移的資料庫檔案放到這裡如下: 然後開啟my.ini:找到datadir,然

資料遷移問題MySQL——>Oracle

共遷移7張表,表間互有關聯,操作步驟: 1、使用Navicat將資料從Mysql傳輸到Oracle   Navicat—>工具—>資料傳輸,注意高階選項中的設定。 2、發現問題遷移後的表名和欄位名有"",在Oracle中,加""的表名是大小寫敏感的,需將加"