利用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 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 后面需要根据机器的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/

后续对于部署radon节点,直接复制 radon 这个目录即可

scp -r radon root@172.16.0.121:/data/

MySQL安装部署及启动

MySQL 需要在三台Xenon角色的机器上都安装,安装步骤一样,这里不再重复。下面给一个统一的安装方式。

1.  下载mysql

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

2.  MySQL软件路径 :

mkdir /opt/mysql
cd /opt/mysql/
tar zxvf /data/mysql/mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz
ln -s /opt/mysql/mysql-xxx /usr/local/mysql

3. 创建数据库相关目录:

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

4. 创建mysql用户&更改权限

同时更改一下mysql用户的密码,方便后续使用(建议ssh信任使用),按个人习惯更改密码。

groupadd mysql
useradd -g mysql -s /bin/bash  -d /usr/local/mysql  mysql
passwd mysql

5.  更改权限

chown -R mysql:mysql /data/mysql/mysql3306
chown -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 -p
mysql>alter user user() identified by 'zstzst';

9. 关闭MySQL

/usr/local/mysql/bin/mysql -S /tmp/mysql3306.sock -p
mysql>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 --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的环境搭建,包括现有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/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 造成 集群切换时新节点VIP对外生效。

  • 配置sudo 相关权限 需要xenon所在的机器上利用root执行

visudo

添加:

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

  • 为Xenon中节点自动重建准备,为xenon的rebuildme准备一个ssh信任。该ssh 信任是需要用Xenon启动的帐号, 在172.16.0.150上执行

su - mysql
ssh-keygen
一路回车
cd .ssh
cat id_rsa.pub >authorized_keys
rm known_hosts
chmod 600 *

把.ssh 目录分发到其它两台机器上

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 &

生产中推荐使用: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

利用RadonDB实现MySQL分库分表-编程知识网

从上图可以看到目前leader节点是172.16.0.152 这个节点 可以去这个节点上查看一下是不是拥有服务IP。

2.  leader节点是不是有服务IP及关闭了只读状态

[root@dzst152 xenon]#ip addr show

利用RadonDB实现MySQL分库分表-编程知识网

3. 把152上MySQL关闭看看会不会切换 mysql> shutdown;

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

利用RadonDB实现MySQL分库分表-编程知识网

从图上看leader节点切换到151这台机器上。可以去151上查看一下服务ip是不是切换过去。而且神奇的发现172.16.0.152上的MySQL又被Xenon 拉起来。

4. 节点重建 

这个属于一个新的运维理念。可以把故障分为已知自动可修复,已知但不可能自动修复(重建), 未知故障节点下线,新加入节点重建加入。xenon在这里也引入了这样的理念。节点重建在xenon中引入了一个保护,只对从节点可以重建,主节点不能在线重建。

基于上面的情况,我这里对dzst152重建一下。

./bin/xenoncli mysql rebuildme

利用RadonDB实现MySQL分库分表-编程知识网

从以上流程上看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 OK
Date: Sat, 17 Nov 2018 06:23:49 GMT
Content-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下面

利用RadonDB实现MySQL分库分表-编程知识网

从上面可以看出来radon,创建的db,对应的在radon-meta下创建了一个目录记录着表创建情况,如:

利用RadonDB实现MySQL分库分表-编程知识网

在上图中可以看出, 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/addcurl -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/addcurl -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 -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= ? ; -- 上面获取的值执行一下。

到此Radondb Cluster也搭建完成。如果看完文档还有问题,可以留言或是加作者微信交流:82565387

利用RadonDB实现MySQL分库分表-编程知识网

小结

RadonDB是基于Golang构建的MySQL高可用+分库分表方案,基本Xenon也可以独立应用于MySQL的高可用架构, Radon相当于一个分库分表的Proxy和Xenon并没有特别的关联。对于生产中使用感觉也非常容易上手。如果你在使用中遇到技术问题或是其它需要技术支持的情况请联系我。

可以关注知数堂腾讯课堂上我分享的RadonDB相关视频。


由吴老师主讲的知数堂「MySQL实战课」第17期已发车,我们的课程从第15期就升级成MySQL 8.0版本了,现在上车刚刚好,一起开启MySQL 8.0的修行之旅吧。

扫码入群了解「MySQL实战」课吧,有助教妹子在等着哟

利用RadonDB实现MySQL分库分表-编程知识网


另外,叶老师在腾讯课堂的短课程《MySQL性能优化》已开课,本课程讲解读几个MySQL性能优化的核心要素:合理利用索引,降低锁影响,提高事务并发度

下面是报名小程序码

利用RadonDB实现MySQL分库分表-编程知识网

点“在看”给我一朵小黄花利用RadonDB实现MySQL分库分表-编程知识网

利用RadonDB实现MySQL分库分表-编程知识网