mycat实现MySQL读写分离
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mycat实现MySQL读写分离相关的知识,希望对你有一定的参考价值。
mycat实现mysql读写分离
mycat是什么
Mycat是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而Mycat并没有存储引擎,所以并不是完全意义的分布式数据库系统。Mycat是数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服务。对数据进行分片处理之后,从原有的一个库,被切分为多个分片数据库,所有的分片数据库集群构成了整个完整的数据库存储。
Mycat的几个典型的应用场景:
单纯的读写分离,此时配置最为简单,支持读写分离,主从切换;
分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片;
多租户应用,每个应用一个库,但应用程序只连接Mycat,从而不改造程序本身,实现多租户化;
表系统,借助于Mycat的分表能力,处理大规模报表的统计;
代替Hbase,分析大数据;
作为海量数据实时查询的一种简单有效方案,比如 1〇〇亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择;
单纯的MyCAT读写分离,配置最为简单,支持读写分离,主从切换分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片;
多租户应用,每个应用一个库,但应用程序只连接Mycat,从而不改造程序本身,实现多租户化;
报表系统,借助于Mycat的分表能力,处理大规模报表的统计替代Hbase,分析大数据,作为海量数据实时查询的一种简单有效方案,比如100亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择。
实现读写分离
1)实验环境 centos 6.5
192.168.1.11 http服务(discuz论坛)
192.168.1.103 mycat服务
192.168.1.21 master_mysql
192.168.1.23 slave_mysql
2)配置mysql主从
1. 在master-mysql服务器的配置文件[mysqld]下加如下两句
# vim /etc/my.cnf[mysqld]server-id= 1log-bin=mysql-bin
重启服务器 # /etc/init.d/mysqld start 登陆master-mysql服务器,进行用户授权并查看状态:
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘dianel‘@‘%‘ IDENTIFIED BY ‘dianel‘; Query OK, 0 rows affected (0.15 sec)mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000012 | 6045464 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
2. 配置slave-mysql, 在配置文件中[mysqld]下添加下面语句,并重启服务器
# vim /etc/my.cnf [mysqld]server-id=2 # /etc/init.d/mysqld restart
接下来登陆slave-mysql服务器:进行主服务master-mysql认证。命令为:
CHANGE MASTER TO master_host=‘192.168.1.21‘,master_user=‘dianel‘,master_password=‘dianel‘,master_log_file=‘mysql-bin.000012‘,master_log_pos=6045464;
其中master_host,master_user....等都要和master-mysql一一对应.然后slave start
开启从服务器。并SHOW SLAVE STATUS\G;
查看主从状态。如果Slave_IO_Running: Yes Slave_SQL_Running: Yes
这两个线程都为yes即表示mysql主从成功。
mysql> mysql> CHANGE MASTER TO master_host=‘192.168.1.21‘,master_user=‘dianel‘,master_password=‘dianel‘,master_log_file=‘mysql-bin.000012‘,master_log_pos=6045464; Query OK, 0 rows affected (0.04 sec) mysql> SLAVE START; Query OK, 0 rows affected (0.00 sec) mysql> SHOW SLAVE STATUS\G;*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.21 Master_User: dianel Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000012 Read_Master_Log_Pos: 6045464 Relay_Log_File: localhost-relay-bin.000002 Relay_Log_Pos: 253 Relay_Master_Log_File: mysql-bin.000012 Slave_IO_Running: Slave_SQL_Running:
接下来在master-mysql上授权root用户密码:GRANT ALL ON *.* TO ‘root‘@‘%‘ IDENTIFIED BY ‘123456‘;
3) 安装mycat
安装mycat之前。需要先准备好jdk环境。下载jdk-8u144-linux-x64.tar.gz
包,点击jdk下载。 解压:
# tar -zxf jdk-8u144-linux-x64.tar.gz # mkdir -p /usr/java/ # mv jdk1.8.0_144/ /usr/java/
配置java环境变量。/etc/profile中添加如下语句:
export JAVA_HOME=/usr/java/jdk1.8.0_144/ export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOMR/bin
使环境变量立即生效并验证是否安装成功:
# source /etc/profile # java -version
接下来下载和安装mycat:
# wget # tar xzf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz # mv mycat/ /usr/local/ # ls /usr/local/mycat/bin catlet conf lib logs version.txt
修改Mycat服务器参数调整和用户授权的配置文件server.xml。主要修改配置段如下:
# vim /usr/local/mycat/conf/server.xml
<user name="jiajie1"> <property name="password">jiajie1</property> <property name="schemas">TESTDB</property> </user> <user name="jiajie2"> <property name="password">jiajie2</property> <property name="schemas">TESTDB</property> <property name="readOnly">true</property> </user> # 创建jiajie1,jiajie2两个用户用于连接mycat中间件。 # 用户名jiajie1密码jiajie1.对逻辑数据库TESTDB具有增删改查的权限,也即WEB连接MyCAT的用户名和密码。 # 用户名jiajie2密码jiajie2该用户对逻辑数据库TESTDB只读的权限;
修改逻辑库定义和表及分片定义的配置文件schema.xml。
# vim /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="1000" dataNode="dn1"> </schema> <dataNode name="dn1" dataHost="localhost1" database="discuz" /> <dataHost name="localhost1" maxCon="2000" minCon="1" balance="3" writeType="1" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1" url="192.168.1.21:3306" user="root" password="123456"> <!-- can have multi read hosts --> <readHost host="hostS1" url="192.168.1.23:3306" user="root" password="123456" /> </writeHost> </dataHost> </mycat:schema>
schema.xml配置文件详解:
<?xml version="1.0"?> xml文件格式; <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> 文件标签属性; <mycat:schema xmlns:mycat="http://io.mycat/"> Mycat起始标签 <schema name="testdb" checkSQLschema="false" sqlMaxLimit="1000" dataNode="dn1"></schema> 配置逻辑库,与server.xml指定库名保持一致,绑定数据节点dn1; <dataNode name="dn1" dataHost="localhost1" database="discuz" /> 添加数据节点dn1,设置数据节点host名称,同时设置数据节点真实database为discuz; <dataHost name="localhost1" maxCon="2000" minCon="1" balance="3" writeType="1" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> 数据节点主机,绑定数据节点,设置连接数及均衡方式、切换方法、驱动程序、连接方法; Balance均衡策略设置: 1) balance=0 不开启读写分离机制,所有读操作都发送到当前可用writehost; 2) balance=1 全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡 3) balance=2 所有读操作都随机的在readhost和writehost上分发; 4) balance=3 所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力。 writeType 写入策略设置 1) writeType=0, 所有写操作发送到配置的第一个writeHost; 2) writeType=1,所有写操作都随机的发送到配置的writeHost; 3) writeType=2,不执行写操作。 switchType 策略设置 1) switchType=-1,表示不自动切换; 2) switchType=1,默认值,自动切换; 3) switchType=2,基于MySQL 主从同步的状态决定是否切换; 4) switchType=3,基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like ‘wsrep%‘。 <heartbeat>select user()</heartbeat>检测后端MYSQL实例,SQL语句; <writeHost host="hostM1" url="192.168.1.21:3306" user="root" password="123456"><readHost host="hostS1" url="192.168.1.23:3306" user="root" password="123456" /></writeHost> 指定读写请求,同时转发至后端MYSQL真实服务器,配置连接后端MYSQL用户名和密码(该用户名和密码为MYSQL数据库用户名和密码); </dataHost> 数据主机标签;</mycat:schema> mycat结束标签;
mycat配置完毕。启动并查看端口8066和9066端口是否起来:
# /usr/local/mycat/bin/mycat start # ss -tnl|egrep "8066|9066"LISTEN 0 100 :::8066 :::* LISTEN 0 100 :::9066 :::* # 注意:如果没有这两个端口没有启动,查看java环境是否生效。 # 8066是用于web连接mycat. # 9066是用于SA|DBA管理端口.
接下来以8066登陆查看数据库:
# mysql -h192.168.1.103 -ujiajie1 -pjiajie1 -P8066 mysql> show databases; +----------+| DATABASE | +----------+| TESTDB | +----------+1 row in set (0.01 sec)
以9066登陆查看数据源:
# mysql -h192.168.1.103 -ujiajie1 -pjiajie1 -P9066 mysql> show @@datasource; +----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+ | DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD | +----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+ | dn1 | hostM1 | mysql | 192.168.1.21 | 3306 | W | 0 | 0 | 2000 | 0 | 0 | 0 | | dn1 | hostS1 | mysql | 192.168.1.23 | 3306 | R | 0 | 0 | 2000 | 0 | 0 | 0 | +----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+ 2 rows in set (0.00 sec)
4)配置http服务:
修改httpd中discuz的配置文件。将dbhost,dbuser,dbpw,dbname中的参数改为和mycat一一对应。实现读写分离。重启服务.
# vim /var/www/html/config/config_global.php $_config = array(); // ---------------------------- CONFIG DB ----------------------------- // $_config[‘db‘][‘1‘][‘dbhost‘] = ‘‘; $_config[‘db‘][‘1‘][‘dbuser‘] = ‘; $_config[‘db‘][‘1‘][‘dbpw‘] = ‘‘; $_config[‘db‘][‘1‘][‘dbcharset‘] = ‘utf8‘; $_config[‘db‘][‘1‘][‘pconnect‘] = ‘0‘; $_config[‘db‘][‘1‘][‘dbname‘] = ‘‘; $_config[‘db‘][‘1‘][‘tablepre‘] = ‘pre_‘; $_config[‘db‘][‘slave‘] = ‘‘; $_config[‘db‘][‘common‘][‘slave_except_table‘] = ‘‘; #注意:数据库名字为mycat的逻辑数据库 # /etc/init.d/httpd restart
这时你在论坛进行浏览和发帖操作。再通过9066登陆查看,读和写的次数如下。证明读写分离成功。
# mysql -h192.168.1.103 -ujiajie1 -pjiajie1 -P9066 mysql> show @@datasource; +----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+ | DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD | +----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+ | dn1 | hostM1 | mysql | 192.168.1.21 | 3306 | W | 0 | 1 | 2000 | 51 | 0 | | | dn1 | hostS1 | mysql | 192.168.1.23 | 3306 | R | 0 | 1 | 2000 | 79 | | 0 | +----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+ 2 rows in set (0.02 sec) mysql> show @@datasource; +----------+--------+-------+--------------+------+ ------+--------+------+------+---------+-----------+------------+ | DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD | +----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+ | dn1 | hostM1 | mysql | 192.168.1.21 | 3306 | W | 0 | 2 | 2000 | 151 | 0 | | | dn1 | hostS1 | mysql | 192.168.1.23 | 3306 | R | 0 | 2 | 2000 | 255 | | 0 | +----------+--------+-------+--------------+-----+------+--------+------+------+---------+----------- +------------+ 2 rows in set (0.01 sec)
本文出自 “dianel简单不简单” 博客,请务必保留此出处http://dianel.blog.51cto.com/12170393/1957556
以上是关于mycat实现MySQL读写分离的主要内容,如果未能解决你的问题,请参考以下文章