這種架構(gòu)一般用在以下三類場(chǎng)景
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供孟州網(wǎng)站建設(shè)、孟州做網(wǎng)站、孟州網(wǎng)站設(shè)計(jì)、孟州網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、孟州企業(yè)網(wǎng)站模板建站服務(wù),十年孟州做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
1. 備份多臺(tái) Server 的數(shù)據(jù)到一臺(tái)如果按照數(shù)據(jù)切分方向來講,那就是垂直切分。比如圖 2,業(yè)務(wù) A、B、C、D 是之前拆分好的業(yè)務(wù),現(xiàn)在需要把這些拆分好的業(yè)務(wù)匯總起來備份,那這種需求也很適用于多源復(fù)制架構(gòu)。實(shí)現(xiàn)方法我大概描述下:業(yè)務(wù) A、B、C、D 分別位于 4 臺(tái) Server,每臺(tái) Server 分別有一個(gè)數(shù)據(jù)庫(kù)來隔離前端的業(yè)務(wù)數(shù)據(jù),那這樣,在從庫(kù)就能把四臺(tái)業(yè)務(wù)的數(shù)據(jù)全部匯總起來,而不需要做額外的操作。那沒有多源復(fù)制之前,要實(shí)現(xiàn)這類需求,只能在匯總機(jī)器上搭建多個(gè) MySQL 實(shí)例,那這樣勢(shì)必會(huì)涉及到跨庫(kù)關(guān)聯(lián)的問題,不但性能急劇下降,管理多個(gè)實(shí)例也沒有單臺(tái)來的容易。
2. 用來聚合前端多個(gè) Server 的分片數(shù)據(jù)。
同樣,按照數(shù)據(jù)切分方向來講,屬于水平切分。比如圖 3,按照年份拆分好的數(shù)據(jù),要做一個(gè)匯總數(shù)據(jù)展現(xiàn),那這種架構(gòu)也非常合適。實(shí)現(xiàn)方法稍微復(fù)雜些:比如所有 Server 共享同一數(shù)據(jù)庫(kù)和表,一般為了開發(fā)極端透明,前端配置有分庫(kù)分表的中間件,比如愛可生的 DBLE。
3. 匯總并合并多個(gè) Server 的數(shù)據(jù)
第三類和第一種場(chǎng)景類似。不一樣的是不僅僅是數(shù)據(jù)需要匯總到目標(biāo)端,還得合并這些數(shù)據(jù),這就比第一種來的相對(duì)復(fù)雜些。比如圖 4,那這樣的需求,是不是也適合多源復(fù)制呢?答案是 YES。那具體怎么做呢?
1、首先要在本地建立兩個(gè)mysql服務(wù)(參考這里),指定不同的端口。我這里一個(gè)主(3306),一個(gè)從(3307)。2、然后修改主配置文件:
[mysqld]
server-id = 1
binlog-do-db=test #要同步的數(shù)據(jù)庫(kù)
#binlog-ignore-db=mysql #不同步的數(shù)據(jù)庫(kù),如果指定了binlog-do-db這里應(yīng)該可以不用指定的
log-bin=mysql-bin #要生成的二進(jìn)制日記文件名稱
修改從配置文件:
[mysqld]
server-id = 2
log-bin = mysql-bin
replicate-do-db=test
3、在主庫(kù)添加一個(gè)用戶 repl 并指定replication權(quán)限
create user 'repl'@'127.0.0.1' identified by 'asdf';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'127.0.0.1'; -- --這里我指定數(shù)據(jù)庫(kù)(test.*)時(shí)報(bào)錯(cuò),而指定全庫(kù)(*.*)時(shí)會(huì)成功。
4、保持主從mysql的test數(shù)據(jù)庫(kù)初始狀態(tài)一致。
一般是先將所有的表加讀鎖,然后copy磁盤上的數(shù)據(jù)庫(kù)文件夾。我這里直接停止服務(wù),然后將數(shù)據(jù)文件拷貝過去。
5、在主數(shù)據(jù)庫(kù)里面運(yùn)行show master status;記下file和position字段對(duì)應(yīng)的參數(shù)。
1.mysql數(shù)據(jù)庫(kù)沒有增量備份的機(jī)制,當(dāng)數(shù)據(jù)量太大的時(shí)候備份是一個(gè)很大的問題。還好mysql數(shù)據(jù)庫(kù)提供了一種主從備份的機(jī)制,其實(shí)就是把主數(shù)據(jù)庫(kù)的所有的數(shù)據(jù)同時(shí)寫到備份數(shù)據(jù)庫(kù)中。實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)的熱備份。
2.要想實(shí)現(xiàn)雙機(jī)的熱備首先要了解主從數(shù)據(jù)庫(kù)服務(wù)器的版本的需求。要實(shí)現(xiàn)熱備mysql的版本都要高于3.2,還有一個(gè)基本的原則就是作為從數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)版本可以高于主服務(wù)器數(shù)據(jù)庫(kù)的版本,但是不可以低于主服務(wù)器的數(shù)據(jù)庫(kù)版本。
3.設(shè)置主數(shù)據(jù)庫(kù)服務(wù)器:
a.首先查看主服務(wù)器的版本是否是支持熱備的版本。然后查看my.cnf(類unix)或者my.ini(windows)中mysqld配置塊的配置有沒有l(wèi)og-bin(記錄數(shù)據(jù)庫(kù)更改日志),因?yàn)閙ysql的復(fù)制機(jī)制是基于日志的復(fù)制機(jī)制,所以主服務(wù)器一定要支持更改日志才行。然后設(shè)置要寫入日志的數(shù)據(jù)庫(kù)或者不要寫入日志的數(shù)據(jù)庫(kù)。這樣只有您感興趣的數(shù)據(jù)庫(kù)的更改才寫入到數(shù)據(jù)庫(kù)的日志中。
server-id=1 //數(shù)據(jù)庫(kù)的id這個(gè)應(yīng)該默認(rèn)是1就不用改動(dòng)
log-bin=log_name //日志文件的名稱,這里可以制定日志到別的目錄 如果沒有設(shè)置則默認(rèn)主機(jī)名的一個(gè)日志名稱
binlog-do-db=db_name //記錄日志的數(shù)據(jù)庫(kù)
binlog-ignore-db=db_name //不記錄日志的數(shù)據(jù)庫(kù)
以上的如果有多個(gè)數(shù)據(jù)庫(kù)用","分割開
然后設(shè)置同步數(shù)據(jù)庫(kù)的用戶帳號(hào)
mysql GRANT REPLICATION SLAVE ON *.*
- TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';
4.0.2以前的版本, 因?yàn)椴恢С諶EPLICATION 要使用下面的語(yǔ)句來實(shí)現(xiàn)這個(gè)功能
mysql GRANT FILE ON *.*
- TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';
設(shè)置好主服務(wù)器的配置文件后重新啟動(dòng)數(shù)據(jù)庫(kù)
b.鎖定現(xiàn)有的數(shù)據(jù)庫(kù)并備份現(xiàn)在的數(shù)據(jù)
鎖定數(shù)據(jù)庫(kù)
mysql FLUSH TABLES WITH READ LOCK;
備份數(shù)據(jù)庫(kù)有兩種辦法一種是直接進(jìn)入到mysql的data目錄然后打包你需要備份數(shù)據(jù)庫(kù)的文件夾,第二種是使用mysqldump的方式來備份數(shù)據(jù)庫(kù)但是要加上"--master-data " 這個(gè)參數(shù),建議使用第一種方法來備份數(shù)據(jù)庫(kù)
c.查看主服務(wù)器的狀態(tài)
mysql show master status\G;
+---------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| mysql-bin.003 | 73 | test | manual,mysql |
+---------------+----------+--------------+------------------+
記錄File 和 Position 項(xiàng)目的值,以后要用的。
d.然后把數(shù)據(jù)庫(kù)的鎖定打開
mysql UNLOCK TABLES;
4.設(shè)置從服務(wù)器
a.首先設(shè)置數(shù)據(jù)庫(kù)的配置文件
server-id=n //設(shè)置數(shù)據(jù)庫(kù)id默認(rèn)主服務(wù)器是1可以隨便設(shè)置但是如果有多臺(tái)從服務(wù)器則不能重復(fù)。
master-host=db-master.mycompany.com //主服務(wù)器的IP地址或者域名
master-port=3306 //主數(shù)據(jù)庫(kù)的端口號(hào)
master-user=pertinax //同步數(shù)據(jù)庫(kù)的用戶
master-password=freitag //同步數(shù)據(jù)庫(kù)的密碼
master-connect-retry=60 //如果從服務(wù)器發(fā)現(xiàn)主服務(wù)器斷掉,重新連接的時(shí)間差
report-host=db-slave.mycompany.com //報(bào)告錯(cuò)誤的服務(wù)器
b.把從主數(shù)據(jù)庫(kù)服務(wù)器備份出來的數(shù)據(jù)庫(kù)導(dǎo)入到從服務(wù)器中
c.然后啟動(dòng)從數(shù)據(jù)庫(kù)服務(wù)器,如果啟動(dòng)的時(shí)候沒有加上"--skip-slave-start"這個(gè)參數(shù)則進(jìn)入到mysql中
mysql slave stop; //停止slave的服務(wù)
d.設(shè)置主服務(wù)器的各種參數(shù)
mysql CHANGE MASTER TO
- MASTER_HOST='master_host_name', //主服務(wù)器的IP地址
- MASTER_USER='replication_user_name', //同步數(shù)據(jù)庫(kù)的用戶
- MASTER_PASSWORD='replication_password', //同步數(shù)據(jù)庫(kù)的密碼
- MASTER_LOG_FILE='recorded_log_file_name', //主服務(wù)器二進(jìn)制日志的文件名(前面要求記住的參數(shù))
- MASTER_LOG_POS=recorded_log_position; //日志文件的開始位置(前面要求記住的參數(shù))
e.啟動(dòng)同步數(shù)據(jù)庫(kù)的線程
mysql slave start;
查看數(shù)據(jù)庫(kù)的同步情況。
查看主從服務(wù)器的狀態(tài)
mysql SHOW PROCESSLIST\G //可以查看mysql的進(jìn)程看看是否有監(jiān)聽的進(jìn)程
如果日志太大清除日志的步驟如下
1.鎖定主數(shù)據(jù)庫(kù)
mysql FLUSH TABLES WITH READ LOCK;
2.停掉從數(shù)據(jù)庫(kù)的slave
mysql slave stop;
3.查看主數(shù)據(jù)庫(kù)的日志文件名和日志文件的position
show master status;
+---------------+----------+--------------+------------------+
| File | Position | Binlog_do_db | Binlog_ignore_db |
+---------------+----------+--------------+------------------+
| louis-bin.001 | 79 | | mysql |
+---------------+----------+--------------+------------------+
4.解開主數(shù)據(jù)庫(kù)的鎖
mysql unlock tables;
5.更新從數(shù)據(jù)庫(kù)中主數(shù)據(jù)庫(kù)的信息
mysql CHANGE MASTER TO
- MASTER_HOST='master_host_name', //主服務(wù)器的IP地址
- MASTER_USER='replication_user_name', //同步數(shù)據(jù)庫(kù)的用戶
- MASTER_PASSWORD='replication_password', //同步數(shù)據(jù)庫(kù)的密碼
- MASTER_LOG_FILE='recorded_log_file_name', //主服務(wù)器二進(jìn)制日志的文件名(前面要求記住的參數(shù))
- MASTER_LOG_POS=recorded_log_position; //日志文件的開始位置(前面要求記住的參數(shù))
6.啟動(dòng)從數(shù)據(jù)庫(kù)的slave
mysql slave start;
mysql最多可以擴(kuò)展9臺(tái)主機(jī)。
MySQL是一種關(guān)系型數(shù)據(jù)庫(kù),在Java企業(yè)級(jí)開發(fā)中非常常用,因?yàn)镸ySQL是開源免費(fèi)的,并且方便擴(kuò)展。阿里巴巴數(shù)據(jù)庫(kù)系統(tǒng)也大量用到MySQL,因此它的穩(wěn)定性是有保障的。MySQL是開放源代碼的,因此任何人都可以在GPL的許可下下載并根據(jù)個(gè)性化的需要對(duì)其進(jìn)行修改。MySQL的默認(rèn)端口號(hào)是3306。
MyISAM是MySQL的默認(rèn)數(shù)據(jù)庫(kù)引擎。雖然性能極佳,而且提供了大量的特性,包括全文索引、壓縮、空間函數(shù)等,但MyISAM不支持事務(wù)和行級(jí)鎖,而且最大的缺陷就是崩潰后無法安全恢復(fù)。不過,5.5版本之后,MySQL引入了InnoDB,MySQL5.5版本后默認(rèn)的存儲(chǔ)引擎為InnoDB。
雙機(jī)熱備說明現(xiàn)成資料很多;我簡(jiǎn)單說下步驟:
主機(jī)為A,從機(jī)為B
A的操作,
用root賬戶登錄,mysql -u root -p密碼
create database wangxh; 創(chuàng)建同步數(shù)據(jù)庫(kù)
grant all privileges on wangxh.* to 'tom'@'B的ip' identified by '密碼'; //添加用于B機(jī)同步的賬號(hào)tom
grant replication slave on *.* to 'tom'@'B的ip'; //這個(gè)權(quán)限需要額外加
flush privileges; 刷新權(quán)限表,不然tom用戶的權(quán)限無效
關(guān)閉mysql服務(wù)
編輯my.cnf,在[mysqld]下加上
server-id=1,//主機(jī)id,可以任意數(shù)字,一般都為1
log-bin=mysql-bin.index //生成的bin-log文件名,可以在mysql數(shù)據(jù)文件夾下找到
binlog_format=row //默認(rèn)是STATEMENT,建議用row
binlog-do-db=wangxh --允許被復(fù)制的庫(kù)名,可以設(shè)置多個(gè),用“,”分開
B的操作,
用root賬戶登錄,mysql -u root -p密碼
create database wangxh; 創(chuàng)建同步數(shù)據(jù)庫(kù)
編輯my.cnf,在[mysqld]下加上
server-id=2 //只要不和A的server-id重復(fù)即可
master-host=A的ip
master-user=tom
master-password=tom的密碼
replicate-do-db=back;復(fù)制的數(shù)據(jù)庫(kù);
最后保存文件,然后重啟AB機(jī)器的mysql
登錄B的mysql執(zhí)行,start slave
查看slave狀態(tài),
show slave status;
目前mysql5.6版本也未能支持CHANGE MASTER TO 多用戶;而且只基于數(shù)據(jù)庫(kù)同步,不支持單個(gè)實(shí)例多線程同步