1、mysql的主從複製
node
複製過程須要至少兩個mysql服務節點,mysql的主從複製框架通常都爲一主多從,從多機房彙總到數據中心的模式,而複製過程只能從主服務器到從服務器實現。
mysql
複製過程當中,主服務器負責讀/寫操做,而從服務器只負責讀操做
sql
2、主從複製的功能數據庫
一、實現數據冗餘、異地災備恢復、備份
vim
二、實現數據的讀/寫分離
安全
三、實現數據庫服務的負載均衡
服務器
四、實現高可用與故障切換
session
五、實現MySQL的升級測試
負載均衡
3、主從複製過程當中注意的事項框架
一、不要混合shi用不一樣的存儲引擎
二、主從服務器的server-id 要保持不一樣
三、盡力避免修改從服務器的數據庫
四、儘量的使用基於行或基於混合模式的複製,避免使用基於語句的複製
五、主服務器要啓動二進制日誌,而從節點則是開啓中繼日誌,並且要確保從服務器的複製線程時刻開啓着
六、注意由於磁盤及內存的大小不足而致使的複製崩潰
4、主從複製的具體實現過程
一、準備兩個安裝過mysql服務的節點xz:172.16.200.5,node2:172.16.200.7,修改主機名並同步時間;
[root@xz ~]# hostname master [root@master ~]# crontab -e */1 * * * * /usr/sbin/ntpdate 172.16.0.1 &> /dev/null [root@node2 ~]# hostname slave [root@slave ~]# crontab -e */1 * * * * /usr/sbin/ntpdate 172.16.0.1 &> /dev/null
二、在主節點上建立有複製權限的用戶,於從節點上使用受權用戶鏈接測試;
[root@master ~]# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.5.33-log MySQL Community Server (GPL) 。。。。。 mysql> grant replication slave,replication client on *.* to 'zly'@'172.16.200.7' identified by 'mypass'; Query OK, 0 rows affected (0.35 sec) mysql> flush privileges; Query OK, 0 rows affected (0.09 sec) mysql> show grants for 'zly'@'172.16.200.7'; +-----------------------------------------------------------------------------------------------------------------------------------------------+ | Grants for zly@172.16.200.7 | +-----------------------------------------------------------------------------------------------------------------------------------------------+ | GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'zly'@'172.16.200.7' IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4' | +-----------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.03 sec) ........... [root@slave ~]# mysql -uzly -pmypass -h 172.16.200.5 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.5.33-log MySQL Community Server (GPL) Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
三、修改主從兩個節點的配置文件,並從新啓動mysql服務;
[root@master ~]# vim /etc/my.cnf log-bin=mysql-bin log_bin_index = mysql_bin.index binlog_format=mixed server-id = 5 [root@master ~]# killall mysqld [root@master ~]# ps aux | grep mysqld root 7700 0.0 0.1 103244 832 pts/3 S+ 09:27 0:00 grep mysqld [root@master ~]# service mysqld restart MySQL server PID file could not be found! [FAILED] Starting MySQL... [ OK ] [root@master ~]# service mysqld restart Shutting down MySQL. [ OK ] Starting MySQL.. [ OK ] ............... [root@slave ~]# vim /etc/my.cnf #log-bin=mysql-bin # binary logging format - mixed recommended #binlog_format=mixed skip_slave_start = 1 read_only = 1 relay_log = relay_log relay_log_index = relay_log.index # required unique id between 1 and 2^32 - 1 # defaults to 1 if master-host is not set # but will not function as a master if omitted server-id = 7 [root@slave ~]# killall mysqld [root@slave ~]# ps aux | grep mysqld root 8796 0.0 0.1 103244 832 pts/4 S+ 23:45 0:00 grep mysqld [root@slave ~]# service mysqld restart MySQL server PID file could not be found! [FAILED] Starting MySQL.. [ OK ] [root@slave ~]# service mysqld restart Shutting down MySQL. [ OK ] Starting MySQL.. [ OK ]
四、查看主節點的二進制日誌及其事件位置;
mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000011 | 107 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
五、與從節點上覆制主節點上的數據;
[root@slave ~]# mysql mysql> help change master to Name: 'CHANGE MASTER TO' Description: Syntax: CHANGE MASTER TO option [, option] ... option: MASTER_BIND = 'interface_name' | MASTER_HOST = 'host_name' | MASTER_USER = 'user_name' | MASTER_PASSWORD = 'password' | MASTER_PORT = port_num | MASTER_CONNECT_RETRY = interval | MASTER_HEARTBEAT_PERIOD = interval | MASTER_LOG_FILE = 'master_log_name' | MASTER_LOG_POS = master_log_pos | RELAY_LOG_FILE = 'relay_log_name' | RELAY_LOG_POS = relay_log_pos | MASTER_SSL = {0|1} | MASTER_SSL_CA = 'ca_file_name' | MASTER_SSL_CAPATH = 'ca_directory_name' | MASTER_SSL_CERT = 'cert_file_name' | MASTER_SSL_KEY = 'key_file_name' | MASTER_SSL_CIPHER = 'cipher_list' | MASTER_SSL_VERIFY_SERVER_CERT = {0|1} | IGNORE_SERVER_IDS = (server_id_list) server_id_list: [server_id [, server_id] ... ] ........................................ mysql> change master to -> master_host='172.16.200.5',master_user='zly',master_password='mypass ',master_port=3306,master_log_file='mysql-bin.000011',master_log_pos=107; Query OK, 0 rows affected (0.07 sec)
六、啓動從服務器複製線程、查看狀態,並查看啓動的線程;
mysql> start slave; Query OK, 0 rows affected (0.01 sec) mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.16.200.5 Master_User: zly Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000011 Read_Master_Log_Pos: 107 Relay_Log_File: relay_log.000002 Relay_Log_Pos: 253 Relay_Master_Log_File: mysql-bin.000011 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 107 Relay_Log_Space: 403 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No ................................. mysql> show processlist\G *************************** 1. row *************************** Id: 1 User: root Host: localhost db: NULL Command: Query Time: 0 State: NULL Info: show processlist *************************** 2. row *************************** Id: 2 User: system user Host: db: NULL Command: Connect Time: 276 State: Waiting for master to send event Info: NULL *************************** 3. row *************************** Id: 3 User: system user Host: db: NULL Command: Connect Time: 275 State: Slave has read all relay log; waiting for the slave I/O thread to update it Info: NULL 3 rows in set (0.00 sec)
七、在主節點上建立數據庫查看從節點是否已經複製;
[root@master ~]# mysql -e "create database classdb;" [root@master ~]# mysql -e "show databases;" +--------------------+ | Database | +--------------------+ | information_schema | | classdb | | mysql | | performance_schema | | testdb | +--------------------+ [root@slave ~]# mysql -e "show databases;" +--------------------+ | Database | +--------------------+ | information_schema | | classdb | | mysql | | performance_schema | +--------------------+
八、與主從節點查看已經更新的狀態及二進制日誌位置
[root@master ~]# mysql -e "show master status;" +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000011 | 453 | | | +------------------+----------+--------------+------------------+ [root@slave ~]# mysql -e "show slave status\G" *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.16.200.5 Master_User: zly Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000011 Read_Master_Log_Pos: 453 Relay_Log_File: relay_log.000002 Relay_Log_Pos: 599 Relay_Master_Log_File: mysql-bin.000011 Slave_IO_Running: Yes Slave_SQL_Running: Yes
至此mysql的主從複製已經完成
5、mysql的半同步複製的具體實現
半同步複製:主服務器只要收到從服務器中的一臺的返回信息,就會提交,不然需等待直至達到超時時間而後切換成異步再提交。可使主從服務器的數據庫數據的延遲較小,能夠在損失很小的性能的前提下提升數據的安全性。
要進行半同步複製,只須要在主從服務器上安裝上半同步複製的插件,並開啓半同步複製功能,即可以進行主從複製了。
一、查看主從節點上的半同步插件,並安裝插件;
[root@master ~]# cd /usr/local/mysql/lib/plugin/ [root@master plugin]# ls adt_null.so debug qa_auth_server.so auth.so libdaemon_example.so semisync_master.so auth_socket.so mypluglib.so semisync_slave.so auth_test_plugin.so qa_auth_client.so daemon_example.ini qa_auth_interface.so .................... [root@slave ~]# cd /usr/local/mysql/lib/plugin/ [root@slave plugin]# ls adt_null.so debug qa_auth_server.so auth.so libdaemon_example.so semisync_master.so auth_socket.so mypluglib.so semisync_slave.so auth_test_plugin.so qa_auth_client.so daemon_example.ini qa_auth_interface.so ...................... [root@master plugin]# mysql mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so'; Query OK, 0 rows affected (0.03 sec) mysql> set global rpl_semi_sync_master_enabled = 1; Query OK, 0 rows affected (0.00 sec) mysql> set global rpl_semi_sync_master_timeout = 1000; Query OK, 0 rows affected (0.00 sec) .................................. [root@slave plugin]# mysql mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; Query OK, 0 rows affected (0.04 sec) mysql> set global rpl_semi_sync_slave_enabled = 1 ; Query OK, 0 rows affected (0.01 sec) mysql> stop slave io_thread; Query OK, 0 rows affected (0.01 sec) mysql> start slave io_thread; Query OK, 0 rows affected (0.01 sec)
二、查看半同步開啓的狀態,並查看從節點的線程啓動狀態;
mysql> show global status like 'rpl_semi%'; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 1 | | 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 | +--------------------------------------------+-------+ 14 rows in set (0.00 sec) mysql> show global variables like '%rpl%'; +------------------------------------+-------+ | Variable_name | Value | +------------------------------------+-------+ | rpl_recovery_rank | 0 | | rpl_semi_sync_master_enabled | ON | | rpl_semi_sync_master_timeout | 1000 | | rpl_semi_sync_master_trace_level | 32 | | rpl_semi_sync_master_wait_no_slave | ON | +------------------------------------+-------+ 5 rows in set (0.00 sec) ............... mysql> show global status like 'rpl_semi%'; +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | Rpl_semi_sync_slave_status | ON | +----------------------------+-------+ 1 row in set (0.00 sec) mysql> show global variables like '%rpl%'; +---------------------------------+-------+ | Variable_name | Value | +---------------------------------+-------+ | rpl_recovery_rank | 0 | | rpl_semi_sync_slave_enabled | ON | | rpl_semi_sync_slave_trace_level | 32 | +---------------------------------+-------+ 3 rows in set (0.00 sec) ................ [root@slave ~]# mysql -e 'show slave status\G' *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.16.200.5 Master_User: zly Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000011 Read_Master_Log_Pos: 453 Relay_Log_File: relay_log.000003 Relay_Log_Pos: 253 Relay_Master_Log_File: mysql-bin.000011 Slave_IO_Running: Yes Slave_SQL_Running: Yes
三、主從雙方節點都存在新建的class數據庫,於主服務器上刪除該數據庫,而後查看從服務器是否也同步刪除了;
[root@master ~]# mysql -e 'show databases;' +--------------------+ | Database | +--------------------+ | information_schema | | classdb | | mysql | | performance_schema | | testdb | +--------------------+ [root@slave ~]# mysql -e 'show databases;' +--------------------+ | Database | +--------------------+ | information_schema | | classdb | | mysql | | performance_schema | +--------------------+ 。。。。。。。。。。。。。 [root@master ~]# mysql -e 'drop database classdb;' [root@master ~]# mysql -e 'show databases;' +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | testdb | +--------------------+ [root@slave ~]# mysql -e 'show databases;' +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | +--------------------+
至此,mysql的半同步複製已經完成。