PolarDB-X 为了方便用户体验,提供了免费的实验环境,您可以在实验环境里体验 PolarDB-X 的安装部署和各种内核特性。除了免费的实验,PolarDB-X 也提供免费的视频课程,手把手教你玩转 PolarDB-X 分布式数据库。
本期实验将指导您关于PolarDB-X replica的原理和使用
前置准备
假设已经根据前一讲内容完成了PolarDB-X的搭建部署,可以成功链接上PolarDB-X数据库。
PolarDB-X作为MySQL的备库
本步骤将指导您如何使用PolarDB-X作为MySQL的备库。
1.建立复制链路。
a.切换至终端一,执行如下命令,登录云服务器ECS_1实例中的MySQL
说明:您需要将如下命令中的替换为云服务器ECS_1实例上的MySQL 8.0的初始密码。
mysql -uroot -p<PASSWORD>
b.执行如下命令,修改MySQL的root用户的初始密码为Aliyun123!
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Aliyun123!';
c.执行如下命令,修改root用户的登录ip白名单
update mysql.user set host='%' where user='root';
d.执行如下命令,使权限相关修改生效
FLUSH PRIVILEGES;
e.执行如下命令,查看最新的binlog File和binlog Position
show master status;
返回结果如下,您可查看到源库的binlog File和binlog Position。
f.切换至终端二,执行PolarDB-X安装完成后输出的的连接方式,登录PolarDB-X。例如mysql -h127.0.0.1 -P7148 -upolardbx_root -pXXXXXX。
g.执行如下命令,修改相关参数,建立复制链路。
说明:如果您想了解更多有关MySQL Replica用法,详情请参考MySQL官方文档。
参数说明:
MASTER_HOST:源库主机的主机名(或 IP 地址),本示例填写为云服务器ECS_1实例的私有地址。
MASTER_USER:源库的用户名,本示例填写为云服务器ECS_1实例的MySQL数据库的用户名root。
MASTER_PASSWORD:源库的密码,本示例填写为Aliyun123!。
MASTER_PORT:源库主机的TCP/IP端口,本示例填写为3306。
MASTER_LOG_FILE:复制I/O线程应该在下次线程启动时开始从源库读取的坐标,填写为上一步中从源库获取的binlog File。
MASTER_LOG_POS:复制I/O线程应该在下次线程启动时开始从源库读取的坐标,填写为上一步中从源库获取的binlog Postion。
SOURCE_HOST_TYPE:源库类型,本示例填写为mysql。
CHANGE MASTER TO
MASTER_HOST='云服务器ECS_1实例的私有地址',
MASTER_USER='root',
MASTER_PASSWORD='Aliyun123!',
MASTER_PORT=3306,
MASTER_LOG_FILE='binlog File',
MASTER_LOG_POS=binlog Postion,
SOURCE_HOST_TYPE=mysql
FOR CHANNEL 'mysql';
h.执行如下命令,仅复制新添加的库。由于主备是异构系统,我们将复制仅限于我们即将要新添加的库,防止主库的心跳等数据影响同步。
CHANGE REPLICATION FILTER replicate_do_db=(rpl) for channel 'mysql';
i.执行如下命令,查看链路状态。
SHOW SLAVE STATUS\G
j.执行如下命令,启动链路。
START SLAVE;
2.在master上执行DDL和DML语句。
a.切换至终端一,执行如下命令,创建数据库rpl。
create database rpl;
b.执行如下命令,使用数据库rpl。
use rpl;
c.执行如下命令,创建表example。
create table example (
`id` bigint(11) auto_increment NOT NULL,
`name` varchar(255) DEFAULT NULL,
`score` bigint(11) DEFAULT NULL,
primary key (`id`)
) engine=InnoDB default charset=utf8;
d.执行如下命令,插入数据。
insert into example values(null,'lily',375),(null,'lisa',400),(null,'ljh',500);
e.执行如下命令,查看数据。
select * from example;
返回结果如下,您可以看到源库中有三条数据。
3.在slave上查看数据
a.切换至终端二,执行如下命令,使用数据库rpl。
use rpl;
b.执行如下命令,查询数据库rpl中的表。
show tables;
c.执行如下命令,查看数据。
select * from example;
返回结果如下,你可查看到源库中的数据已经同步到备库中。
4.暂停并删除测试链路
a.执行如下命令,暂停链路。
STOP SLAVE;
b.执行如下命令,删除链路。
RESET SLAVE ALL;
c.执行如下命令,查看链路是否删除。
SHOW SLAVE STATUS;
使用PolarDB-X作为PolarDB-X的备库
本步骤将指导您如何使用一个PolarDB-X集群作为另外一个PolarDB-X集群的备库,并进行TPC-C测试。
1.建立复制链路。
a.切换至终端三,执行PolarDB-X安装完成后输出的的连接方式,登录PolarDB-X。例如mysql -h127.0.0.1 -P7148 -upolardbx_root -pXXXXXX。
b.执行如下命令,查看最新的binlog position。
SHOW MASTER STATUS\G
返回结果如下,您可查看到源库的binlog File和binlog Position。
c.切换至终端二,执行如下命令,修改相关参数,建立复制链路。
说明:如果您想了解更多有关MySQL Replica用法,详情请参考MySQL官方文档。
参数说明:
MASTER_HOST:源库主机的主机名(或 IP 地址),本示例填写为云服务器ECS_3实例的私有地址。
MASTER_USER:源库的用户名,本示例填写为polardbx_root。
MASTER_PASSWORD:源库的密码,本示例填写为云服务器ECS_3实例的PolarDB-X集群的密码。
MASTER_PORT:源库主机的TCP/IP端口,本示例填写为云服务器ECS_3实例的PolarDB-X集群的端口号。
MASTER_LOG_FILE:复制I/O线程应该在下次线程启动时开始从源库读取的坐标,填写为上一步中从源库获取的binlog File。
MASTER_LOG_POS:复制I/O线程应该在下次线程启动时开始从源库读取的坐标,填写为上一步中从源库获取的binlog Postion。
SOURCE_HOST_TYPE:源库类型,本示例填写为polardbx。
CHANGE MASTER TO
MASTER_HOST='云服务器ECS_3实例的私有地址',
MASTER_USER='polardbx_root',
MASTER_PASSWORD='云服务器ECS_3实例的PolarDB-X集群的密码',
MASTER_PORT=云服务器ECS_3实例的PolarDB-X集群的端口号,
MASTER_LOG_FILE='binlog File',
MASTER_LOG_POS=binlog Postion,
SOURCE_HOST_TYPE=polardbx
FOR CHANNEL 'tpcc';
d.执行如下命令,仅复制新添加的库。由于主备是异构系统,我们将复制仅限于我们即将要新添加的库,防止主库的心跳等数据影响同步
CHANGE REPLICATION FILTER replicate_do_db=(tpcc);
e.执行如下命令,启动链路。
START SLAVE;
f.执行如下命令,查看链路状态
SHOW SLAVE STATUS\G
2.TPC-C测试。
a.首先请阅读PolarDB-X TPCC测试指南,了解PolarDB TPCC测试。
b.切换至终端三,执行如下命令,创建数据库tpcc。
create database tpcc;
c.输入exit退出PolarDB-X集群。
d.执行如下命令,使用yum安装JDK 1.8。
yum -y install java-1.8.0-openjdk*
e.执行如下命令,下载压测工具包。
wget https://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/file-manage-files/zh-CN/40302202/cgaj_benchmarksql.tar.gz
f.执行如下命令,解压压测工具包。
tar xzvf cgaj_benchmarksql.tar.gz
g.执行如下命令,编辑props.mysql配置文件。填入对应的PolarDB-X实例连接信息。
cd benchmarksql/run vim props.mysql
h.在props.mysql配置文件中,按下i键进入编辑模式,修改如下参数后,按下Esc键后,输入:wq后按下Enter键保存并退出。
参数说明:
HOST:主机名{HOST},在本示例中您需要将{HOST}替换为127.0.0.1。
PORT:端口号{PORT},在本示例中您需要将{PORT}替换为云服务器ECS_3实例的PolarDB-X集群的端口号。
user:用户名,在本示例中您需要将{USER}替换为云服务器ECS_3实例的PolarDB-X集群的用户名polardbx_root。
password:密码,在本示例中您需要将{PASSWORD}替换为云服务器ECS_3实例的PolarDB-X的密码。
warehouses:仓库数,在本示例中填写为1。
loadWorkers:导入数据并发数,在本示例中填写为1。
terminals:压测并发数,在本示例中填写为5。
runMins:压测时间,在本示例中填写为2。
i.执行如下命令,导入压测数据。
nohup ./runDatabaseBuild.sh props.mysql &
j.按下Ctrl+C键后,执行如下命令,查看导入压测数据的日志。
cat nohup.out
请您等待大约3分钟,压测数据的日志返回结果如下,表示压测数据已成功导入。
说明:由于实验室资源有限,此处使用非生产规格实例,导致压测数据导入速度较慢。
k.执行云服务器ECS_3实例的PolarDB-X集群安装完成后输出的的连接方式,登录PolarDB-X。例如mysql -h127.0.0.1 -P7148 -upolardbx_root -pXXXXXX。
l.待数据导入完毕后,执行如下命令,在源端验证压测数据的完整性。
use tpcc;
select a.* from (Select w_id, w_ytd from bmsql_warehouse) a left join (select d_w_id, sum(d_ytd) as d_ytd_sum from bmsql_district group by d_w_id) b on a.w_id = b.d_w_id and a.w_ytd = b.d_ytd_sum where b.d_w_id is null;
select a.* from (Select d_w_id, d_id, D_NEXT_O_ID - 1 as d_n_o_id from bmsql_district) a left join (select o_w_id, o_d_id, max(o_id) as o_id_max from bmsql_oorder group by o_w_id, o_d_id) b on a.d_w_id = b.o_w_id and a.d_id = b.o_d_id and a.d_n_o_id = b.o_id_max where b.o_w_id is null;
select a.* from (Select d_w_id, d_id, D_NEXT_O_ID - 1 as d_n_o_id from bmsql_district) a left join (select no_w_id, no_d_id, max(no_o_id) as no_id_max from bmsql_new_order group by no_w_id, no_d_id) b on a.d_w_id = b.no_w_id and a.d_id = b.no_d_id and a.d_n_o_id = b.no_id_max where b.no_id_max is null;
select * from (select (count(no_o_id)-(max(no_o_id)-min(no_o_id)+1)) as diff from bmsql_new_order group by no_w_id, no_d_id) a where diff != 0;
select a.* from (select o_w_id, o_d_id, sum(o_ol_cnt) as o_ol_cnt_cnt from bmsql_oorder group by o_w_id, o_d_id) a left join (select ol_w_id, ol_d_id, count(ol_o_id) as ol_o_id_cnt from bmsql_order_line group by ol_w_id, ol_d_id) b on a.o_w_id = b.ol_w_id and a.o_d_id = b.ol_d_id and a.o_ol_cnt_cnt = b.ol_o_id_cnt where b.ol_w_id is null;
select a.* from (select d_w_id, sum(d_ytd) as d_ytd_sum from bmsql_district group by d_w_id) a left join (Select w_id, w_ytd from bmsql_warehouse) b on a.d_w_id = b.w_id and a.d_ytd_sum = b.w_ytd where b.w_id is null;
返回结果如下,若结果集均为空,则证明压测数据完整。
m.输入exit退出PolarDB-X集群。
n.执行如下命令,运行TPC-C测试。
./runBenchmark.sh props.mysql
返回结果如下,运行TPC-C测试后可以您看到实时的tpmC数值。请您耐心等待2分钟后,运行结束后会显示平均的tpmC数值。
o.执行云服务器ECS_3实例的PolarDB-X集群安装完成后输出的的连接方式,登录PolarDB-X。例如mysql -h127.0.0.1 -P7148 -upolardbx_root -pXXXXXX。
p.分别在终端二和终端三的PolarDB-X集群中执行如下命令,进行数据校验。
use tpcc;
select bit_xor(crc32(CONCAT_WS(',', `ol_w_id`, `ol_d_id`, `ol_o_id`, `ol_number`, `ol_i_id`, `ol_amount`, `ol_supply_w_id`, `ol_quantity`, `ol_dist_info`))) as checksum from bmsql_order_line;
当源端和目标端返回结果一致时,表示两侧数据一致,replica保证了数据的一致性。
清理现场和回收资源
本步骤将指导您如何停止MySQL服务和删除PolarDB-X集群。
说明:在云起实验室中您可直接在页面右上角单击结束实验,即可释放所有资源。
1.停止MySQL服务。
a.切换至终端一,输入exit退出MySQL数据库。
b.执行如下命令,停止MySQL服务。
systemctl stop mysqld.service
2.删除PolarDB-X集群。
a.切换至终端二,输入exit退出PolarDB-X集群。
b.执行如下命令,删除云服务器ECS_2实例的PolarDB-X集群。
pxd cleanup
c.切换至终端三,输入exit退出PolarDB-X集群。
d.执行如下命令,删除云服务器ECS_3实例的PolarDB-X集群。
pxd cleanup
本文来源:PolarDB-X知乎号