Mycat读写分离(一主一从)

耗尽温柔 提交于 2019-12-01 19:33:22

Mycat读写分离(一主一从)

 

我们一共使用2个虚拟机,每个机器的作用如下:

主机名

IP地址

任务角色

数据库

node1

192.168.1.121

Mycat, master

MySQL

node2

192.168.1.122

slave

MySQL

 

 

Mysql主服务器配置

第一步:修改/etc/my.cnf文件:

在[mysqld]段下添加:

datadir=/var/lib/mysql                        默认数据存储目录

server-id=1                                            主机唯一id

log-bin=/var/lib/mysql/mysqlbin                  启用二进制日志

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

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

binlog-do-db=boot_security                  设置需要复制的数据库

binlog-ignore-db=mysql                           设置不要复制的数据库

binlog_format=STATEMENT                 设置logbin格式

 

 

第二步:重启mysql服务

systemctl mysqld restart

 

第三步:建立帐户并授权slave

mysql> GRANT REPLICATION SLAVE ON *.* TO 'sendcode'@'%' IDENTIFIED BY '123456';

#一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全。

 

刷新权限

mysql> FLUSH   PRIVILEGES;

 

查看mysql现在有哪些用户

mysql>select user,host from mysql.user;

 

第四步:查询master的状态

mysql> show master status;

+----------------------+------------+--------------------+------------------+-----------------------------+

| File            | Position  | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+----------------------+------------+--------------------+------------------+-----------------------------+

| mysql-bin.000001 |  120    | boot_security  | mysql        |                    |

+----------------------+------------+--------------------+------------------+-----------------------------+

注意:File    Position :两个值稍后配置从库的时候可能会用到!         

 

 

Mysql从服务器配置

第一步:修改my.cnf文件

[mysqld]

server-id = 2

relay-log=mysql-relay

 

注意:修改完成后,必须重启mysql服务:

systemctl mysqld restart

 

第二步:配置从服务器

CHANGE MASTER TO MASTER_HOST='192.168.1.121',MASTER_USER='sendcode',MASTER_PASSWORD='123456',MASTER_LOG_FILE=' mysql-bin.000001',MASTER_LOG_POS=120;

  

注意语句中间不要断开,master_port为mysql服务器端口号(无引号),master_user为执行同步操作的数据库账户。

Mysql5.6以前的版本配置需要增加2个参数:

master_log_file='mysql-bin.000001'   //主服务器日志文件名称

master_log_pos=120               //主服务器日志线程号

 

第三步:启动从服务器复制功能

Mysql>start slave;

 

第四步:检查从服务器复制功能状态:

mysql> show slave status \G;

 

……………………(省略部分)

Slave_IO_Running: Yes //此状态必须YES

Slave_SQL_Running: Yes //此状态必须YES

……………………(省略部分)

 

注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。

 

错误处理:

如果出现此错误:

Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

因为是mysql是克隆的系统所以mysql的uuid是一样的,所以需要修改。

解决方法:

删除/var/lib/mysql/auto.cnf文件,重新启动服务。

 

 

以上操作过程,从服务器配置完成。

 

如果需要重新配置主从 需要从机操作

stop slave;                     停止从服务复制功能

reset master;                重新配置主从

 

 

Mycat配置

Mycat 1.6 支持MySQL主从复制状态绑定的读写分离机制,让读更加安全可靠,配置如下:

1.修改文件位置:/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="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">

        </schema>

        <dataNode name="dn1" dataHost="host1" database="boot_security" />

        <dataHost name="host1" maxCon="1000" minCon="10" balance="3"

                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">

                <heartbeat>select user()</heartbeat>

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

                <writeHost host="hostM1" url="192.168.1.121:3306" user="root"

                                   password="123456">

                        <readHost host="hostS2" url="192.168.1.122:3306" user="root" password="123456" />

                </writeHost>

        </dataHost>

</mycat:schema>

 

Schema标签:name指明schema逻辑数据库的名称,checkSQLschema是否去除sql语句中的数据库名称,如果sql查询语句没有limit语句,sqlMaxLimit为查询语句加上limit。

 

dataNode标签:定义节点,指定数据虚拟服务器,数据库等属性

 

dataHost标签:定义具体的数据库实例,读写分离配置,心跳包语句。maxCon属性指定每个读写实例连接池的最大连接。minCon属性指定每个读写实例连接池的最小连接。

balance属性,目前的取值有 4 种:

balance="0", 不开启读写分离机制,所有读写操作都发送到当前可用的writeHost 上。

balance="1",所有读操作都随机的发送到readHost

balance="2",所有读操作都随机的在 writeHost、 readhost 上分发。

balance="3", 所有读请求随机分发到 wiriterHost 对应的 readhost 执行

 

2.根据 server.xml(/usr/local/mycat/conf/server.xml)配置的用户名和密码,我配置的是mycat,123456,Mycat运行默认端口为8066

 

测试读写分离

 

  1. 1.  启动Mycat:

进入bin目录启动mycat (确保配置的读写分离Host已经配置了主从数据同步)

cd /usr/local/mycat/bin

 ./mycat start

 查看Mycat是否正常启动(查看logs的wrapper.log)

 

  1. 2.  Mycat已经成功启动,连接上Mycat

mysql -umycat   -p123456 -h 192.168.1.121 -P8066

 

  1. 3.  查看当前可使用数据库

show databases;

 

  1. 4.  使用数据库

use TESTDB;

 

 

  1. 5.  创建测试数据表

 

CREATE TABLE company (

  id  bigint(20) NOT NULL ,

  body varchar(100) NOT NULL , 

  PRIMARY KEY (id)

) ;

 

 

  1. 6.  查看数据表是否创建成功

desc company;

 

 

7读写分离测试:

确保2台已经配置好主从的MYSQL服务器主从连接状态正常。

向company表插入1条数据:

insert into company (id,body)values(1,’body1’);

查询数据:select * from company;

 

 

分别查看主、从2个数据库,可以看到数据都已经存在。

 

 

主数据库的数据正常通过mycat代理层插入了。

从服务器的数据通过主从复制同步过来了。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!