构建读写分离的数据库集群

一、案例目标
(1)了解mycat提供的读写分离功能
(2)了解mysql数据库的主从架构
(3)构建以mycat为中间件的读写分离数据库集群
二、案例分析
1.规划节点
使用mycat作为数据库中间件服务构建读写分离的数据库集群

IP 主机名/节点
192.168.94.130 mycat/mycat中间件服务节点
192.168.94.131 db1/mariadb数据库采集主节点
192.168.94.132 db2/mariadb数据库采集从节点

2.基础准备
使用CentOS 7.2系统,flavor使用2vCPU/4G内存/50G硬盘,创建3台虚拟机进行实验。
其中2台虚拟机db1和db2部署MariaDB数据库服务,搭建主从数据库集群;一台作为主节点,负责写入数据库信息;另一台作为从节点,负责读取数据库信息。
使用一台虚拟机部署Mycat数据库中间件服务,将用户提交的读写操作识别分发给相应的数据库节点。这样将用户的访问操作、数据库的读与写操作分给3台主机,只有数据库集群的主节点接收增、删、改SQL语句,从节点接收查询语句,分担了主节点的查询压力。
Yum源使用提供的gpmall-repo文件夹作为本地源,Mycat组件使用提供的Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz压缩包安装。
三、案例实施
1.基础环境配置
(1)修改主机名
使用hostnamectl命令修改三台主机的主机名
mycat节点修改主机名命令:

[root@localhost ~]# hostnamectl set-hostname mycat
[root@localhost ~]#bash
[root@mycat ~]#

db1节点修改主机名命令:

[root@localhost ~]# hostnamectl set-hostname db1
[root@localhost ~]#bash
[root@db1 ~]#

db2节点修改主机名命令:

[root@localhost ~]# hostnamectl set-hostname db2
[root@localhost ~]#bash
[root@db2 ~]#

(2)编辑hosts文件
三台主机的/etc/hosts文件均添加如下内容

[root@mycat ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.51.6     mycat
172.16.51.18    db1
172.16.51.30    db2

(3)配置yum安装源
数据库集群需要安装MariaDB数据库服务,需要给集群虚拟机配置Yum安装源文件,使用提供的gpmall-repo文件上传至3个虚拟机的/opt目录下,设置本地Yum源。
首先将3个节点/etc/yum.repo.d目录下的文件移动到/media下,命令如下:

#mkdir -p /opt/centos
#mount /dev/cdrom /opt/centos
#mv /etc/yum.repos.d/* /media/
#cat /etc/yum.repos.d/local.repo 
[mariadb]
name=mariadb
baseurl=file:///opt/gpmall-repo
gpgcheck=0
enabled=1
[centos]
Name=centos
Baseurl=file:///opt/centos
Gpgcheck=0
Enabled=1

(4)安装JDK环境
部署Mycat中间件服务需要先部署JDK 1.7或以上版本的JDK软件环境,这里部署JDK 1.8版本。
Mycat节点安装Java环境:

#yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
#java -version

(5)关闭防火墙(全部节点)

#iptables -F
#iptables -X
#iptables -Z
#iptables-save

2.部署mariadb主从数据库
(1)安装mariadb服务
通过yun命令在db1和db2节点上安装mariadb服务,命令如下:

# yum install -y mariadb mariadb-server

两个节点启动mariadb服务,并设置为开机自启。

# systemctl start mariadb
# systemctl enable mariadb

(2)初始化mariadb数据库

[root@db1 ~]# mysql_secure_installation 

构建读写分离的数据库集群
构建读写分离的数据库集群
构建读写分离的数据库集群
构建读写分离的数据库集群
构建读写分离的数据库集群
(3)配置数据库集群主节点
编辑主节点db1的数据库配置文件my.cnf,在配置文件my.cnf中添加如下内容:

[root@db1 ~]# cat /etc/my.cnf
[mysqld]
log_bin = mysql-bin                       #记录操作日志
binlog_ignore_db = mysql                  #不同步MySQL系统数据库
server_id = 131                            #数据库集群中的每个节点id都要不同,一般使用IP地址的最后段的数字,例如192.168.94.131,server_id就写131 

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

编辑完成配置文件后,重启mariadb服务

[root@db1 ~]# systemctl restart mariadb

(4)开放主节点的数据库权限
在主节点db1虚拟机上使用mysql命令登录MariaDB数据库,授权在任何客户端机器上可以以root用户登录到数据库。

[root@db1 ~]# mysql -uroot -p123456
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 137
Server version: 10.3.18-MariaDB-log MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> grant all privileges  on *.* to root@'%' identified by "123456";

在主节点db1数据库上创建一个user用户让从节点db2连接,并赋予从节点同步主节点数据库的权限,命令如下:

MariaDB [(none)]> grant replication slave on *.* to 'user'@'db2' identified by '123456';

(5)配置从节点db2同步主节点db1
在从节点db2虚拟机上使用mysql命令登录MariaDB数据库,配置从节点连接主节点的连接信息。master_host为主节点主机名db1,master_user为在步骤(4)中创建的用户user,命令如下:

[root@db2 ~]# mysql -uroot -p123456
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 88
Server version: 10.3.18-MariaDB-log MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>  change master to master_host='db1',master_user='user',master_password='123456';

配置完毕主从数据库之间的连接信息之后,开启从节点服务。使用show slave status\G; 命令并查看从节点服务状态,如果Slave_IO_Running和Slave_SQL_Running的状态都为YES,则从节点服务开启成功。查询结果如图4-4-1所示。

MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G;

构建读写分离的数据库集群
(6)验证主从数据库的同步状态
先在主节点db1的数据库中创建库test,并在库test中创建表company,插入表数据。创建完成后,查看表company数据,如下所示:

MariaDB [(none)]> create database test;

构建读写分离的数据库集群

MariaDB [(none)]> use test

构建读写分离的数据库集群

MariaDB [test]> create table company(id int not null primary key,name varchar(50),addr varchar(255));

构建读写分离的数据库集群

MariaDB [test]> insert into company values(1,"facebook","usa");
MariaDB [test]> select * from company;

构建读写分离的数据库集群
这时从节点db2的数据库就会同步主节点数据库创建的test库,可以在从节点查询test数据库与表company,如果可以查询到信息,就能验证主从数据库集群功能在正常运行。查询结果如下所示:

MariaDB [(none)]> show databases;
MariaDB [(none)]> select * from test.company;

构建读写分离的数据库集群
3.部署mycat读写分离中间件服务
(1)安装mycat服务
将mycat服务的二进制软件包Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz上传到Mycat虚拟机的/root目录下,并将软件包解压到/use/local目录中。赋予解压后的Mycat目录权限。

[root@mycat ~]# tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
[root@mycat ~]# chown -R 777 /usr/local/mycat/

在/etc/profile系统变量文件中添加Mycat服务的系统变量,并生效变量。

[root@mycat ~]# echo export MYCAT_HOME=/usr/local/mycat/ >> /etc/profile
[root@mycat ~]# source /etc/profile

(2)编辑mycat的逻辑库配置文件
配置Mycat服务读写分离的schema.xml配置文件在/usr/local/mycat/conf/目录下,可以在文件中定义一个逻辑库,使用户可以通过Mycat服务管理该逻辑库对应的MariaDB数据库。在这里定义一个逻辑库schema,name为USERDB;该逻辑库USERDB对应数据库database为test(在部署主从数据库时已安装);设置数据库写入节点为主节点db1;设置数据库读取节点为从节点db2。(可以直接删除原来schema.xml的内容,替换为如下。)
注意:IP需要修改成实际的IP地址。

[root@mycat ~]# cat /usr/local/mycat/conf/schema.xml 
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="USERDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"></schema> 
<dataNode name="dn1" dataHost="localhost1" database="test" />  
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" dbType="mysql" dbDriver="native" writeType="0" switchType="1"  slaveThreshold="100">  
    <heartbeat>select user()</heartbeat>
    <writeHost host="hostM1" url="192.168.94.131:3306" user="root" password="123456">
        <readHost host="hostS1" url="192.168.94.132:3306" user="root" password="123456" />
    </writeHost>
</dataHost>
</mycat:schema>

代码说明:
sqlMaxLimit:配置默认查询数量。
database:为真实数据库名。
balance=“0”:不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
balance=“1”:全部的readHost与stand by writeHost参与select语句的负载均衡,简单来说,当双主双从模式(M1->S1,M2->S2,并且M1与M2互为主备),正常情况下,M2、S1、S2都参与select语句的负载均衡。
balance=“2”:所有读操作都随机的在writeHost、readhost上分发。
balance=“3”:所有读请求随机地分发到wiriterHost对应的readhost执行,writerHost不负担读压力,注意balance=3只在1.4及其以后版本有,1.3版本没有。
writeType=“0”:所有写操作发送到配置的第一个writeHost,第一个挂了需要切换到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件dnindex.properties中。
writeType=“1”:所有写操作都随机的发送到配置的writeHost。
(3)修改配置文件权限
修改schema.xml的用户权限,命令如下:

[root@mycat ~]# chown root:root /usr/local/mycat/conf/schema.xml

(4)编辑mycat的访问用户
修改/usr/local/mycat/conf/目录下的server.xml文件,修改root用户的访问密码与数据库,密码设置为123456,访问Mycat的逻辑库为USERDB,命令如下:

[root@mycat ~]# cat /usr/local/mycat/conf/server.xml 

在配置文件的最后部分,

<user name="root">
		<property name="password">123456</property>
		<property name="schemas">USERDB</property>
然后删除如下几行:
<user name="user">
		<property name="password">user</property>
		<property name="schemas">TESTDB</property>
		<property name="readOnly">true</property>
</user>

保存并退出server.xml配置文件。
(5)启动mycat服务
通过命令启动mycat数据库中间件服务,启动后使用netstat -ntpl命令查看虚拟机端口开放情况,如果8066和9066端口已启动,则表示mycat服务开启成功。

[root@mycat ~]# /bin/bash /usr/local/mycat/bin/mycat start

构建读写分离的数据库集群
4.验证数据库集群服务读写分离功能
(1)用mycat服务查询数据库信息
现在mycat虚拟机上使用yum安装mariadb-client服务

[root@mycat ~]# yum install -y MariaDB-client

在mycat节点上使用mysql命令查看mycat服务的逻辑库USERDB,因为mycat的逻辑库USERDB对应的数据库test(在部署主从数据库时已安装),所以可以查看库中已经创建的表company,命令如下:

[root@mycat ~]# mysql -h127.0.0.1 -P8066 -uroot -p123456
MySQL [(none)]> show databases;

构建读写分离的数据库集群MySQL [(none)]> use USERDB;
构建读写分离的数据库集群

MySQL [USERDB]> show tables;

构建读写分离的数据库集群

MySQL [USERDB]> select * from company;

构建读写分离的数据库集群
(2)用mycat服务添加表数据
在mycat虚拟机上使用mysql命令对表company添加一条数据(2,“basketball”,“usa”),添加完毕后查看表信息。命令如下。

MySQL [USERDB]> insert into company values(2,"bastetball","usa");

构建读写分离的数据库集群

MySQL [USERDB]> select * from company;

构建读写分离的数据库集群
(3)验证mycat服务对数据库读写操作分离
在Mycat虚拟机节点使用mysql命令,通过9066端口查询对数据库读写操作的分离信息。可以看到所有的写入操作WRITE_LOAD数都在db1主数据库节点上,所有的读取操作READ_LOAD数都在db2主数据库节点上。由此可见,数据库读写操作已经分离到db1和db2节点上了。命令如下。

[root@mycat ~]# mysql -h127.0.0.1 -P9066 -uroot -p123456 -e 'show  @@datasource;

构建读写分离的数据库集群
至此,Mycat读写分离数据库案例完成。

上一篇:教程 |【阿里云.人脸识别】人脸比对调用


下一篇:centos7上安装mysql,配置主从同步,配置读写分离(mycat)