Atlas實踐
Atlas簡介
Atlas是由 Qihoo 360公司Web平臺部基礎架構團隊開發維護的一個基於MySQL協議的資料中間層專案。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎上,修改了大量bug,新增了很多功能特性。目前該專案在360公司內部得到了廣泛應用,很多MySQL業務已經接入了Atlas平臺,每天承載的讀寫請求數達幾十億條。同時,有超過50家公司在生產環境中部署了Atlas,超過800人已加入了我們的開發者交流群,並且這些數字還在不斷增加。
官方連結:
主要功能
1.讀寫分離
2.從庫負載均衡
3.IP過濾
4.自動分表
5.DBA可平滑上下線DB
6.自動摘除當機的DB
接下來將測試驗證以上功能。。。。。。
安裝部署
]# rpm -ivh Atlas-2.1.el6.x86_64.rpm
Preparing... ########################################### [100%]
1:Atlas ########################################### [100%]
編輯配置檔案
Atlas執行需要依賴一個配置檔案(test.cnf)。在執行Atlas之前,需要對該檔案進行配置。Atlas的安裝目錄是/usr/local/mysql-proxy,進入安裝目錄下的conf目錄,可以看到已經有一個名為test.cnf的預設配置檔案,我們只需要修改裡面的某些配置項,不需要從頭寫一個配置檔案。
]# pwd
/usr/local/mysql-proxy/conf
]# vim test.cnf
[mysql-proxy]
#帶#號的為非必需的配置專案
#管理介面的使用者名稱
admin-username = user
#管理介面的密碼
admin-password = pwd
#注:使用的主從環境:Master:192.168.1.100,Slave:192.168.1.200
#Atlas後端連線的MySQL主庫的IP和埠,可設定多項,用逗號分隔
proxy-backend-addresses = 192.168.1.100:3306
#Atlas後端連線的MySQL從庫的IP和埠,@後面的數字代表權重,用來作負載均衡,若省略則預設為1,可設定多項,用逗號分隔
proxy-read-only-backend-addresses = 192.168.1.200:3306
#使用者名稱與其對應的加密過的MySQL密碼,密碼使用PREFIX/bin目錄下的加密程式encrypt加密,下行的user1和user2為示例,將其替換為你的MySQL的使用者名稱和加密密碼!
pwds = root:5AaUuB6tXYU=
#設定Atlas的執行方式,設為true時為守護程式方式,設為false時為前臺方式,一般開發除錯時設為false,線上執行時設為true
daemon = true
#設定Atlas的執行方式,設為true時Atlas會啟動兩個程式,一個為monitor,一個為worker,monitor在worker意外退出後會自動將其重啟,設為false時只有worker,沒有monitor,一般開發除錯時設為false,線上執行時設為true
keepalive = true
#工作執行緒數,對Atlas的效能有很大影響,可根據情況適當設定
event-threads = 1
#日誌級別,分為message、warning、critical、error、debug五個級別
log-level = message
#日誌存放的路徑
log-path = /usr/local/mysql-proxy/log
#SQL日誌的開關,可設定為OFF、ON、REALTIME,OFF代表不記錄SQL日誌,ON代表記錄SQL日誌,REALTIME代表記錄SQL日誌且實時寫入磁碟,預設為OFF
sql-log = REALTIME
#例項名稱,用於同一臺機器上多個Atlas例項間的區分
instance = test
#Atlas監聽的工作介面IP和埠
proxy-address = 0.0.0.0:1234
#Atlas監聽的管理介面IP和埠
admin-address = 0.0.0.0:2345
#分表設定,此例中person為庫名,mt為表名,id為分表欄位,3為子表數量,可設定多項,以逗號分隔,若不分表則不需要設定該項
#tables = person.mt.id.3
#預設字符集,設定該項後客戶端不再需要執行SET NAMES語句
charset = utf8
#允許連線Atlas的客戶端的IP,可以是精確IP,也可以是IP段,以逗號分隔,若不設定該項則允許所有IP連線,否則只允許列表中的IP連線
#client-ips = 127.0.0.1, 192.168.1
#Atlas前面掛接的LVS的物理網路卡的IP(注意不是虛IP),若有LVS且設定了client-ips則此項必須設定,否則可以不設定
#lvs-ips = 192.168.1.1
關於配置檔案引數詳細說明可以參考:
啟動atlas服務
]# /usr/local/mysql-proxy/bin/mysql-proxyd test start
OK: MySQL-Proxy of test is started
注意:
(1). 執行檔案是:mysql-proxyd(不是mysql-proxy)。
(2). test是conf目錄下配置檔案的名字,也是配置檔案裡instance項的名字,三者需要統一。
檢視Atlas程式
]# ps -ef | grep mysql-proxy|grep -v grep
root 7186 1 0 14:28 ? 00:00:00 /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/test.cnf
root 7187 7186 0 14:28 ? 00:00:00 /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/test.cnf
連線Atlas管理介面
]# mysql -P2345 -uuser -ppwd -h 127.0.0.1
……
mysql> select * from t;
ERROR 1105 (07000): use 'SELECT * FROM help' to see the supported commands
mysql> SELECT * FROM help;
+----------------------------+---------------------------------------------------------+
| command | description |
+----------------------------+---------------------------------------------------------+
| SELECT * FROM help | shows this help |
| SELECT * FROM backends | lists the backends and their state |
| SET OFFLINE $backend_id | offline backend server, $backend_id is backend_ndx's id |
| SET ONLINE $backend_id | online backend server, ... |
| ADD MASTER $backend | example: "add master 127.0.0.1:3306", ... |
| ADD SLAVE $backend | example: "add slave 127.0.0.1:3306", ... |
| REMOVE BACKEND $backend_id | example: "remove backend 1", ... |
+----------------------------+---------------------------------------------------------+
7 rows in set (0.00 sec)
mysql> select * FROM backends;
#可以看到1.100為rw,1.200為ro
功能測試
1.Atlas讀寫分離功能
#連線Atlas,進行增刪改查,檢視sql_log日誌
#注意如果atlas和mysql處於同一臺機器,連線atlas時必須指定-h 127.0.0.1或者機器的IP
因為不指定-h的時候mysql連線走的unix socket連線,此時-P引數無效,-P後面指定任意埠都是連到的本機的mysql例項
~]# mysql -P1234 -uroot -pyougou -h192.168.1.200
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1827336327
Server version: 5.0.81-log MySQL Community Server (GPL)
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show tables;
+------------------+
| Tables_in_yougou |
+------------------+
| t |
+------------------+
1 row in set (0.00 sec)
mysql> select * from t;
+------+
| x |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+------+
5 rows in set (0.01 sec)
mysql> delete from t where x=5;
Query OK, 1 row affected (0.05 sec)
mysql> insert into t select 5;
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> update t set x=8 where x=5;
Query OK, 1 row affected (0.06 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from t;
+------+
| x |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 8 |
+------+
5 rows in set (0.00 sec)
mysql> create table y(y int);
Query OK, 0 rows affected (0.61 sec)
mysql> drop table y;
Query OK, 0 rows affected (0.28 sec)
#對應的sql_log日誌:
~]# tail -f /usr/local/mysql-proxy/log/sql_test.log
#可以看到所有的增刪改查操作都去master上,select去slave上
2.Atlas從庫負載均衡
架構環境
Master 192.168.1.100:3306
Slave 192.168.1.200:3306, 192.168.1.200:3307, 192.168.1.200:3308
#此處實驗環境資源有限,使用的mysqld_multi啟動多個mysql例項,關於mysqld_multi的使用參考:http://blog.itpub.net/27000195/viewspace-1419251/
Atlas配置檔案
#其他引數與上面一致,主要修改proxy-read-only-backend-addresses為:
重啟atlas服務
~]# /usr/local/mysql-proxy/bin/mysql-proxyd test restart
OK: MySQL-Proxy of test is stopped
OK: MySQL-Proxy of test is started
測試atlas負載均衡
#在1.200上連線1.200的atlas,進行資料庫操作,檢視atlas的sql_log日誌
~]# tail -f /usr/local/mysql-proxy/log/sql_test.log
可以看到讀得操作都是在(slave)1.200上,並且3306埠會聯絡讀2次(配置了3306@2權重為2),才輪到3307和3308埠,從而實現了讀負載均衡和讀寫分離
3.IP過濾
透過配置client-ips來限制允許連線Atlas的客戶端的IP,可以是精確IP,也可以是IP段,以逗號分隔,若不設定該項則允許所有IP連線,否則只允許列表中的IP連線
client-ips = 127.0.0.1, 192.168.1
設定client-ips為127.0.0.1
重啟atlas服務
]# /usr/local/mysql-proxy/bin/mysql-proxyd test restart
OK: MySQL-Proxy of test is stopped
OK: MySQL-Proxy of test is started
IP過濾驗證
#本機連線正常
#使用1.100連線1.200的atlas,被拒絕
從而實現了客戶端IP過濾功能
4.自動分表
配置分表引數
#此處將資料庫yougou下的表parttable按照欄位ID分位10張表
重啟atlas使配置生效
建立子表
#yougoyu資料庫中建立parttable_0….10共10張子表
生成測試資料
#本來打算使用procedure插入測試資料,但是報錯,如下:
create procedure insertparttable()
begin
declare i int;
set i=0;
while i<100 do
insert into parttable values(i,i*100);
set i=i+1;
end while;
end;//
mysql> call insertparttable();
ERROR 1146 (42S02): Table 'yougou.parttable' doesn't exist
所以只有寫明ID列位int數字,來生成:
~]# vim insertparttable.sql
insert into parttable values(1,100);
insert into parttable values(i,i*100);
0<=i<=100
……
測試atlas自動分表
#插入資料
mysql> source insertparttable.sql
#監控sql_log,發現atlas自動將id%10的結果插入到對應的子表中
#查詢資料
#對應的sql_log
如上驗證了atlas的簡單分表功能,感覺目前可用性較差
5.上下線DB
#上線
#下線
6.自動摘除當機的DB
#正常狀態
#將3308埠的mysql停止
#連線atlas,執行查詢,並且檢視log
可以看到atlas的log提示標記為down,sql_log中發現不在去3308埠讀
#此時透過atlas管理環境檢視狀態,發現3308的state為down
Keepalived+Atlas架構實踐
架構圖
Mysql主從:一主三從
Atlas:2個節點做HA
Keepalived:提供VIP防止Atlas單點故障
Mysql主從配置
省略……
Keepalived安裝
下載url
#安裝keepalived
tar zxvf keepalived-1.2.13.tar -C /opt/
cd /opt/keepalived-1.2.13
./configure --prefix=/usr/local/keeplived
make;makeinstall 或 make && makeinstall
#編譯keepalived時報錯
++++++++++++++++++++++++++++++++++++++++
configure: error:
!!! OpenSSL is not properly installed on your system. !!!
!!! Can not include OpenSSL headers files. !!!
++++++++++++++++++++++++++++++++++++++++
解決方法:
rpm -ivh e2fsprogs-devel-1.39-23.el5.x86_64.rpm
rpm -ivh keyutils-libs-devel-1.2-1.el5.x86_64.rpm
rpm -ivh libsepol-devel-1.15.2-2.el5.x86_64.rpm
rpm -ivh libselinux-devel-1.33.4-5.5.el5.x86_64.rpm
rpm -ivh krb5-devel-1.6.1-36.el5.x86_64.rpm
rpm -ivh zlib-devel-1.2.3-3.x86_64.rpm
rpm -ivh openssl-devel-0.9.8e-12.el5.x86_64.rpm
==============================================
#新建一個配置檔案,預設情況下keepalived啟動時會去/etc/keepalived
]# mkdir -p /etc/keepalived
]# cp -p /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
編輯配置檔案
#Atlas1(1.100)上
~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
yu.jx@yougou.com
}
notification_email_from yu.jx@yougou.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id Atlas_ha
}
vrrp_instance Atlas_ha{
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.254
}
}
virtual_server 192.168.1.254 1234{
delay_loop 6
lb_algo wrr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.1.100 1234{
weight 3
notify_down /usr/local/mysql-proxy/bin/Atlas.sh
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 1234
}
}
#Atlas2(1.200)與atlas1幾乎一致,如下:
~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
yu.jx@yougou.com
}
notification_email_from yu.jx@yougou.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id Atlas_ha
}
vrrp_instance Atlas_ha{
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.254
}
}
virtual_server 192.168.1.254 1234{
delay_loop 6
lb_algo wrr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.1.200 1234{
weight 3
notify_down /usr/local/mysql-proxy/bin/Atlas.sh
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 1234
}
}
}
建立notify_down指令碼
~]# cat /usr/local/mysql-proxy/bin/Atlas.sh
#!/bin/sh
pkill keepalived
~]# chmod +x /usr/local/mysql-proxy/bin/Atlas.sh
啟動keepalived
~]# /usr/local/keepalived/sbin/keepalived –D
~]#ps aux | grep keepalived
Atlas自動切換測試
使用客戶端連線VIP(1.254):1234,假設VIP此時繫結在atlas A節點上
檢視atlas A節點上altlas的log可以看到使用者在使用當前atlas A連線資料庫,關閉此節點上的atlas
發現VIP切換到另外一個節點atlas B,並且在atlas B上檢視atlas的log,發現此時客戶端已經切換到atlas B上從而實現了Atlas的HA功能
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27000195/viewspace-1421262/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Atlas 2.1.0 實踐(3)—— Atlas整合HIveHive
- Atlas 2.1.0 實踐(1)—— 編譯Atlas編譯
- Atlas 2.1.0 實踐(2)—— 安裝Atlas
- Atlas 2.1.0 實踐(4)—— 許可權控制
- 雲知聲 Atlas 超算平臺: 基於 Fluid + Alluxio 的計算加速實踐UIUX
- 當Atlas遇見Flink——Apache Atlas 2.2.0釋出!Apache
- docker+atlas+mysql實現讀寫分離DockerMySql
- ATLAS學習---UndatePanel
- MySQL 中介軟體Atlas 實現讀寫分離MySql
- 阿里的Atlas元件化框架阿里元件化框架
- MySQL讀寫分離AtlasMySql
- MySQL + Atlas --- 部署讀寫分離MySql
- Azure SLB + httpd + ILB + HAProxy + Atlas + MySQLhttpdMySql
- kaldi或者eesen atlas編譯失敗編譯
- Atlas—微軟的Ajax工具包(轉)微軟
- Golang 高效實踐之併發實踐Golang
- vue實踐06-專案實踐Vue
- 採用Atlas+Keepalived實現MySQL讀寫分離、讀負載均衡MySql負載
- MYSQL 主從 + ATLAS 讀寫分離 搭建MySql
- Mysql之讀寫分離架構-AtlasMySql架構
- Mysql 高可用(MHA)-讀寫分離(Atlas)MySql
- 應用實踐——新東方實時數倉實踐
- Golang 高效實踐之defer、panic、recover實踐Golang
- ReactNative學習實踐:Navigator實踐React
- 通義靈碼實踐教程——效能實踐
- lerna實踐
- SearchGuard 實踐
- Flutter實踐Flutter
- flask實踐Flask
- SQL實踐SQL
- TypeScript 實踐TypeScript
- Truffle實踐
- Nuxt 實踐UX
- RestTemplate實踐REST
- nginx實踐Nginx
- Oracle實踐Oracle
- 實踐XP
- Golang高效實踐之interface、reflection、json實踐GolangJSON