mysql數(shù)據(jù)庫主從復(fù)制+讀寫分離

本文引自:?http://www.361way.com/atlas-mysql/5310.html卤材,根據(jù)踩過的坑,在原內(nèi)容的基礎(chǔ)上做了一定的修改,需要注意的地方我已經(jīng)加了標(biāo)注毫蚓。

--------------------------------------------------------------------------------------

Atlas是360團隊弄出來的一套基于MySQL-Proxy基礎(chǔ)之上的代理,修改了MySQL-Proxy的一些BUG昔善,并且優(yōu)化了很多東西元潘。而且安裝方便。配置與注釋寫的都很詳細君仆,并且是都是中文翩概,不過從Altas在github上的代碼來看,將近一年沒更新了返咱。與Atlas類似的產(chǎn)品有Cobar钥庇、Cobar、amoeba咖摹、TDDL评姨、mycat等,不過這些產(chǎn)品部分已經(jīng)停滯或文檔不全面萤晴,mycat相對比較活躍吐句。

Atlas官方文檔鏈接:https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md

Atlas下載鏈接:https://github.com/Qihoo360/Atlas/releases

一、主機規(guī)劃

環(huán)境:

系統(tǒng)IP配置

CentOS 6.8192.168.122.10Atlas代理服務(wù)

CentOS 6.8192.168.122.20主MySQL數(shù)據(jù)庫

CentOS 6.8192.168.122.30從MySQL數(shù)據(jù)庫

二店读、用戶及數(shù)據(jù)庫準備

首先需要在兩臺 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

#主從復(fù)制配置

innodb_flush_log_at_trx_commit=1

sync_binlog=1

#需要備份的數(shù)據(jù)庫

binlog-do-db=test

#不需要備份的數(shù)據(jù)庫

binlog-ignore-db=mysql

#啟動二進制文件

log-bin=mysql-bin

#服務(wù)器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

注:重啟數(shù)據(jù)庫阻星,若沒有配置binlog-do-db和binlog_ignore_db朋鞍,表示備份全部數(shù)據(jù)庫。

修改備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 一行妥箕,其他都是默認配置 滥酥。

重啟數(shù)據(jù)庫

2、主備同步配置

在主服務(wù)器上配置同步權(quán)限設(shè)置畦幢,并配置表只讀及查看服務(wù)器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 服務(wù)器上配置同步(該操作之前坎吻,確認通過上面的用戶連接到主mysql 服務(wù)器上,避免iptables等的影響):

備用庫同樣設(shè)置

mysql> grant replication slave on *.* to 'sync'@'%' identified by '361way.com';

如果不設(shè)置宇葱,在后面的步驟中會出錯J菡妗?贰!V罹 T印!D4┮蕖!<士础O滩!

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 服務(wù)器上啟動 slave 并查看主備同步狀態(tài) :

mysql> start slave;

mysql> show slave status \G;

查看slave狀態(tài)時仲闽,確認Slave_IO_Running和Slave_SQL_Running都是ok的脑溢。

四、Atlas安裝配置

1赖欣、Atlas安裝

前提要求:安裝jdk7僦尽!N饭摹=闯辍!T平谩I殴痢!让禀!

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

其安裝后,目前結(jié)構(gòu)如下:

[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”,服務(wù)的啟動糜工、重啟弊添、停止。都是用他來執(zhí)行的

conf目錄下放的是配置文件

1. “test.cnf”只有一個文件捌木,用來配置代理的油坝,可以使用vim來編輯

lib目錄下放的是一些包,以及Atlas的依賴 ,log目錄下放的是日志澈圈,如報錯等錯誤信息的記錄 彬檀。

2、Atlas配置

加密數(shù)據(jù)庫使用的密碼:

[root@atlas bin]# ./encrypt 361way.com

FVqTnS1W5uzgSv1GServJg==

編輯/usr/local/mysql-proxy/conf/test.cnf文件 瞬女。這是用來登錄到Atlas的管理員的賬號與密碼凤覆,與之對應(yīng)的是“#Atlas監(jiān)聽的管理接口IP和端口”,也就是說需要設(shè)置管理員登錄的端口拆魏,才能進入管理員界面盯桦,默認端口是2345,也可以指定IP登錄渤刃,指定IP后拥峦,其他的IP無法訪問管理員的命令界面。

#管理接口的用戶名

admin-username = user

#管理接口的密碼

admin-password = pwd

通過管理接口卖子,簡化管理工作略号,DB的上下線對應(yīng)用完全透明,同時可以手動上下線洋闽。這個后面再提 玄柠。接下來配置主數(shù)據(jù)的地址與從數(shù)據(jù)庫的地址:

#Atlas后端連接的MySQL主庫的IP和端口,可設(shè)置多項诫舅,用逗號分隔

proxy-backend-addresses = 192.168.122.20:3306

#Atlas后端連接的MySQL從庫的IP和端口羽利,@后面的數(shù)字代表權(quán)重,用來作負載均衡刊懈,若省略則默認為1这弧,可設(shè)置多項,用逗號分隔

proxy-read-only-backend-addresses = 192.168.122.30:3306@1

注意虚汛,上面這一行默認是注釋掉的匾浪,你需要把他前面的#去掉。

#用戶名與其對應(yīng)的加密過的MySQL密碼卷哩,密碼使用PREFIX/bin目錄下的加密程序encrypt加密蛋辈,下行的user1和user2為示例,將其替換為你的MySQL的用戶名和加密密碼将谊!

#pwds = user1:+jKsgB3YAG8=, user2:GS+tr4TPgqc=

pwds = sync:FVqTnS1W5uzgSv1GServJg==

上面用到的pwds密碼為encrypt加密過后的密碼 冷溶。同時需要在設(shè)置管理端的密碼,否則不能登錄F澳取9衣濉@裨ぁ眠砾!

#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í)行數(shù)據(jù)庫的增刪改查 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中設(shè)置從庫ip那一塊是不被注釋了

也可以這樣:add slave ip ;save config;

如果新添加的slave地址 state的狀態(tài)為down,

先檢查ip地址和端口是否正確,

然后可以登錄slave數(shù)據(jù)庫.查看mysql表是否設(shè)置了遠程登錄,如果沒有請設(shè)置,具體方法如下:

mysql>grant all on *.* to ?sync@'%' identified by "361way.com";

可以看出這里管理的內(nèi)容和test.cnf配置文件內(nèi)使用的內(nèi)容相關(guān) 。這里和直接修改配置文件的區(qū)別是刨疼,在這里執(zhí)行語句的修改可以立即生效泉唁,無需重再重啟atlas服務(wù) 。

2揩慕、讀寫分離測試

操作前亭畜,可以先修改test.cnf文件,開啟sql-log = REALTIME 迎卤,這樣執(zhí)行的sql操作及連接的主機都會在日志中顯示拴鸵。先把mysql的主節(jié)點關(guān)閉,執(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ā)現(xiàn)蜗搔,當(dāng)主節(jié)點出現(xiàn)問題后劲藐。查詢操作仍然不受影響,寫入操作會受到影響樟凄。接著將主mysql節(jié)點開啟聘芜,把從mysql節(jié)點關(guān)閉,發(fā)現(xiàn)插入和寫入都不受影響:

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ā)現(xiàn)其連接情況如下:

[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ā)現(xiàn)查詢相關(guān)的操作都是在從mysql 上執(zhí)行的,select和update操作在主mysql 上操作的二拐。

六服鹅、總結(jié)

1.主庫宕機不影響讀

主庫宕機,Atlas自動將宕機的主庫摘除百新,寫操作會失敗企软,讀操作不受影響。從庫宕機饭望,Atlas自動將宕機的從庫摘除仗哨,對應(yīng)用沒有影響。在mysql官方的proxy中主庫宕機铅辞,從庫亦不可用厌漂。

2.通過管理接口,簡化管理工作斟珊,DB的上下線對應(yīng)用完全透明苇倡,同時可以手動上下線。 比如可以通過add slave手動添加一臺從庫。

3.自己實現(xiàn)讀寫分離

(1)為了解決讀寫分離存在寫完馬上就想讀而這時可能存在主從同步延遲的情況旨椒,Altas中可以在SQL語句前增加 /*master*/ 就可以將讀請求強制發(fā)往主庫苫拍。

(2)主庫可設(shè)置多項虚茶,用逗號分隔,從庫可設(shè)置多項和權(quán)重,達到負載均衡凰兑。

4.其在安全方面還具有可以根據(jù)用戶或IP進行過濾的功能塘装。在分表功能上也可以將單個大表拆分成多個小表赴涵,但這里有一個限制辞色,多個小表必須在同一臺DB的同一個庫里,具分表需要手動創(chuàng)建好米罚。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末媚狰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子阔拳,更是在濱河造成了極大的恐慌崭孤,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糊肠,死亡現(xiàn)場離奇詭異辨宠,居然都是意外死亡,警方通過查閱死者的電腦和手機货裹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門嗤形,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人弧圆,你說我怎么就攤上這事赋兵。” “怎么了搔预?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵霹期,是天一觀的道長。 經(jīng)常有香客問我拯田,道長历造,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任船庇,我火速辦了婚禮吭产,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鸭轮。我一直安慰自己臣淤,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布窃爷。 她就那樣靜靜地躺著邑蒋,像睡著了一般姓蜂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寺董,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天覆糟,我揣著相機與錄音刻剥,去河邊找鬼遮咖。 笑死,一個胖子當(dāng)著我的面吹牛造虏,可吹牛的內(nèi)容都是我干的御吞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼漓藕,長吁一口氣:“原來是場噩夢啊……” “哼陶珠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起享钞,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤揍诽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后栗竖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暑脆,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年狐肢,在試婚紗的時候發(fā)現(xiàn)自己被綠了添吗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡份名,死狀恐怖碟联,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情僵腺,我是刑警寧澤鲤孵,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站辰如,受9級特大地震影響裤纹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丧没,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一鹰椒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧呕童,春花似錦漆际、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽施符。三九已至,卻和暖如春擂找,著一層夾襖步出監(jiān)牢的瞬間戳吝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工贯涎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留听哭,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓塘雳,卻偏偏與公主長得像陆盘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子败明,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容