---
# System prepended metadata

title: MYCAT MYSQL

---

# MYCAT MYSQL
从数据库(Slave)是主数据库的备份，当主数据库(Master)变化时从数据库要更新，这些数据库软件可以设计更新周期。这是提高信息安全的手段。主从数据库服务器不在一个地理位置上，当发生意外时数据库可以保存。
(1) 主从分工

其中Master负责写操作的负载，也就是说一切写的操作都在Master上进行，而读的操作则分摊到Slave上进行。这样一来的可以大大提高读取的效率。在一般的互联网应用中，经过一些数据调查得出结论，读/写的比例大概在 10：1左右 ，也就是说大量的数据操作是集中在读的操作，这也就是为什么我们会有多个Slave的原因。但是为什么要分离读和写呢？熟悉DB的研发人员都知道，写操作涉及到锁的问题，不管是行锁还是表锁还是块锁，都是比较降低系统执行效率的事情。我们这样的分离是把写操作集中在一个节点上，而读操作其其他的N个节点上进行，从另一个方面有效的提高了读的效率，保证了系统的高可用性。

(2) 基本过程
1)、Mysql的主从同步就是当master（主库）发生数据变化的时候，会实时同步到slave（从库）。
2)、主从复制可以水平扩展数据库的负载能力，容错，高可用，数据备份。
3)、不管是delete、update、insert，还是创建函数、存储过程，都是在master上，当master有操作的时候，slave会快速的接受到这些操作，从而做同步。

(3) 用途和条件
1)、mysql主从复制用途
  ●实时灾备，用于故障切换
  ●读写分离，提供查询服务
  ●备份，避免影响业务
2)、主从部署必要条件：
  ●主库开启binlog日志（设置log-bin参数）
  ●主从server-id不同
  ●从库服务器能连通主库
  
第一步是在主库上记录二进制日志（稍后介绍如何设置）。在每次准备提交事务完成数 据更新前，主库将数
据更新的事件记录到二进制日志中。MySQL 会按事务提交的顺序 而非每条语句的执行顺序来记录二进制日志。
在记录二进制日志后，主库会告诉存储引擎可以提交事务了。 下一步，备库将主库的二进制日志复制到其本地的
中继日志中。首先，备库会启动一个工作线程，称为 I/O 线程，I/O 线程跟主库建立一个普通的客户端连接，然
后在主库上启 动一个特殊的二进制转储(binhg dump、线程（该线程没有对应的 SQL 命令），这个二 进制转储
线程会读取主库上二进制日志中的事件。它不会对事件进行轮询。如果该线程 追赶上了主库，它将进入睡眠状态，
直到主库发送信号量通知其有新的事件产生时才会 被唤醒，备库 I/O 线程会将接收到的事件记录到中继日志中。
备库的 SQL 线程执行最后一步，该线程从中继日志中读取事件并在备库执行，从而实现 备库数据的更新。当
SQL 线程追赶上 I/O 线程时，中继日志通常已经在系统缓存中，所 以中继日志的开销很低。SQL 线程执行的事件
也可以通过配置选项来决定是否写入其自 己的二进制日志中，它对于我们稍后提到的场景非常有用。这种复制架
构实现了获取事件和重放事件的解耦，允许这两个过程异步进行。也就是说 I/o 线程能够独立于 SQL 线程之外工
作。但这种架构也限制了复制的过程，其中最重要 的一点是在主库上并发运行的査询在备库只能串行化执行，因
为只有一个 SQL 线程来重 放中继日志中的事件。后面我们将会看到，这是很多工作负载的性能瓶颈所在。虽然有
一些针对该问题的解决方案，但大多数用户仍然受制于单线程。MySQL5.6 以后，提供了基于 GTID 多开启多线
程同步复制的方案，即每个库有一个单独的(sql thread)
进行同步复制，这将大大改善 MySQL 主从同步的数据延迟问题，配合 Mycat 分片，可以更好的将一个超级
大表的数据同步的时延降低到最低。此外，用 GTID 避免了在传送 binlog 逻辑上依赖文件名和物理偏移量，能够
更好的支持自动容灾切换，对运维人员来说应该是一件令人高兴的事情，因为传统的方式里，你需要找到 binlog
和 POS 点，然后 change master to 指向，而不是很有经验的运维，往往会将其找错，造成主从同步复制报错，
在 mysql5.6 里，无须再知道 binlog 和 POS 点，需要知道 master 的 IP、端口，账号密码即可，因为同步复制是
自动的，mysql 通过内部机制 GTID 自动找点同步。
即使是并发复制机制、仍然无法避免主从数据库的数据瞬间不同步的问题，因此又有了一种增强的方案，即
galera for mysql、percona-cluster 或者 mariadb cluster 等集群机制，他们是一种多主同步复制的模式，可以
在任意节点上进行读写、自动控制成员，自动删除故障节点、自动加入节点、真正给予行级别的并发复制等强大
能力!
下图是其原理图，通常是采用 3 个 MySQL 节点作为一个 Cluster，即提供了 3 倍的数据库读的并发能力.galera for mysql 集群这种方式，是牺牲了数据的写入速度，以换取最大程度的数据并发访问能力，类似



MYCAT1.4 开始支持 MySQL 主从复制状态绑定的读写分离机制，让读更加安全可靠，配置如下：
MyCAT 心跳检查语句配置为 show slave status ，dataHost 上定义两个新属性： switchType="2" 与 slaveThreshold="100"，此时意味着开启 MySQL 主从复制状态绑定的读写分离与切换机制，Mycat 心跳机制通过检测 show slave status 中的 "Seconds_Behind_Master", "Slave_IO_Running","Slave_SQL_Running" 
三个字段来确定当前主从同步的状态以及 Seconds_Behind_Master 主从复制时延，
当 Seconds_Behind_Master>slaveThreshold 时，读写分离筛选器会过滤掉此 Slave 机器，防止读到很久之前的旧数据，而当主节点宕机后，切换逻辑会检查 Slave 上的 Seconds_Behind_Master 是否为 0，为 0 时则表示主从同步，可以安全切换，否则不会切换。






mysql -ubryant -pp@ssw0rd1981

## mysql 主從複製

### 主機

vim etc/my.cnf


[mysqld]
#### 綁定自己的ip
bind-address = 172.104.101.248
#### 設定 server_id 伺服器唯一ID
server_id=248
#### binlog 的檔名
log-bin=/var/log/mysql/mariadb-bin
binlog-format=row
#### 複製過濾：需要備份的資料庫，輸出binlog
binlog-do-db=bryantDB
#### 複製過濾：不需要備份的資料庫，不輸出（mysql 庫一般不同步）
binlog-ignore-db=mysql

重啟mysql
systemctl restart mysql

進mysql

mysql>GRANT REPLICATION SLAVE ON *.* TO 'bryant'@'172.104.108.88' IDENTIFIED BY 'p@ssw0rd1981';

mysql>FLUSH PRIVILEGES;

mysql>GRANT ALL PRIVILEGES ON *.* TO 'bryant'@'172.104.101.248' IDENTIFIED BY 'p@ssw0rd1981' WITH GRANT OPTION;

show master status;
會顯示下面這樣的東東 這些資訊在從機的配置會需要用到
+--------------------+----------+--------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000001 |      615 | masterdb     |                  |
+--------------------+----------+--------------+------------------+
1 row in set (0.00 sec)


### 從機

vim etc/my.cnf

[mysqld]
bind-address = 172.104.108.88
server-id =88
replicate-do-db=bryantDB

重啟mysql
systemctl restart mysql


進mysql

mysql>GRANT ALL PRIVILEGES ON *.* TO 'bryant'@'172.104.101.248' IDENTIFIED BY 'p@ssw0rd1981' WITH GRANT OPTION;


配置master的相關信息到從機
CHANGE MASTER TO MASTER_HOST='172.104.101.248',MASTER_USER='bryant',
MASTER_PASSWORD='p@ssw0rd1981',MASTER_LOG_FILE='mariadb-bin.000004 ',MASTER_LOG_POS=330

start slave;

show slave status\G;
看到以下信息 Slave_IO_Running: Yes Slave_SQL_Running: Yes
這兩項都是yes就代表配好了
*************************** 1. row ***************************
                Slave_IO_State: Waiting for master to send event
                   Master_Host: 172.104.101.248
                   Master_User: bryant
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: mariadb-bin.000004
           Read_Master_Log_Pos: 662
                Relay_Log_File: localhost-relay-bin.000002
                 Relay_Log_Pos: 963
         Relay_Master_Log_File: mariadb-bin.000004
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
               Replicate_Do_DB: bryantDB


  

如果要停掉主從複製 
stop slave
reset slave

## MYCAT

首先裝好 openjdk8

安裝mycat  1.6RELEASE版本
http://dl.mycat.org.cn/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

解壓mycat

#### 到mycat/conf資料夾底下打開schema.xml



```
<schema name="testBryant" checkSQLschema="false" 
        sqlMaxLimit="100" dataNode="infoNode"> 
</schema>

<dataNode name="infoNode" dataHost="infoHost" database="bryantDB"/>

<dataHost name="infoHost" maxCon="500" minCon="20" 
    balance="3" writeType="0" dbType="mysql" 
    dbDriver="native" switchType="1" slaveThreshold="100">
    <heartbeat>show slave status</heartbeat>
		
    <writeHost host="hostMaster" url="172.104.101.248:3306" 
        user="bryant" password="p@ssw0rd1981">
        <readHost host="hostSlave" url="172.104.108.88:3306" 
        user="bryant" password="p@ssw0rd1981"/>
    </writeHost>
</dataHost>
```

schema的name就代表到時候在連mycat時的database name
配置dataNode跟後面dataHode的name一致

dataNode裡配置infoHost的名字 這裡的database指的是實際的mysql裡的DB名稱

配置dbType為mysql balance值取3 所有读请求随机的分发到 wiriterHost 对应的 readhost 执行，writerHost 不负担读压力

#### 到mycat/conf資料夾底下打開server.xml
配置防火牆的白名單

```
<firewall> 
   <whitehost>
    <host host="127.0.0.1" user="bryant"/>
    <host host="172.104.101.248" user="bryant"/>
   </whitehost>
   <blacklist check="false">
   </blacklist>
</firewall>
```

配置mycat的登入資訊以及指定要使用的schema
```
<user name="bryant">
    <property name="password">p@ssw0rd1981</property>
    <property name="schemas">testBryant</property>
</user>
```


連到mycat的方法
mysql -ubryant -pp@ssw0rd1981 -P8066 -h172.104.101.248 -DtestBryant
