輕鬆配置MYSQL的主-從複製,主-主複製,半同步複製及基於ssl的複製

MySQL複製

MYSQL的複製其實就是其中一臺服務器充當主服務器,而有一臺或多臺從服務器,它們以某種方式同步數據的過程就叫MYSQL的複製。


MYSQL複製的工作機制

由於畫圖水平有限,描述的可能不夠詳盡。根據圖示講解一下都表示什麼?分別有什麼用途?

MySQL複製過程中要啓用三個重要的線程:

(1)dump thread:主服務器從本地的二進制日誌傳送至從服務的中繼日誌

(2)IO Thread:從服務器向主服務器請求數據

(3)SQL thread:在從服務器上讀取中繼日誌並應用到本地服務器的線程

三個線程的調用關係就完成了數據複製的過程。

紅線表示的IO線程會每隔一段時間向主服務器請求獲取二進制文件;當主服務器中有新操作時就響應IO線程,再有dump線程讀取本地的二進制日誌傳遞給IO線程,IO線程則將讀取的語句記錄到本地的relay log中;當記錄完成後,SQL線程就會啓動起來,然後讀取relay log並應用至本地。


MYSQL複製的類型

MYSQL的複製類型有:主-從模型,主-主模型,半同步模型

一、主-從模型

在主從模型中,主服務器可以接收用戶的讀、寫操作,但從服務器只能執行讀操作。主從模型是如何配置的呢?現在就開始配置。

1、規劃

主服務器地址:192.168.0.100  主機名rs1

從服務器地址:192.168.0.101  主機名rs1

2、環境

這裏是基於虛擬機環境的,最好能夠同步時間。

3、配置步驟

在主服務器rs1上

(1)創建邏輯卷用於存放數據

  1. 創建一個20G的分區本機爲/dev/sda5,調整器類型爲8e  
  2. #pvcreate /dev/sda5  
  3. #vgcreate myvg /dev/sda5  
  4. #lvcreate -n mylv -L 10G myvg  
  5. #mke2fs -j /dev/myvg/mylv  
  6. #mkdir -p /data/mydata  
  7. 編寫/etc/fstab文件讓其能夠開機自動掛載  
  8. /dev/myvg/mylv  /data/mydata    ext3    defaults    0 0  

(2)安裝MYSQL

  1. #useradd -r mysql  
  2. #tar xf mysql-5.5.24-linux2.6-i686.tar.gz -C /usr/local   
  3. #cd /usr/local  
  4. #ln -sv mysql-5.5.24-linux2.6-i686 mysql  
  5. #cd mysql  
  6. #chown -R mysql.mysql .  
  7. #scripts/mysql_install_db --user=mysql --datadir=/data/mydata  
  8. #cp support-files/my-large.cnf /etc/my.cnf  
  9. #cp support-files/mysql.server /etc/rc.d/init.d/mysqld 
  10. 編輯主配置文件/etc/my.cnf
  11. thread_concurrency = 2 datadir = /data/mydata
  12. log-bin=mysql-bin //開啓二進制日誌
  13. binlog_format=mixed
  14. server-id = 1 //從服務器的Server-id不能與此值相同
  15. #chown -R root .  
  16. #service mysqld start  

(3)配置相關屬性

  1. #/usr/local/mysql/bin/mysql 
  2. mysql>grant replication slave,replication client on *.* to
  3.  repluser@'192.168.0.%' identified by 'sql123'; //創建有複製權限的用戶
  4. mysql>flush privileges; 
  5. mysql> show master status; 
  6. +------------------+----------+--------------+------------------+ 
  7. | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | 
  8. +------------------+----------+--------------+------------------+ 
  9. | mysql-bin.000001 |      355 |              |                  | 
  10. +------------------+----------+--------------+------------------+ 

在從服務器rs2上

(1)前面兩個步驟與主服務器相同,但在編輯配置文件時有所不同。

  1. #vim /etc/my.cnf
  2. thread_concurrency = 2 
  3. datadir = /data/mydata 
  4. log-bin=mysql-bin     //二進制日誌可以開啓也可以關閉 
  5. relay-log=mysql-relay  //一定要開啓中繼日誌 
  6. binlog_format=mixed 
  7. server-id       = 21  //從服務器的Server-id不能與此值相同 
  8. #service mysqld restart //重啓讓修改生效

(2)配置相關屬性

  1. #/usr/local/mysql/bin/mysql 
  2.  mysql> show global variables like '%relay_log%';//配置生效 
  3. +-----------------------+----------------+ 
  4. | Variable_name         | Value          | 
  5. +-----------------------+----------------+ 
  6. | max_relay_log_size    | 0              | 
  7. | relay_log             | mysql-relay    | 
  8. | relay_log_index       |                | 
  9. | relay_log_info_file   | relay-log.info | 
  10. | relay_log_purge       | ON             | 
  11. | relay_log_recovery    | OFF            | 
  12. | relay_log_space_limit | 0              | 
  13. | sync_relay_log        | 0              | 
  14. | sync_relay_log_info   | 0              | 
  15. +-----------------------+----------------+ 
  16. mysql> show global variables like 'server_id'; 
  17. +---------------+-------+ 
  18. | Variable_name | Value | 
  19. +---------------+-------+ 
  20. | server_id     | 11    | 
  21. +---------------+-------+ 
  22. mysql> change master to  
  23. master_host='192.168.0.100' //主服務器的地址
  24. master_user='repluser' ,   
  25. master_password='sql123',
  26. master_log_file='mysql-bin.000001',
  27. master_log_pos=355
  28. mysql> show slave status\G 
  29. *************************** 1. row *************************** 
  30.                Slave_IO_State:  
  31.                   Master_Host: 192.168.0.100 
  32.                   Master_User: repluser 
  33.                   Master_Port: 3306 
  34.                 Connect_Retry: 60 
  35.               Master_Log_File: mysql-bin.000001 
  36.           Read_Master_Log_Pos: 355 
  37.                Relay_Log_File: mysql-relay.000001 
  38.                 Relay_Log_Pos: 4 
  39.         Relay_Master_Log_File: mysql-bin.000001 
  40.              Slave_IO_Running: No 
  41.             Slave_SQL_Running: No 
  42. 此時IO線程和SQL線程沒有啓動,執行如下命令使其啓用 
  43. mysql>start slave; 

4、測試

此時主從基本配置已完成。下面進行一個小小的測試。

在主服務器上創建一個數據庫testdb,在從服務器上查看。

  1. mysql> show databases; 
  2. +---------------------+ 
  3. | Database            | 
  4. +---------------------+ 
  5. | information_schema  | 
  6. | #mysql50#lost+found | 
  7. | mysql               | 
  8. | performance_schema  | 
  9. | test                | 
  10. | testdb              | 
  11. +---------------------+ 

testdb已顯示出來,配置完成。

二、主-主模型

兩臺服務器都有二進制日誌和中繼日誌;服務器可讀可寫。但請注意配置對於有自動增長字段的數據要設置特別的屬性。

1、使用與主從模型相同的主機

2、配置

在rs1服務器上

(1)安裝軟件步驟同上述內容

(2)配置相關屬性

  1. #vim /etcmy.cnf  
  2.  log-bin=mysql-bin        //二進制日誌必須開啓  
  3.  relay-log=mysql-relay   //中繼日誌必須開啓  
  4.  auto-increment-increment = 2  //增長間隔爲2  
  5.  auto-increment-offset = 1 //自動增長的字段從1開始 
  6.  server-id       = 10 

  1. 進入mysql命令行  
  2. mysql>grant replication slave,replication client on *.*  
  3. to repluser@'192.168.0.%' identified by 'sql123';  
  4. mysql> show global variables like '%auto_increment%'; 
  5. +--------------------------+-------+ 
  6. | Variable_name            | Value | 
  7. +--------------------------+-------+ 
  8. | auto_increment_increment | 2     | 
  9. | auto_increment_offset    | 1     | 
  10. +--------------------------+-------+ 
  11. mysql> show master status;  
  12. +------------------+----------+--------------+------------------+  
  13. | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |  
  14. +------------------+----------+--------------+------------------+  
  15. | mysql-bin.000001 |      355 |              |                  |  
  16. +------------------+----------+--------------+------------------+  

在從服務器rs2上

(1)同樣的基本配置同上。在此直接編輯配置文件

  1. log-bin=mysql-bin 
  2. relay-log=mysql-relay 
  3. auto-increment-increment = 2 
  4. auto-increment-offset = 2 
  5. server-id       = 20 

  1. mysql> show global variables like '%auto_increment%'; 
  2. +--------------------------+-------+ 
  3. | Variable_name            | Value | 
  4. +--------------------------+-------+ 
  5. | auto_increment_increment | 2     | 
  6. | auto_increment_offset    | 2     | 
  7. +--------------------------+-------+ 
  8. mysql>change master to   
  9. master_host='192.168.0.100',  
  10. master_user='repluser',  
  11. master_password='sql123',  
  12. master_log_file='mysql-bin.000001',  
  13. master_log_pos=355;  
  14. mysql>start slave;  
  15.  
  16. mysql>grant replicatin slave,replication client on *.* to 
  17. repluser2@'192.168.0.%' identified by 'sql456'; //創建授權用戶 
  18.  
  19. mysql> show master status;  
  20. +------------------+----------+--------------+------------------+  
  21. | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |  
  22. +------------------+----------+--------------+------------------+  
  23. | mysql-bin.000002 |      286 |              |                  |  
  24. +------------------+----------+--------------+------------------+  

現在rs1已是rs2的主服務器,接下來配置rs2成爲rs1的主。回到rs1服務器上。

  1. 進入mysql命令行 
  2. change master to 
  3. master_host='192.168.0.101'
  4. master_user='repluser2'
  5. master_password='sql456'
  6. master_log_file='mysql-bin.000002'
  7. master_log_pos=286;  //這裏定義的值是從從服務器中得到的。
  8. mysql> show slave status\G 
  9. *************************** 1. row *************************** 
  10.                Slave_IO_State:  
  11.                   Master_Host: 192.168.0.101 
  12.                   Master_User: repluser2 
  13.                   Master_Port: 3306 
  14.                 Connect_Retry: 60 
  15.               Master_Log_File: mysql-bin.000002 
  16.           Read_Master_Log_Pos: 286 
  17.                Relay_Log_File: mysql-relay.000001 
  18.                 Relay_Log_Pos: 4 
  19.         Relay_Master_Log_File: mysql-bin.000002 
  20.              Slave_IO_Running: No 
  21.             Slave_SQL_Running: No 
  22. mysql>start slave 

3、測試

現在rs1上創建一個有自動增長類型的字段,查看設置的屬性是否生效。

mysql> desc tb1;
+-------+---------------------+------+-----+---------+----------------+
| Field | Type                | Null | Key | Default | Extra          |
+-------+---------------------+------+-----+---------+----------------+
| id    | tinyint(3) unsigned | NO   | PRI | NULL    | auto_increment |
| name  | char(10)            | YES  |     | NULL    |                |
+-------+---------------------+------+-----+---------+----------------+

插入兩個字段。查看效果

mysql> select * from tb1;
+----+-------+
| id | name  |
+----+-------+
|  1 | tom   |
|  3 | jerry |
+----+-------+
在rs1上呈奇數增加。

在rs2對此表也插入兩個字段,查看效果。
mysql> select * from tb1;
+----+-------+
| id | name  |
+----+-------+
|  1 | tom   |
|  3 | jerry |
|  4 | Lily  |
|  6 | Lucy  |
+----+-------+
在rs2上呈偶數增長,與預期效果一致,配置成功。
 

三、半同步模型

MYSQL複製時的默認方式爲異步,但異步方式會產生很多滯後操作,因此引進了半同步式的模式。半同步模式是依靠插件模塊來實現的。它可以將在主服務器上寫操作轉發至從服務器的內存中,大大提高了數據的同步性。

1、配置一個主從模型

2、在主服務器上

  1. mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; 
  2.  //裝載插件模塊   
  3. mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1; //啓動插件  
  4. mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000; //設置超時參數 
  5. mysql> show global status like 'rpl_semi%'; 
  6. +--------------------------------------------+-------+ 
  7. | Variable_name                              | Value | 
  8. +--------------------------------------------+-------+ 
  9. | Rpl_semi_sync_master_clients               | 1     |  
  10. | Rpl_semi_sync_master_net_avg_wait_time     | 0     | 
  11. | Rpl_semi_sync_master_net_wait_time         | 0     | 
  12. | Rpl_semi_sync_master_net_waits             | 0     | 
  13. | Rpl_semi_sync_master_no_times              | 0     | 
  14. | Rpl_semi_sync_master_no_tx                 | 0     | 
  15. | Rpl_semi_sync_master_status                | ON    | 
  16. | Rpl_semi_sync_master_timefunc_failures     | 0     | 
  17. | Rpl_semi_sync_master_tx_avg_wait_time      | 0     | 
  18. | Rpl_semi_sync_master_tx_wait_time          | 0     | 
  19. | Rpl_semi_sync_master_tx_waits              | 0     | 
  20. | Rpl_semi_sync_master_wait_pos_backtraverse | 0     | 
  21. | Rpl_semi_sync_master_wait_sessions         | 0     | 
  22. | Rpl_semi_sync_master_yes_tx                | 0     | 
  23. +--------------------------------------------+-------+  
  24. clients 變爲1 ,證明主從半同步複製連接成功。 

3、在從服務器上

  1. mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';   
  2. mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;   
  3. mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;   
  4. mysql> show global status like 'rpl_semi%'; 
  5. +----------------------------+-------+ 
  6. | Variable_name              | Value | 
  7. +----------------------------+-------+ 
  8. | Rpl_semi_sync_slave_status | ON    | 
  9. +----------------------------+-------+ 

配置完成。

如果想要配置永久生效則只需在各自服務器的/etc/my.cnf的[mysqld]段添加上述操作中set指令後的內容即可。

四、基於ssl的MYSQL複製

MYSQL的複製過程中數據的傳輸是明文顯示的,這對企業來說是非常不安全的。所以我們採取某種機制對數據進行相應的加密,而ssl就是首選機制了。下面就進行ssl配置。

1、首先配置主-從服務。在此不再詳述。

2、將rs1設置爲CA服務器

  1. #vim /etc/pki/tls/openssl.cnf  
  2. 將  dir             = ../../CA修改爲 
  3.     dir             = /etc/pki/CA 
  4. #(umask 077;openssl genrsa 2048 > private/cakey.pem) 
  5. #openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650 
  6. #mkdir certs crl newcerts 
  7. #touch index.txt 
  8. #echo 01 > serial 
  9.  
  10. 爲Master上的Mysql準備私鑰以及頒發證書 
  11. #mkdir /usr/local/mysql/ssl 
  12. #cd ssl/ 
  13. #(umask 077;openssl genrsa 1024 > mysql.key) 
  14. #openssl req -new -key mysql.key -out mysql.csr 
  15. #openssl ca -in mysql.csr -out mysql.crt 
  16. #chown -R mysql.mysql ssl/ 

3、爲rs2頒發證書

  1. #mkdir /usr/local/mysql/ssl 
  2. #cd /usr/local/mysql
  3. #chown -R mysql.mysql ssl/
  4. #cd ssl/
  5. #(umask 077;openssl genrsa 1024 > slave.key) 
  6. #openssl req -new -key slave.key -out slave.csr 
  7. #scp slave.csr 192.168.0.100:/root 
  8.  
  9. 在rs1上爲rs2簽發證書 
  10. #openssl ca -in slave.csr -out slave.crt 
  11. #scp slave.crt 192.168.0.101:/usr/local/mysql/ssl 
  12. #cd /etc/pki/CA 
  13. #scp cacert.pem 192.168.0.101:/etc/pki/CA 

4、在主服務器rs1上配置開啓ssl

  1. #vim /etc/my.cnf 
  2. [mysqld] 
  3. ssl-ca=/etc/pki/CA/cacert.pem 
  4. ssl-cert=/usr/local/mysql/ssl/mysql.crt 
  5. ssl-key=/usr/local/mysql/ssl/mysql.key 
  6. #serivce mysqld restart 

5、在從服務器上

  1. # vim my.cnf 
  2.  [mysqld] 
  3.  ssl-ca=/etc/pki/CA/cacert.pem 
  4.  ssl-cert=/usr/local/mysql/ssl/slave.crt 
  5.  ssl-key=/usr/local/mysql/ssl/slave.key 
  6. 登錄從服務器mysql 更改master的相關選項,以實現ssl功能  
  7. mysql> change master to 
  8.     -> master_host='192.168.0.100'
  9.     -> master_user='repluser'
  10.     -> master_password='sql123'
  11.     -> master_ssl=1
  12.     -> master_ssl_ca = '/etc/pki/CA/cacert.pem'
  13.     -> master_ssl_capath = 'ettc/pki/CA'
  14.     -> master_ssl_cert = '/usr/local/mysql/ssl/slave.crt'
  15.     -> master_ssl_key = '/usr/local/mysql/ssl/slave.key'
  16. mysql>start slave; 
  17. mysql>show slave status; 
  18.              Slave_IO_Running: Yes 
  19.             Slave_SQL_Running: Yes 
  20.            Master_SSL_Allowed: Yes 
  21.            Master_SSL_CA_File: /etc/pki/CA/cacert.pem 
  22.            Master_SSL_CA_Path: /etc/pki/CA 
  23.               Master_SSL_Cert: /usr/local/mysql/ssl/slave.crt 
  24.             Master_SSL_Cipher:  
  25.                Master_SSL_Key: /usr/local/mysql/slave.key 

至此,基於ssl的MYSQL複製配置完成。 

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