天天看點

@mysql讀寫分離分庫分表

文章目錄

  • ​​MySQL中間件Atlas​​
  • ​​一 atlas簡介​​
  • ​​二 主要功能​​
  • ​​三 使用場景​​
  • ​​四 企業讀寫分離及分庫分表其他方案了解​​
  • ​​五 安裝Atlas​​
  • ​​六 配置​​
  • ​​七 啟動服務​​
  • ​​1) mysql庫建立賬号​​
  • ​​八 Atlas使用​​
  • ​​九 管理功能簡介​​
  • ​​1、 連接配接管理服務,使用配置檔案中管理接口賬戶​​
  • ​​2、 持久化配置檔案​​
  • ​​3、 節點管理​​
  • ​​1)檢視所有節點​​
  • ​​2) 節點的上線和下線​​
  • ​​3) 添加删除節點​​
  • ​​4、 使用者管理​​
  • ​​1)在主庫增加資料庫使用者​​
  • ​​2)檢視目前用​​
  • ​​3) 增加Atlas使用者​​

MySQL中間件Atlas

一 atlas簡介

Mysql 的 proxy 中間件有比較多的工具,例如,mysql-proxy(官方提供), atlas , cobar, mycat, tddl, tinnydbrouter等等

而Atlas是由 Qihoo 360公司Web平台部基礎架構團隊開發維護的一個基于MySQL協定的資料中間層項目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎上,修改了大量bug,添加了很多功能特性。目前該項目在360公司内部得到了廣泛應用,很多MySQL業務已經接入了Atlas平台,每天承載的讀寫請求數達幾十億條。

同時,有超過50家公司在生産環境中部署了Atlas,超過800人已加入了我們的開發者交流群,并且這些數字還在不斷增加。而且安裝友善。配置的注釋寫的蠻詳細的,都是中文。

​​Atlas官方連結:​​​​Atlas下載下傳連結:​​

二 主要功能

Atlas主要功能(代理)
  1.讀寫分離
  2.從庫負載均衡
  3.IP過濾
  4.自動分表
  5.DBA可平滑上下線DB(不影響使用者的體驗,把你的資料庫下線)
  6.自動摘除當機的DB
  

Atlas相對于官方MySQL-Proxy的優勢
  1.将主流程中所有Lua代碼用C重寫,Lua僅用于管理接口
  2.重寫網絡模型、線程模型
  3.實作了真正意義上的連接配接池
  4.優化了鎖機制,性能提高數十倍      

三 使用場景

Atlas是一個位于前端應用與後端MySQL資料庫之間的中間件,在後端DB看來,Atlas相當于連接配接它的用戶端,在前端應用看來,Atlas相當于一個DB。Atlas作為服務端與應用程式通訊,它實作了MySQL的用戶端和服務端協定,同時作為用戶端與MySQL通訊。它對應用程式屏蔽了DB的細節,同時為了降低MySQL負擔,它還維護了連接配接池。

Atlas使得應用程式員無需再關心讀寫分離、分表等與MySQL相關的細節,可以專注于編寫業務邏輯,同時使得DBA的運維工作對前端應用透明,上下線DB前端應用無感覺。

四 企業讀寫分離及分庫分表其他方案了解

Mysql-proxy(oracle)

Mysql-router(oracle)

Atlas (Qihoo 360)

Atlas-sharding (Qihoo 360)

Cobar(是阿裡巴巴(B2B)部門開發)

Mycat(基于阿裡開源的Cobar産品而研發)

TDDL Smart Client的方式(淘寶)

Oceanus(58同城資料庫中間件)

OneProxy(原支付寶首席架構師樓方鑫開發 )

vitess(谷歌開發的資料庫中間件)

Heisenberg(百度)

TSharding(蘑菇街白輝)      

五 安裝Atlas

# 雖然包時el6的,但是centos7也能用
wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm




rpm      

六 配置

[root@manager ~]# cd /usr/local/mysql-proxy/conf
[root@manager mysql-proxy]# vim test.cnf
[mysql-proxy]
# 用來登入atlas管理接口的賬号和密碼,部署登入msyql資料
admin-username = bigegon 
admin-password = 666    
proxy-backend-addresses = 192.168.15.100:3306 # 寫節點(主庫)
proxy-read-only-backend-addresses = 192.168.15.101:3306,192.168.15.102:3306 # 隻讀節點(從庫)



# 用來登入msyql的賬号和加密密碼,都是存在與mysql庫的賬号免密,我們需要指定我們自己的,可以指定多個
# 注意一定要是加密密碼,需要執行
# /usr/local/mysql-proxy/bin/encrypt 123,得到123的加密密碼
pwds = root:3yb5jEku5h4=, egon:3yb5jEku5h4=     
daemon = true       # 背景運作
keepalive = true    # 監測節點心跳
event-threads = 4   # 并發數量,設定cpu核數一半
log-level = message   # 日志級别
log-path = /usr/local/mysql-proxy/log  # 日志目錄
sql-log = On   # sql記錄(可做審計)
proxy-address = 0.0.0.0:3306    # 業務連接配接端口
admin-address = 0.0.0.0:2345    # 管理連接配接端口
charset=utf8   # 字元集      

七 啟動服務

#1、啟動,配置檔案名為test.conf對應此處的test
/usr/local/mysql-proxy/bin/mysql-proxyd test start




#2、驗證啟動(沒起來他也顯示OK)
ps -ef|grep [m]ysql-proxy
netstat -lntup|grep [m]ysql-proxy




#3、檢視日志定位問題
tail      

1) mysql庫建立賬号

grant all on *.* to 'root'@'%' identified by '123';
grant all on *.* to 'egon'@'%' identified by '123';      

八 Atlas使用

進入管理接口
# 進入管理接口,使用配置檔案中指定的管理賬号與密碼
mysql -ubigegon -p666 -h127.0.0.1 -P2345




#檢視幫助,依據幫助查找可執行的管理操作
mysql> SELECT * FROM help;



#檢視後端的資料庫
SELECT * FROM backends;      
在任意一台機器上,登入atlas主機
#1、為了很好地觀察讀寫分離的效果,可以先把從庫的sql延遲設定大
stop slave;
CHANGE MASTER TO MASTER_DELAY = 60;
start slave;
  


#2、登入atlas來進行測試
# -u、-p為atlas配置檔案中pwds指定的賬号和密碼
# -h後的位址為atlas主機的位址
# -P自定atlas監聽的ip
mysql -uroot -p123 -h 192.168.15.200 -P 3306




mysql> create database db1;
此時去主庫檢視,發現有db1庫,但是去所有從庫檢視發現都沒有
過了一分鐘後從庫上都有db1了,然後我們通過atlas也可以檢視到了
mysql> show databases;      

九 管理功能簡介

1、 連接配接管理服務,使用配置檔案中管理接口賬戶

mysql -ubigegon -p666 -h192.168.15.200 -P2345      

2、 持久化配置檔案

mysql> save config;
Empty set (0.00 sec)      

3、 節點管理

1)檢視所有節點

mysql> SELECT * FROM backends;
+-------------+---------------------+-------+------+
| backend_ndx | address             | state | type |
+-------------+---------------------+-------+------+
|           1 | 192.168.15.100:3306 | up    | rw   |
|           2 | 192.168.15.101:3306 | up    | ro   |
|           3 | 192.168.15.102:3306 | up    | ro   |
+-------------+---------------------+-------+------+
3 rows in set (0.00 sec)      

2) 節點的上線和下線

下線:
mysql> set offline 1;
+-------------+---------------------+---------+------+
| backend_ndx | address             | state   | type |
+-------------+---------------------+---------+------+
|           1 | 192.168.15.100:3306 | offline | rw   |
+-------------+---------------------+---------+------+
1 row in set (0.00 sec)

mysql> SELECT * FROM backends;
+-------------+---------------------+---------+------+
| backend_ndx | address             | state   | type |
+-------------+---------------------+---------+------+
|           1 | 192.168.15.100:3306 | offline | rw   |
|           2 | 192.168.15.101:3306 | up      | ro   |
|           3 | 192.168.15.102:3306 | up      | ro   |
+-------------+---------------------+---------+------+
3 rows in set (0.00 sec)      
上線:
mysql> set online 1;
+-------------+---------------------+---------+------+
| backend_ndx | address             | state   | type |
+-------------+---------------------+---------+------+
|           1 | 192.168.15.100:3306 | unknown | rw   |
+-------------+---------------------+---------+------+
1 row in set (0.00 sec)      

3) 添加删除節點

mysql> remove backend 3;
mysql> SELECT * FROM backends;      
mysql> add slave 192.168.15.102:3306;
mysql> SELECT * FROM backends;      

4、 使用者管理

1)在主庫增加資料庫使用者

mysql> grant all on *.* to user1@'192.168.10.%' identified by '123';
Query OK, 0 rows affected, 1 warning (0.00 sec)      

2)檢視目前用

mysql> select * from pwds;
+----------+--------------+
| username | password     |
+----------+--------------+
| test     | 3yb5jEku5h4= |
| repl     | 3yb5jEku5h4= |
+----------+--------------+
2 rows in set (0.00 sec)      

3) 增加Atlas使用者

mysql> add pwd user1:123;
Empty set (0.00 sec)

mysql> select * from pwds;
+----------+--------------+
| username | password     |
+----------+--------------+
| root     | 3yb5jEku5h4= |
| egon     | 3yb5jEku5h4= |
| user1    | 3yb5jEku5h4= |
+----------+--------------+
3 rows in set (0.00 sec)