MySQL Replication

主從架構(gòu)

主從架構(gòu)的原理就是從節(jié)點通過獲取主節(jié)點的二進制日志荣赶,重放執(zhí)行sql語句來達到和主節(jié)點數(shù)據(jù)同步镇饺。如下圖:

主從架構(gòu)有基本的一主一從说订,有一主多從灵临,有循環(huán)復(fù)制(就是每個是下一個的主桅狠,是上一個的從讼载,圍城一個環(huán)),級連復(fù)制(分配一個從節(jié)點中跌,讓他從主節(jié)點上獲取二進制日志并發(fā)送給其他從節(jié)點咨堤,用來分擔(dān)主節(jié)點的壓力,而他自己本身不去重放二進制日志)
然后從另一個角度又可以分為異步主從和半同步主從晒他,主從默認就是異步的吱型,主節(jié)點寫數(shù)據(jù)可以是多線程同時及逆行,而從節(jié)點通過主節(jié)點的二進制日志去重讀操作的過程是單進程的陨仅,所以默認為異步津滞。所謂半同步就是指定一個或者多個從節(jié)點,請求的寫操作不僅在主節(jié)點寫完灼伤,還要在在從節(jié)點也同步完成后主節(jié)點才返回給客戶端處理完成的信息触徐,而沒有指定的從節(jié)點仍然是異步的,所以叫做半同步狐赡。

下面我們來實現(xiàn)最簡單的一主一從

我們先來理一下思路撞鹉,做主從首先將時間同步,然后主節(jié)點開啟二進制日志,從節(jié)點開啟中繼日志,主節(jié)點要創(chuàng)建一個能用來同步的賬號,然后從服務(wù)器使用這個賬號去找主節(jié)點去同步蘑辑。
1.環(huán)境

  • 主節(jié)點ip:172.16.200.102
  • 從節(jié)點ip:172.16.200.101
  • 兩個服務(wù)器時間同步幸撕,都使用centos6.9系統(tǒng),mysql版本為5.1.73
  • 防火墻和selinux確保是關(guān)閉的
    2.主節(jié)點上修改配置文件/etc/my.cnf鹦聪,在[mydqld]段中添加如下內(nèi)容
server-id=1   
log-bin=binlog
skip_name_resolve

3.從節(jié)點上修改配置文件/etc/my.cnf,在[mysqld]段中添加如下內(nèi)容

server-id=2
relay_log=relaylog    #開啟中繼日志
skip_name_resolve
read_only=ON

啟動從節(jié)點mysqld
4.主節(jié)點上授權(quán)用戶
啟動mysqld,然后授權(quán)一個能做主從的賬號,根據(jù)最小權(quán)限準(zhǔn)則,我們使用如下權(quán)限:

mysql> grant replication client,replication slave on *.* to 'repluser'@'172.16.200.%' identified by '123';

然后查詢binlog日志位置并記錄,方便從節(jié)點同步時不會處亂子

mysql> show master status;
+---------------+----------+--------------+------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| binlog.000003 |      356 |              |                  |
+---------------+----------+--------------+------------------+

這里看到當(dāng)前的binlog日志使用的是binlog.000003苔咪,位置是在356處
5.配置從節(jié)點
登陸到從節(jié)點上,執(zhí)行如下操作

mysql> change master to master_host='172.16.200.102',master_user='repluser',master_pas
sword='123',master_log_file=' binlog.000003',master_log_pos=356;
#master_log_file就是主節(jié)點的二進制日志,master_log_pos為二進制日志位置
mysql> start slave;    #開啟io線程和sql線程柳骄,單獨開一個就在后邊跟上想要開啟的線程名就行
mysql> show slave status\G    #查看如下兩個線程是不是已經(jīng)顯示YES
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

6.此時团赏,一個簡單的主從復(fù)制就已經(jīng)成功了,我們可以在主節(jié)點上創(chuàng)建一個表耐薯,在從節(jié)點看一下有沒有舔清,有的話實驗成功。

半同步實現(xiàn)

之前我們講了半同步的原理可柿,實現(xiàn)需要通過加載插件來完成鸠踪,步驟如下:
1.環(huán)境
半同步基于semisync_master.so和semisync_slave.so這兩個插件來完成丙者,注意較老版本的mysql可能沒有這兩個插件

  • 主節(jié)點:172.16.200.107复斥,mariadb5.5.52
  • 從節(jié)點:172.16.200.108,mariadb5.5.52
  • 時間同步械媒,selinux和防火墻關(guān)閉
    2.主節(jié)點上加載這兩個插件并啟用
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';    #查看插件裝載上了目锭,但是處于OFF狀態(tài)
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled       | OFF   |
| rpl_semi_sync_master_timeout       | 10000 |
| rpl_semi_sync_master_trace_level   | 32    |
| rpl_semi_sync_master_wait_no_slave | ON    |
+------------------------------------+-------+
MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_enabled=ON;     #設(shè)置插件為啟用狀態(tài)

3.從節(jié)點上安裝配套的從節(jié)點插件

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
MariaDB [(none)]> stop slave IO_THREAD;
MariaDB [(none)]> start slave IO_THREAD;
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
2 rows in set (0.00 sec)
主從復(fù)制的讀寫分離

主從復(fù)制只是將從節(jié)點和主節(jié)點的數(shù)據(jù)做了備份,要分散各個節(jié)點的壓力纷捞,就要讓讀請求去找從節(jié)點痢虹,而寫請求去找主節(jié)點,這樣就可以分散各個節(jié)點的壓力主儡。而要實現(xiàn)這種功能奖唯,一般的反向代理像nginx,haproxy是實現(xiàn)不了的,需要一個能識別mysql協(xié)議的代理糜值,這里我們使用proxysql來實現(xiàn)丰捷。
我們到http://www.proxysql.com/去下載一個最新版本的proxysql,進去之后點download后就會跳轉(zhuǎn)到下載節(jié)點寂汇,找到當(dāng)前系統(tǒng)版本對應(yīng)的包病往,下載就行,這里我們使用proxysql-1.3.6
實現(xiàn)步驟:
1.環(huán)境
這里我們還是使用上面的主從主機骄瓣,然后添加一臺讀寫分離器主機停巷,ip為172.16.200.109,將下載好的proxysql包放到/root下,關(guān)閉selinux和firewalld。
2.安裝proxysql和mysql客戶端

[root@localhost ~]# yum -y install ./proxysql-1.4.2-1-centos7.x86_64.rpm     #在/root目錄下用yum安裝本地包
[root@localhost ~]# yum -y install mariadb

3.修改配置文件

[root@localhost ~]# rpm -qc proxysql-1.4.2-1
/etc/proxysql.cnf
[root@localhost ~]# vim /etc/proxysql.cnf
#在mysql_variables段中畔勤,修改監(jiān)聽的端口
interfaces="0.0.0.0:3306;/tmp/proxysql.sock"
#在mysql_servers段中將第一個{}的內(nèi)容注釋去掉蕾各,并在拷貝一份放到下面以此來做模板,然后修改
        {
                address = "172.16.200.107"    #主節(jié)點ip
                port = 3306           
                hostgroup = 0           #分組庆揪,主一個組示损,從一個組,編號不能一樣
                status = "ONLINE"     
                weight = 1            
                compression = 0       
   max_replication_lag = 10  
        },
        {
                address = "172.16.200.108"    #從節(jié)點ip
                port = 3306           
                hostgroup = 1           
                status = "ONLINE"     
                weight = 1            
                compression = 0       
   max_replication_lag = 10  
        }
#mysql_users段中添加下面這段
        {
                username = "feng" 
                password = " 123"
                default_hostgroup = 0 
                active = 1   
        }
#mysql_replication_hostgroups=段中添加
        {
                writer_hostgroup=0
                reader_hostgroup=1
                comment="test repl 1"
       }

完成后在主節(jié)點上創(chuàng)建用戶feng,密碼為123,然后就可以用這個賬號在代理端登陸驗證了

[root@localhost ~]# mysql -S /tmp/proxysql.sock -ufeng -p123
mysql高可用

完成主從復(fù)制和讀寫分離之后嚷硫,我們還需要做高可用检访,解決主節(jié)點是單點的問題,保證主節(jié)點掛掉后有從節(jié)點可以接管主節(jié)點的工作仔掸,這里我們使用MHA這款高可用程序脆贵。注意這里的高可用不是針對的proxysql這個讀寫分離器來做的,而讀寫分離器如果是單點可以使用別的方案起暮,如keepalived等卖氨,這里就不說這些了。
MHA服務(wù)分為Manager節(jié)點和Node節(jié)點负懦,服務(wù)端安裝Manager服務(wù)筒捺,而Node上安裝節(jié)點的工具
實現(xiàn)步驟:
1.環(huán)境

  • 上邊實驗的環(huán)境,加上一臺ip為172.16.200.120的centos主機作為MHA.
  • MHA需要從節(jié)點上一定要增加read_only=ON選項纸厉,如果從節(jié)點上沒有系吭,就給加上。
  • 確保每個節(jié)點的id必須唯一颗品。
  • 確保有一個賬戶可以在各個節(jié)點上都能有管理權(quán)限肯尺,這里我們上面創(chuàng)建了feng用戶擁有這個權(quán)限,所以就不在創(chuàng)建了躯枢。
  • 下載 mha4mysql-node-0.56-0.el6.noarch.rpm mha4mysql-manager-0.55-0.el6.noarch.rpm這兩個包分別到從節(jié)點和主節(jié)點/root目錄下
    2.由于從節(jié)點可能成為主節(jié)點则吟,而主節(jié)點如果斷了在上線時就是從節(jié)點了,所以要在主節(jié)點和從節(jié)點的配置文件中都設(shè)置二進制日志和中繼日志锄蹂;由于MHA在指定一個 新的主節(jié)點時氓仲,要讓這個準(zhǔn)備升級的從節(jié)點和別的從節(jié)點做比較,如果有別的從節(jié)點上有而本從節(jié)點沒有的東西就都要傳過來得糜,讓自己也擁有敬扛,這樣能避免不同步的問題,而要實現(xiàn)這個功能就需要通過中繼日志來做比較掀亩,而中繼日志默認是會自動清理的舔哪,所以需要在配置文件中加入選項,關(guān)閉自動清理中繼日志的功能槽棍。
    主節(jié)點/etc/my.cnf配置文件中增加中繼日志選項
relay-log=relay-bin

從節(jié)點/etc/my.cnf增加二進制日志選項捉蚤,關(guān)閉自動清理中繼日志

log-bin=bin_log
relay_log_purge=0

重啟這些服務(wù)
3.MHA集群中各個節(jié)點彼此之間需要基于ssh互相通信抬驴,以實現(xiàn)遠程控制及數(shù)據(jù)管理。所以我們需要在一個節(jié)點上配置密鑰對缆巧,然后將私鑰和authorized_keys文件拷貝到別的節(jié)點上布持,這樣就能實現(xiàn)集群中各主機之間無密碼直接通信了。
我們在MHA主機上創(chuàng)建密鑰對:

[root@localhost ~]# ssh-keygen -t rsa -P ''
[root@localhost ~]# for i in {7..9};do scp -p -r .ssh/ root@172.16.200.10$i:/root/.ssh
/;done    #將生成的鑰匙文件目錄整個復(fù)制到各個節(jié)點上

測試用ssh連接陕悬,發(fā)現(xiàn)不用輸入密碼了题暖,就成功了
4.安裝MHA的程序
在MHA主機上安裝Manager

[root@localhost ~]# cd
[root@localhost ~]# yum -y install ./mha4mysql-manager-0.55-0.el6.noarch.rpm 

各個節(jié)點上安裝node

[root@localhost ~]# cd
[root@localhost ~]# yum -y install ./mha4mysql-node-0.56-0.el6.noarch.rpm 

5.在MHA中,每一個被監(jiān)控的集群叫做一個application,而每個監(jiān)控的app需要單獨創(chuàng)建一個配置文件捉超。所以下邊我們自己定義配置文件胧卤,并加入配置:

[root@localhost ~]# mkdir /etc/mha
[root@localhost ~]# cd /etc/mha
[root@localhost mha]# vim app1.cnf
[server default]
user=feng
password=123
manager_workdir=/data/masterha/app1
manager_log=/data/masterha/app1/manager.log
remote_workdir=/dta/masterha/app1
ssh_user=root
repl_user=repluser
repl_password=123
ping_interval=1

[server1]
hostname=172.16.200.107
candidate_master=1 #設(shè)置能成為主節(jié)點

[server2]
hostname=172.16.200.108
candidate_master=1

然后測試ssh是否連通

[root@localhost mha]# masterha_check_ssh --conf=/etc/mha/app1.cnf 

測試集群是否正確

[root@localhost mha]# masterha_check_repl --conf=/etc/mha/app1.cnf

如果出現(xiàn)ERROR提示User repluser does not exist,原因是之前主從實驗時拼岳,在主節(jié)點創(chuàng)建的repluser用戶沒有同步到從節(jié)點枝誊,我們只需要在主節(jié)點再次執(zhí)行授權(quán)repluser用戶的語句就可以同步到從節(jié)點了,如下

MariaDB [(none)]> grant replication client,replication slave on *.* to 'repluser'@'172
.16.200.%' identified by '123';

在后臺運行程序惜纸,并且將日志記錄

[root@localhost mha]# nohup masterha_manager --conf=/etc/mha/app1.cnf > /data/masterha/app1/manager.log 2>&1 & 

測試集群運行狀態(tài)

[root@localhost mha]# masterha_check_status --conf=/etc/mha/app1.cnf

6.模擬故障
我們手動關(guān)閉主節(jié)點叶撒,然后去恢復(fù)集群
主節(jié)點關(guān)閉后,檢測程序就會自動停止耐版,所以配置完主節(jié)點后要再次啟用檢測層序祠够。
在主節(jié)點上關(guān)閉mariadb

[root@localhost ~]# service mariadb stop

然后在172.16.200.108這個從上查看

MariaDB [feng]> show global variables like 'read_only';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only     | OFF   |
+---------------+-------+

我們看到之前在配置文件中設(shè)置的只讀選項成為了OFF,證明MHA已經(jīng)將這個從節(jié)點設(shè)置成為主節(jié)點粪牲。
7.恢復(fù)
我們接下來要做的就是將之前宕掉的主節(jié)點現(xiàn)在設(shè)置為從節(jié)點古瓤,讓他上線正常運行,然后將MHA程序再運行起來虑瀑。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末湿滓,一起剝皮案震驚了整個濱河市滴须,隨后出現(xiàn)的幾起案子舌狗,更是在濱河造成了極大的恐慌,老刑警劉巖扔水,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痛侍,死亡現(xiàn)場離奇詭異,居然都是意外死亡魔市,警方通過查閱死者的電腦和手機主届,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來待德,“玉大人君丁,你說我怎么就攤上這事〗埽” “怎么了绘闷?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵橡庞,是天一觀的道長。 經(jīng)常有香客問我印蔗,道長扒最,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任华嘹,我火速辦了婚禮吧趣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘耙厚。我一直安慰自己强挫,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布薛躬。 她就那樣靜靜地躺著纠拔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪泛豪。 梳的紋絲不亂的頭發(fā)上稠诲,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音诡曙,去河邊找鬼臀叙。 笑死,一個胖子當(dāng)著我的面吹牛价卤,可吹牛的內(nèi)容都是我干的劝萤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼慎璧,長吁一口氣:“原來是場噩夢啊……” “哼床嫌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起胸私,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤厌处,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后岁疼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阔涉,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年捷绒,在試婚紗的時候發(fā)現(xiàn)自己被綠了瑰排。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡暖侨,死狀恐怖椭住,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情字逗,我是刑警寧澤京郑,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布显押,位于F島的核電站,受9級特大地震影響傻挂,放射性物質(zhì)發(fā)生泄漏乘碑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一金拒、第九天 我趴在偏房一處隱蔽的房頂上張望兽肤。 院中可真熱鬧,春花似錦绪抛、人聲如沸资铡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笤休。三九已至,卻和暖如春症副,著一層夾襖步出監(jiān)牢的瞬間店雅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工贞铣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留闹啦,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓辕坝,卻偏偏與公主長得像窍奋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子酱畅,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

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