之前一直对腾讯TDSQL的实现原理比较感兴趣,号称使用Raft来保障数据的一致性。MySQL官方推荐使用MGR的方案来搭建高可用集群,基于Paxos的MGR毕竟是官方的解决方案,也很想知道其性能到底如何。
另一方面,在同城两个容灾数据中心之间,由于测试出来只有4ms的时延,理论上将MGR的一个节点放到容灾数据中心也是没有问题的。这样可以解决异步复制和半同步复制都无法解决的数据一致性问题。
资源准备
主机
需要至少有四台主机,其中:三台作为集群节点,一台安装mysqlrouter(同时部署mysql-shell)
机器的配置都是:4核16G
1 | # 修改主机名 |
yum源
慢!真的很慢!官方的yum源安装起来能够让人崩溃。所以,我找了清华的源,然后自己改了配置。由于我只关注8.x的版本,因此只修改了这部分,要使用5.7的请自行修改。
1 | cat mysql.repo |
安装服务
mysqld
1 | yum install -y mysql-server |
mysql-shell
1 | yum install -y mysql-shell |
mysql-router
1 | yum install -y mysql-router |
配置集群
密码与权限
1 | # 从日志从获取系统生成的 |
my.cnf配置更新
1 | # 在my.cnf添加一下配置,注意这里的server_id每台节点需要不一样 |
mysqlsh创建集群
1 | # 连接到节点 |
配置router
在安装了mysql-router的节点上直接执行一下命令,会提示输入密码,输入之后系统会告知已经创建配置文件。
1 | [root@mrouter ~]# mysqlrouter --bootstrap root@sh-mgr1:3306 --user=root |
不知道是什么原因,我通过系统命令启动服务一直失败,索性直接使用一下命令启动服务。
1 | nohup mysqlrouter -c /etc/mysqlrouter/mysqlrouter.conf & |
服务对应的读写端口都有自动列出来,大概也可以去手动修改,后面我们做压力测试主要使用R/W的6446端口。
压力测试
sysbench安装
1 | curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash |
压力测试
测试主要针对于三节点在单个机房的测试,以及其中一个节点在另外一个机房的测试。对应的测试参数和命令如下,大概是先分别压了50万条记录到5张表里面,然后开启100个线程,总共花1分钟时间去读写数据。
1 | sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --table_size=500000 --tables=5 --time=60 --threads=100 --mysql-host=sh-mgr1 --mysql-port=3306 --mysql-db=test --mysql-user=root --mysql-password=Mysql,123 prepare |
测试结果
- 第一组
1 | SQL statistics: |
- 第二组
1 | SQL statistics: |
- 第三组
1 | SQL statistics: |