# 分布式MySql 部署方案
---
1. 解决方案
2. 系统环境
3. mysql 主从备份
4. MyCat 中间件搭建
5. haproxy 负载代理
6. keepalived 解决单点故障
7. mycat-eye 监控web
8. 实验环境整体结构图
9. 补充

## 解决方案
### 描述
```
1. 启动mysql主从备份
2. 通过使用Mycat中间件做分表以及路由
3. 使用haproxy代理MyCat做负载均衡
4. keepalived保证haproxy的高可用性,解决单点故障。
```
### 结构图

![Mysql 分布式集群结构图](http://images.cnblogs.com/cnblogs_com/maybo/974565/o_mysql%E5%88%86%E5%B8%83%E5%BC%8F%E5%9B%BE.jpg)

## 系统环境

| system | ip | user | cpu | memory |
| ------------- |:-------------:| -----:|------------- |:-------------:| -----:|8G|
| centos7 | 192.168.100.95 | root |cpu: Intel(R) Pentium(R) CPU G3220 @ 3.00GHz 双核|8G|
| centos7 | 192.168.100.96 | root |cpu: Intel(R) Pentium(R) CPU G3220 @ 3.00GHz 双核|8G|
| centos7 | 192.168.100.97 | root |cpu: Intel(R) Pentium(R) CPU G3220 @ 3.00GHz 双核|8G|

## mysql主从备份
### 修改配置文件(my.conf)

1. 主库配置

```
Server-id = 1 #这是数据库ID,此ID是唯一的,主库默认为1,其他从库以此ID进行递增,ID值不能重复,否则会同步出错;

log-bin = mysql-bin 二进制日志文件,此项为必填项,否则不能同步数据;

binlog-do-db = dbTest1 #需要同步的数据库,如果需要同步多个数据库;

则继续添加此项。

binlog-do-db = dbTest2

binlog-ignore-db = mysql 不需要同步的数据库;

```

2. 从库配置

```
log_bin = mysql-bin
server_id = 2
relay_log = mysql-relay-bin
log_slave_updates = 1
read_only = 1
user = mysql

```
### 重启数据库
### 为master数据库添加访问权限

```
create user repl;
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.100.%' IDENTIFIED BY '1234'; #访问权限添加
SHOW MASTER STATUS; #显示主节点状态
```
### slave 备份配置
```
change master to master_host='192.168.100.96', #master的host
master_port=3306, #端口
master_user='repl', #用户
master_password='1234', #密码
master_log_file='mysql-bin.000001', #日志文件名
master_log_pos=3204; #开始位置将从这个位置开始备份
SHOW SLAVE STATUS; #查看slave状态
START SLAVE; #开启备份
STOP SLAVE; #停止备份

注意: 在开启备份后<SHOW SLAVE STATUS>会看到:
Slave_IO_Runing=Yes
Slave_SQL_Runing=Yes
说明备份启动成功。
```
## MyCat中间件搭建
### 下载地址
<http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz>
### 文档
<https://github.com/MyCATApache/Mycat-Server/wiki>

### 配置文件
#### server.xml
```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="serverPort">8066</property>
<property name="bindIp">192.168.100.96</property>
<property name="managerPort">9066</property>
<property name="systemReserveMemorySize">384m</property>
<property name="defaultSqlParser">druidparser</property>
</system>
<user name="admin">
<property name="password">mypass</property>
<property name="schemas">dbTest</property>

<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>

<!--<user name="admin">
<property name="password">mypass</property>
<property name="schemas">db</property>
<property name="readOnly">false</property>
</user>-->

</mycat:server>

说明:
1. 结合文档很容易知道配置含义,不在说明。
2. 主要是对外用户配置,以及管理端口,服务端口配置,和其它一些配置。

```
#### schema.xml
```
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

<schema name="dbTest" checkSQLschema="true" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<table name="t_user" primaryKey="id" dataNode="dn1,dn2" rule="rule1" />

<!-- global table is auto cloned to all defined data nodes ,so can join
with any table whose sharding node is in the same data node -->
<table name="t_company" primaryKey="id" type="global" dataNode="dn1,dn2" rule="rule1" />
</schema>
<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
/> -->
<dataNode name="dn1" dataHost="localhost1" database="dbTest1" />
<dataNode name="dn2" dataHost="localhost1" database="dbTest2" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>show status like 'wsrep%'</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.100.96:3306" user="admin"
password="mypass">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.100.97:3306" user="admin" password="mypass"/>
</writeHost>
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
</mycat:schema>

说明:
1. 数据库对应表分表配置,其中rule对应rule.xml中分表的类型。
2. datanode 所分的数据库名字以及datahost名字。
3. datahost 连接配置,主数据库配置,以及从数据库配置。
```
#### rule.xml
```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="rule1">
<rule>
<columns>id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
<function name="func1" class="io.mycat.route.function.PartitionByLong">
<property name="partitionCount">8</property>
<property name="partitionLength">128</property>
</function>
</mycat:rule>

说明:
1. 默认分表规则有很多种,可以酌情选择使用。
```
### 启动
```
1. ./bin/mycat start #启动mycat
2. tail -n1000 -f ./logs/wrapper.log #查看启动日志
3. tail -n1000 -f ./logs/mycat.log #查看mycat.log服务日志
```
## haproxy 负载代理
### 下载地址
<http://www.haproxy.org/download/1.7/src/haproxy-1.7.3.tar.gz>
### 参考文档
<http://blog.csdn.net/zzhongcy/article/details/46443765>
### 安装
```
 uname -a //查看Linux内核版本, TARGET是内核版本,2.6就写作26
  make TARGET=linux26 PREFIX=/usr/local/haproxy
  make install PREFIX=/usr/local/haproxy
  
```
### 配置
```

1. mkdir /etc/haproxy/conf
2. vim /etc/haproxy/conf/haproxy.cfg

global
log 127.0.0.1 local0 ##记日志的功能
maxconn 4096
chroot /usr/local/haproxy
user haproxy
group haproxy
daemon
########默认配置############
defaults
log global
mode tcp #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
retries 3 #两次连接失败就认为是服务器不可用,也可以通过后面设置
option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
maxconn 32000 #默认的最大连接数
timeout connect 5000ms #连接超时
timeout client 30000ms #客户端超时
timeout server 30000ms #服务器超时
timeout check 2000 #心跳检测超时
#log 127.0.0.1 local0 err #[err warning info debug]

########test1配置#################
listen mycat_1
bind 0.0.0.0:8076
mode tcp
balance roundrobin
server s1 192.168.100.95:8066 weight 1 maxconn 10000 check inter 10s
server s2 192.168.100.96:8066 weight 1 maxconn 10000 check inter 10s
listen mycat_1_manage
bind 0.0.0.0:9076
mode tcp
balance roundrobin
server s1 192.168.100.95:9066 weight 1 maxconn 10000 check inter 10s
server s2 192.168.100.96:9066 weight 1 maxconn 10000 check inter 10s

```
### 启动
```
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
```

## keepalived 解决单点故障
### 下载地址
<http://www.keepalived.org/software/keepalived-1.3.5.tar.gz>
### 文档
<http://www.keepalived.org/documentation.html>
### 安装
```
./configure && make
```
### 配置
```
1. mkdir -p /usr/local/etc/keepalived/
2. vim /usr/local/etc/keepalived/keepalived.conf

global_defs {
router_id NodeB
}
vrrp_instance VI_1 {
state BACKUP #设置为主服务器
interface enp3s0 #监测网络接口
virtual_router_id 51 #主、备必须一样
priority 90 #(主、备机取不同的优先级,主机值较大,备份机值较小,值越大优先级越高)
advert_int 1 #VRRP Multicast广播周期秒数
authentication {
auth_type PASS #VRRP认证方式,主备必须一致
auth_pass 1111 #(密码)
}
virtual_ipaddress {
192.168.200.100/24 #VRRP HA虚拟地址
}

```
### 启动
```
./bin/keepalived -D -f /usr/local/etc/keepalived/keepalived.conf
```
## mycat-eye 监控web
### 下载地址
```
http://dl.mycat.io/mycat-web-1.0/Mycat-web-1.0-SNAPSHOT-20170102153329-linux.tar.gz
```
### 安装zookeeper
```
docker run -d \
-e MYID=1 \
--name=zookeeper --net=host --restart=always sdvdxl/zookeeper
```
### 配置
```
修改zookeeper地址:
1. cd /mycat-web/WEB-INF/classes
2. vim mycat.properties
3. zookeeper=127.0.0.1:2181
```
### 启动
```
1. cd /mycat-web/
2. ./start.sh &
```
## 实验环境整体结构图
![mysq分布式整体架构图](http://images.cnblogs.com/cnblogs_com/maybo/974565/o_mysql%e5%88%86%e5%b8%83%e5%bc%8f%e5%ae%9e%e9%aa%8c%e6%9e%b6%e6%9e%84%e5%9b%be.jpg)
## 补充
### MyCat 密码明文加密

```
1. java -cp Mycat-server-1.6-RELEASE.jar io.mycat.util.DecryptUtil 1:userB:root:321
2. 修改配置 <property name="usingDecrypt">1</property> #使用加密

说明:
1. 0 为对外提供密码加密,1.是后端也就是数据库连接密码加密
2. userB 用户名
3. 321 明文密码
```

分布式MySql的更多相关文章

  1. 京东分布式MySQL集群方案介绍

    背景 数据库作为一个非常基础的系统,任何一家互联网公司都会使用,数据库产品也很多,有Oracle.SQL Server .MySQL.PostgeSQL.MariaDB等,像SQLServer/Ora ...

  2. 分布式MySQL集群方案的探索与思考

    转载:http://www.infoq.com/cn/articles/exploration-of-distributed-mysql-cluster-scheme?utm_campaign=rig ...

  3. 分布式MySQL数据库TDSQL架构分析

    摘要:腾讯计费平台部为了解决基于内存的NoSQL解决方式HOLD平台在应对多种业务接入时的不足.结合团队在MySQL领域多年应用和优化经验,终于在MySQL存储引擎基础上,打造一套分布式SQL系统TD ...

  4. 一个分布式 MySQL Binlog 存储系统的架构设计

    1. kingbus简介 1.1 kingbus是什么? kingbus是一个基于raft强一致协议实现的分布式MySQL binlog 存储系统.它能够充当一个MySQL Slave从真正的Mast ...

  5. 分布式mysql 和 zk ( zookeeper )的分布式的区别 含冷热数据讨论

    zk ( zookeeper )的分布式仅仅指的是备份模式. 分布式 mysql 不仅仅要关注备份(从以往的半主,主主,到 paxos). (mysql 比 hbase 的region成熟, hdfs ...

  6. 分布式MySQL 数据库

    http://zhangxugg-163-com.iteye.com/blog/1666673 而本文所描述的 federated属于 MySQL的一种特殊引擎,利用它可将本地数据表映射至远程 MyS ...

  7. mycat分布式mysql中间件(数据库切分概述)[转]

    mysql数据库切分 前言 通 过MySQLReplication功能所实现的扩展总是会受到数据库大小的限制,一旦数据库过于庞大,尤其是当写入过于频繁,很难由一台主机支撑的时 候,我们还是会面临到扩展 ...

  8. 分布式mysql中间件(mycat)

    1.   MyCAT概述 1.1 背景 随着传统的数据库技术日趋成熟.计算机网络技术的飞速发展和应用范围的扩充,数据库应用已经普遍建立于计算机网络之上.这时集中式数据库系统表现出它的不足: (1)集中 ...

  9. Percona 开始尝试基于Ceph做上层感知的分布式 MySQL 集群,使用 Ceph 提供的快照,备份和 HA 功能来解决分布式数据库的底层存储问题

    本文由 Ceph 中国社区 -QiYu 翻译 英文出处:Using Ceph with MySQL 欢迎加入CCTG Over the last year, the Ceph world drew m ...

随机推荐

  1. vs2010帮助文件安装完全攻略

    1.VS2010帮助文件不支持重新配置,这个时候打开C:\Program Files\Microsoft Help Viewer\1.0目录,找到“HelpLibManager.exe.config” ...

  2. java-mybaits-00301-SqlMapConfig

    1.配置内容 mybatis的全局配置文件SqlMapConfig.xml,SqlMapConfig.xml中配置的内容和顺序如下: properties(属性) settings(全局配置参数) t ...

  3. 登录plsql 报错 the account is locked --用户被锁

    登录数据库服务器,进入oracle用户下: [root@uumsnormal-oracle admin]# su - oracle [oracle@uumsnormal-oracle ~]$ sqlp ...

  4. Jmeter(三)断言和关联

    Jmeter断言 断言是什么呢,它是用来检查返回结果对不对的.用来验证结果是否正确,如果正确的话,就代表这个请求的返回是正确的,如果没有的话就代表这个请求的结果和我们预期的不一致,这样我们就可以通过断 ...

  5. PL/SQL编程—存储过程

    SQL> create or replace procedure sp_pro3(name_in varchar2,id_in varchar2) is begin update mytest ...

  6. 150. Evaluate Reverse Polish Notation(逆波兰表达式)

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...

  7. TOSCA自动化测试工具安装

    1.下载链接 https://www.tricentis.com/software-testing-tools/ 2.免费试用14天, 弹出的页面输入邮箱地址--> 输入一堆信息-->点击 ...

  8. 获取Android设备的方向,Sensor和SensorManager实现手机旋转角度

    http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1009/425.html 带有g-sensor的Android设备上可通过API ...

  9. Python爬虫学习笔记之Centos下安装配置Mongodb3.6

    在Centos6.9上安装Mongodb时候,遇到"No package mongodb-org available"这个报错. 经过查询后,在Centos6.9上需要针对Mong ...

  10. JS的checkbox状态切换dom无变化

    今天调试checkbox,手动加上checked="checked"和去掉,都对实际页面没有产生影响 搜索一番 1.对radio .checkbox 来说说,checked属性可以 ...