本文引自:?http://www.361way.com/atlas-mysql/5310.html,根據踩過的坑,在原內容的基礎上做了一定的修改,需要注意的地方我已經加了標注。
--------------------------------------------------------------------------------------
Atlas是360團隊弄出來的一套基于MySQL-Proxy基礎之上的代理,修改了MySQL-Proxy的一些BUG,并且優(yōu)化了很多東西。而且安裝方便。配置與注釋寫的都很詳細,并且是都是中文,不過從Altas在github上的代碼來看,將近一年沒更新了。與Atlas類似的產品有Cobar、Cobar、amoeba、TDDL、mycat等,不過這些產品部分已經停滯或文檔不全面,mycat相對比較活躍。
Atlas官方文檔鏈接:https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md
Atlas下載鏈接:https://github.com/Qihoo360/Atlas/releases
一、主機規(guī)劃
環(huán)境:
系統IP配置
CentOS 6.8192.168.122.10Atlas代理服務
CentOS 6.8192.168.122.20主MySQL數據庫
CentOS 6.8192.168.122.30從MySQL數據庫
二、用戶及數據庫準備
首先需要在兩臺 mysql 主機上分別創(chuàng)建一個 mysql 用戶,用于兩臺mysql 主機之間做主從配置,同時也可以讓 atlas 代理可以使用該用戶可以連接到兩臺realserver 。具體實施步驟如下:
mysql> grant all on *.* to? sync@'%' identified by "361way.com";
mysql> use mysql;
mysql> select user, host from user;? ? //確認增加的用戶是否成功
mysql> flush privileges;
上面我們創(chuàng)建了一個sync用戶,密碼為361way.com 。
三、mysql 主從配置
很早之前我寫就寫過 mysql主從配置 ,具體可以查看:http://www.361way.com/mysql-replicate/975.html?,這里再簡單的列下步驟。
1、my.cnf配置
修改主mysql 主機my.cnf 的配置如下:
[mysqld]
datadir=/data/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
#主從復制配置
innodb_flush_log_at_trx_commit=1
sync_binlog=1
#需要備份的數據庫
binlog-do-db=test
#不需要備份的數據庫
binlog-ignore-db=mysql
#啟動二進制文件
log-bin=mysql-bin
#服務器ID
server-id=1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
注:重啟數據庫,若沒有配置binlog-do-db和binlog_ignore_db,表示備份全部數據庫。
修改備mysql 主機的my.cnf 配置如下:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
server-id=2
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
這里就增加了server-id=2 一行,其他都是默認配置 。
重啟數據庫
2、主備同步配置
在主服務器上配置同步權限設置,并配置表只讀及查看服務器binlog日志信息:
mysql> grant replication slave on *.* to 'sync'@'%' identified by '361way.com';
Query OK, 0 rows affected (0.00 sec)
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+
| File? ? ? ? ? ? | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |? ? ? 757 | test? ? ? ? | mysql? ? ? ? ? ? |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
備用mysql 服務器上配置同步(該操作之前,確認通過上面的用戶連接到主mysql 服務器上,避免iptables等的影響):
備用庫同樣設置
mysql> grant replication slave on *.* to 'sync'@'%' identified by '361way.com';
如果不設置,在后面的步驟中會出錯!!!!!!!!!!!!
mysql> change master to master_host='192.168.122.20',
master_user='sync',master_password='361way.com',
master_port=3306,master_log_file='mysql-bin.000003',
master_log_pos=757,master_connect_retry=10;
并在備用mysql 服務器上啟動 slave 并查看主備同步狀態(tài) :
mysql> start slave;
mysql> show slave status \G;
查看slave狀態(tài)時,確認Slave_IO_Running和Slave_SQL_Running都是ok的。
四、Atlas安裝配置
1、Atlas安裝
前提要求:安裝jdk!!!!!!!!!
Atlas會有兩個版本,其中有個分表的版本,但是這個需要其他的依賴,一般場景下不需要分表這種需求,所以這里選擇安裝普通的版本:
Atlas (普通) :?Atlas-2.2.1.el6.x86_64.rpm
Atlas (分表) :?Atlas-sharding_1.0.1-el6.x86_64.rpm
安裝如下:
# wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
# rpm -ivh Atlas-2.2.1.el6.x86_64.rpm
其安裝后,目前結構如下:
[root@atlas ~]# cd /usr/local/mysql-proxy/
[root@atlas mysql-proxy]# ll
total 16
drwxr-xr-x. 2 root root 4096 Dec 12 04:14 bin
drwxr-xr-x. 2 root root 4096 Dec 13 02:27 conf
drwxr-xr-x. 3 root root 4096 Dec 12 04:14 lib
drwxr-xr-x. 2 root root 4096 Dec 13 02:38 log
bin目錄下放的都是可執(zhí)行文件
1. “encrypt”是用來生成MySQL密碼加密的,在配置的時候會用到
2. “mysql-proxy”是MySQL自己的讀寫分離代理
3. “mysql-proxyd”是360弄出來的,后面有個“d”,服務的啟動、重啟、停止。都是用他來執(zhí)行的
conf目錄下放的是配置文件
1. “test.cnf”只有一個文件,用來配置代理的,可以使用vim來編輯
lib目錄下放的是一些包,以及Atlas的依賴 ,log目錄下放的是日志,如報錯等錯誤信息的記錄 。
2、Atlas配置
加密數據庫使用的密碼:
[root@atlas bin]# ./encrypt 361way.com
FVqTnS1W5uzgSv1GServJg==
編輯/usr/local/mysql-proxy/conf/test.cnf文件 。這是用來登錄到Atlas的管理員的賬號與密碼,與之對應的是“#Atlas監(jiān)聽的管理接口IP和端口”,也就是說需要設置管理員登錄的端口,才能進入管理員界面,默認端口是2345,也可以指定IP登錄,指定IP后,其他的IP無法訪問管理員的命令界面。
#管理接口的用戶名
admin-username = user
#管理接口的密碼
admin-password = pwd
通過管理接口,簡化管理工作,DB的上下線對應用完全透明,同時可以手動上下線。這個后面再提 。接下來配置主數據的地址與從數據庫的地址:
#Atlas后端連接的MySQL主庫的IP和端口,可設置多項,用逗號分隔
proxy-backend-addresses = 192.168.122.20:3306
#Atlas后端連接的MySQL從庫的IP和端口,@后面的數字代表權重,用來作負載均衡,若省略則默認為1,可設置多項,用逗號分隔
proxy-read-only-backend-addresses = 192.168.122.30:3306@1
注意,上面這一行默認是注釋掉的,你需要把他前面的#去掉。
#用戶名與其對應的加密過的MySQL密碼,密碼使用PREFIX/bin目錄下的加密程序encrypt加密,下行的user1和user2為示例,將其替換為你的MySQL的用戶名和加密密碼!
#pwds = user1:+jKsgB3YAG8=, user2:GS+tr4TPgqc=
pwds = sync:FVqTnS1W5uzgSv1GServJg==
上面用到的pwds密碼為encrypt加密過后的密碼 。同時需要在設置管理端的密碼,否則不能登錄!!!!
#Atlas監(jiān)聽的工作接口IP和端口
proxy-address = 0.0.0.0:1234
#Atlas監(jiān)聽的管理接口IP和端口
admin-address = 0.0.0.0:2345
以上為連接端口和管理端口配置 。其中管理端口用于連接增刪節(jié)點 ,默認為2345端口 。1234端口為連接端口,連接完這個端口可以正常執(zhí)行數據庫的增刪改查 sql 語句 。
可以通過如下操作啟動altas:
[root@atlas bin]# ./mysql-proxyd test start
OK: MySQL-Proxy of test is started
五、連接與測試
1、連接管理接口
# mysql -h127.0.0.1 -P2345 -uuser -ppwd
管理接口可以執(zhí)行的命令如下:
注意:如果這里只能看到一個地址,
可以先看一下mysql_proxy/conf/test.cnf中設置從庫ip那一塊是不被注釋了
也可以這樣:add slave ip ;save config;
如果新添加的slave地址 state的狀態(tài)為down,
先檢查ip地址和端口是否正確,
然后可以登錄slave數據庫.查看mysql表是否設置了遠程登錄,如果沒有請設置,具體方法如下:
mysql>grant all on *.* to ?sync@'%' identified by "361way.com";
可以看出這里管理的內容和test.cnf配置文件內使用的內容相關 。這里和直接修改配置文件的區(qū)別是,在這里執(zhí)行語句的修改可以立即生效,無需重再重啟atlas服務 。
2、讀寫分離測試
操作前,可以先修改test.cnf文件,開啟sql-log = REALTIME ,這樣執(zhí)行的sql操作及連接的主機都會在日志中顯示。先把mysql的主節(jié)點關閉,執(zhí)行select查詢操作:
MySQL [test]> select max(id) from my;
+---------+
| max(id) |
+---------+
|? ? 9999 |
+---------+
1 row in set (0.00 sec)
MySQL [test]> select * from my where id=9999;
+------+-------+
| id? | name? |
+------+-------+
| 9999 | XnBQJ |
+------+-------+
1 row in set (0.00 sec)
MySQL [test]> insert my values(10000,'xxxxx');
ERROR 2013 (HY000): Lost connection to MySQL server during query
MySQL [test]> insert my values(10000,'xxxxx');
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:? ? 10010
Current database: test
Query OK, 1 row affected (0.03 sec)
可以發(fā)現,當主節(jié)點出現問題后。查詢操作仍然不受影響,寫入操作會受到影響。接著將主mysql節(jié)點開啟,把從mysql節(jié)點關閉,發(fā)現插入和寫入都不受影響:
MySQL [test]> insert my values(10001,'361way.com');
Query OK, 1 row affected (0.01 sec)
MySQL [test]> select max(id) from my;
+---------+
| max(id) |
+---------+
|? 10001 |
+---------+
1 row in set (0.01 sec)
開始sql-log實時日志后,可以查看日志,發(fā)現其連接情況如下:
[root@atlas log]# more sql_test.log
[12/08/2016 01:43:25] C:127.0.0.1:55946 S:192.168.122.30:3306 OK 1.546 "show databases"
[12/08/2016 01:43:25] C:127.0.0.1:55946 S:192.168.122.30:3306 OK 0.911 "show tables"
[12/08/2016 01:43:35] C:127.0.0.1:55946 S:192.168.122.30:3306 OK 1.735 "show databases"
[12/08/2016 01:43:39] C:127.0.0.1:55946 S:192.168.122.30:3306 OK 1.143 "SELECT DATABASE()"
[12/08/2016 01:43:50] C:127.0.0.1:55946 S:192.168.122.30:3306 OK 5.462 "select max(id) from my"
[12/08/2016 01:45:32] C:127.0.0.1:55946 S:192.168.122.20:3306 OK 8.488 "insert my values(10002,'361way.com')"
[12/08/2016 01:46:06] C:127.0.0.1:55946 S:192.168.122.30:3306 OK 2.940 "select * from my where id=10002"
[12/08/2016 01:46:40] C:127.0.0.1:55946 S:192.168.122.20:3306 OK 2.718 "help 'update'"
[12/08/2016 01:47:24] C:127.0.0.1:55946 S:192.168.122.20:3306 OK 16.327 "update my set name='yunwei' where id=10002"
這里可以發(fā)現查詢相關的操作都是在從mysql 上執(zhí)行的,select和update操作在主mysql 上操作的。
六、總結
1.主庫宕機不影響讀
主庫宕機,Atlas自動將宕機的主庫摘除,寫操作會失敗,讀操作不受影響。從庫宕機,Atlas自動將宕機的從庫摘除,對應用沒有影響。在mysql官方的proxy中主庫宕機,從庫亦不可用。
2.通過管理接口,簡化管理工作,DB的上下線對應用完全透明,同時可以手動上下線。 比如可以通過add slave手動添加一臺從庫。
3.自己實現讀寫分離
(1)為了解決讀寫分離存在寫完馬上就想讀而這時可能存在主從同步延遲的情況,Altas中可以在SQL語句前增加 /*master*/ 就可以將讀請求強制發(fā)往主庫。
(2)主庫可設置多項,用逗號分隔,從庫可設置多項和權重,達到負載均衡。
4.其在安全方面還具有可以根據用戶或IP進行過濾的功能。在分表功能上也可以將單個大表拆分成多個小表,但這里有一個限制,多個小表必須在同一臺DB的同一個庫里,具分表需要手動創(chuàng)建好。