主從架構(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程序再運行起來虑瀑。