images\cherry_red.png1 实训二前期LNMP简易架构
      images\cherry_blue.png1.1 php server安装
      images\cherry_blue.png1.2 安装初始化数据库
   images\cherry_red.png2 Mysql数据库
      images\cherry_blue.png2.1 Mysql5.7安装
         images\cherry_orange.png2.1.1 rpm安装
         images\cherry_orange.png2.1.2 yum安装
         images\cherry_orange.png2.1.3 源码安装
         images\cherry_orange.png2.1.4 编译好的非rpm包安装
         images\cherry_orange.png2.1.5 my.cnf常见选项
      images\cherry_blue.png2.2 Mysql基础
         images\cherry_orange.png2.2.1 MySql数据库操作
         images\cherry_orange.png2.2.2 MySql数据类型
            images\cherry_cyan.png2.2.2.1 整型
            images\cherry_cyan.png2.2.2.2 浮点数和定数
            images\cherry_cyan.png2.2.2.3 字符串类型
            images\cherry_cyan.png2.2.2.4 日期和时间类型
            images\cherry_cyan.png2.2.2.5 字段修饰和约束
            images\cherry_cyan.png2.2.2.6 业务建表练习
         images\cherry_orange.png2.2.3 MySql表操作
         images\cherry_orange.png2.2.4 MySql体系结构
         images\cherry_orange.png2.2.5 MySql存储引擎
      images\cherry_blue.png2.3 MySql操作
         images\cherry_orange.png2.3.1 MySql数据操作
         images\cherry_orange.png2.3.2 MySql单表查询
         images\cherry_orange.png2.3.3 MySql多表查询
         images\cherry_orange.png2.3.4 MySql存储过程与函数
      images\cherry_blue.png2.4 MySql操作-2
         images\cherry_orange.png2.4.1 MySql安全机制
         images\cherry_orange.png2.4.2 MySql日志管理
         images\cherry_orange.png2.4.3 MySql复制概述
         images\cherry_orange.png2.4.4 主从同步
      images\cherry_blue.png2.5 最基本sql语句及主从架构
      images\cherry_blue.png2.6 MyCat中间件
         images\cherry_orange.png2.6.1 部署Mycat
         images\cherry_orange.png2.6.2 配置读写分离
            images\cherry_cyan.png2.6.2.1 安全的读写分离
         images\cherry_orange.png2.6.3 XML语法格式
         images\cherry_orange.png2.6.4 mycat 分表分库
      images\cherry_blue.png2.7 Mysql MHA
         images\cherry_orange.png2.7.1 MHA-部署
         images\cherry_orange.png2.7.2 MHA-故障切换VIP透明
            images\cherry_cyan.png2.7.2.1 VIP切换脚本内容
            images\cherry_cyan.png2.7.2.2 VIP-手动在线切换脚本
         images\cherry_orange.png2.7.3 MHA+Mycat高可用Mysql读写分离
         images\cherry_orange.png2.7.4 MHA+VIP+Mycat
         images\cherry_orange.png2.7.5 MHA-故障切换邮件报警
         images\cherry_orange.png2.7.6 自动配置Slave主机
   images\cherry_red.png3 实验
      images\cherry_blue.png3.1 mysql授权问题
      images\cherry_blue.png3.2 1.单节点数据库
      images\cherry_blue.png3.3 2.主从同步
      images\cherry_blue.png3.4 3.实验(高可用)
         images\cherry_orange.png3.4.1 高可用keepalived
            images\cherry_cyan.png3.4.1.1 keepalived install
      images\cherry_blue.png3.5 4.实验(高可用+大并发)
         images\cherry_orange.png3.5.1 HAproxy代理
      images\cherry_blue.png3.6 4.实验(mycat-读写分离)
         images\cherry_orange.png3.6.1 mycat安装部署
         images\cherry_orange.png3.6.2 读写分离高可用
         images\cherry_orange.png3.6.3 mycat管理端口命令
      images\cherry_blue.png3.7 5.双主双从-读写分离-高可用
      images\cherry_blue.png3.8 6.mycat分库操作
      images\cherry_blue.png3.9 7.mycat分表
      images\cherry_blue.png3.10 8.mycat分库分表之下实现读写分离
   images\cherry_red.png4 Shell脚本编程
   images\cherry_red.png5 Zabbix监控
      images\cherry_blue.png5.1 zabbix设置邮件报警--自定义报警媒介
      images\cherry_blue.png5.2 zabbix解决中文界面乱码问题
      images\cherry_blue.png5.3 ziabbix自带的template Linux OS
      images\cherry_blue.png5.4 zabbix-agent自定义收集数据
      images\cherry_blue.png5.5 zabbix监控Nginx性能
      images\cherry_blue.png5.6 综合配置
      images\cherry_blue.png5.7 实验:监控nginx端口实现告警
   images\cherry_red.png6 ELK日志分析
      images\cherry_blue.png6.1 PS
      images\cherry_blue.png6.2 es-head插件安装
      images\cherry_blue.png6.3 安装filebeat nginx日志模板


使用MyCat完成读写分离 ==========================



作为快速上手也为了继续优化之前文章中介绍的MySQL读写分离方案,本小节我们首先通过MyCat配置一个最简的、单纯的读写分离集群。

配置过程的是指也很简单:不需要对逻辑表进行分片,也就是说只需要配置一个分片表和分片节点;

只使用读写分离功能,也就是说只需要在这唯一的一个分片节点配置读节点和写节点以及节点健康的检查策略。


images\35-1.png


您可以在MyCat官网上下载MyCat的Linux版本,在本文发表时MyCat稳定版本为V 1.6.1。

MyCat数据库中间件的工作目录下的conf文件夹中存放着所有需要的配置文件,其中有几个配置文件比较重要,

它们是:schema.xml、rule.xml 和 server.xml。

rule.xml 描述了逻辑表和逻辑节点/分片节点的关联规则,也即是数据的分片规则;
server.xml 描述了 MyCat服务的访问规则 和 用户授权规则。
schema.xml 最重要的文件,其中描述了上节中我们提到的几个关键概念,逻辑库、逻辑表、分片节点和节点主机。



1.修改server.xml 配置mycat用户 密码 端口 以及逻辑库名
server.xml 修改以下部分 :

<!--设定用户连接mycat 的用户名及密码 当前定义的用户与后端数据库的用户密码无任何关系,与前端业务相关-->
<user name="mycat">
<property name="password">123123</property>
<property name="schemas">TESTDB</property> ##TESTDB 与schema.xml 上的 逻辑库 对应。
</user>

<!--
<user name="mycat"> ## 注释掉 另外一个普通 用户。
<property name="password">123123</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
-->



2.配置schema.xml 定义 读写节点
schema.xml 修改以下部分 :

一般来说我们要实现单纯的读写分离集群,只需要对schema.xml文件进行更改:

[root@server-4 conf]# vim 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>

<!-- database指定 真实的物理库名 -->
<dataNode name="dn1" dataHost="host1" database="mydb" />

<!--

balance目前取值4种:
'0':不开启读写分离机制,所有读操作都发送到当前可用的writeHost上
'1':全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说:"当双主双从模式(M1->S1,
M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。"
'2':所有读操作都随机的在writeHost、readhost上分发。(所有节点负载均衡)
'3':所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力(读负载均衡)

switchType指的是切换的模式,目前的取值也有4种:
switchType='-1' 表示不自动切换
switchType='1' 默认值,表示自动切换
switchType='2' 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status
switchType='3' 基于MySQL galary cluster的切换机制(适合集群)心跳语句为 show status like 'wsrep%'

writeType:
该属性涉及节点主机中个物理节点的写负载模式问题。
MyCat目前支持最好或者说推荐的设置值就是0。
writeType=0,所有写操作发送到配置的第一个writeHost,如果第一个writeHost挂了,则切到还生存的第二个writeHost。
重新启动后已切换后的为准,切换记录在配置文件dnindex.properties中。
wirteType=1 所有的写操作 随机的分担到writeHost 主机

-->

<dataHost name="host1" maxCon="1000" minCon="10" balance="2"
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.110.200:3306" user="upl"
password="Uplooking_123">

<!-- can have multi read hosts 读在从库-->
<readHost host="hostS2" url="192.168.110.100:3306" user="upl" password="Uplooking_123" />
<readHost host="hostS3" url="192.168.110.110:3306" user="upl" password="Uplooking_123" />
</writeHost>
</dataHost>
</mycat:schema>

==================================================================
3.在主库上授权用户mycat访问物理库的用户
mysql> grant all privileges on *.* to 'upl'@'192.168.110.%' identified by 'Uplooking_123';
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.06 sec)

mysql> show grants for 'upl'@'192.168.110.%';
+------------------------------------------------------+
| Grants for upl@192.168.110.% |
+------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'upl'@'192.168.110.%' |
+------------------------------------------------------+
1 row in set (0.00 sec)

mysql>


4.在主库上创建 测试库 database mydb
mysql>create database mydb;


5.启动mycat,建议先以console模式启动,便于调试查看信息
[root@web-proxy conf]# /usr/local/mycat/bin/mycat console
[root@web-proxy conf]# netstat -nlpt | grep java
tcp6 0 0 :::8066 :::* LISTEN 6581/java
tcp6 0 0 :::9066 :::* LISTEN 6581/java

6.用mysql客户端登陆mycat 建表,查询测试
[root@192 ~]# mysql -umycat -p123456 -P8066 -h192.168.110.99


通过mycat 随意建立一张表或数据,只要在其他从机能看到数据 说明写正常

查询数据库的主机名,可以用于证明 读分离的负载均衡效果
MySQL [(none)]> show variables like 'host%';

===================================================================
字段注释:

这里要注意一个关键点,请在由 Linux For MyCat 控制的各个MySQL节点上设置 “lower_case_table_names = 1”,(不区分表名大小写)
否则使用MyCat有时候会提示找不到表的错误。


以上代码段落示意了MyCat中实现的最简单的读写分离集群最关键的配置信息,这里对配置信息进行一些必要的说明 (部分说明直接摘自MyCat官方文档):


schema:checkSQLschema
当该值设置为 true 时,如果我们执行语句“ select * from qiangSchema.travelrecord;”
则 MyCat 会把语句修改为“select * from travelrecord;”。
即把表示 schema 的字符去掉,避免发送到后端数据库执行时报“(ERROR 1146 (42S02): Table‘qiangSchema.travelrecord’ doesn’t exist)”。


schema:sqlMaxLimit
当该值设置为某个数值时。每条执行的 SQL 语句,如果没有加上 limit 语句,MyCat 也会自动的加上所对应的值(适用于MySQL数据库)。

table:primaryKey
该逻辑表对应真实表的主键。

table:type
该属性定义了逻辑表的类型,目前逻辑表只有 “全局表”(global) 和 ”普通表” 两种类型。
如果是普通表,则不需要设置这个type属性。
那么什么叫做全局表呢?数据库拆分的关键在于被拆分的数据表和关联表之间的join操作符,Mycat 中通过数据冗余来解决这类表间的join操作问题,
即所有的分片都有一份数据的拷贝,这样的数据表定义为全局表。在数据库中存在的字典性质的的数据表或者变化率趋于0的数据表都应设置为全局表。

dataHost:maxCon和dataHost:minCon
分别指定每个读写实例连接池的最大连接数和最小连接数。
也就是说,标签内嵌套的 writeHost、readHost 标签都会使用这个属性的值来实例化出连接池的最大连接数。


dataHost:balance
这个设置很关键,涉及到节点主机中各个物理节点的读负载模式问题。

设置值为0, 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上;
设置值为1,全部的readHost与stand by writeHost 参与 select 语句的负载均衡;
设置为2时,所有读操作都随机的在 writeHost、readhost 上分发;
设置为3时,所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost不负担读压力。注意只在 MyCat Version 1.4及以后的版本才支持值为3的设置。


dataHost:writeType:
该属性涉及节点主机中个物理节点的写负载模式问题。
MyCat目前支持最好或者说推荐的设置值就是0。
当writeType属性设置为0时,所有写操作发送到配置的第一个writeHost,如果第一个writeHost挂了,则切到还生存的第二个writeHost。
重新启动后已切换后的为准,切换记录在配置文件dnindex.properties中。


dataHost:dbType和dataHost:dbDriver:
dbType属性指定后端连接的数据库类型,目前支持二进制的 mysql 协议,还有其他使用 JDBC 连接的数据库。
目前dbType属性可指定的值包括:mysql、maridb、oracle、mongodb、postgresql。
dbDriver属性则可以给定连接指定数据库所使用的驱动类型,如果是连接mysql和maridb,则该属性可以设置为native(原生的mysql网络连接协议),
否则请指定数据库对应的JDBC驱动实现(需要将符合JDBC 4标准的驱动JAR包放到MyCat安装路径下的lib目录中)。

dataHost:switchType:
该属性描述多个writeHost的切换机制,
值为1时,表示自动切换;
值为2时,表示基于 MySQL 主从同步的状态决定是否切换;
值为3时,表示基于MySQL galary cluster 的切换机制。

配置完成schema.xml文件并且保存后,就可以用过“mycat console”命令启动了。
“mycat console”命令可以用于测试配置效果使用,因为这样的启动方式MyCat将会把日志直接输出到屏幕上。



启动Mycat

# /usr/local/mycat/bin/mycat console ##前台的 控制台 调试模式。 直接看到错误信息
# /usr/local/mycat/bin/mycat start ## 服务方式。

成功之后 8066 9066 端口会打开监听。

Running Mycat-server...
wrapper | --> Wrapper Started as Console
wrapper | Launching a JVM...
jvm 1 | Wrapper (Version 3.2.3) https://wrapper.tanukisoftware.org
jvm 1 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
jvm 1 |
jvm 1 | 2016-11-10 00:03:25,369 [INFO ][WrapperSimpleAppMain] total resouces of dataHost dataHost is :2 (io.mycat.backend.datasource.PhysicalDBPool:PhysicalDBPool.java:100)
......
jvm 1 | 2016-11-10 00:03:26,874 [INFO ][WrapperSimpleAppMain] =============================================== (io.mycat.MycatServer:MycatServer.java:266)
jvm 1 | 2016-11-10 00:03:26,874 [INFO ][WrapperSimpleAppMain] MyCat is ready to startup ... (io.mycat.MycatServer:MycatServer.java:267)
jvm 1 | 2016-11-10 00:03:26,874 [INFO ][WrapperSimpleAppMain] Startup processors ...,total processors:2,aio thread pool size:4
jvm 1 | each process allocated socket buffer pool bytes ,a page size:2097152 a page's chunk number(PageSize/ChunkSize) is:512 buffer page's number is:40 (io.mycat.MycatServer:MycatServer.java:279)
......
jvm 1 | 2016-11-10 00:03:28,396 [INFO ][WrapperSimpleAppMain] using nio network handler (io.mycat.MycatServer:MycatServer.java:381)
jvm 1 | 2016-11-10 00:03:28,513 [INFO ][WrapperSimpleAppMain] $_MyCatManager is started and listening on 9066 (io.mycat.MycatServer:MycatServer.java:397)
jvm 1 | 2016-11-10 00:03:28,515 [INFO ][WrapperSimpleAppMain] $_MyCatServer is started and listening on 8066 (io.mycat.MycatServer:MycatServer.java:401)
jvm 1 | 2016-11-10 00:03:28,515 [INFO ][WrapperSimpleAppMain] =============================================== (io.mycat.MycatServer:MycatServer.java:403)
jvm 1 | 2016-11-10 00:03:28,515 [INFO ][WrapperSimpleAppMain] Initialize dataHost ... (io.mycat.MycatServer:MycatServer.java:407)
......

出错调试信息检索。

images\35-2.png






可以看到MyCat启动成功了,接下来就可以使用mysql的客户端进行连接并测试读写操作执行了。


// 连接到mycat,mycat的端口为 8066

# mysql -h 192.168.10.4 -P 8066 -u root -p ## 账号和密码,是 server.xml 中定义的管理账号密码。
Enter password:

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.29-mycat-1.6-RELEASE-20161028204710 MyCat Server (OpenCloundDB)
......

// 接下来执行一个insert语句:
> insert into myuser (Id,user_name,usersex,user_number) values (24,'user24',0,'242424');

// 从读节点查询刚才插入的数据
> select * from myuser;
+----+-----------+---------+-------------+
| Id | user_name | usersex | user_number |
+----+-----------+---------+-------------+
| 1 | 用户1 | 1 | 11111 |
| 22 | 用户22 | 0 | 220220 |
| 23 | 用户23 | 1 | 232323 |
| 24 | user24 | 0 | 242424 |
+----+-----------+---------+-------------+

需要注意MyCat并不负责节点主机中设置的写节点和读节点间的数据同步过程,
所以您还是需要使用MySQL Replicaion机制完成读写节点的同步工作。
另外注意,某些MySQL第三方客户端由于不支持NIO方式,所以连接MyCat还有一些问题,例如MySQL-Front。



验证方式, 让 读写 的 真实 服务器, 打开 通用 查询 日志。 观察 读写 语句的 记录。

写服务器截图。注意心跳 检测信息。

images\35-3.png