围观小白做实验-HCIE云服务实验第4章-云数据库架构设计实验

举报
xuhh1990 发表于 2020/06/27 22:54:59 2020/06/27
【摘要】 要主要下命令中单引号的使用,还需要非要有耐心哟~

实验目的

1.理解华为云数据库服务的基本原理

2.理解RDS,RDS迁移服务的使用场景


实验组网

image.png


1资源准备

VPC准备

image.png 

sg-migrate安全组准备

image.png 

sg-mysql安全组准备

image.png 

 

 

 

 

Mycat安全组

image.png 

image.png 

 

 

2.新增云服务器ECS-WEB01

image.png 

 

ECS-WEB001安装安装httpd

yum install httpd –y

 

image.png 

ECS-WEB001 安装

phpyum install -y php

 image.png

 

 

 

 

 

安装组件

yum install -y php-pdo.x86_64 php-mysql

image.png 

3.Mysql主从部署

新增ECS实例ECS-DB01

image.png

新增ECS实例ECS-DB02,与ECS-DB01不在一个可用区

image.png

新增云服务器ECS-WEB0201不在一个可用区

先创建备份存储库

image.png

image.png

image.png 

ECS-DB01上部署mysql

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm

rpm -ivh mysql-community-release-el7-5.noarch.rpm

yum install mysql-server  -y

image.png 

image.png 

image.png 

ECS-DB01上启动mysql

通过以下命令启动mysql

systemctl start mysqld

image.png 

 

ECS-DB01修改mysql密码

首先通过以下命令登录mysql

mysql -u root

然后在mysql>界面通过以下命令修改mysqlroot密码为Huawei@123!”:

use mysql

update user set password=PASSWORD("Huawei@123!") where User='root';

image.png 

修改完毕通过以下命令退出

mysqlquit

image.png 


image.png 

netstat -nutpel|grep 3306

 

image.png 

 

配置ECS-DB01为主库

登录ECS-DB01修改配置文件通过以下命令备份mysql配置文件

mv /etc/my.cnf /etc/my.cnf.bak

通过以下整段命令新增新的my.cnf配置文件

cat << EOF >> /etc/my.cnf

[mysqld]

join_buffer_size = 128M

sort_buffer_size = 2M

read_rnd_buffer_size = 2M

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks

lower_case_table_names = 1

innodb_strict_mode = 1

sql_mode =

symbolic-links=0

character_set_server = utf8

log-bin = mysql-bin

binlog_format=row

server-id = 2

expire_logs_days = 10

slave_skip_errors = 1062

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

EOF

通过以下命令确认mysql配置文件

cat /etc/my.cnf

image.png 

通过以下命令重启mysqld:

systemctl restart mysqld

image.png 

ECS-DB01设置同步账户

首先通过以下命令登录ECS-DB01mysql

mysql -pHuawei@123!

mysql>界面输入以下命令新建同步账户:

create user 'copy'@'172.16.%' identified by 'huawei@123';

image.png 

 

 

 

mysql>界面输入以下命令为同步账户授予复制权限:

grant replication slave on *.* to 'copy'@'172.16.%' identified by 'huawei@123';

image.png 

mysql>界面输入以下命令为root账户授予vpc01访问呢权限:

grant all privileges on *.* to 'root'@'172.16.%' identified by 'Huawei@123!';

image.png 

mysql>界面输入以下命令使配置生效:

flush privileges

image.png 

 

记录binlog信息

确认主库binlogFile值和Position,并记录,用于后续配置从库同步:

show master status;

image.png 

 

Filemysql-bin.000001

Position773

 

 

 

 

ECS-DB02上部署mysql

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm

rpm -ivh mysql-community-release-el7-5.noarch.rpm

yum install mysql-server  -y

image.png 

 

image.png 

image.png 

 

ECS-DB02上启动mysql

通过以下命令启动mysql

systemctl start mysqld

image.png 

ECS-DB02修改mysql密码

首先通过以下命令登录mysql

mysql -u root

然后在mysql>界面通过以下命令修改mysqlroot密码为Huawei@123!”:

use mysql

update user set password=PASSWORD("Huawei@123!") where User='root';

 

 

 

image.png 

image.png 

修改完毕通过以下命令退出mysql

quit

image.png 

确认ECS-DB02mysql状态

netstat -nutpel|grep 3306

image.png 

 

 

 

 

 

 

ECS-DB02root设置访问权限

mysql>界面输入以下命令为root用户授予vpc01访问权限

grant all privileges on *.* to 'root'@'172.16.%' identified by 'Huawei@123!';

 

 

image.png 

设置ECS-DB02为从库

登录ECS-DB02,通过以下命令备份mysql配置文件:

mv /etc/my.cnf /etc/my.cnf.bak

通过复制以下整段命令执行配置从库的配置文件:

cat << EOF >> /etc/my.cnf

[mysqld]

join_buffer_size = 128M

sort_buffer_size = 2M

read_rnd_buffer_size = 2M

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

sql_mode =

lower_case_table_names = 1

innodb_strict_mode = 1

log-bin = mysql-bin

binlog_format=row

character_set_server = utf8

server-id = 3

read-only = 1

expire_logs_days = 10

slave_skip_errors = 1062

 

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

确认配置文件

通过以下命令确认文件

cat /etc/my.cnf

image.png 

 

重启ECS-DB02mysql

通过以下命令重启mysqld

systemctl restart mysqld

image.png 

记录ECS-DB01的内网IP地址

登录ECS-DB01通过ifconfig命令查看内网IP地址,并记录IP地址,用于下一步骤使用

image.png 

ECS-DB01的内网IP172.16.0.135

设置ECS-DB02为从库

通过以下命令登录ECS-DB02mysql数据库:

mysql -pHuawei@123!

image.png 

 

输入以下命令设置ECS-DB01为从库


image.png 

 

 

CHANGE MASTER TO MASTER_HOST='172.16.0.135', MASTER_USER='copy', MASTER_PASSWORD='huawei@123', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=773;

image.png 

 

开启主从同步

mysql>界面输入以下命令

start slave;

image.png 

查看主从同步状态

mysql>界面输入以下命令查看同步状态,查看Slave_IO_RunningSlave_SQL_Running的状态

show slave status \G;

image.png 

 

ECS-DB01mysql中插入数据表

登录ECS-DB01mysql数据库:

mysql -pHuawei@123!

image.png 

 

 

 

通过以下命令新建库

create database demo;

image.png 

通过以下命令创建数据表

use demo;

CREATE TABLE IF NOT EXISTS `users` (`id` INT UNSIGNED AUTO_INCREMENT, `firstname` VARCHAR(100) NOT NULL, `lastname` VARCHAR(100) NOT NULL,  PRIMARY KEY(`id`))ENGINE=InnoDB DEFAULT CHARSET=utf8;

image.png 

通过以下命令插入数据

insert into users values (1, 'Kelton', 'Hoover');

insert into users values (2, 'Siena', 'Alvarado');

insert into users values (3, 'Zayden', 'Bennett');

insert into users values (4, 'Kinley', 'Carter');

insert into users values (5, 'Athena', 'Wallace');

insert into users values (6, 'Gavin', 'Duran');

insert into users values (7, 'Alyssa', 'Oneill');

insert into users values (8, 'Kylan', 'Branch');

insert into users values (9, 'Nigel', 'Rodriguez');

insert into users values (10, 'Mackenzie', 'Watson');

insert into users values (11, 'Cara', 'Richard');

insert into users values (12, 'Madyson', 'Macdonald');

insert into users values (13, 'Jordin', 'Stanton');

insert into users values (14, 'Sidney', 'Dean');

insert into users values (15, 'Lainey', 'Skinner');

insert into users values (16, 'Adalyn', 'Sellers');

insert into users values (17, 'Alisson', 'Blake');

insert into users values (18, 'Jamarcus', 'Clarke');

insert into users values (19, 'Yoselin', 'Yoder');

insert into users values (20, 'Holden', 'Bridges');

 

image.png 

登录ECS-DB02mysql查看同步是否生效

ECSDB02上通过以下命令查看同步信息

首先通过以下命令登陆mysql

mysql -pHuawei@123!

image.png 

 

然后通过命令show databases;查看公告新建的库是否已经正常同步

 

 

 image.png

 

 

使用demo

use demo

image.png 

查看表数据

select * from users;

image.png 

数据显示正常

 

 

 

 

4.部署mycat

新增一台ECS部署mycat

image.png 

部署mycat

 


image.png 

使用winscp工具传过去

image.png 

登录ECS-mycat01通过以下命令下载mycat并安装到目录/usr/local

Wget  http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

 

tar -xvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

mv mycat /usr/local/ -f

 

 

 

image.png 

image.png 

 

安装java

通过以下命令安装java

yum install -y java-1.8.0-openjdk

image.png 

 

 

 

修改mycat数据库配置文件

通过以下命令设置切换到mycat配置文件目录 

cd /usr/local/mycat/conf

通过以下命令修改mycat配置文件schema.xml(将红色字体替换为实际的值):

注意IP地址

mv schema.xml schema.xml.bak

masterdb=172.16.0.135

slavedb=172.16.0.160

cat << EOF >> schema.xml

<?xml version="1.0"?>

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">

<mycat:schema xmlns:mycat="http://io.mycat/">

<schema name="copydb" checkSQLschema="false" sqlMaxLimit="100" dataNode="copynode"></schema>

 

        <dataNode name="copynode" dataHost="dthost" database="demo" />

        <dataHost name="dthost" maxCon="1000" minCon="10" balance="1"

        writeType="0" dbType="mysql" dbDriver="native">

                <heartbeat>select user()</heartbeat>

                <!-- can have multi write hosts -->

                <writeHost host="hostmaster" url="$masterdb:3306" user="root" password="Huawei@123!">

                <!-- can have multi read hosts -->

                        <readHost host="hostslave" url="$slavedb:3306" user="root" password="Huawei@123!"

                weight="1" />

                </writeHost>

        </dataHost>

</mycat:schema>

EOF

image.png 

确认已经修改的配置文件

image.png 

 

 

 

 

 

 

修改mycat服务配置文件

通过以下命令设置mycat配置文件server.xml

cd /usr/local/mycat/conf

mv server.xml server.xml.bak

cat << EOF >> server.xml

<?xml version="1.0" encoding="UTF-8"?>

<!-- - - Licensed under the Apache License, Version 2.0 (the "License");

        - you may not use this file except in compliance with the License. - You

        may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0

        - - Unless required by applicable law or agreed to in writing, software -

        distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT

        WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the

        License for the specific language governing permissions and - limitations

        under the License. -->

<!DOCTYPE mycat:server SYSTEM "server.dtd">

<mycat:server xmlns:mycat="http://io.mycat/">

        <system>

        <property name="useSqlStat">0</property>

        <property name="useGlobleTableCheck">0</property>

        <property name="serverPort">3310</property>

        <property name="manageport">9066</property>

 

                <property name="sequnceHandlerType">2</property>

                <property name="processorBufferPoolType">0</property>

                <property name="frontWriteQueueSize">4096</property>

                <property name="processors">32</property>

                <property name="handleDistributedTransactions">0</property>

                <property name="useOffHeapForMerge">1</property>

                <property name="memoryPageSize">1m</property>

                <property name="spillsFileBufferSize">1k</property>

                <property name="useStreamOutput">0</property>

                <property name="systemReserveMemorySize">384m</property>

                <property name="useZKSwitch">true</property>

        </system>

 

        <user name="root">

                <property name="password">Huawei@123!</property>

                <property name="schemas">copydb</property>

        </user>

 

        <user name="user">

                <property name="password">Huawei@123!</property>

                <property name="schemas">copydb</property>

                <property name="readOnly">true</property>

        </user>

</mycat:server>

EOF

image.png 

 

确认mycat服务的配置文件

image.png 

启动mycat

通过以下命令启动mycat

cd /usr/local/mycat/bin

./mycat start

image.png 

 

 

 

 

通过以下命令查看mycat的状态

netstat -nutple|grep 3310

image.png 

 


 

mycat01安装Mysql客户端

通过下面的命令安装mysql

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm

rpm -ivh mysql-community-release-el7-5.noarch.rpm

yum install mysql-server  -y

image.png 

image.png 

通过以下命令启动mysql

systemctl start mysqld

image.png 

修改mysql密码

首先通过以下命令登录mysql

mysql -u root

然后在mysql>界面通过以下命令修改mysqlroot密码为Huawei@123!”:

use mysql

update user set password=PASSWORD("Huawei@123!") where User='root';

image.png 

 

修改完毕通过以下命令退出mysql

quit

image.png 

确认ECS-mycat01mysql状态

netstat -nutple|grep 3306

image.png 

验证mycat

登录ECS-mycat01虚机使用mysql命令通过3310端口登录数据库

mysql -h127.0.0.1 -uroot -P3310 -pHuawei@123!

 

image.png 

show databases;

image.png 

use copydb;

image.png 

select * from users;

image.png 

 

 

 

 

 

 

 

 

 

 

 

 

 

5.部署php代码

登录ECS-WEB01虚机,执行如下命令(将红色字体替换为实际值):

cd /var/www/html/

mycatip="172.16.0.165"

cat << EOF >>index.php

<!DOCTYPE html>

<html>

<body>

 

<?php

echo "<table style='border: solid 1px black;'>";

 echo "<tr><th>Id</th><th>Firstname</th><th>Lastname</th></tr>";

 

class TableRows extends RecursiveIteratorIterator {

    function __construct(\$it) {

        parent::__construct(\$it, self::LEAVES_ONLY);

    }

 

    function current() {

        return "<td style='width: 150px; border: 1px solid black;'>" . parent::current(). "</td>";

    }

 

    function beginChildren() {

        echo "<tr>";

    }

 

    function endChildren() {

        echo "</tr>" . "\n";

    }

}

 

\$servername = "$mycatip";

\$username = "root";

\$password = "Huawei@123!";

\$dbname = "copydb";

\$dbport = 3310;

 

try {

    \$conn = new PDO("mysql:host=\$servername;port=\$dbport;dbname=\$dbname", \$username, \$password);

    \$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    \$stmt = \$conn->prepare("SELECT id, firstname, lastname FROM users");

    \$stmt->execute();

 

    // set the resulting array to associative

    \$result = \$stmt->setFetchMode(PDO::FETCH_ASSOC);

 

    foreach(new TableRows(new RecursiveArrayIterator(\$stmt->fetchAll())) as \$k=>\$v) {

        echo \$v;

    }

}

catch(PDOException \$e) {

    echo "Error: " . \$e->getMessage();

}

\$conn = null;

echo "</table>";

?>

 

</body>

</html>

EOF

 

image.png 

启动httpd服务

使用以下命令开启httpd

systemctl start httpd

image.png 

 

验证web服务是否能正常访问

打开浏览器,输入ECS-WEB01的外网IP:116.63.54.124查看是否能显示名字列表

image.png 

 

 

 

 

 

 

 

 

 

 

 

 

6.迁移到RDS数据库

购买数据库

image.png 

确认已经购买的RDS服务

等到RDS实例创建完毕

image.png 

创建迁移任务

image.png 

 

 

测试连通性

image.png 

确定设置

image.png 

 

修改报错参数重新检测后正常

image.png 

image.png 

确认参数对比一致

image.png 

启动任务确认

image.png 

确定迁移状态

image.png 

状态变为“增量迁移”

image.png 

登录rds验证迁移结果

打开RDS管理列表点击“登录”

image.png 

 

 

 

点击库名demo

image.png 

找到users点击“打开表”

image.png 

RDS新增列

点击“新增”,并手动插入一条数据

image.png 

 

 

 

 

 

 

 

配置只读数据库不同的可用区创建只读数据库

image.png 

RDS控制台查看只读实例

image.png 

等待只读库创建完毕

 

image.png 

 

 

 

 

记录RDS主库和RDS只读实例的IP地址

分别记录RDS主库和RDS只读实例的IP地址准备下一步的迁移操作

 

image.png 

Rds主库:172.16.0.62

Rds只读:172.16.0.42

 

mycat后端数据库迁移到RDS

登录mycat虚机,修改配置文件,确认主库、从库、RDS的内网ip地址(将红色替换为实际值)

cd /usr/local/mycat/conf

sed -i"s/主库ECS-DB01的内网IP地址/RDS主库的内网IP地址/g" schema.xml

sed -i "s/172.16.0.135/172.16.0.62/g" schema.xml

image.png 

sed -i "s/从库ECS-DB02的内网IP地址/RDS只读实例的内网IP地址/g" schema.xml

sed -i "s/172.16.0.160/172.16.0.42/g" schema.xml

image.png 

确认是否修改成功

cat schema.xml

image.png 

 

重启mycat

通过以下命令重启mycat

cd /usr/local/mycat/bin

./mycat restart

image.png 

 

验证web是否正常

在浏览器输入ECS-WEB01的外网IP外网IP:116.63.54.124查看新插入的数据是否可以正常显示

 

image.png 

暂增量数据迁移实例

image.png 

 

任务结束后删除任务

image.png 

 

 

删除ECS数据库实例

ECS数据库实例已经成功迁移到RDS服务,打开ECS控制台,删除实例ECS-DB01ECS-DB02

image.png 

7.结果验证 

web端验证结果

在浏览器输入ECS-WEB01的外网IP116.63.54.124查看新插入的数据是否可以正常显示

 

image.png 

 

 

 

 

 

 

 


8.思考题

我们在配置文件上传过程请思考以下两个问题

1.数据库主备的好处是什么?

答:具有高可用,主库挂了,可以通过备库切换,具有高性能,读写都操作主库,很容易产生瓶颈。大部分互联网应用读多写少,读会先成为瓶颈,进而影响写性能。主备实例存储六副本,数据可靠性>99.99999%,异地容灾场景

 

2. 数据库中间件的作用是什么

答:中间件可以看做是应用到数据库之间一个proxy(代理),实现读写分离的功能,

另外它还可以实现分库分表,mycat实现的就是读写分离的作用




【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。