使用DockerCompose搭建MySQL高可用集群颖低,并平滑遷移

!!!由于MySQL官方驅(qū)動還不支持Group Replication忱屑,因此當前只是服務端可用想幻,客戶端驅(qū)動還需要等待新版本话浇。

本文描述如何使用Docker+DockerCompose來部署一個MySQL的高可用集群。

此集群由3個MySQL實例組成食店,一個Master節(jié)點吉嫩,2個Secondary節(jié)點自娩。Master可讀寫忙迁,Secondary可讀姊扔。集群之間會自動同步數(shù)據(jù)。Master失效剩余的Secondary會自動選舉Master梅誓。

  • 請準備三臺Linux VM(Ubuntu14.04)恰梢,最好是異地的
  • 每臺VM上請部署docker

由于公司內(nèi)部網(wǎng)絡隔離佛南,很多地址需要從公司內(nèi)鏡像網(wǎng)站下載。請注意嵌言,某些配置步驟在可以直連外網(wǎng)的情況下并不需要嗅回。

配置Docker環(huán)境(每臺VM)

  1. 在配置文件/etc/default/docker中DOCKER_OPTS選項添加--insecure-registry hub.witcloud.huawei.com,并重啟docker服務

  2. 執(zhí)行apt-get install python-pip

  3. 配置pip公司內(nèi)網(wǎng)鏡像

    在~/.pip/目錄下增加pip.conf文件
    
    然后編輯其內(nèi)容為:
    
    [global]
    trusted-host=rnd-mirrors.huawei.com
    index-url=http://rnd-mirrors.huawei.com/pypi/simple/
    
  4. 安裝docker-compose

    pip install docker-compose
    

部署完成后就可以使用docker-compose來進行鏡像的下載和容器的啟動了呀页。

使用Docker部署MySQL(每臺VM)

首先我們要編寫DockerCompose文件妈拌,用于配置MySQL鏡像的啟動。

mkdir /home/docker/mysql -p
vim /home/docker/mysql/docker-compose.yml

注意:因為數(shù)據(jù)庫容量未來可能較大蓬蝶,因此最好將大容量磁盤掛載到/data目錄尘分。

version: '2'
services:
  mysql:
    network_mode: "host"
    environment:
      MYSQL_ROOT_PASSWORD: "blu3Spoon55"
    image: hub.witcloud.huawei.com/it-ark/mysql
    restart: unless-stopped
    volumes:
      - "/data/mysql/db:/var/lib/mysql"
      - "/data/mysql/conf:/etc/mysql/conf.d"

MYSQL_ROOT_PASSWORD為管理員密碼,請自己設置一個強密碼丸氛。

配置Group Replication節(jié)點(每臺VM)

需要注意的差異如下:

  1. server_id每臺VM不同
    節(jié)點1: 1
    節(jié)點2: 2
    節(jié)點3: 3
    
  2. loose-group_replication_local_address每臺VM不同
    節(jié)點1: 10.183.22.167:24901
    節(jié)點2: 100.112.98.176:24901
    節(jié)點3: 10.167.117.41:24901
    
  3. bind-addressreport_host綁定為各VM的IP地址

我們使用配置文件來對集群進行配置:

mkdir /data/mysql/conf -p
vim /data/mysql/conf/ha.cnf

文件內(nèi)容:

[mysqld]  
#Encoding
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

#Replication Framework  
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW

# Host specific replication configuration
server_id=1
bind-address="10.183.22.167"
report_host="10.183.22.167"
loose-group_replication_local_address ="10.183.22.167:24901"
  
#Group Replication  
transaction_write_set_extraction=XXHASH64  
loose-group_replication_group_name="9a261783-7436-4df7-be2c-97fc7b37eb85"         
loose-group_replication_start_on_boot=on  
loose-group_replication_group_seeds="10.183.22.167:24901,100.112.98.176:24901,10.167.117.41:24901"  
loose-group_replication_bootstrap_group=off  
loose-group_replication_ip_whitelist="10.183.22.167,100.112.98.176,10.167.117.41,127.0.0.1/8"

依次啟動每個節(jié)點禾锤,進行數(shù)據(jù)庫內(nèi)部配置

  1. 啟動節(jié)點數(shù)據(jù)庫

    docker-compose up -d
    
  2. 使用數(shù)據(jù)庫工具鏈接節(jié)點

  3. 僅針對節(jié)點2,3,第一個節(jié)點不用:清理Docker容器內(nèi)部產(chǎn)生的binlog峭状,從完全干凈的狀態(tài)進行集群同步

    RESET MASTER ;
    
  4. 創(chuàng)建group replication所需要的用戶

    SET SQL_LOG_BIN =0;
    CREATE USER rpl_user@'%' IDENTIFIED BY 'rpl_pass';
    GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
    FLUSH PRIVILEGES ;
    SET SQL_LOG_BIN =1;
    CHANGE MASTER TO MASTER_USER ='rpl_user', MASTER_PASSWORD ='rpl_pass' FOR CHANNEL 'group_replication_recovery';
    
  5. 安裝組復制插件

    INSTALL PLUGIN group_replication SONAME 'group_replication.so';
    

    檢查是否插件是否啟用:

    mysql> SHOW PLUGINS;
    +----------------------------+----------+--------------------+----------------------+-------------+
    | Name                       | Status   | Type               | Library              | License     |
    +----------------------------+----------+--------------------+----------------------+-------------+
    | binlog                     | ACTIVE   | STORAGE ENGINE     | NULL                 | PROPRIETARY |
    (...)
    | group_replication          | ACTIVE   | GROUP REPLICATION  | group_replication.so | PROPRIETARY |
    +----------------------------+----------+--------------------+----------------------+-------------+
    
  6. 啟動group replication

    • 節(jié)點1:
      SET GLOBAL group_replication_bootstrap_group=ON;
      START GROUP_REPLICATION;
      SET GLOBAL group_replication_bootstrap_group=OFF;
      
    • 節(jié)點2/3
      START GROUP_REPLICATION;
      
  7. 僅針對節(jié)點1: 增加一些測試數(shù)據(jù),用于測試節(jié)點2和節(jié)點3是否同步了數(shù)據(jù)

    CREATE DATABASE test;
    use test;
    CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
    INSERT INTO t1 VALUES (1, 'mysql集群測試');
    

客戶端使用

!!!由于MySQL官方驅(qū)動還不支持Group Replication,因此當前只是服務端可用,客戶端驅(qū)動還需要等待新版本傅是。

官方ConnectJ支持使用Replication,以支持MySQL Group Replication。

只需要在連接字符串中配置即可:

jdbc:mysql:loadbalance://100.112.98.176:3306,10.183.22.167:3306,10.167.117.41:3306

應用程序代碼無需修改嫌术,驅(qū)動會自動判斷可用的Master。

Master/Secondary異步延時

由于Master/Secondary之間的數(shù)據(jù)同步存在一定延時,可能導致先寫入后讀取的時候院领,讀取不到數(shù)據(jù)废恋。

舉例說明:

  1. 線程A在Master 1上插入一條數(shù)據(jù)拟烫,id為6217614201566007296
  2. 線程A把此ID(6217614201566007296)給線程B
  3. 線程B在Secondary 1上通過此ID(6217614201566007296)讀取數(shù)據(jù)
  4. 但是此時數(shù)據(jù)還未從Master1同步到Secondary 1
  5. 線程B讀取數(shù)據(jù)為空

因此,在這種情況下,由于寫入到讀取之間可能存在延時拇囊,那么在寫入之后的處理階段(比如線程B)路捧,需要增加重試或者延時,來等待數(shù)據(jù)同步。
這也是分布式數(shù)據(jù)庫最終一致性帶來的問題凡伊。

參考資料:

  1. MySQL Group Replication官方文檔
  2. 細細探究MySQL Group Replication — 配置維護故障處理全集
  3. 使用ConnectJ配置負載均衡
  4. 數(shù)據(jù)庫分庫分表(二)Twitter-Snowflake(64位分布式ID算法)分析與JAVA實現(xiàn)
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子苍苞,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柠贤,死亡現(xiàn)場離奇詭異,居然都是意外死亡镜盯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門破停,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵蹬竖,是天一觀的道長芽腾。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任连舍,我火速辦了婚禮染簇,結果婚禮上青灼,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布督赤。 她就那樣靜靜地躺著孽糖,像睡著了一般滩褥。 火紅的嫁衣襯著肌膚如雪酒甸。 梳的紋絲不亂的頭發(fā)上农尖,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天巍实,我揣著相機與錄音瓦盛,去河邊找鬼处窥。 笑死哆致,一個胖子當著我的面吹牛胞此,可吹牛的內(nèi)容都是我干的酣胀。 我是一名探鬼主播儒溉,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蒲障,長吁一口氣:“原來是場噩夢啊……” “哼毙籽!你這毒婦竟也來了毅否?” 一聲冷哼從身側響起仰迁,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤恰起,失蹤者是張志新(化名)和其女友劉穎吨枉,沒想到半個月后圃庭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體堪滨,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡凉翻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年伶棒,在試婚紗的時候發(fā)現(xiàn)自己被綠了宛渐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鳍烁。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡姚垃,死狀恐怖看成,靈堂內(nèi)的尸體忽然破棺而出兑燥,到底是詐尸還是另有隱情,我是刑警寧澤馍盟,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布泊交,位于F島的核電站,受9級特大地震影響研乒,放射性物質(zhì)發(fā)生泄漏汹忠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捂襟,春花似錦、人聲如沸举反。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至陆赋,卻和暖如春沐祷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背攒岛。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工赖临, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人灾锯。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓兢榨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親顺饮。 傳聞我的和親對象是個殘疾皇子吵聪,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一、項目目標 搭建一個高可用web集群網(wǎng)站 二兼雄、項目規(guī)劃 2.1 ip地址規(guī)劃 2.2 拓撲圖 2.3 相關說明 ...
    夏日之光閱讀 3,411評論 0 1
  • 寫這篇文章主要是為了今后畢業(yè)論文素材上的整理吟逝,同時對docker進行鞏固溫習。大綱: docker簡介docker...
    胡圖仙人閱讀 7,435評論 2 96
  • 簡述 hadoop 集群一共有4種部署模式君旦,詳見《hadoop 生態(tài)圈介紹》。HA模式的集群里面會部署兩臺NN(最...
    mtide閱讀 7,010評論 0 10
  • 嘿 陌生人 我們聊聊吧 想想也已經(jīng)好長好長時間沒有寫過東西了 只是現(xiàn)在忽然想起來想要寫點什么 估計是現(xiàn)在宿舍這...
    陪考研狗的fighting蘇小閱讀 600評論 0 0
  • 沉淀了吧嘲碱!時不時的又被搖晃起了那顆不安的心金砍,瓶子放置的位置在哪都不合適,也不知道是心里放了個瓶子還是瓶子里放了個心...
    曉燦閱讀 166評論 0 0