MySQLは分離を達成するために、可用性、およびアプリケーション統合mycatを読んmyCat

先行レビュー

前の二つのブログの記事で:Mycat - 高可用性とMycatから別のデータベースを読み書き - 高可用性と負荷分散を実現するために、乾燥品のフル!我々は、以下に示す展開アセンブリを完了しました

MySQLは分離を達成するために、可用性、およびアプリケーション統合mycatを読んmyCat

図1のデバイス構造。


VIPへのSQL要求、VIPは、完全なマッピングをkeepalivedのとLVSのmycatによって要求を転送し、mycat SQL要求の種類に応じて(SELECT SQLまたはSQL DML、または、ノードDBを強制する)ことによって達成さ、特定のSQL DBに配布されます実行を完了するために、特定のSQLデータベースサービス。

しかし、私たちのアプリケーションは、本当の意味を持たない統合されていない、データベースレベルで展開滞在し、その後、どのように我々はmycatの使命を達成するために、私たちのアプリケーションを統合できますか?

アプリケーション統合

mycat良い、アプリケーション統合の構築が非常に簡単である場合には、さまざまな状況でのアプリケーションの統合を実現するためのステップバイステップでみよう

別々のMySQLの利用可能性の読み書き

別々の読み取りおよび書き込みデータベースが(参照:スプリング集積MyBatisのは、MySQLが読み取り分離および書き込み得る)コード・レベルで実装することができるが、推奨されない、コードのコアの責任は、コードの大部分は、データベース読取りを実現するために使用される場合、ビジネスを達成するためにであるべきです分離と高可用性を書き、それは、広く発散本来の意図から逸脱することでしょう。

[コンピュータ]フィールドことわざがあります:「コンピュータサイエンスのあらゆる問題は、間接的中間層を追加することによって解決することができる」と 直接我々のコードを直接ウェル高可用性データベースから分離読み書きするデータベースをドッキングので、次に(mycat 1つだけを実現する)データベースミドルウェアを作成途中で実現するミドルウェアの層を追加し、アプリケーション・コード中間データベースをドッキング、読み、高可用性データベースミドルウェアの分離によりデータベースに書き込みます。このとき、図の構造のコンポーネントを以下に示します。

MySQLは分離を達成するために、可用性、およびアプリケーション統合mycatを読んmyCat

図2の構造部品


具体的な展開プロセスはを参照してもよい:Mycat - データベースは、分離と高可用性を読み書き、どのようにこの時点で統合されたアプリケーション?実際には、非常に単純な、単に以下のように、(データベースなどmycat)mycatに対処するために変更することができ、当社のデータベース接続プールの設定に対処します

application.yml

server:
 port: 8886
spring:
 #连接池配置
 datasource:
 type: com.alibaba.druid.pool.DruidDataSource
 druid:
 driver-class-name: com.mysql.jdbc.Driver
 url: jdbc:mysql://192.168.1.212:8066/TESTDB?useSSL=false&useUnicode=true&characterEncoding=utf-8
 username: root
 password: 123456
 initial-size: 1 #连接池初始大小
 max-active: 20 #连接池中最大的活跃连接数
 min-idle: 1 #连接池中最小的活跃连接数
 max-wait: 60000 #配置获取连接等待超时的时间
 pool-prepared-statements: true #打开PSCache,并且指定每个连接上PSCache的大小
 max-pool-prepared-statement-per-connection-size: 20
 validation-query: SELECT 1 FROM DUAL
 validation-query-timeout: 30000
 test-on-borrow: false #是否在获得连接后检测其可用性
 test-on-return: false #是否在连接放回连接池后检测其可用性
 test-while-idle: true #是否在连接空闲一段时间后检测其可用性
#mybatis配置
mybatis:
 type-aliases-package: com.lee.mycat.entity
 #config-location: classpath:mybatis/mybatis-config.xml
 mapper-locations: classpath:mybatis/*.xml
# pagehelper配置
pagehelper:
 helperDialect: mysql
 #分页合理化,pageNum<=0则查询第一页的记录;pageNum大于总页数,则查询最后一页的记录
 reasonable: true
 supportMethodsArguments: true
 params: count=countSql
logging:
 level:
 com.lee.mycat.mapper: DEBUG

UserWeb.java

package com.lee.mycat.web;
import com.lee.mycat.entity.User;
import com.lee.mycat.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/mycat")
public class UserWeb {
 @Autowired
 private IUserService userService;
 @RequestMapping("/getUserByNameFromMasterDb")
 public User getUserByNameFromMasterDb(String name) {
 return userService.getUserByNameFromMasterDb(name);
 }
 @RequestMapping("/getUserByNameFromSlaveDb")
 public User getUserByNameFromSlaveDb(String name) {
 return userService.getUserByNameFromSlaveDb(name);
 }
 @RequestMapping("/getUserByName")
 public User getUserByName(String name) {
 return userService.getUserByName(name);
 }
 @RequestMapping("/addUser")
 public Integer addUser(String name, Integer age) {
 return userService.insertUser(new User(name, age));
 }
}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lee.mycat.mapper.UserMapper">
 <sql id="Base_Column_List">
 id,name,age
 </sql>
 <select id="getUserByNameFromMasterDb" resultType="User" parameterType="String">
 /*!mycat:db_type=master*/ SELECT
 <include refid="Base_Column_List" />
 FROM
 tbl_user
 WHERE name=#{name}
 </select>
 <select id="getUserByNameFromSlaveDb" resultType="User" parameterType="String">
 /*!mycat:db_type=slave*/ SELECT
 <include refid="Base_Column_List" />
 FROM
 tbl_user
 WHERE name=#{name}
 </select>
 <select id="getUserByName" resultType="User" parameterType="String">
 SELECT
 <include refid="Base_Column_List" />
 FROM
 tbl_user
 WHERE name=#{name}
 </select>
 <insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
 INSERT INTO
 tbl_user(name, age)
 VALUES
 (#{name}, #{age})
 </insert>
</mapper>

UserMapper.xml文件中会与我们平时的写法有些许不同,有时候需要明确指定强制走master还是slave节点。具体细节可查看:spring-boot-mycat

测试结果

MySQLは分離を達成するために、可用性、およびアプリケーション統合mycatを読んmyCat



如上图所示,我们一开始新增了一个用户:Jiraiye,其年龄是50,我们手动改了mysql slave中Jiraiye的年龄为52是为了更直观的验证SQL请求最终走的是mysql master还是mysql slave。从上图可知,一般的Select SQL走的是从库(DML SQL走主库这个就不用说了),如在mapper.xml中强制指定了db节点,那么就会在指定的mysql节点上来执行SQL。

mysql的高可用就没进行测试了,应用其实是感知不到的;mysql master宕机了,mycat会按我们配置好的进行mysql db的切换,正常服务于我们的应用。

Mycat的高可用

mysql的读写分离与高可用我们是实现了,可mycat却存在高可用问题,一旦mycat宕机了,整个数据库层就相当于宕机了。可想而知,我们需要实现mycat的高可用。

mycat的高可用搭建过程可参考:Mycat - 高可用与负载均衡实现,满满的干货!,此时的组件结构图如下

MySQLは分離を達成するために、可用性、およびアプリケーション統合mycatを読んmyCat

组件结构图三

应用工程改动非常小,只需要将数据库连接配置的url改成VIP即可,如下

jdbc:mysql://192.168.1.212:8066/TESTDB?useSSL=false&useUnicode=true&characterEncoding=utf-8
改成
jdbc:mysql://192.168.1.200:8066/TESTDB?useSSL=false&useUnicode=true&characterEncoding=utf-8

测试结果

MySQLは分離を達成するために、可用性、およびアプリケーション統合mycatを読んmyCat


非常に短い時間内に例外があった、それはデータベース接続プールからです;分離はまだmycatの高可用性を実現するために、転送SQLのタスクを引き継ぐために、適切mycatスレーブをするときmycatマスターのダウンタイムを働いている読み書きするのMysql mycat 212が現在ダウンしている、212に接続されているので、非常にプロンプ​​トが存在することになるが、接続プールは直ちにデータベース接続を再確立することによって応答し、その後、接続プール110に接続されています。

Mycatのロードバランシング

可用性上記mycat、ほとんどの場合、mycatスレーブが待機状態にあった私たちのmycatマスター一般的なダウンタイムではないので、それは、どんなサービスを提供していません。スレーブはまた、SQL要求を処理できますが、マスターと高可用性を実現するための相互支援がそれをmycat任意のアプローチはありますか?すなわち、mycat主従関係は、この時点では存在しないが、タリアのペアワイズを調製、この時間は、図1のデバイス構造のアセンブリの構成図であるMycat負荷分散です。アプリケーションエンジニアリングは、構成データベースの接続やVIPを変更しないでください。実証されていない特定の、私たちは練習に行かなければなりません。

概要

、mycatちょうどデータベースミドルウェアの実装だけでなく、比較的良好な達成するために、1、データベースミドルウェアは、データベースミドルウェアにフルタイムのビジネスコードを達成することができ、アプリケーション・コード、およびデータベースレベルの作業の複雑さを軽減することができます彼女は、オープンソースです。

2、同時量は高くはないが、高可用性がMycatのロードバランシングを必要とせず、mycatことができます。負荷分散mycatは、より多くのハードウェアやメンテナンスのコストが必要ですが、収入には質的な変化がない、それは費用対効果の高いです上昇するのではなく、落下。

図3は、特に構造に展開するために必要なものコンポーネント、あなたはmycatミドルウェアを使用した場合、個人的に私はにと、最高の高可用性mycatを達成するために、まだだと思うかを達成する必要があり、多くの場合、mycatミドルウェアを使用したことがない、特定のニーズを見てする必要がありますmycatのロードバランシングは、同時実行の具体的な金額を見て、これも標準ではありません、実際の状況をトラブルシューティングするために必要な負荷が高すぎるmycat、実際mycat負荷が高すぎる場合、mycatを達成するために必要であるされていないです単一mycatの負荷を軽減するためにロードバランシング。唯一の最も適切な瞬間を配備する絶対的な最適な展開は、ありません。


おすすめ

転載: blog.51cto.com/14455981/2436880