Mysql讀寫分離——主從數(shù)據(jù)庫+Atlas

mysql集群
最近在參加項目開發(fā)微信小程序后臺晌纫,由于用戶數(shù)量巨大荐类,且后臺程序并不是很完美夯辖,所以對用戶的體驗很是不友好(簡單說就是很卡)。趕巧最近正在翻閱《大型網(wǎng)站系統(tǒng)與Java中間件實踐》劝评。
所以姐直,先是使用Docker swarm構(gòu)建了負載均衡集群,然后使用Atlas做了數(shù)據(jù)庫的讀寫分離蒋畜,盡可能對用戶進行分流声畏,降低對單機服務(wù)器的負載,提高訪問體驗。本片隨筆僅對數(shù)據(jù)庫的讀寫分離部分進行介紹插龄。

目標:實現(xiàn)mysql數(shù)據(jù)庫集群愿棋,一個主節(jié)點負責(zé)寫入數(shù)據(jù),多個從節(jié)點負責(zé)讀取數(shù)據(jù)

實驗環(huán)境
服務(wù)器:

阿里云服務(wù)器:centos7(10.0.0.1)
騰訊云服務(wù)器:ubuntu:16.04(10.0.0.2)
京東云服務(wù)器:ubuntu:16.04 (10.0.0.3)
mysql:5.7

docker:18.03

實現(xiàn)方案
mysql 主從數(shù)據(jù)庫 + Atlas讀寫分離

步驟:
進入Master服務(wù)器進行配置
使用Docker均牢,在服務(wù)器上創(chuàng)建MySQL服務(wù)
docker run -p 3306:3306 --name mysql3306 -v /opt/mysql/data/data3306:/var/lib/mysql -v /opt/mysql/logs/logs3306:/logs -e MYSQL_ROOT_PASSWORD=hello -d mysql:5.7
進Master服務(wù)器的MySQL數(shù)據(jù)庫中糠雨,創(chuàng)建用戶"niwoo"設(shè)置密碼為"hello"
mysql -h 127.0.0.1 -uroot -phello

mysql> grant all on . to ninwoo@'127.0.0.1' identified by "hello";
Query OK, 0 rows affected, 1 warning (0.00 sec)
修改niwoo的訪問權(quán)限
mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> update user set host = '%' where user = 'ninwoo';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 0
確認是否修改成功
mysql> update user set host = '%' where user = 'ninwoo';
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select user, host from user;
+---------------+-----------+
| user | host |
+---------------+-----------+
| ninwoo | % |
| root | % |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+-----------+
5 rows in set (0.00 sec)
更新數(shù)據(jù)庫,是配置生效
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
Master,Slave1的MySQL數(shù)據(jù)庫上創(chuàng)建CampusHire數(shù)據(jù)庫

進入Slave1執(zhí)行相同1,2,3,4操作
配置主從數(shù)據(jù)庫連接
進入Master服務(wù)器進行配置

進入mysql容器內(nèi)部徘跪,修改配置文件
docker exec -it mysql3306 bash
默認沒有vim见秤,無法修改文件

更新軟件源

apt update

安裝vim

apt install vim
修改mysql配置文件
vim /etc/mysql/mysql.conf.d/mysqld.cnf
添加如下配置

主從復(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
退出容器,重啟docker應(yīng)用
docker restart mysql3306
進入數(shù)據(jù)庫真椿,配置主從復(fù)制的權(quán)限
mysql -h 127.0.0.1 -uroot -phello
mysql> grant replication slave on . to 'ninwoo'@'127.0.0.1' identified by 'hello';
Query OK, 0 rows affected, 1 warning (0.01 sec)
鎖定數(shù)據(jù)庫
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)
查看主數(shù)據(jù)庫信息鹃答,記住下面的“File”與“Position”的信息
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 439 | CampusHire | mysql | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
進入slave服務(wù)器,進入mysql容器內(nèi)部

更新軟件源

apt update

安裝vim

apt install vim
修改從數(shù)據(jù)庫的配置文件
vim /etc/mysql/mysql.conf.d/mysqld.cnf
添加server-id=2

重啟Slave數(shù)據(jù)庫
docker restart mysql3306
進入數(shù)據(jù)庫突硝,輸入剛剛記錄下來的File和Position
MySQL [(none)]> change master to master_host='10.0.0.1',
->
-> master_user='ninwoo',
-> master_password='hello',
-> master_port=3306,
-> master_log_file='mysql-bin.000001',
-> master_log_pos=439,
-> master_connect_retry=10;
啟動Slave進程
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
查看復(fù)制狀態(tài)
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 139.199.194.49
Master_User: ninwoo
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 439
Relay_Log_File: 2a8a4abdcf68-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 439
Relay_Log_Space: 534
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 4a0187fa-b0a5-11e8-a7e7-0242ac110003
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more up dates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
到這里主從數(shù)據(jù)的配置就已經(jīng)完成测摔,在向主庫寫入數(shù)據(jù)的同時,將在從庫進行自動的備份解恰。但在實際測試中遇到了配置完成之后無法向主數(shù)據(jù)庫寫入的問題锋八,初步
判斷是由于主庫加鎖而未解鎖的問題,所以這里采用比較暴力的方法护盈,重啟主數(shù)據(jù)庫容器挟纱。

master節(jié)點

docker restart mysql3306
配置Atlas
Atlas是有360團隊優(yōu)化mysqlproxy而衍生出的版本,性能更好更穩(wěn)定腐宋。

Atlas有兩個版本紊服,這里我選擇普通版本,即不分表胸竞。

在阿里云主機(centos7)上進行一下安裝步驟:

下載安裝
[root@localhost ~]# cd /home/
[root@localhost home]# wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
安裝
[root@localhost home]# rpm -ivh Atlas-2.2.1.el6.x86_64.rpm
安裝目錄位于/usr/local/mysql-proxy/

使用安裝目錄下的bin/encrypt程序加密數(shù)據(jù)庫密碼
[root@localhost bin]# ./encrypt hello
配置Atlas
[root@localhost conf]# cd /usr/local/mysql-proxy/conf/
[root@localhost conf]# vim test.cnf
修改以下配置:

管理接口的用戶名

admin-username = user

管理接口的密碼

admin-password = pwd

...

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

proxy-backend-addresses = 10.0.0.1:3306

Atlas后端連接的MySQL從庫的IP和端口卫枝,@后面的數(shù)字代表權(quán)重煎饼,用來作負載均衡,若省略則默認為1校赤,可設(shè)置多項吆玖,用逗號分隔

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

...

用戶名與其對應(yīng)的加密過的MySQL密碼,密碼使用PREFIX/bin目錄下的加密程序encrypt加密马篮,下行的user1和user2為示例沾乘,將其替換為你的MySQL的用戶名和加密密碼!

pwds = buck:RePBqJ+5gI4=

...

Atlas監(jiān)聽的工作接口IP和端口

proxy-address = 0.0.0.0:1234

Atlas監(jiān)聽的管理接口IP和端口

admin-address = 0.0.0.0:2345
讀者需要根據(jù)自己的實際情況修改以上配置

啟動Atlas
[root@localhost bin]# /etc/init.d/mysqld status
OK: MySQL-Proxy of test is started
使用mysql命令連接數(shù)據(jù)庫
其中2345端口是管理端口积蔚,用戶可以在該管理數(shù)據(jù)庫中修改數(shù)據(jù)庫代理服務(wù)器的相關(guān)配置

[root@localhost bin]# mysql -h127.0.0.1 -P2345 -uuser -ppwd
其中1234端口是數(shù)據(jù)庫代理服務(wù)器的端口意鲸,用戶可以直接訪問該端口進行數(shù)據(jù)庫的訪問和更新

[root@localhost bin]# mysql -h127.0.0.1 -P1234 -ubuck -phello
使用軟件連接Atlas數(shù)據(jù)庫代理服務(wù)器
這里發(fā)現(xiàn),之前使用的mysql workbench無法正常使用尽爆,更換Navicat可以正常使用怎顾。

使用jdbc連接數(shù)據(jù)庫
使用方法與普通數(shù)據(jù)庫一樣。

后記
到這里漱贱,配置就已經(jīng)全部完成槐雾。有心的讀者或者已經(jīng)發(fā)現(xiàn),還有一臺服務(wù)器未使用幅狮,這臺服務(wù)器將在以后接入到現(xiàn)有的mysql數(shù)據(jù)庫集群當(dāng)中募强,充當(dāng)新的slave節(jié)點。該實驗將在以后補上崇摄。

理論上說擎值,我所做的這些或許會對負載過大的問題有所解決。但最近并未出現(xiàn)太高的訪問現(xiàn)象逐抑,所以短期也沒有看到效果鸠儿。具體效果,將在實際場景中驗證后補充上厕氨,敬請期待进每。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市命斧,隨后出現(xiàn)的幾起案子田晚,更是在濱河造成了極大的恐慌,老刑警劉巖国葬,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贤徒,死亡現(xiàn)場離奇詭異,居然都是意外死亡汇四,警方通過查閱死者的電腦和手機泞莉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來船殉,“玉大人鲫趁,你說我怎么就攤上這事±妫” “怎么了挨厚?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長糠惫。 經(jīng)常有香客問我疫剃,道長,這世上最難降的妖魔是什么硼讽? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任巢价,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘壤躲。我一直安慰自己城菊,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布碉克。 她就那樣靜靜地躺著凌唬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪漏麦。 梳的紋絲不亂的頭發(fā)上客税,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機與錄音撕贞,去河邊找鬼更耻。 笑死,一個胖子當(dāng)著我的面吹牛捏膨,可吹牛的內(nèi)容都是我干的秧均。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼脊奋,長吁一口氣:“原來是場噩夢啊……” “哼熬北!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起诚隙,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤讶隐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后久又,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巫延,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年地消,在試婚紗的時候發(fā)現(xiàn)自己被綠了炉峰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡脉执,死狀恐怖疼阔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情半夷,我是刑警寧澤婆廊,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站巫橄,受9級特大地震影響淘邻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜湘换,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一宾舅、第九天 我趴在偏房一處隱蔽的房頂上張望统阿。 院中可真熱鬧,春花似錦筹我、人聲如沸扶平。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜻直。三九已至盯质,卻和暖如春袁串,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背呼巷。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工囱修, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留材义,地道東北人嫌吠。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓乓土,卻偏偏與公主長得像诚欠,于是被迫代替她去往敵國和親刑然。 傳聞我的和親對象是個殘疾皇子逝她,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,700評論 2 345

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