讀寫分離前端
複製:每一個節點都有相同的數據集node
向外擴展mysql
二進制日誌linux
單向sql
複製的功用:數據庫
數據分佈vim
負載均衡讀centos
備份安全
高可用和故障切換服務器
MySQL升級測試
主從複製:主節點將數據同步到多個從節點
級聯複製:主節點將數據同步到一個從節點,其餘的從節點在向從節點複製數據
同步複製:將數據從主節點所有同步到從節點時才返回給用戶的複製策略叫同步複製
異步複製:只要數據寫入到主節點就當即返回給用戶同步完成
讀寫分離:在前端加一個調度器,負責將改變數據的語句和查詢數據的語句分開調度,把寫操做調度到主節點,讀操做調度到從節點
主節點:
dump Thread:爲每一個Slave的I/O Thread啓動一個dump線程,用於向其發送binary log events
從節點:
I/O Thread:向Master請求二進制日誌事件,並保存於中繼日誌中
SQL Thread:從中繼日誌中讀取日誌事件,在本地完成重放
跟複製功能相關的文件:
master.info:用於保存slave鏈接至master時的相關信息,例如帳號、密碼、服務器地址等
relay-log.info(中繼日誌):保存在當前slave節點上已經複製的當前二進制日誌和本地replay log日誌的對應關係
複製架構:
一主一從
一主多從
主主複製
環狀複製
級聯複製
多主一從
主服務器配置
~]# vim /etc/my.cnf [mysqld] log_bin binlog_format=ROW server_id=1 ~]# systemctl restart mariadb ~]# mysql MariaDB [(none)]> grant replication slave on *.* to lv(從服務接收的用戶)@'192.168.130.%' identified by 'centos'; #受權同步帳號 Query OK, 0 rows affected (0.01 sec) MariaDB [(none)]> show master logs; +--------------------+-----------+ | Log_name | File_size | +--------------------+-----------+ | mariadb-bin.000001 | 19578633 | | mariadb-bin.000002 | 395 | #記錄此位置,從服務器從這裏開始同步 +--------------------+-----------+ 2 rows in set (0.00 sec)
2)從服務器配置
~]# vim /etc/my.cnf [mysqld] server_id=2 #服務器ID惟一 relay_log=relay-log #relay log的文件路徑,默認值hostname-relay-bin relay_log_index=relay-log.index #默認值hostname-relay-bin.index read_only=ON ~]# systemctl restart mariadb #重啓服務 ~]# mysql MariaDB [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.130.8', #指定主節點IP -> MASTER_USER='lv', #同步用戶的用戶名 -> MASTER_PASSWORD='centos', #同步用戶的密碼 -> MASTER_PORT=3306, #數據庫的端口號 -> MASTER_LOG_FILE='mariadb-bin.000002', #以上記錄的文件
-> MASTER_LOG_POS=395, #位置
-> MASTER_CONNECT_RETRY=10; #重試時間10秒
MariaDB [(none)]> START SLAVE; #開始主從複製
3)測試
在主節點上生成一些數據: MariaDB [(none)]> CREATE DATABASE testdb; MariaDB [(none)]> use testdb MariaDB [testdb]> create table testlog (id int auto_increment primary key,name char(20),age int default 20); MariaDB [testdb]> delimiter $$ MariaDB [testdb]> create procedure pro_testlog() -> begin -> declare i int; -> set i = 1; -> while i < 100000 -> do insert into testlog(name,age) values (concat('testuser',i),i); -> set i = i +1; -> end while; -> end$$ MariaDB [testdb]> delimiter ; MariaDB [testdb]> START TRANSACTION; MariaDB [testdb]> CALL pro_testlog; MariaDB [testdb]> COMMIT;
在從節點上查看同步狀況: MariaDB [(none)]> SELECT COUNT(*) FROM testdb.testlog; +----------+ | COUNT(*) | +----------+ | 99999 | #同步成功 +----------+ MariaDB [(none)]> SHOW SLAVE STATUS\G *************************** 1. row **************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.130.8 Master_User: lv Master_Port: 3306 Connect_Retry: 10 Master_Log_File: mariadb-bin.000002 Read_Master_Log_Pos: 10389814 Relay_Log_File: relay-log.000002 Relay_Log_Pos: 10389944 Relay_Master_Log_File: master1-bin.000002 Slave_IO_Running: Yes #IO線程已啓動 Slave_SQL_Running: Yes #SQL線程已啓動 Seconds_Behind_Master: 0 #主從複製的時間差 Master_Server_Id: 1
1)主服務器配置
~]# vim /etc/my.cnf [mysqld] log_bin binlog_format=ROW log-basename=master1 server_id=1 #爲當前節點設置一個全局唯的ID號 ~]# systemctl restart mariadb ~]# mysqldump -uroot -pcentos -A -F --single-transaction --master-data=1 > full.sql ~]# scp full.sql root@192.168.130.7:/root/ ~]#mysql MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO testuser(從服務接收的用戶)@'192.168.130.7' IDENTIFIED BY 'centos';
2)從服務器配置~]# vim /etc/my.cnf
[mysqld] server_id=2 #爲當前節點設置一個全局唯的ID號 relay_log=relay-log read_only=ON ~]# systemctl restart mariadb ~]# vim full.sql #在備份的SQL文件中加入如下信息 CHANGE MASTER TO MASTER_HOST='192.168.130.8', MASTER_USER='testuser', MASTER_PASSWORD='centos', MASTER_PORT=3306, MASTER_LOG_FILE='mariadb-bin.000003',# 已默認的 MASTER_LOG_POS=245, #已默認的 MASTER_CONNECT_RETRY=10; ~]# mysql < full.sql #導入SQL的同時配置已經完成 MariaDB [(none)]> SELECT COUNT(*) FROM testdb.testlog; +----------+ | COUNT(*) | +----------+ | 99999 | +----------+ MariaDB [(none)]> START SLAVE; #啓動同步複製 MariaDB [(none)]> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.130.8 Master_User: testuser Master_Port: 3306 Connect_Retry: 10 Master_Log_File: mariadb-bin.000003 Read_Master_Log_Pos: 401 Relay_Log_File: relay-log.024649 Relay_Log_Pos: 531 Relay_Master_Log_File: mariadb-bin.000003 Slave_IO_Running: Yes #IO線程已啓動
Slave_SQL_Running: Yes #SQL線程已啓動 Seconds_Behind_Master: 0 #主從複製的時間差 Master_Server_Id: 1
1)主節點
[root@master ~]# vim /etc/my.cnf [mysqld] log_bin binlog_format=ROW server_id=1 [root@master ~]# systemctl restart mariadb MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO testuser@'192.168.130.%' IDENTIFIED BY 'centos'; MariaDB [(none)]> SHOW MASTER LOGS;
+--------------------+-----------+
| Log_name | File_size |
+--------------------+-----------+
| mariadb-bin.000001 | 19578756 |
| mariadb-bin.000002 | 401 |
+--------------------+-----------+
2 rows in set (0.00 sec)
2)從節點
[root@slave1 ~]# vim /etc/my.cnf [mysqld] log_bin #注意,級聯架構中中繼從節點必定得開二進制日誌功能 binlog_format=ROW read_only=ON server_id=2 log_slave_updates #這項爲關鍵,做用是將從服務的數據改變記錄到二進制日誌文件中 relay_log=relay-log relay_log_index=relay-log.index [root@slave1 ~]# systemctl start mariadb MariaDB [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.130.10', -> MASTER_USER='testuser', -> MASTER_PASSWORD='ccentos', -> MASTER_PORT=3306, -> MASTER_LOG_FILE='mariadb-bin.000002', -> MASTER_LOG_POS=401, -> MASTER_CONNECT_RETRY=10; MariaDB [(none)]> START SLAVE; MariaDB [(none)]> show master logs; +--------------------+-----------+ | Log_name | File_size | +--------------------+-----------+ | mariadb-bin.000001 | 19578633 | | mariadb-bin.000002 | 10389327 | | mariadb-bin.000003 | 1792 | | mariadb-bin.000004 | 264 | | mariadb-bin.000005 | 245 | +--------------------+-----------+ 5 rows in set (0.00 sec) MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO testuser@'192.168.0.%' IDENTIFIED BY 'centos';
3)從節點的從節點
[root@slave2 ~]# vim /etc/my.cnf [mysqld] read_only=ON server_id=3 relay_log=relay-log relay_log_index=relay-log.index [root@slave2 ~]# systemctl start mariadb MariaDB [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.130.8', -> MASTER_USER='testuser', -> MASTER_PASSWORD='centos', -> MASTER_PORT=3306, -> MASTER_LOG_FILE='mariadb-bin.000005', -> MASTER_LOG_POS=245, -> MASTER_CONNECT_RETRY=10; MariaDB [(none)]> START SLAVE;
4)測試
在主節點上生成一些數據:
MariaDB [(none)]> CREATE DATABASE testdb; MariaDB [(none)]> use testdb MariaDB [testdb]> create table testlog (id int auto_increment primary key,name char(20),age int default 20); MariaDB [testdb]> delimiter $$ MariaDB [testdb]> create procedure pro_testlog() -> begin -> declare i int; -> set i = 1; -> while i < 100000 -> do insert into testlog(name,age) values (concat('testuser',i),i); -> set i = i +1; -> end while; -> end$$ MariaDB [testdb]> delimiter ; MariaDB [testdb]> START TRANSACTION; MariaDB [testdb]> CALL pro_testlog; MariaDB [testdb]> COMMIT;
在從節點上查看同步狀況: MariaDB [(none)]> SELECT COUNT(*) FROM testdb.testlog; +----------+ | COUNT(*) | +----------+ | 99999 | #同步成功 +----------+ MariaDB [(none)]> SHOW SLAVE STATUS\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.130.10 Master_User: testuser Master_Port: 3306 Connect_Retry: 10 Master_Log_File: mariadb-bin.000002 Read_Master_Log_Pos: 401 Relay_Log_File: relay-log.000004 Relay_Log_Pos: 531 Relay_Master_Log_File: mariadb-bin.000002 Slave_IO_Running: Yes #IO線程已啓動 Slave_SQL_Running: Yes #SQL線程已啓動 Seconds_Behind_Master: 0 #主從複製的時間差 Master_Server_Id: 1
在從節點的從節點上查看同步狀況: MariaDB [(none)]> SELECT COUNT(*) FROM testdb.testlog; +----------+ | COUNT(*) | +----------+ | 99999 | #同步成功 +----------+ MariaDB [(none)]> SHOW SLAVE STATUS\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.130.8 Master_User: testuser Master_Port: 3306 Connect_Retry: 10 Master_Log_File: mariadb-bin.000005 Read_Master_Log_Pos: 401 Relay_Log_File: relay-log.000002 Relay_Log_Pos: 687 Relay_Master_Log_File: mariadb-bin.000005 Slave_IO_Running: Yes #IO線程已啓動 Slave_SQL_Running: Yes #SQL線程已啓動 Seconds_Behind_Master: 0 #主從複製的時間差 Master_Server_Id: 1
容易產生的問題:數據不一致,所以慎用;考慮要點:自動增加id 配置一個節點使用奇數id auto_increment_offset=1 開始點 auto_increment_increment=2 增加幅度 另外一個節點使用偶數id auto_increment_offset=2 auto_increment_increment=2
默認狀況下,MySQL的複製功能是異步的,異步複製能夠提供最佳的性能,主庫把binlog日誌發送給從庫即結束,並不驗證從庫是否接收完畢。這意味着當主服務器或從服務器端發生故障時,有可能從服務器沒有接收到主服務器發送過來的binlog日誌,這就會形成主服務器和從服務器的數據不一致,甚至在恢復時形成數據的丟失;半同步複製的機制是隻有當主節點和從節點同步完成,僅有一臺同步完成便可,返回寫入完成,這樣的機制保證了數據的安全性。

1)主節點
[root@master ~]# vim /etc/my.cnf [mysqld] log_bin binlog_format=ROW log-basename=master server_id=1 relay_log=relay-log relay_log_index=relay-log.index [root@master ~]# systemctl restart mariadb MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO testuser@'192.168.0.%' IDENTIFIED BY 'centos'; MariaDB [(none)]> SHOW MASTER LOGS; +--------------------+-----------+ | Log_name | File_size | +--------------------+-----------+ | mariadb-bin.000001 | 19578756 | | mariadb-bin.000002 | 586 | | mariadb-bin.000003 | 401 | +--------------------+-----------+ MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; #安裝模塊 MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_enabled=1; #開啓半同步功能 MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%'; +------------------------------------+-------+ | Variable_name | Value | +------------------------------------+-------+ | rpl_semi_sync_master_enabled | ON | #已開啓 | rpl_semi_sync_master_timeout | 10000 | | rpl_semi_sync_master_trace_level | 32 | | rpl_semi_sync_master_wait_no_slave | ON | +------------------------------------+-------+ MariaDB [(none)]> SHOW GLOBAL STATUS LIKE '%semi%'; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 0 | | Rpl_semi_sync_master_net_avg_wait_time | 0 | | Rpl_semi_sync_master_net_wait_time | 0 | | Rpl_semi_sync_master_net_waits | 0 | | Rpl_semi_sync_master_no_times | 0 | | Rpl_semi_sync_master_no_tx | 0 | | Rpl_semi_sync_master_status | ON | | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 0 | | Rpl_semi_sync_master_tx_wait_time | 0 | | Rpl_semi_sync_master_tx_waits | 0 | | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | | Rpl_semi_sync_master_wait_sessions | 0 | | Rpl_semi_sync_master_yes_tx | 0 | +--------------------------------------------+-------+
2)從節點1
[root@slave1 ~]# vim /etc/my.cnf [mysqld] read_only=ON log_bin binlog_format=ROW log-basename=slave server_id=2 relay_log=relay-log relay_log_index=relay-log.index [root@slave1 ~]# systemctl restart mariadb MariaDB [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.130.10', -> MASTER_USER='testuser', -> MASTER_PASSWORD='centos', -> MASTER_PORT=3306, -> MASTER_LOG_FILE='master-bin.000003', -> MASTER_LOG_POS=401, -> MASTER_CONNECT_RETRY=10; MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; #安裝模塊 MariaDB [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled=1; #開啓半同步功能 MariaDB [(none)]> START SLAVE; MariaDB [(none)]> SHOW MASTER LOGS; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | slave-bin.000001 | 245 | +------------------+-----------+ 1 row in set (0.00 sec) MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO repluser@'192.168.0.%' IDENTIFIED BY 'replpass';
3)從節點2
[root@slave2 ~]# vim /etc/my.cnf [mysqld] read_only=ON server_id=3 relay_log=relay-log relay_log_index=relay-log.index [root@slave2 ~]# systemctl restart mariadb MariaDB [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.130.10', -> MASTER_USER='testuser', -> MASTER_PASSWORD='centos', -> MASTER_PORT=3306, -> MASTER_LOG_FILE='slave-bin.000001', -> MASTER_LOG_POS=245, -> MASTER_CONNECT_RETRY=10; MariaDB [(none)]> START SLAVE; 固然,從服務器還能夠有不少,此處到此爲止。再按上面的測試一下就OK!
複製過濾器表示能夠指定只複製指定的表或者只複製指定的庫,其餘的表和庫都不進行復制,兩種方法能夠實現:
主服務器實現:主服務器指定只有指定的表或者庫的修改信息才傳遞到從服務器的中繼日誌,可是主服務器出現問題以後會丟失未複製表和庫的數據;不建議使用 (限定的二進制文件不會同步過來;這樣作會使二進制數據形成丟失)
從服務器實現:全部二進制日誌都傳到從服務器的中繼日誌,可是sql_thread只執行指定表和庫的修改語句,當主服務器出現故障,則不會丟失數據,全部建議採用從服務器的複製過濾;(將全部的二進制日誌文件都複製過來,但在同步到本身的數據庫時,會選擇不一樣步限制條件的內容)
從服務器配置: SET GLOBAL replicate_do_db=庫名 #指定只複製指定的庫(至關於庫的白名單) SET GLOBAL Replicate_Ignore_DB=庫名 #指定不復制指定的庫(至關於庫的黑名單) SET GLOBAL Replicate_Do_Table=表名 #指定只複製指定表(至關於表的白名單) SET GLOBAL Replicate_Ignore_Table=表名 #指定不復制指定表(至關於表的黑名單)
當指定了複製過濾器後,經過SHOW SLAVE STATUS;命令能夠查看到指定的庫和表
建議此配置寫入配置文件永久生效。
在默認的主從複製過程或遠程鏈接到MySQL/MariaDB全部的連接通訊中的數據都是明文的,外網裏訪問數據或則複製,存在安全隱患。經過SSL/TLS加密的方式進行復制的方法,來進一步提升數據的安全性
主服務器開啓SSL:[mysqld] 加一行ssl 主服務器配置證書和私鑰;而且建立一個要求必須使用SSL鏈接的複製帳號 從服務器使用CHANGER MASTER TO 命令時指明ssl相關選項
參看:https://mariadb.com/kb/en/library/replication-with-secureconnections/
MariaDB [(none)]> SHOW VARIABLES LIKE '%ssl%'; +---------------+----------+ | Variable_name | Value | +---------------+----------+ | have_openssl | DISABLED | | have_ssl | DISABLED | | ssl_ca | | | ssl_capath | | | ssl_cert | | | ssl_cipher | | | ssl_key | | +---------------+----------+
特別提示:在配置以前先檢查mysql服務是否支持ssl功能,若是have_ssl的值爲'DISABLED'則支持;若是爲'NO'則不支持,須要再從新編譯安裝或者安裝具備ssl功能的版本
1)CA
[root@CA ~]# mkdir /etc/my.cnf.d/ssl/ [root@CA ~]# cd /etc/my.cnf.d/ssl/ [root@CA ssl]# openssl genrsa 2048 > cakey.pem [root@CA ssl]# openssl req -new -x509 -key cakey.pem -out cacert.pem -days 3650 #自簽證書 Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:beijing Locality Name (eg, city) [Default City]:beijing Organization Name (eg, company) [Default Company Ltd]:testmysqlca Organizational Unit Name (eg, section) []:opt Common Name (eg, your name or your server's hostname) []:ca.testmysqlca.com [root@CA ssl]# openssl req -newkey rsa:2048 -days 365 -nodes -keyout master.key > master.csr Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:beijing Locality Name (eg, city) [Default City]:beijing Organization Name (eg, company) [Default Company Ltd]:testmysqlca Organizational Unit Name (eg, section) []:opt Common Name (eg, your name or your server's hostname) []:master.testmysqlca.com [root@CA ssl]# openssl x509 -req -in master.csr -CA cacert.pem -CAkey cakey.pem -set_serial 01 > master.crt #簽署master證書 [root@CA ssl]# openssl req -newkey rsa:2048 -days 365 -nodes -keyout slave.key > slave.csr Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:beijing Locality Name (eg, city) [Default City]:beijing Organization Name (eg, company) [Default Company Ltd]:testmysqlca Organizational Unit Name (eg, section) []:opt Common Name (eg, your name or your server's hostname) []:slave.testmysqlca.com [root@CA ssl]# openssl x509 -req -in slave.csr -CA cacert.pem -CAkey cakey.pem -set_serial 02 > slave.crt #簽署slave證書 [root@CA ssl]# openssl req -newkey rsa:2048 -days 365 -nodes -keyout slave2.key > slave2.csr Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:beijing Locality Name (eg, city) [Default City]:beijing Organization Name (eg, company) [Default Company Ltd]:testmysqlca Organizational Unit Name (eg, section) []:opt Common Name (eg, your name or your server's hostname) []:slave2.testmysqlca.com [root@CA ssl]# openssl x509 -req -in slave2.csr -CA cacert.pem -CAkey cakey.pem -set_serial 03 > slave2.crt #簽署slave2證書 [root@CA ssl]# openssl verify -CAfile cacert.pem master.crt slave.crt slave2.crt #檢查證書是否可用 master.crt: OK slave.crt: OK slave2.crt: OK 先在各個節點上建立/etc/my.cnf.d/ssl/文件夾,將各自的證書,CA的證書和各自的祕鑰文件複製過去 [root@CA ssl]# scp cacert.pem master.crt master.key root@192.168.0.7:/etc/my.cnf.d/ssl/ [root@CA ssl]# scp cacert.pem slave.crt slave.key root@192.168.0.8:/etc/my.cnf.d/ssl/ [root@CA ssl]# scp cacert.pem slave2.crt slave2.key root@192.168.0.9:/etc/my.cnf.d/ssl/
2)master
[root@master ~]# mkdir /etc/my.cnf.d/ssl/ [root@master ~]# vim /etc/my.cnf [mysqld] log_bin binlog_format=ROW log-basename=master server_id=1 ssl #開啓ssl功能 ssl-ca=/etc/my.cnf.d/ssl/cacert.pem #指定CA證書的路徑 ssl-cert=/etc/my.cnf.d/ssl/master.crt #指定本身的證書的路徑 ssl-key=/etc/my.cnf.d/ssl/master.key #指定本身的祕鑰文件路徑 [root@master ~]# systemctl restart mariadb MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO repluser@'192.168.0.%' IDENTIFIED BY 'replpass' REQUIRE SSL; #受權用戶而且強制迫使用戶開啓ssl登陸 MariaDB [(none)]> SHOW MASTER LOGS; +-------------------+-----------+ | Log_name | File_size | +-------------------+-----------+ | master-bin.000001 | 26753 | | master-bin.000002 | 921736 | | master-bin.000003 | 413 | +-------------------+-----------+
3)slave1
[root@slave1 ~]# mkdir /etc/my.cnf.d/ssl/ [root@slave1 ~]# mysql -urepluser -preplpass -h192.168.0.7 --ssl-ca=/etc/my.cnf.d/ssl/cacert.pem --ssl-cert=/etc/my.cnf.d/ssl/slave.crt --ssl-key=/etc/my.cnf.d/ssl/slave.key [root@slave1 ~]# vim /etc/my.cnf [mysqld] read_only=ON server_id=2 relay_log=relay-log relay_log_index=relay-log.index ssl ssl-ca=/etc/my.cnf.d/ssl/cacert.pem ssl-cert=/etc/my.cnf.d/ssl/slave.crt ssl-key=/etc/my.cnf.d/ssl/slave.key [root@slave1 ~]# systemctl restart mariadb MariaDB [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.0.7', -> MASTER_USER='repluser', -> MASTER_PASSWORD='replpass', -> MASTER_PORT=3306, -> MASTER_LOG_FILE='master-bin.000003', -> MASTER_LOG_POS=413, -> MASTER_CONNECT_RETRY=10, -> MASTER_SSL=1; #注意,須要指明開啓ssl連接 MariaDB [(none)]> START SLAVE;
4)slave2
[root@slave2 ~]# mkdir /etc/my.cnf.d/ssl/ [root@slave2 ~]# mysql -urepluser -preplpass -h192.168.0.7 --ssl-ca=/etc/my.cnf.d/ssl/cacert.pem --ssl-cert=/etc/my.cnf.d/ssl/slave2.crt --ssl-key=/etc/my.cnf.d/ssl/slave2.key [root@slave2 ~]# vim /etc/my.cnf [mysqld] read_only=ON server_id=3 relay_log=relay-log relay_log_index=relay-log.index ssl ssl-ca=/etc/my.cnf.d/ssl/cacert.pem ssl-cert=/etc/my.cnf.d/ssl/slave2.crt ssl-key=/etc/my.cnf.d/ssl/slave2.key [root@slave2 ~]# systemctl restart mariadb MariaDB [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.0.7', -> MASTER_USER='repluser', -> MASTER_PASSWORD='replpass', -> MASTER_PORT=3306, -> MASTER_LOG_FILE='master-bin.000003', -> MASTER_LOG_POS=413, -> MASTER_CONNECT_RETRY=10, -> MASTER_SSL=1; MariaDB [(none)]> START SLAVE;
選項:
log_bin 啓用二進制日誌,在主節點或級聯複製中間的從節點必需要開啓 binlog_format=ROW 二進制日誌記錄方式爲基於行的方式記錄,強烈建議開啓 log-basename=master | slave ... 二進制日誌的前綴名,不是必須向,但建議標識 server_id = # 服務器ID,各個節點的ID必須惟一 relay_log = relay-log 開啓中繼日誌,並以relay-log爲文件名開頭,從節點開啓 relay_log_index = relay-log.index 中繼日誌索引文件 log_slave_updates 做用是SQL線程重讀中繼日誌時將改變數據的操做記錄爲二進制日誌,在級聯複製中使用 ssl 開啓ssl功能 ssl-ca=/etc/my.cnf.d/ssl/cacert.pem ssl-cert=/etc/my.cnf.d/ssl/master.crt ssl-key=/etc/my.cnf.d/ssl/master.key sync_binlog=1 每次寫後當即同步二進制日誌到磁盤 innodb_flush_log_at_trx_commit=1 每次事務提交當即同步日誌寫磁盤 sync_master_info=# #次事件後master.info同步到磁盤 skip_slave_start=ON 不自動啓動slave sync_relay_log=# #次寫後同步relay log到磁盤 sync_relay_log_info=# #次事務後同步relay-log.info到磁盤 auto_increment_offset=1 自動增加開始點,在主主複製中使用 auto_increment_increment=2 增加幅度
變量:
replicate_do_db= 指定複製庫的白名單 replicate_ignore_db= 指定複製庫黑名單 replicate_do_table= 指定複製表的白名單 replicate_ignore_table= 指定複製表的黑名單 replicate_wild_do_table= foo%.bar% 支持通配符 replicate_wild_ignore_table= 指定複製的表,黑名單 rpl_semi_sync_slave_enabled=1 開啓半同步複製,須要安裝模塊
指令:
START SLAVE; 啓動主從複製 STOP SLAVE; 中止複製 SHOW SLAVE STATUS; 查看複製狀態 Seconds_Behind_Master: 0 從服務器是否落後於主服務 RESET SLAVE ALL; 重置從服務器的配置 MASTER_SSL=1, 配合 CHANGE MASTER TO 使用,開啓ssl加密複製 MASTER_SSL_CA = '/etc/my.cnf.d/ssl/cacert.pem', MASTER_SSL_CERT = '/etc/my.cnf.d/ssl/slave.crt', MASTER_SSL_KEY = '/etc/my.cnf.d/ssl/slave.key'; PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr } 刪除二進制日誌,謹慎操做 SHOW MASTER STATUS 查看二進制日誌狀態 SHOW BINLOG EVENTS 查看二進制日誌 SHOW BINARY LOGS 查看二進制日誌 SHOW PROCESSLIST 查看進程
MHA
對主節點進行監控,可實現自動故障轉移至其它從節點;經過提高某一從節點爲新的主節點,基於主從複製實現,還須要客戶端配合實現,目前MHA主要支持一主多從的架構,要搭建MHA,要求一個複製集羣中必須最少有三臺數據庫服務器,一主二從,即一臺充當master,一臺充當備用master,另一臺充當從庫。
工做原理
從宕機崩潰的master保存二進制日誌事件(binlog events) 識別含有最新更新的slave
應用差別的中繼日誌(relay log)到其餘的slave 應用從master保存的二進制日誌事件(binlog events) 提高一個slave爲新的master 使其餘的slave鏈接新的master進行復制
masterha_check_ssh 檢查MHA的SSH配置情況 masterha_check_repl 檢查MySQL複製情況 masterha_manger 啓動MHA masterha_check_status 檢測當前MHA運行狀態 masterha_master_monitor 檢測master是否宕機 masterha_master_switch 故障轉移(自動或手動) masterha_conf_host 添加或刪除配置的server信息
Node工具包:這些工具一般由MHA Manager的腳本觸發,無需人爲操做)主 要包括如下幾個工具:
save_binary_logs 保存和複製master的二進制日誌
apply_diff_relay_logs 識別差別的中繼日誌事件並將其差別的事件應用 於其餘的slave
purge_relay_logs 清除中繼日誌(不會阻塞SQL線程)
注意:爲了儘量的減小主庫硬件損壞宕機形成的數據丟失,所以在配置MHA 的同時建議配置成MySQL 5.5的半同步複製
實現主從高可用MHA (在主服務器宕機時,自動將從服務器切換成主服務器來使用)
此功能只是一次性的,切換以後,功能就停用了,若是想啓用須要再次開啓此功能。
結構拓撲圖:四臺主機;manager,master,slave1,slave2 (管理者,主服務器,兩個從服務器)
具體實驗步驟:
1). 準備
selinux ,iptables ,time (此實驗各臺服務器的時間要保持一致) 在vim /etc/ntp.conf 添加server 172.20.0.1 iburst systemctl start nptd
2) . 實現主從服務器的搭建
~]#vim /etc/my.cnf [mysqld] server_id=1 log_bin skip_name_resolve #跳過名字解析 ~]#systemctl start mariadb #重啓服務 mysql > grant replication slave on *.* to lv@’192.168.60.%’ identified by ‘centos’; #受權用戶帳號 mysql > show master logs; #查看此時的二進制日誌狀態爲後面從服務器同步時使用
3 ).在slave1服務器上
~]#vim /etc/my.cnf [mysqld] server_id=2 log_bin read_only=1 relay_log_purge=0 skip_name_resolve=1 ~]#systemctl start mariadb #重啓服務 mysql > CHANGE MASTER TO MASTER_HOST=’192.168.60.20′, MASTER_USER=’lv’, MASTER_PASSWORD=’centos’, MASTER_LOG_FILE=’mariadb-bin.000001′, MASTER_LOG_POS=394; #鏈接同步 mysql > start slave #開啓同步 mysql > show slave status\G; #查看同步狀態
4 ).在slave2服務器上:
~]#vim /etc/my.cnf [mysqld] server_id=3 log_bin read_only=1 relay_log_purge=0 skip_name_resolve=1 ~]#systemctl start mariadb #重啓服務 mysql > CHANGE MASTER TO MASTER_HOST=’192.168.60.20′, MASTER_USER=’lv’, MASTER_PASSWORD=’centos’, MASTER_LOG_FILE=’mariadb-bin.000001′, MASTER_LOG_POS=394; #鏈接同步 mysql > start slave #開啓同步 mysql > show slave status\G; #查看同步狀態
5 ). 在manager主機上:
實現基於key的驗證: ~]#ssh-keygen #生成私鑰對 ~]#ssh-copy-id 192.168.60.4 #把本身的公鑰複製到本身的機器上 ~]#cd .ssh #進到此目錄下 ~]#scp -pr .ssh 192.168.60.20:/root/ ~]#scp -pr .ssh 192.168.60.21:/root/ ~]#scp -pr .ssh 192.168.60.22:/root/ #將公鑰都複製到其餘主機的家目錄下
6) . 在master服務器上新建受權用戶:
grant all on *.* to testuser@’192.168.130.%’ identified by ‘centos’; # 此帳號因爲是如今創建的他會自動同步到其餘兩個從服務器上
7 ). 在管理節點上安裝兩個包: mha4mysql-manager mha4mysql-node #manager服務器上安裝
在被管理節點安裝: mha4mysql-node #主從服務器上安裝 mha4mysql-manager-0.56-0.el6.noarch.rpm Public Documents mha4mysql-node-0.56-0.el6.noarch.rpm #網上下載兩個包 ~]#yum install mha* #安裝兩個包,要依賴於epel源
8 ). 在主從的三個服務器上安裝mha4mysql-manager-0.56-0.el6.noarch.rpm Public包
9). 在manager服務器上建立一個文件:mkdir /etc/mha
~]#vim /etc/mha/app1.cnf [server default] user=testuser #此爲在第6步建立受權的用戶 password=centos manager_workdir=/data/mastermha/app1/ manager_log=/data/mastermha/app1/manager.log remote_workdir=/data/mastermha/app1/ ssh_user=root repl_user=lv repl_password=centos ping_interval=1 [server1] hostname=192.168.130.10 #主服務器的地址 candidate_master=1 [server2] hostname=192.168.130.7 #從服務器的地址 candidate_master=1 #添加此行表明,主服務器宕機時此爲備用的 [server3] hostname=192.168.130.8
10). MHA驗證和啓動 (檢查和驗證)
~]#masterha_check_ssh –conf=/etc/mha/app1.conf #探測ssh協議可否鏈接成功 ~]#masterha_check_repl –conf=/etc/mha/app1.conf #檢查複製功能 檢查複製功能時出現錯誤,提示lv用戶沒有複製的權限,添加上權限,在主服務器上:grant all on *.* to lv@’192.168.130.%’; 添加和後再查看一下權限:show grants for lv@’192.168.130.%’; ~]#masterha_manager –conf=/etc/mha/app1.conf #開啓監控功能此命令爲前臺運行命令,開啓後是不會退出的,以此執行詞條命令應該在終端上行,若是在遠程上執行,鏈接斷開會形成監控失敗
排錯日誌: /data/mha/app1/manager.log