实验环境:三台linux终端,每台linux的系统为:Red Hat Enterprise Linux release 8.0
10.9.128.4:mysql1 主数据库节点
10.9.128.5:mysql2 从数据库节点
10.9.128.6:mycat 数据库中间件节点
配置主数据库节点
安装服务
# yum -y install mariadb mariadb-server
启动服务
# systemctl start mariadb
初始化数据库,配置数据库root密码为000000
# mysql_secure_installation Enter current password for root (enter for none): //默认回车 Set root password? [Y/n] y New password: #输入数据库root密码000000 Re-enter new password: #再次输入密码000000 Remove anonymous users? [Y/n] y Disallow root login remotely? [Y/n] n Remove test database and access to it? [Y/n] y Reload privilege tables now? [Y/n] y
配置mysql1主节点,修改mysql1节点的数据库配置文件,在配置文件中的[mysqld]增添如下内容。
# vi /etc/my.cnf [mysqld] log_bin = mysql-bin //记录操作日志 server_id = 1 //配置mysql节点,每台服务器节点必须不一样 binlog_ignore_db = mysql //不同步mysql系统数据库 :wq
重启服务,进入数据库
# systemctl restart mariadb # mysql -uroot -p000000
在mysql1节点,授权在任何客户端机器上可以以root用户登录到数据库,创建一个user用户连接节点mysql2,并赋予从节点同步主节点数据库的权限。
然后创建测试用的数据库test和表user,重要!
> grant all privileges on *.* to root@'%' identified by '000000'; > grant replication slave on *.* to 'user'@'10.9.128.5' identified by '000000'; > flush privileges; > create database test; //创建测试用的数据库test > use test; > create table user( id int primary key, pass varchar(40)); //创建测试表user
配置从数据库节点
安装服务
# yum -y install mariadb mariadb-server
启动服务
# systemctl start mariadb
初始化数据库,配置数据库root密码为000000
# mysql_secure_installation Enter current password for root (enter for none): //默认回车 Set root password? [Y/n] y New password: #输入数据库root密码000000 Re-enter new password: #再次输入密码000000 Remove anonymous users? [Y/n] y Disallow root login remotely? [Y/n] n Remove test database and access to it? [Y/n] y Reload privilege tables now? [Y/n] y
修改mysql2节点的数据库配置文件,在配置文件/etc/my.cnf.d/server.cnf中的[mysqld]增添如下内容
# vi /etc/my.cnf [mysqld] log_bin = mysql-bin binlog_ignore_db = mysql server_id = 2 :wq
重启服务
# systemctl restart mariad
配置主从数据库之间的连接信息
# mysql -uroot -p000000 > change master to > master_host='10.9.128.4', > master_user='user', > master_password='000000';
开启从节点服务,并验证主从是否成功
如果Slave_IO_Running和Slave_SQL_Running的状态都为YES,则从节点服务开启成功。
> start slave; > show slave status\G
配置mycat
安装Java JDK环境,将jak软件包,上传到Mycat虚拟机的/use/local目录下,并将软件包解压,赋予解压后的目录权限。然后配置环境变量。
# tar -xvf jdk1.7.0_79.tar.gz -C /usr/local/
设置权限
# chmod -R 777 /usr/local/jdk1.7.0_79
# vi /etc/profile 最底部添加 export JAVA_HOME=/usr/local/jdk1.7.0_79 export PATH=$PATH:$JAVA_HOME/bin :wq # source /etc/profile
验证
# java -version
安装Mycat服务,
将Mycat服务的软件包Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz上传到Mycat虚拟机的/use/local目录下,并将软件包解压,赋予解压后的目录权限
# tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
设置权限
# chmod -R 777 /usr/local/mycat/
添加变量
# vi /etc/profile 最底部添加 export MYCAT_HOME=/usr/local/mycat :wq # source /etc/profile
编辑Mycat的逻辑库配置文件
# vi /usr/local/mycat/conf/schema.xml
配置Mycat服务读写分离的schema.xml配置文件在/usr/local/mycat/conf/目录下,可以在文件中定义一个逻辑库,使用户可以通过Mycat服务管理该逻辑库对应的MariaDB数据库。在这里定义一个逻辑库schema,name为USERDB;该逻辑库USERDB对应数据库database为test(在部署主从数据库时已创建);设置数据库写入节点为主节点mysql1;设置数据库读取节点为从节点mysql2。(可以直接删除原来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="10.9.128.4:3306" user="root" password="000000"> <readHost host="hostS1" url="10.9.128.5:3306" user="root" password="000000" /> </writeHost> </dataHost> </mycat:schema> :wq
代码意思
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的访问用户
# chown root:root /usr/local/mycat/conf/schema.xml
修改/usr/local/mycat/conf/目录下的server.xml文件
# vi /usr/local/mycat/conf/server.xml 在配置文件最底部位置会发现<user name="user"></user>,修改 最终效果 将其他定义<user name=></user>删除或者注释掉
:wq保存退出
启动服务
# /bin/bash /usr/local/mycat/bin/mycat start
验证端口,如果有开发8066与9066端口,则表示服务开启成功,配置无误。
# netstat -ntpl
认证数据库读写分离功能
安装mariadb服务
# yum -y install mariadb # systemctl start mariadb
登录数据库,可以看到test数据库和test的user表
# mysql -h127.0.0.1 -P8066 -uroot -p000000 > show databases;
> use USERDB; > show tables;
对表user添加一条数据,然后退出
> insert into user values(1,"test"); > quit
查看读写分离情况
# mysql -h127.0.0.1 -P9066 -uroot -p000000 -e 'show @@datasource;'
可以看出通过9066端口查询对数据库读写操作的分离信息,所有的写入操作WRITE_LOAD数都在mysql1主数据库节点上,所有的读取操作READ_LOAD数都在mysql2主数据库节点上,实验成功