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

来自CloudWiki
Cloud17讨论 | 贡献2019年11月7日 (四) 09:02的版本
跳转至: 导航搜索

规划节点

使用Mycat作为数据库中间件服务构建读写分离的数据库集群,节点规划见表4-1-1。

表4-1-1 节点规划

IP	主机名	节点
172.16.51.6	mycat	Mycat中间件服务节点
172.16.51.18	db1	MariaDB数据库集群主节点
172.16.51.30	db2	MariaDB数据库集群从节点

基础准备

使用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压缩包安装。

修改主机名

使用hostnamectl命令修改3台主机的主机名。

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 ~]#

编辑hosts文件

3台集群虚拟机的/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

配置yum安装源

数据库集群需要安装MariaDB数据库服务,需要给集群虚拟机配置Yum安装源文件,使用提供的gpmall-repo文件上传至3个虚拟机的/opt目录下,设置本地Yum源。

首先将3个节点/etc/yum.repo.d目录下的文件移动到/media下,命令如下:

mv /etc/yum.repos.d/* /media/

3台集群虚拟机的Yum安装源文件配置部分:

cat /etc/yum.repos.d/local.repo

[mariadb]
name=mariadb
baseurl=file:///opt/gpmall-repo
gpgcheck=0
enabled=1

安装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

[root@mall ~]# java -version

openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)

部署MariaDB主从数据库集群服务

可参考部署MariaDB主从数据库集群服务

部署Mycat读写分离中间件服务

部署Mycat读写分离中间件服务

安装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

编辑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="172.16.51.18:3306" user="root" password="123456">
        <readHost host="hostS1" url="172.16.51.30: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。

修改配置文件权限

修改schema.xml的用户权限,命令如下:

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

编辑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>

然后删除如下几行:

<user name="user">
		<property name="password">user</property>
		<property name="schemas">TESTDB</property>
		<property name="readOnly">true</property>
</user>

保存并退出server.xml配置文件。

启动Mycat服务

通过命令启动Mycat数据库中间件服务。

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

启动后使用netstat -ntpl命令查看虚拟机端口开放情况,如果有开放8066和9066端口,则表示Mycat服务开启成功。端口查询情况类似如下所示。

[root@mycat ~]# netstat -ntpl

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      764/sshd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1027/master
tcp        0      0 127.0.0.1:32000         0.0.0.0:*               LISTEN      1590/java
tcp6       0      0 :::9066                 :::*                    LISTEN      1590/java
tcp6       0      0 :::38794                :::*                    LISTEN      1590/java
tcp6       0      0 :::22                   :::*                    LISTEN      764/sshd
tcp6       0      0 ::1:25                  :::*                    LISTEN      1027/master
tcp6       0      0 :::45086                :::*                    LISTEN      1590/java
tcp6       0      0 :::1984                 :::*                    LISTEN      1590/java
tcp6       0      0 :::8066                 :::*                    LISTEN      1590/java