分佈式MySql

# 分佈式MySql 部署方案
---
1. 解決方案
2. 系統環境
3. mysql 主從備份
4. MyCat 中間件搭建
5. haproxy 負載代理
6. keepalived 解決單點故障
7. mycat-eye 監控web
8. 實驗環境總體結構圖
9. 補充html

## 解決方案
### 描述
```
1. 啓動mysql主從備份
2. 經過使用Mycat中間件作分表以及路由
3. 使用haproxy代理MyCat作負載均衡
4. keepalived保證haproxy的高可用性,解決單點故障。
```
### 結構圖java

![Mysql 分佈式集羣結構圖](http://images.cnblogs.com/cnblogs_com/maybo/974565/o_mysql%E5%88%86%E5%B8%83%E5%BC%8F%E5%9B%BE.jpg)

## 系統環境node

| 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

## mysql主從備份
### 修改配置文件(my.conf)linux

1. 主庫配置git

```
Server-id = 1 #這是數據庫ID,此ID是惟一的,主庫默認爲1,其餘從庫以此ID進行遞增,ID值不能重複,不然會同步出錯;github

log-bin = mysql-bin 二進制日誌文件,此項爲必填項,不然不能同步數據;web

binlog-do-db = dbTest1 #須要同步的數據庫,若是須要同步多個數據庫;redis

則繼續添加此項。sql

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 明文密碼```

相關文章
相關標籤/搜索