!!!由于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)
在配置文件/etc/default/docker中DOCKER_OPTS選項添加
--insecure-registry hub.witcloud.huawei.com
,并重啟docker服務執(zhí)行
apt-get install python-pip
-
配置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/
-
安裝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)
需要注意的差異如下:
-
server_id
每臺VM不同節(jié)點1: 1 節(jié)點2: 2 節(jié)點3: 3
-
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
-
bind-address
和report_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)部配置
-
啟動節(jié)點數(shù)據(jù)庫
docker-compose up -d
使用數(shù)據(jù)庫工具鏈接節(jié)點
-
僅針對節(jié)點2,3,第一個節(jié)點不用:清理Docker容器內(nèi)部產(chǎn)生的binlog峭状,從完全干凈的狀態(tài)進行集群同步
RESET MASTER ;
-
創(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';
-
安裝組復制插件
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 | +----------------------------+----------+--------------------+----------------------+-------------+
-
啟動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;
-
節(jié)點1:
-
僅針對節(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ù)废恋。
舉例說明:
- 線程A在Master 1上插入一條數(shù)據(jù)拟烫,id為6217614201566007296
- 線程A把此ID(6217614201566007296)給線程B
- 線程B在Secondary 1上通過此ID(6217614201566007296)讀取數(shù)據(jù)
- 但是此時數(shù)據(jù)還未從Master1同步到Secondary 1
- 線程B讀取數(shù)據(jù)為空
因此,在這種情況下,由于寫入到讀取之間可能存在延時拇囊,那么在寫入之后的處理階段(比如線程B)路捧,需要增加重試或者延時,來等待數(shù)據(jù)同步。
這也是分布式數(shù)據(jù)庫最終一致性帶來的問題凡伊。