利用RadonDB實現(xiàn)MySQL分庫分表
RadonDB是青云上提供的MySQL分布式解決方案,提供數(shù)據(jù)庫的透明拆分及高可用服務。RadonDB包括Radon, Xenon, MySQL三部分安裝。其中Radon,Xenon官方?jīng)]有發(fā)行二進制包,需要編譯安裝, MySQL可以使用官方編譯后的版本安裝,但需要使用MySQL 5.7這個版本。在以下文檔安裝過程中如果遇到問題請及時的反饋作者:QQ/Weixin: 82565387
本文內(nèi)容較長大致分為:
環(huán)境基本情況介紹
編譯環(huán)境準備
Xenon編譯安裝
Radon 編譯安裝
MySQL安裝部署及啟動
Xtrabackup安裝
Xenon安裝部署
Xenon的基本管理
Radon安裝布署
Radon集群安裝
小結(jié)
其中MySQL的配置限于文章長度,這里不在放在文中,如果需要聯(lián)系作者獲取即可。
環(huán)境基本情況介紹

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
在環(huán)境安裝環(huán)節(jié),大致可以分為:radon和 xenon(包含:MySQL, xtrabackup)的安裝部署。
編譯環(huán)境準備
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
- 修改環(huán)境變量 在~/.bash_profile末尾添加一行
export PATH=$PATH:/usr/local/go/bin
# source ~/.bash_profile
- 驗證Go安裝是否成功
# go version
go version go1.13.4 linux/amd64
Xenon編譯安裝
- 下載源代碼 & 編譯
# git clone https://github.com/radondb/xenon.git
# cd xenon
# make
確認bin目錄下生成了: xenon,xenoncli 便大功告成。
- 簡單的打包:
mkdir xenon
cp -r bin xenon
cp xenon.json xenon
echo "/etc/xenon/xenon.json" >xenon/bin/config.path
其中xenon.json 后面需要根據(jù)機器的IP修改一下。把這個xenon同步復制到 :172.16.0.150, 172.16.0.151 ,172.16.0.152的/data目錄下:
scp -r xenon root@172.16.0.150:/data/
scp -r xenon root@172.16.0.151:/data/
scp -r xenon root@172.16.0.152:/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 radon
cp -r bin radon/
cp conf/radon.default.json radon/bin/
后續(xù)對于部署radon節(jié)點,直接復制 radon 這個目錄即可
scp -r radon root@172.16.0.121:/data/
MySQL安裝部署及啟動
MySQL 需要在三臺Xenon角色的機器上都安裝,安裝步驟一樣,這里不再重復。下面給一個統(tǒng)一的安裝方式。
- 下載mysql
cd /data
- MySQL軟件路徑 :
mkdir /opt/mysql
3. 創(chuàng)建數(shù)據(jù)庫相關目錄:
mkdir /data/mysql/ -p
4. 創(chuàng)建mysql用戶&更改權(quán)限
同時更改一下mysql用戶的密碼,方便后續(xù)使用(建議ssh信任使用),按個人習慣更改密碼。
groupadd mysql
- 更改權(quán)限
chown -R mysql:mysql /data/mysql/mysql3306
配置文參考 /data/mysql/mysql3306/my3306.cnf公眾號中沒辦法放置配置文件,如果需要聯(lián)系作者獲取
- 初始化
/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 -p
9. 關閉MySQL
/usr/local/mysql/bin/mysql -S /tmp/mysql3306.sock -p
- 創(chuàng)建帳號
測試用服務帳號
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執(zhí)行:
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';
構(gòu)建成主從結(jié)構(gòu) 三臺機器最終構(gòu)建成基于GTID的復制結(jié)構(gòu),就完成了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 驗證有正確的結(jié)果輸出。
xtrabackup --version
xtrabackup: recognized server arguments:
xtrabackup version 2.4.16 based on MySQL server 5.7.26 Linux (x86_64) (revision id: c807cfa)
Xenon安裝部署
xenon的環(huán)境搭建,包括現(xiàn)有MySQL想引入xenon實現(xiàn)MySQL高可用需要把握以下幾點:
1. 把MySQL的半同步plugin加載上去
2. 對外服務IP是在xenon.json配置文件中l(wèi)eader-start-command 這個項成為leader時觸發(fā),如果我們使用的普通用戶運行xenon,還需要給該用戶配置sudo 相關權(quán)限。
3. xenon的rebuildme需要xenon.json中backup中"ssh-user" 指定的用戶打通ssh信任,或是指定正確的密碼。
- Xenon中發(fā)生選舉后,新的服務節(jié)點一定要對外發(fā)起arping , 請參考xenon.json中"leader-start-command" 的定義。
- 基于編譯機上編譯copy過來的xenon部署。
cd /data/xenon
mkdir /etc/xenon
mv xenon.json /etc/xenon/
chown -R mysql:mysql /etc/xenon
chown -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 造成 集群切換時新節(jié)點VIP對外生效。
- 配置sudo 相關權(quán)限 需要xenon所在的機器上利用root執(zhí)行
visudo
添加:
mysql ALL=(ALL) NOPASSWD: /usr/sbin/ip
- 為Xenon中節(jié)點自動重建準備,為xenon的rebuildme準備一個ssh信任。該ssh 信任是需要用Xenon啟動的帳號, 在172.16.0.150上執(zhí)行
su - mysql
ssh-keygen
一路回車
cd .ssh
cat id_rsa.pub >authorized_keys
rm known_hosts
chmod 600 *
把.ssh 目錄分發(fā)到其它兩臺機器上
scp -r .ssh mysql@172.16.0.151:~/
scp -r .ssh mysql@172.16.0.152:~/
測試ssh信任是不是工作ok。
ssh 172.16.0.151
ssh 172.16.0.150
ssh 172.16.0.152
- 安裝sshpass
yum install -y sshpass
Xenon的基本管理
- 啟動xenon:
su - mysql
cd /data/xenon
nohup ./bin/xenon -c /etc/xenon/xenon.json >./xenon.log 2>&1 &
生產(chǎn)中推薦使用:screen 或是supervisor
- 關閉: xenon:
pkill xenon
- xenon的raft節(jié)點間通信 在xenon進程啟動的情況下,執(zhí)行(這個動作需要在三個節(jié)點上都要執(zhí)行)
./bin/xenoncli cluster add 172.16.0.150:8801,172.16.0.151:8801,172.16.0.152:8801
-節(jié)點成員狀態(tài)查看
./bin/xenoncli cluster raft
提示 ./bin/xenoncli cluster add 172.16.0.150:8801,172.16.0.151:8801,172.16.0.152:8801 后面的節(jié)點成員不要出現(xiàn)空格。到這里xenon部署完成。下面讓我們檢查一下xenon是不是可以工作起來。
- xenon工作情況檢查
- 節(jié)點成員狀態(tài)是不是正常
/data/xenon/bin/xenoncli cluster status
從上圖可以看到目前l(fā)eader節(jié)點是172.16.0.152 這個節(jié)點 可以去這個節(jié)點上查看一下是不是擁有服務IP。
- leader節(jié)點是不是有服務IP及關閉了只讀狀態(tài)
[root@dzst152 xenon]#ip addr show
3. 把152上MySQL關閉看看會不會切換 mysql> shutdown;
[root@dzst152 xenon]# ./bin/xenoncli cluster status
從圖上看leader節(jié)點切換到151這臺機器上。可以去151上查看一下服務ip是不是切換過去。而且神奇的發(fā)現(xiàn)172.16.0.152上的MySQL又被Xenon 拉起來。
4. 節(jié)點重建
這個屬于一個新的運維理念??梢园压收戏譃橐阎詣涌尚迯?,已知但不可能自動修復(重建), 未知故障節(jié)點下線,新加入節(jié)點重建加入。xenon在這里也引入了這樣的理念。節(jié)點重建在xenon中引入了一個保護,只對從節(jié)點可以重建,主節(jié)點不能在線重建。
基于上面的情況,我這里對dzst152重建一下。
./bin/xenoncli mysql rebuildme
從以上流程上看xenon的的節(jié)點重建是封裝了xtrabackup的備份及恢復,自動重建一個節(jié)點。
5. 通過xenon提供服務IP連接MySQL
mysql -h 172.16.0.100 -P3306 -uwubx -pwubxwubx
其中IP要指向提供的服務IP,這個IP有點VIP的感覺,但這個只是在leader機器的網(wǎng)卡上多綁一個IP罷了,和利用VRRP搞定的VIP還是有區(qū)別的。所以在云上環(huán)境xenon也是可以跑的。到這里xenon的搭建告一段落,在RadonDB中有多組Xenon組成,在Xenon中默認架構(gòu)中也只有帶有服務節(jié)點的IP對外提供服務。其它節(jié)點屬于standby狀態(tài)。當然standby的機器也可以對外服務。
Radon安裝布署
Radon 可以部署為獨立節(jié)點,也可以部署為集群模式。Radon在定位上是做一個無狀態(tài)路由節(jié)點,對業(yè)務層提供數(shù)據(jù)庫的分庫分表的能力。
基于編譯的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節(jié)點
目前Radon是通過開放API接口的方式進行集群管理,這樣方便開發(fā)人員進行定制化的開發(fā),所以我們在配置過程中也是通過調(diào)用Radon開放的API接口進行MySQL節(jié)點的添加。Radon默認采用8080為管理端口,3308為訪問端口通過管理端口開放API添加MySQL節(jié)點
#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表示后端節(jié)點的名稱,可自定義,但要求唯一。
address表示要添加的MySQL的連接地址以及端口,這個建議指Xenon對外提供的服務IP;
user和 password表示用于連接MySQL的用戶名和密碼;
max-connections表示最大連接數(shù);
從API請求上看,這里也沒涉及到從庫的節(jié)點。
如果添加節(jié)點成功會返回以下內(nèi)容:
HTTP/1.1 200 OK
Date: Sat, 17 Nov 2018 06:23:49 GMT
Content-Length: 0
- 通過RadonDB訪問MySQL 這里可以通過后端Xenon數(shù)據(jù)庫上提供的任意用戶名和密碼連接到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)**
從上面的操作上看, 創(chuàng)建一個單表為什么這么慢呢?密秘就在: /data/radon/bin/radon-eta下面
從上面可以看出來radon,創(chuàng)建的db,對應的在radon-meta下創(chuàng)建了一個目錄記錄著表創(chuàng)建情況,如:
在上圖中可以看出, tb1屬于zst下面的一個表,利用id做hash拆分,總共創(chuàng)建了64個分片,對應4096個slot, 在partions中標明每個分片的名稱及對應的slot和后端的節(jié)點。后續(xù)擴容就可以通過移動分片到后面不同的Xenon上,從而實現(xiàn)擴容。
- Radon的一些高級API
通過上面添加后面數(shù)據(jù)庫的操作,大家可能會有一個大概的感受:Radon是通過http restful api來控制配置。
完整API列表請查閱:https://github.com/radondb/radon/blob/master/docs/api.md
使用方法,例如獲取后面分區(qū)情況:
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的配置變更,實質(zhì)的數(shù)據(jù)遷移還需要另外的工具配置完成, 從這點看青云的RadonDB后面還有不少自動管理工作內(nèi)容并不是全在Radon中完成的。
Radon集群安裝
單節(jié)點的Radon工作并不能讓人放心,MySQL的高可用我們可以用Xenon搞定。但現(xiàn)在Radon還是單點中,下面我們在給Radon也配置成cluster模式。Radon原生支持高可用模式,配置在任意節(jié)點更改會自動同步到其它節(jié)點上。
這里通過舉例看一下radon本身的cluster搭建。我們現(xiàn)在已經(jīng)有一個radon節(jié)點:172.16.0.121 (master)接下來我們在搭建一個節(jié)點: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
分別連接到兩個節(jié)點上操作:
mysql -h 172.16.0.121 -P3306 -uwubx -pwubxwubx
mysql -h 172.16.0.122 -P3306 -uwubx -pwubxwubx
insert into tb1(c1, d1) values(uuid(), now());
...
select * from tb1;
delete from tb1 where id= ? ; -- 上面獲取的值執(zhí)行一下。
到此Radondb Cluster也搭建完成。如果看完文檔還有問題,可以留言或是加作者微信交流:82565387
小結(jié)
RadonDB是基于Golang構(gòu)建的MySQL高可用+分庫分表方案,基本Xenon也可以獨立應用于MySQL的高可用架構(gòu), Radon相當于一個分庫分表的Proxy和Xenon并沒有特別的關聯(lián)。對于生產(chǎn)中使用感覺也非常容易上手。如果你在使用中遇到技術(shù)問題或是其它需要技術(shù)支持的情況請聯(lián)系我。