利用RadonDB實現MySQL分庫分表

  • 2020 年 3 月 10 日
  • 筆記

利用RadonDB實現MySQL分庫分表

RadonDB是青雲上提供的MySQL分散式解決方案,提供資料庫的透明拆分及高可用服務。RadonDB包括Radon, Xenon, MySQL三部分安裝。其中Radon,Xenon官方沒有發行二進位包,需要編譯安裝, MySQL可以使用官方編譯後的版本安裝,但需要使用MySQL 5.7這個版本。在以下文檔安裝過程中如果遇到問題請及時的回饋作者:QQ/Weixin: 82565387

本文內容較長大致分為:

  • 環境基本情況介紹
  • 編譯環境準備
  • Xenon編譯安裝
  • Radon 編譯安裝
  • MySQL安裝部署及啟動
  • Xtrabackup安裝
  • Xenon安裝部署
  • Xenon的基本管理
  • Radon安裝布署
  • Radon集群安裝
  • 小結

其中MySQL的配置限於文章長度,這裡不在放在文中,如果需要聯繫作者獲取即可。

環境基本情況介紹

機器名

角色

IP

部署路徑

radon1

radon

172.16.0.121

/data/radon

radon1

radon

172.16.0.122

/data/radon

dzst150

xenon,mysql,xtrabackup

172.16.0.150

/data/xenon,標準化安裝mysql,利用percona安裝xtrabackup

dzst151

xenon,mysql,xtrabackup

172.16.0.151

/data/xenon,標準化安裝mysql,利用percona安裝xtrabackup

dzst152

xenon,mysql,xtrabackup

172.16.0.152

/data/xenon,標準化安裝mysql, 利用percona安裝xtrabackup

服務IP

172.16.0.100

該IP就類似於機器上多綁一個ip

  • Radon下載: https://github.com/radondb/radon
  • Xenon下載: https://github.com/radondb/xenon
  • golang下載: https://dl.google.com/go/go1.13.4.linux-amd64.tar.gz
  • MySQL下載: https://dev.mysql.com/downloads/mysql/ 下載MySQL 5.7版本
  • Xtrabakup:https://www.percona.com/downloads/Percona-XtraBackup-2.4/LATEST/也可以利用https://repo.percona.com/yum/percona-release-latest.noarch.rpm 安裝2.4版本的xtrabacku

在環境安裝環節,大致可以分為:radon和 xenon(包含:MySQL, xtrabackup)的安裝部署。

編譯環境準備

Golang安裝需要在編譯機上安裝即可,其它機器不用安裝。

  • 下載go1.13.4安裝包
# wget https://dl.google.com/go/go1.13.4.linux-amd64.tar.gz
  • 解壓安裝包
# tar -xvf go1.13.4.linux-amd64.tar.gz -C /usr/local
  • 修改環境變數 在~/.bash_profile末尾添加一行
export PATH=$PATH:/usr/local/go/bin# source ~/.bash_profile
  • 驗證Go安裝是否成功
# go versiongo version go1.13.4 linux/amd64

Xenon編譯安裝

  • 下載源程式碼 & 編譯
# git clone https://github.com/radondb/xenon.git# cd xenon# make

確認bin目錄下生成了: xenon,xenoncli 便大功告成。

  • 簡單的打包:
mkdir xenoncp -r bin xenoncp xenon.json xenonecho "/etc/xenon/xenon.json" >xenon/bin/config.path

其中xenon.json 後面需要根據機器的IP修改一下。把這個xenon同步複製到 :172.16.0.150, 172.16.0.151 ,172.16.0.152的/data目錄下:

scp -r xenon [email protected]:/data/scp -r xenon [email protected]:/data/scp -r xenon [email protected]:/data/

Radon 編譯安裝

  • 下載Radon&編譯
# git clone https://github.com/radondb/radon# cd radon# make

沒有報錯,確認bin目錄下生成 radon

ls -l bin/total 17024-rwxr-xr-x 1 root root 17431669 Nov 15 11:11 radon
  • 簡單打包
mkdir radoncp -r bin radon/cp conf/radon.default.json radon/bin/

後續對於部署radon節點,直接複製 radon 這個目錄即可

scp -r radon [email protected]:/data/

MySQL安裝部署及啟動

MySQL 需要在三台Xenon角色的機器上都安裝,安裝步驟一樣,這裡不再重複。下面給一個統一的安裝方式。

1. 下載mysql

cd /datawget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz

2. MySQL軟體路徑 :

mkdir /opt/mysqlcd /opt/mysql/tar zxvf /data/mysql/mysql-5.7.28-linux-glibc2.12-x86_64.tar.gzln -s /opt/mysql/mysql-xxx /usr/local/mysql

3. 創建資料庫相關目錄:

mkdir /data/mysql/ -pmkdir /data/mysql/mysql3306/{data,logs,tmp} -p

4. 創建mysql用戶&更改許可權

同時更改一下mysql用戶的密碼,方便後續使用(建議ssh信任使用),按個人習慣更改密碼。

groupadd mysqluseradd -g mysql -s /bin/bash  -d /usr/local/mysql  mysqlpasswd mysql

5. 更改許可權

chown -R mysql:mysql /data/mysql/mysql3306chown -R mysql:mysql /opt/mysql/chown -R mysql:mysql /usr/local/mysql

配置文參考 /data/mysql/mysql3306/my3306.cnf 公眾號中沒辦法放置配置文件,如果需要聯繫作者獲取

6. 初始化

/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3306/my3306.cnf  --initialize

確認沒有錯誤提示,從error log中找到初始化的密碼。

grep  "password" /data/mysql/mysql3306/data/error.log

7. 啟動MySQL

/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql/mysql3306/my3306.cnf &

8. 進入mysql更改密碼。

/usr/local/mysql/bin/mysql -S /tmp/mysql3306.sock -pmysql>alter user user() identified by 'zstzst';

9. 關閉MySQL

/usr/local/mysql/bin/mysql -S /tmp/mysql3306.sock -pmysql>shutdown;

10. 創建帳號

測試用服務帳號

create user 'wubx'@'%' identified by 'wubxwubx';grant all privileges on *.* to 'wubx'@'%';

MySQL複製使用帳號

create user 'repl'@'%' identified by 'repl4slave';grant replication slave on *.* to 'repl'@'%';

11. 為MySQL載入半同步需要plugin

進入MySQL執行:

set global super_read_only=0;set global read_only=0; INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';     

構建成主從結構 三台機器最終構建成基於GTID的複製結構,就完成了MySQL的安裝。

Xtrabackup安裝

三台xenon的機器上都需要安裝:

#wget https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.16/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.16-1.el7.x86_64.rpm

安裝xtrbackup24

#yum localinstall -y percona-xtrabackup-24-2.4.16-1.el7.x86_64.rpm

確認無報錯

利用 xtrabackup –version 驗證 有正確的結果輸出。

xtrabackup --versionxtrabackup: recognized server arguments: xtrabackup version 2.4.16 based on MySQL server 5.7.26 Linux (x86_64) (revision id: c807cfa)

Xenon安裝部署

xenon的環境搭建,包括現有MySQL想引入xenon實現MySQL高可用需要把握以下幾點:

1. 把MySQL的半同步plugin載入上去

2. 對外服務IP是在xenon.json配置文件中leader-start-command 這個項成為leader時觸發,如果我們使用的普通用戶運行xenon,還需要給該用戶配置sudo 相關許可權。

3. xenon的rebuildme需要xenon.json中backup中"ssh-user" 指定的用戶打通ssh信任,或是指定正確的密碼。

4. Xenon中發生選舉後,新的服務節點一定要對外發起arping , 請參考xenon.json中"leader-start-command" 的定義。

  • 基於編譯機上編譯copy過來的xenon部署。
cd /data/xenonmkdir /etc/xenonmv xenon.json /etc/xenon/chown -R mysql:mysql /etc/xenonchown -R mysql:mysql /data/xenon
  • xenon的配置xenon.json
{        "server":        {                "endpoint":"172.16.0.150:8801"        },          "raft":        {                "meta-datadir":"raft.meta",                "heartbeat-timeout":1000,                "election-timeout":3000,                "leader-start-command":"sudo /sbin/ip a a 172.18.0.100/16 dev eth0 && arping -c 3 -A  172.18.0.100  -I eth0",                "leader-stop-command":"sudo /sbin/ip a d 172.18.0.100/16 dev eth0"        },          "mysql":        {                "admin":"root",                "passwd":"",                "host":"127.0.0.1",                "port":3306,                "basedir":"/usr/local/mysql",                "defaults-file":"/data/mysql/mysql3306/my3306.cnf",                "ping-timeout":1000,                "master-sysvars":"super_read_only=0;read_only=0;sync_binlog=default;innodb_flush_log_at_trx_commit=default",                "slave-sysvars": "super_read_only=1;read_only=1;sync_binlog=1000;innodb_flush_log_at_trx_commit=2"        },          "replication":        {                "user":"repl",                "passwd":"repl4slave"        },          "backup":        {                "ssh-host":"172.16.0.150",                "ssh-user":"mysql",                "ssh-passwd":"mysql",                "ssh-port":22,                "backupdir":"/data/mysql/mysql3306/data",                "xtrabackup-bindir":"/usr/bin",                "backup-iops-limits":100000,                "backup-use-memory": "1GB",                "backup-parallel": 2        },          "rpc":        {                "request-timeout":500        },          "log":        {                "level":"INFO"        }}

對於xenon的配置文件在三台機器上注意IP處理一下就可以,每台機器換成自已的IP即可。對於Xenon的配置,從實踐來看遇到遇到最多的問題忘了做arpping 造成 集群切換時新節點VIP對外生效。

  • 配置sudo 相關許可權 需要xenon所在的機器上利用root執行
visudo

添加:

mysql ALL=(ALL) NOPASSWD: /usr/sbin/ip

  • 為Xenon中節點自動重建準備,為xenon的rebuildme準備一個ssh信任。該ssh 信任是需要用Xenon啟動的帳號, 在172.16.0.150上執行
su - mysqlssh-keygen一路回車cd .sshcat id_rsa.pub >authorized_keysrm known_hostschmod 600 *

把.ssh 目錄分發到其它兩台機器上

scp -r .ssh [email protected]:~/scp -r .ssh [email protected]:~/

測試ssh信任是不是工作ok。

ssh 172.16.0.151ssh 172.16.0.150ssh 172.16.0.152
  • 安裝sshpass
yum install -y sshpass

Xenon的基本管理

  • 啟動xenon:
su - mysqlcd /data/xenonnohup ./bin/xenon -c /etc/xenon/xenon.json >./xenon.log 2>&1 &

生產中推薦使用:screen 或是supervisor

  • 關閉: xenon:
pkill xenon
  • xenon的raft節點間通訊 在xenon進程啟動的情況下,執行(這個動作需要在三個節點上都要執行)
./bin/xenoncli cluster add 172.16.0.150:8801,172.16.0.151:8801,172.16.0.152:8801

-節點成員狀態查看

./bin/xenoncli cluster raft

提示 ./bin/xenoncli cluster add 172.16.0.150:8801,172.16.0.151:8801,172.16.0.152:8801 後面的節點成員不要出現空格。到這裡xenon部署完成。下面讓我們檢查一下xenon是不是可以工作起來。

  • xenon工作情況檢查

1. 節點成員狀態是不是正常

/data/xenon/bin/xenoncli cluster status

從上圖可以看到目前leader節點是172.16.0.152 這個節點 可以去這個節點上查看一下是不是擁有服務IP。

2. leader節點是不是有服務IP及關閉了只讀狀態

[root@dzst152 xenon]#ip addr show

3. 把152上MySQL關閉看看會不會切換 mysql> shutdown;

[root@dzst152 xenon]# ./bin/xenoncli cluster status

從圖上看leader節點切換到151這台機器上。可以去151上查看一下服務ip是不是切換過去。而且神奇的發現172.16.0.152上的MySQL又被Xenon 拉起來。

4. 節點重建

這個屬於一個新的運維理念。可以把故障分為已知自動可修復,已知但不可能自動修復(重建), 未知故障節點下線,新加入節點重建加入。xenon在這裡也引入了這樣的理念。節點重建在xenon中引入了一個保護,只對從節點可以重建,主節點不能在線重建。

基於上面的情況,我這裡對dzst152重建一下。

./bin/xenoncli mysql rebuildme

從以上流程上看xenon的的節點重建是封裝了xtrabackup的備份及恢復,自動重建一個節點。

5. 通過xenon提供服務IP連接MySQL

mysql -h 172.16.0.100 -P3306 -uwubx -pwubxwubx

其中IP要指向提供的服務IP,這個IP有點VIP的感覺,但這個只是在leader機器的網卡上多綁一個IP罷了,和利用VRRP搞定的VIP還是有區別的。所以在雲上環境xenon也是可以跑的。到這裡xenon的搭建告一段落,在RadonDB中有多組Xenon組成,在Xenon中默認架構中也只有帶有服務節點的IP對外提供服務。其它節點屬於standby狀態。當然standby的機器也可以對外服務。

Radon安裝布署

Radon 可以部署為獨立節點,也可以部署為集群模式。Radon在定位上是做一個無狀態路由節點,對業務層提供資料庫的分庫分表的能力。

基於編譯的radon運行

  • radon配置 /data/radon/bin/radon.json
{        "proxy": {                "endpoint": ":3306",                "meta-dir": "bin/radon-meta",                "peer-address": ":8080"        },        "audit": {                "audit-dir": "bin/radon-audit"        },        "log": {                "level": "INFO"        },        "monitor": {            "monitor-address": "0.0.0.0:13380"        }}
  • 啟動Radon
# /data/radon/bin/radon -c /data/radon/con/radon.json > radon.log 2>&1 &

為了方便查看,先直接把日誌寫到了當前目前下面。

  • 向Radon中添加MySQL節點

目前Radon是通過開放API介面的方式進行集群管理,這樣方便開發人員進行訂製化的開發,所以我們在配置過程中也是通過調用Radon開放的API介面進行MySQL節點的添加。Radon默認採用8080為管理埠,3308為訪問埠 通過管理埠開放API添加MySQL節點

#curl -i -H 'Content-Type: application/json' -X POST -d '{"name": "backend1", "address": "172.16.0.100:3306", "user":"wubx", "password": "wubxwubx", "max-connections":1024}' http://127.0.0.1:8080/v1/radon/backend

name表示後端節點的名稱,可自定義,但要求唯一。

address表示要添加的MySQL的連接地址以及埠,這個建議指Xenon對外提供的服務IP;

userpassword表示用於連接MySQL的用戶名和密碼;

max-connections表示最大連接數;

從API請求上看,這裡也沒涉及到從庫的節點。

如果添加節點成功會返回以下內容:

HTTP/1.1 200 OKDate: Sat, 17 Nov 2018 06:23:49 GMTContent-Length: 0
  • 通過RadonDB訪問MySQL 這裡可以通過後端Xenon資料庫上提供的任意用戶名和密碼連接到Radon上,Radon上對於認證,還是需要和後端做一次認證處理,同時radon上也不保存用戶名和密碼。
# mysql -h 172.16.0.121 -P3306 -uwubx -pwubxwubx

連接接到radon操作

create database zst;create table tb1(id bigint not null auto_increment, c1 varchar(64), d1 datetime, primary key(id));**Query OK, 0 rows affected (11.91 sec)**

從上面的操作上看, 創建一個單表為什麼這麼慢呢?密秘就在: /data/radon/bin/radon-eta下面

從上面可以看出來radon,創建的db,對應的在radon-meta下創建了一個目錄記錄著表創建情況,如:

在上圖中可以看出, tb1屬於zst下面的一個表,利用id做hash拆分,總共創建了64個分片,對應4096個slot, 在partions中標明每個分片的名稱及對應的slot和後端的節點。後續擴容就可以通過移動分片到後面不同的Xenon上,從而實現擴容。

  • Radon的一些高級API

通過上面添加後面資料庫的操作,大家可能會有一個大概的感受:Radon是通過http restful api來控制配置。

完整API列表請查閱:https://github.com/radondb/radon/blob/master/docs/api.md

使用方法,例如獲取後面分區情況:

curl http://127.0.0.1:8080/v1/shard/shardz

其中我們大家可能比較感興趣的:Radon是如何擴容的?

這個API: https://github.com/radondb/radon/blob/master/docs/api.md#shift

從這個API上看,目前只是提供一個radon的配置變更,實質的數據遷移還需要另外的工具配置完成, 從這點看青雲的RadonDB後面還有不少自動管理工作內容並不是全在Radon中完成的。

Radon集群安裝

單節點的Radon工作並不能讓人放心,MySQL的高可用我們可以用Xenon搞定。但現在Radon還是單點中,下面我們在給Radon也配置成cluster模式。Radon原生支援高可用模式,配置在任意節點更改會自動同步到其它節點上。

這裡通過舉例看一下radon本身的cluster搭建。我們現在已經有一個radon節點:172.16.0.121 (master) 接下來我們在搭建一個節點:172.16.0.122 (slave)

在122上直接利用一個新的配置啟動一個Radon /data/radon/bin/radon.json

{        "proxy": {                "endpoint": ":3306",                "meta-dir": "bin/radon-meta",                "peer-address": ":8080"        },        "audit": {                "audit-dir": "bin/radon-audit"        },        "log": {                "level": "INFO"        },        "monitor": {            "monitor-address": "0.0.0.0:13380"        }}

啟動122上面的radon

/data/radon/bin/radon -c /data/radon/conf/radon.json >radon.log 2>&1 &
  • 原121上操作
 curl -i -H 'Content-Type: application/json' -X POST -d '{"address": "172.16.0.121:8080"}' http://172.16.0.121:8080/v1/peer/add   curl -i -H 'Content-Type: application/json' -X POST -d '{"address": "172.16.0.122:8080"}' http://172.16.0.121:8080/v1/peer/add
  • 在122上操作
 curl -i -H 'Content-Type: application/json' -X POST -d '{"address": "172.16.0.121:8080"}' http://172.16.0.122:8080/v1/peer/add   curl -i -H 'Content-Type: application/json' -X POST -d '{"address": "172.16.0.122:8080"}' http://172.16.0.122:8080/v1/peer/add

分別連接到兩個節點上操作:

mysql -h 172.16.0.121 -P3306 -uwubx -pwubxwubxmysql -h 172.16.0.122 -P3306 -uwubx -pwubxwubx  insert into tb1(c1, d1) values(uuid(), now());...select * from tb1;delete from tb1 where id= ? ; -- 上面獲取的值執行一下。

到此Radondb Cluster也搭建完成。

小結

RadonDB是基於Golang構建的MySQL高可用+分庫分表方案,基本Xenon也可以獨立應用於MySQL的高可用架構, Radon相當於一個分庫分表的Proxy和Xenon並沒有特別的關聯。對於生產中使用感覺也非常容易上手。如果你在使用中遇到技術問題或是其它需要技術支援的情況請聯繫我。

可以關注知數堂騰訊課堂上我分享的RadonDB相關影片。