构建读写分离的数据库集群
4.1实战案例——构建读写分离的数据库集群
使用Mycat作为数据库中间件服务构建读写分离的数据库集群
使用一台虚拟机部署Mycat数据库中间件服务,将用户提交的读写操作识别分发给相应的数据库
节点。这样将用户的访问操作、数据库的读与写操作分给3台主机,只有数据库集群的主节点接
收增、删、改SQL语句,从节点接收查询语句,分担了主节点的查询压力
基础准备
使用CentOS 7.2系统,创建3台虚拟机进行实验。
其中2台虚拟机db1和db2部署MariaDB数据库服务,搭建主从数据库集群;一台作为主节点,负
责写入数据库信息;另一台作为从节点,负责读取数据库信息。
基础环境配置
修改主机名
# hostnamectl set-hostname mycat
# hostnamectl set-hostname db1
# hostnamectl set-hostname db2
修改完之后使命令生效
# bash
编辑hosts文件(mycat,db1,db2)
# vi /etc/hosts
安装JDK环境(mycat)
安装java环境
# yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
查看java版本
# java -version
部署MariaDB主从数据库集群服务
安装MariaDB服务(db1和db2)
# yum install -y mariadb mariadb-server
启动服务并设置开机自启
# systemctl start mariadb
# systemctl enable mariadb
初始化MariaDB数据库(db1和db2)
初始化MariaDB数据库,并设置MariaDB数据库root访问用户的密码为123456
# mysql_secure_installation
还没有设置根密码,直接回车
设置根密码,yes
删除匿名用户,yes
不允许远程登陆,no
删除测试数据库并访问它,yes
现在重新加载特权表,yes
配置数据库集群主节点(db1)
编辑配置文件
# vi /etc/my.cnf
log_bin = mysql-bin 记录操作日志
binlog_ignore_db = mysql 不同步MySQL系统数据库
server_id = 12 数据库集群中的每个节点ip都要不同,一般使用ip最后段的数字
编辑完成后重启服务
# systemctl restart mariadb
关闭防火墙
# systemctl stop firewalld
开放数据库权限(db1)
登录数据库
# mysql -uroot -p123456
授权在任何客户端机器上可以以root用户登录到数据库
> grant all privileges on *.* to root@'%' identified by "123456";
创建一个用户,并赋予从节点同步主节点数据库的权限
> grant replication slave on *.* to 'user'@'db2' identified by '123456';
配置同步(db2)
登录数据库
# mysql -uroot -p123456
配置连接信息
> change master to master_host='db1',master_user='user',master_password='123456';
开启从服务
> start slave;
查看从服务状态
> show slave status\G;
验证主从数据库的同步功能
创建库表数据(db1)
创建库test
> create database test;
在库test中创建表company
> use test
> create table company(id int not null primary key,name varchar(50),addr varchar(255));
插入表数据
> insert into company values(1,"facebook","usa");
查看表数据
> select * from company;
查询是否同步(db2)
查询数据库
> show databases;
查询表company
> select * from test.company;
部署mycat读写分离中间件服务
安装mycat服务(mycat)
将软件包上传到mycat的/root目录下,将软件包解压
# tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
赋予权限
# chown -R 777 /usr/local/mycat/
添加系统变量,并生效变量
# echo export MYCAT_HOME=/usr/local/mycat/ >> /etc/profile
# source /etc/profile
编辑逻辑库配置文件(mycat)
在文件中定义一个逻辑库
# vi /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
修改配置文件权限(mycat)
修改schema.xml的用户权限
# chown root:root /usr/local/mycat/conf/schema.xml
编辑访问用户(mycat)
修改root用户的访问密码与数据库
# vi /usr/local/mycat/conf/server.xml
修改内容
删除内容
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
保存并退出
启动服务(mycat)
启动数据库中间件服务
# /bin/bash /usr/local/mycat/bin/mycat start
查看虚拟机端口开放情况(8066和9066)
# netstat -ntpl
验证数据库集群服务读写分离功能
查询数据库信息(mycat)
安装服务
# yum install -y mariadb mariadb-client
登录数据库
# mysql -h127.0.0.1 -P8066 -uroot -p123456
查看逻辑库
> show databases;
> use USERDB
> show tables;
查看表company
> select * from company;
添加表数据(mycat)
在表中添加一条数据
> insert into company values(2,"bastetball","usa");
查看表信息
> select * from company;
验证读写操作分离(mycat)
查询对数据库读写操作的分离信息
# mysql -h127.0.0.1 -P9066 -uroot -p123456 -e 'show @@datasource;'