mysql的主從複製與半同步複製(一)

一、mysql的主從複製

複製過程需要至少兩個mysql服務節點,mysql的主從複製框架一般都爲一主多從,從多機房彙總到數據中心的模式,而複製過程只能從主服務器到從服務器實現。

複製過程中,主服務器負責讀/寫操作,而從服務器只負責讀操作

二、主從複製的功能

1、實現數據冗餘、異地災備恢復、備份

2、實現數據的讀/寫分離

3、實現數據庫服務的負載均衡

4、實現高可用與故障切換

5、實現MySQL的升級測試

三、主從複製過程中注意的事項

1、不要混合shi用不同的存儲引擎

2、主從服務器的server-id 要保持不同

3、盡力避免修改從服務器的數據庫

4、儘可能的使用基於行或基於混合模式的複製,避免使用基於語句的複製

5、主服務器要啓動二進制日誌,而從節點則是開啓中繼日誌,而且要確保從服務器的複製線程時刻開啓着

6、注意因爲磁盤及內存的大小不足而導致的複製崩潰

四、主從複製的具體實現過程

mysql主從複製拓撲圖212339331.jpg

1、準備兩個安裝過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

2、在主節點上創建有複製權限的用戶,於從節點上使用授權用戶連接測試;


[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 [email protected]                                                                                                                   |
+-----------------------------------------------------------------------------------------------------------------------------------------------+
| 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>

3、修改主從兩個節點的配置文件,並重新啓動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  ]

4、查看主節點的二進制日誌及其事件位置;

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000011 |      107 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

5、與從節點上覆制主節點上的數據;

[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)

6、啓動從服務器複製線程、查看狀態,並查看啓動的線程;

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)

7、在主節點上創建數據庫查看從節點是否已經複製;

[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 |
+--------------------+

8、與主從節點查看已經更新的狀態及二進制日誌位置

[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的主從複製已經完成

五、mysql的半同步複製的具體實現

半同步複製:主服務器只要收到從服務器中的一臺的返回信息,就會提交,否則需等待直至達到超時時間然後切換成異步再提交。可以使主從服務器的數據庫數據的延遲較小,可以在損失很小的性能的前提下提高數據的安全性。

要進行半同步複製,只需要在主從服務器上安裝上半同步複製的插件,並開啓半同步複製功能,便可以進行主從複製了。

1、查看主從節點上的半同步插件,並安裝插件;

[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)

2、查看半同步開啓的狀態,並查看從節點的線程啓動狀態;

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

3、主從雙方節點都存在新建的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的半同步複製已經完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章