MySQL雙主(主主)架構(gòu)配置方案
在企業(yè)中,數(shù)據(jù)庫高可用一直是企業(yè)的重中之重,中小企業(yè)很多都是使用mysql主從方案,一主多從,讀寫分離等,但是單主存在單點故障,從庫切換成主庫需要作改動。因此,如果是雙主或者多主,就會增加mysql入口,增加高可用。不過多主需要考慮自增長ID問題,這個需要特別設(shè)置配置文件,比如雙主,可以使用奇偶,總之,主之間設(shè)置自增長ID相互不沖突就能完美解決自增長ID沖突問題。
主從同步復(fù)制原理
在開始之前,我們先來了解主從同步復(fù)制原理。
復(fù)制分成三步:
1. master將改變記錄到二進制日志(binary log)中(這些記錄叫做二進制日志事件,binary log events);
2. slave將master的binary log events拷貝到它的中繼日志(relay log);
3. slave重做中繼日志中的事件,將改變反映它自己的數(shù)據(jù)。
下圖描述了這一過程:
該過程的第一部分就是master記錄二進制日志。在每個事務(wù)更新數(shù)據(jù)完成之前,master在二日志記錄這些改變。MySQL將事務(wù)串行的寫入二進制日志,即使事務(wù)中的語句都是交叉執(zhí)行的。在事件寫入二進制日志完成后,master通知存儲引擎提交事務(wù)。
下一步就是slave將master的binary log拷貝到它自己的中繼日志。首先,slave開始一個工作線程——I/O線程。I/O線程在master上打開一個普通的連接,然后開始binlog dump process。Binlog dump process從master的二進制日志中讀取事件,如果已經(jīng)跟上master,它會睡眠并等待master產(chǎn)生新的事件。I/O線程將這些事件寫入中繼日志。
SQL slave thread處理該過程的最后一步。SQL線程從中繼日志讀取事件,更新slave的數(shù)據(jù),使其與master中的數(shù)據(jù)一致。只要該線程與I/O線程保持一致,中繼日志通常會位于OS的緩存中,所以中繼日志的開銷很小。
此外,在master中也有一個工作線程:和其它MySQL的連接一樣,slave在master中打開一個連接也會使得master開始一個線程。
MySQL5.6以前的版本復(fù)制過程有一個很重要的限制——復(fù)制在slave上是串行化的,也就是說master上的并行更新操作不能在slave上并行操作。 MySQL5.6版本參數(shù)slave-parallel-workers=1 表示啟用多線程功能。
MySQL5.6開始,增加了一個新特性,是加入了全局事務(wù) ID (GTID) 來強化數(shù)據(jù)庫的主備一致性,故障恢復(fù),以及容錯能力。
官方文檔:http://dev.mysql.com/doc/refman/5.6/en/replication-gtids.html
MySQL雙主(主主)架構(gòu)方案思路是:
1.兩臺mysql都可讀寫,互為主備,默認只使用一臺(masterA)負責數(shù)據(jù)的寫入,另一臺(masterB)備用;
2.masterA是masterB的主庫,masterB又是masterA的主庫,它們互為主從;
3.兩臺主庫之間做高可用,可以采用keepalived等方案(使用VIP對外提供服務(wù));
4.所有提供服務(wù)的從服務(wù)器與masterB進行主從同步(雙主多從);
5.建議采用高可用策略的時候,masterA或masterB均不因宕機恢復(fù)后而搶占VIP(非搶占模式);
這樣做可以在一定程度上保證主庫的高可用,在一臺主庫down掉之后,可以在極短的時間內(nèi)切換到另一臺主庫上(盡可能減少主庫宕機對業(yè)務(wù)造成的影響),減少了主從同步給線上主庫帶來的壓力;
但是也有幾個不足的地方:
1.masterB可能會一直處于空閑狀態(tài)(可以用它當從庫,負責部分查詢);
2.主庫后面提供服務(wù)的從庫要等masterB先同步完了數(shù)據(jù)后才能去masterB上去同步數(shù)據(jù),這樣可能會造成一定程度的同步延時;
架構(gòu)的簡易圖如下:
主主環(huán)境(這里只介紹2臺主的配置方案):
1.CentOS 6.8 64位 2臺:masterA(192.168.10.11),masterB(192.168.10.12)
2.官方Mysql5.6版本
搭建過程:
1.安裝MySQL服務(wù)(建議源碼安裝)
1.1 yum安裝依賴包
yum -y install make gcc gcc-c++ ncurses-devel bison openssl-devel
1.2 添加MySQL所需要的用戶和組
groupadd -g 27 mysql adduser -u 27 -g mysql -s /sbin/nologin mysql
1.3 下載MySQL源碼包
mkdir -p /data/packages/src cd /data/packages/ wget http://distfiles.macports.org/cmake/cmake-3.2.3.tar.gz wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.34.tar.gz
1.4 創(chuàng)建mysql數(shù)據(jù)目錄
mkdir -p /usr/local/mysql/data
1.5 解壓編譯安裝cmake、MySQL
cd /data/packages/src tar -zxvf ../cmake-3.2.3.tar.gz cd cmake-3.2.3/ ./bootstrap gmake make install cd ../ tar xf mysql-5.6.34.tar.gz cd mysql-5.6.34 cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DSYSCONFDIR=/etc \ -DWITH_SSL=bundled -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci \ -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 \ -DMYSQL_TCP_PORT=3306 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ -DMYSQL_DATADIR=/usr/local/mysql/data make && make install
1.6 添加開機啟動腳本
cp support-files/mysql.server /etc/rc.d/init.d/mysqld
1.7 添加masterA配置文件/etc/my.cnf
[client] port = 3306 socket = /tmp/mysql.sock [mysqld] basedir = /usr/local/mysql port = 3306 socket = /tmp/mysql.sock datadir = /usr/local/mysql/data pid-file = /usr/local/mysql/data/mysql.pid log-error = /usr/local/mysql/data/mysql.err server-id = 1 auto_increment_offset = 1 auto_increment_increment = 2 #奇數(shù)ID log-bin = mysql-bin #打開二進制功能,MASTER主服務(wù)器必須打開此項 binlog-format=ROW binlog-row-p_w_picpath=minimal log-slave-updates=true gtid-mode=on enforce-gtid-consistency=true master-info-repository=TABLE relay-log-info-repository=TABLE sync-master-info=1 slave-parallel-workers=0 sync_binlog=0 binlog-checksum=CRC32 master-verify-checksum=1 slave-sql-verify-checksum=1 binlog-rows-query-log_events=1 #expire_logs_days=5 max_binlog_size=1024M #binlog單文件最大值 replicate-ignore-db = mysql #忽略不同步主從的數(shù)據(jù)庫 replicate-ignore-db = information_schema replicate-ignore-db = performance_schema replicate-ignore-db = test replicate-ignore-db = zabbix max_connections = 3000 max_connect_errors = 30 skip-character-set-client-handshake #忽略應(yīng)用程序想要設(shè)置的其他字符集 init-connect='SET NAMES utf8' #連接時執(zhí)行的SQL character-set-server=utf8 #服務(wù)端默認字符集 wait_timeout=1800 #請求的最大連接時間 interactive_timeout=1800 #和上一參數(shù)同時修改才會生效 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #sql模式 max_allowed_packet = 10M bulk_insert_buffer_size = 8M query_cache_type = 1 query_cache_size = 128M query_cache_limit = 4M key_buffer_size = 256M read_buffer_size = 16K skip-name-resolve slow_query_log=1 long_query_time = 6 slow_query_log_file=slow-query.log innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 16M [mysql] no-auto-rehash [myisamchk] key_buffer_size = 20M sort_buffer_size = 20M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout [mysqldump] quick max_allowed_packet = 16M [mysqld_safe]
1.8 特別參數(shù)說明
log-slave-updates = true #將復(fù)制事件寫入binlog,一臺服務(wù)器既做主庫又做從庫此選項必須要開啟 #masterA自增長ID auto_increment_offset = 1 auto_increment_increment = 2 #奇數(shù)ID #masterB自增加ID auto_increment_offset = 2 auto_increment_increment = 2 #偶數(shù)ID
1.9 添加masterB配置文件/etc/my.cnf
[client] port = 3306 socket = /tmp/mysql.sock [mysqld] basedir = /usr/local/mysql port = 3306 socket = /tmp/mysql.sock datadir = /usr/local/mysql/data pid-file = /usr/local/mysql/data/mysql.pid log-error = /usr/local/mysql/data/mysql.err server-id = 2 auto_increment_offset = 2 auto_increment_increment = 2 #偶數(shù)ID log-bin = mysql-bin #打開二進制功能,MASTER主服務(wù)器必須打開此項 binlog-format=ROW binlog-row-p_w_picpath=minimal log-slave-updates=true gtid-mode=on enforce-gtid-consistency=true master-info-repository=TABLE relay-log-info-repository=TABLE sync-master-info=1 slave-parallel-workers=0 sync_binlog=0 binlog-checksum=CRC32 master-verify-checksum=1 slave-sql-verify-checksum=1 binlog-rows-query-log_events=1 #expire_logs_days=5 max_binlog_size=1024M #binlog單文件最大值 replicate-ignore-db = mysql #忽略不同步主從的數(shù)據(jù)庫 replicate-ignore-db = information_schema replicate-ignore-db = performance_schema replicate-ignore-db = test replicate-ignore-db = zabbix max_connections = 3000 max_connect_errors = 30 skip-character-set-client-handshake #忽略應(yīng)用程序想要設(shè)置的其他字符集 init-connect='SET NAMES utf8' #連接時執(zhí)行的SQL character-set-server=utf8 #服務(wù)端默認字符集 wait_timeout=1800 #請求的最大連接時間 interactive_timeout=1800 #和上一參數(shù)同時修改才會生效 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #sql模式 max_allowed_packet = 10M bulk_insert_buffer_size = 8M query_cache_type = 1 query_cache_size = 128M query_cache_limit = 4M key_buffer_size = 256M read_buffer_size = 16K skip-name-resolve slow_query_log=1 long_query_time = 6 slow_query_log_file=slow-query.log innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 16M [mysql] no-auto-rehash [myisamchk] key_buffer_size = 20M sort_buffer_size = 20M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout [mysqldump] quick max_allowed_packet = 16M [mysqld_safe]
1.10 初始化MySQL
cd /usr/local/mysql scripts/mysql_install_db --user=mysql
1.11 為啟動腳本賦予可執(zhí)行權(quán)限并啟動MySQL
chmod +x /etc/rc.d/init.d/mysqld /etc/init.d/mysqld start
2. 配置主從同步
2.1 添加主從同步賬戶
masterA上:
mysql> grant replication slave on *.* to 'repl'@'192.168.10.12' identified by '123456'; mysql> flush privileges;
masterB上:
mysql> grant replication slave on *.* to 'repl'@'192.168.10.11' identified by '123456'; mysql> flush privileges;
2.2 查看主庫的狀態(tài)
masterA上:
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000003 | 120 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
masterB上
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000003 | 437 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
2.3 配置同步信息:
masterA上:
mysql> change master to master_host='192.168.10.12',master_port=3306,master_user='repl',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=437; mysql> start slave; mysql> show slave status\G;
顯示有如下狀態(tài)則正常:
Slave_IO_Running: Yes Slave_SQL_Running: Yes
masterB上:
#本人是測試環(huán)境,可以保證沒數(shù)據(jù)寫入,否則需要的步驟是:先masterA鎖表-->masterA備份數(shù)據(jù)-->masterA解鎖表 -->masterB導(dǎo)入數(shù)據(jù)-->masterB設(shè)置主從-->查看主從 mysql> change master to master_host='192.168.10.11',master_port=3306,master_user='repl',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=120; start slave; mysql> show slave status\G;
顯示有如下狀態(tài)則正常:
Slave_IO_Running: Yes Slave_SQL_Running: Yes
3.測試主從同步
3.1 在masterA上創(chuàng)建一個數(shù)據(jù)庫測試同步效果
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.00 sec) mysql> create database test01; Query OK, 1 row affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | test01 | +--------------------+ 5 rows in set (0.00 sec) mysql> quit Bye [root@masterA data]#
3.2 到masterB查看是否已經(jīng)同步創(chuàng)建數(shù)據(jù)庫
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | test01 | +--------------------+ 5 rows in set (0.00 sec) mysql> quit Bye [root@masterB data]#
4. 開啟MySQL5.6的GTID功能
masterA和masterB分別執(zhí)行如下命令:
mysql> stop slave; Query OK, 0 rows affected (0.00 sec) mysql> change master to MASTER_AUTO_POSITION=1; Query OK, 0 rows affected (0.01 sec) mysql> start slave; Query OK, 0 rows affected (0.00 sec)
5. 遇到的問題
一種主從報錯折騰了我半天:
Last_IO_Errno: 1236
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not open log file'
后面修改主從同步相關(guān) 參數(shù),確認原因是my.cnf增加了如下參數(shù):
log-bin = mysql-bin relay-log = mysql-bin
從正常主主同步時的二進制日志文件顯示,有2套二進制日志。因此推斷上面2個參數(shù)導(dǎo)致不能產(chǎn)生2套二進制文件,故導(dǎo)致二進制文件錯亂和丟失。
到此這篇關(guān)于MySQL雙主(主主)架構(gòu)配置方案的文章就介紹到這了,更多相關(guān)MySQL 雙主內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
與MSSQL對比學(xué)習MYSQL的心得(七)--查詢
在這個《與MSSQL對比學(xué)習MYSQL的心得》系列里面,我一直都把MYSQL跟SQLSERVER進行比較,相互進行比較是學(xué)習一樣?xùn)|西比較好的方法2014-08-08MySQL5.7慢查詢?nèi)罩緯r間與系統(tǒng)時間差8小時原因詳解
這篇文章主要介紹了MySQL5.7慢查詢?nèi)罩緯r間與系統(tǒng)時間差8小時原因詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2020-01-01mysql數(shù)據(jù)庫 主從復(fù)制的配置方法
本文主要介紹 mysql數(shù)據(jù)庫 主從負責的配置方法,在做數(shù)據(jù)庫開發(fā)的時候有時候會遇到,這里做出詳細流程,大家可以參考下2016-07-07mysql5.7數(shù)據(jù)庫安裝完成后如何配置環(huán)境變量
這篇文章主要為大家詳細介紹了在win10系統(tǒng)下,mysql5.7數(shù)據(jù)庫安裝完成后配置環(huán)境變量的具體步驟,感興趣的小伙伴們可以參考一下2016-06-06