一、网络拓扑图

Mysql主从基本配置及基于ssl的配置详解_ssl

二、实验简介
    如图所示,本实验主要是实现两台Mysql服务器之间的主从复制,包括:设置主从服务器之间的半同步、mysql的复制过滤、和基于SSL的mysql主从复制功能,上图中
主服务器为:Master:172.16.76.1
从服务器为:Slave:172.16.77.1。

三、实验步骤
在进行主从服务器配置之前,应确保两台主机Mysql服务能正常运行,在此不再叙述。
1、Mysql的主从复制
(1)Master上的配置

  1. mysql> show global variables like 'log_bin';//查看二进制是否开启,二进制日志一定要开启  
  2. +---------------+-------+  
  3. | Variable_name | Value |  
  4. +---------------+-------+  
  5. | log_bin       | ON    |  
  6. +---------------+-------+  
  7. #vim /etc/my.cnf   
  8. [mysqld]  
  9.     server-id = 1 //在此采用默认值  
  10.     sync_binlog = 1//在事务提交时将为写进二进制日志中的语句,同步到二进制中  
  11. #service mysqld restart  
  12. mysql> grant replication slave,replication client on *.* to repluser@172.16.77.1 identified by 'redhat';//创建一个具有复制权限的用户  
  13. mysql> flush privileges;  
  14. mysql> show master status;    
  15. +------------------+----------+--------------+------------------+  
  16. | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |  
  17. +------------------+----------+--------------+------------------+  
  18. | mysql-bin.000006 |      107 |              |                  |  
  19. +------------------+----------+--------------+------------------+ 

(2)Slave上的配置

编辑主配置文件
#vim /etc/my.com //添加如下选项

  1. [mysqld]  
  2.     log-bin=mysql-bin //二进制可以开启也可关闭   
  3.     relay-log=mysql-relay  //开启中继日志  
  4.     skip_slave_start=1  //防止从服务器mysql重启时,start slave也自动运行  
  5.     server-id = 21 //设置server-id  
  6.     read_only=1 //只允许从服务器具有读操作 

重新启动mysql服务,在做如下操作,来验证配置结果

  1. mysql> show global variables like '%server_id%';//验证server-id  
  2. +---------------+-------+  
  3. | Variable_name | Value |  
  4. +---------------+-------+  
  5. | server_id     | 21    |  
  6. +---------------+-------+  
  7. mysql>  show global variables like '%relay_log%';(验证中继日志是否开启)  
  8. +-----------------------+----------------+  
  9. | Variable_name         | Value          |  
  10. +-----------------------+----------------+  
  11. | max_relay_log_size    | 0              |  
  12. | relay_log             | mysql-relay    |  
  13. | relay_log_index       |                |  
  14. | relay_log_info_file   | relay-log.info |  
  15. | relay_log_purge       | ON             |  
  16. | relay_log_recovery    | OFF            |  
  17. | relay_log_space_limit | 0              |  
  18. | sync_relay_log        | 0              |  
  19. | sync_relay_log_info   | 0              |  
  20. +-----------------------+----------------+ 

定义指向主服务器的信息如下:

  1. mysql> change master to master_host='172.16.76.1',master_user='repluser',master_password='redhat',  
  2. master_log_file='mysql-bin.000006',master_log_pos=107;//后两项一定要与Mater服务器上的相同 

 

查看从服务器的状态:

  1. mysql> show slave status\G;  
  2. *************************** 1. row ***************************  
  3.                Slave_IO_State:   
  4.                   Master_Host: 172.16.76.1  
  5.                   Master_User: repluser  
  6.                   Master_Port: 3306  
  7.                 Connect_Retry: 60  
  8.               Master_Log_File: mysql-bin.000006  
  9.           Read_Master_Log_Pos: 107  
  10.                Relay_Log_File: mysql-relay.000001  
  11.                 Relay_Log_Pos: 4  
  12.         Relay_Master_Log_File: mysql-bin.000006  
  13.              Slave_IO_Running: No   //开机默认是No的,这就是skip_slave_start=1的效果  
  14.             Slave_SQL_Running: No  
  15.               Replicate_Do_DB:   
  16.           Replicate_Ignore_DB:   
  17.            Replicate_Do_Table:   
  18.        Replicate_Ignore_Table:   
  19.       Replicate_Wild_Do_Table:   
  20.   Replicate_Wild_Ignore_Table:   
  21.                    Last_Errno: 0  
  22.                    Last_Error:   
  23.                  Skip_Counter: 0  
  24.           Exec_Master_Log_Pos: 107  
  25.               Relay_Log_Space: 107  
  26.               Until_Condition: None  
  27.                Until_Log_File:   
  28.                 Until_Log_Pos: 0  
  29.            Master_SSL_Allowed: No  
  30.            Master_SSL_CA_File:   
  31.            Master_SSL_CA_Path:   
  32.               Master_SSL_Cert:   
  33.             Master_SSL_Cipher:   
  34.                Master_SSL_Key:   
  35.         Seconds_Behind_Master: NULL  
  36. Master_SSL_Verify_Server_Cert: No  
  37.                 Last_IO_Errno: 0  
  38.                 Last_IO_Error:   
  39.                Last_SQL_Errno: 0  
  40.                Last_SQL_Error:   
  41.   Replicate_Ignore_Server_Ids:   
  42.              Master_Server_Id: 0  
  43. 1 row in set (0.00 sec)  

启动Slave_IO和Slave_SQL的两个线程,在查看状态:

  1. mysql> show slave status\G;  
  2. *************************** 1. row ***************************  
  3.                Slave_IO_State: Waiting for master to send event  
  4.                   Master_Host: 172.16.76.1  
  5.                   Master_User: repluser  
  6.                   Master_Port: 3306  
  7.                 Connect_Retry: 60  
  8.               Master_Log_File: mysql-bin.000006  
  9.           Read_Master_Log_Pos: 194  
  10.                Relay_Log_File: mysql-relay.000002  
  11.                 Relay_Log_Pos: 340  
  12.         Relay_Master_Log_File: mysql-bin.000006  
  13.              Slave_IO_Running: Yes  //已经启动 
  14.             Slave_SQL_Running: Yes  
  15.               Replicate_Do_DB:   
  16.           Replicate_Ignore_DB:   
  17.            Replicate_Do_Table:   
  18.        Replicate_Ignore_Table:   
  19.       Replicate_Wild_Do_Table:   
  20.   Replicate_Wild_Ignore_Table:   
  21.                    Last_Errno: 0  
  22.                    Last_Error:   
  23.                  Skip_Counter: 0  
  24.           Exec_Master_Log_Pos: 194  
  25.               Relay_Log_Space: 492  
  26.               Until_Condition: None  
  27.                Until_Log_File:   
  28.                 Until_Log_Pos: 0  
  29.            Master_SSL_Allowed: No  
  30.            Master_SSL_CA_File:   
  31.            Master_SSL_CA_Path:   
  32.               Master_SSL_Cert:   
  33.             Master_SSL_Cipher:   
  34.                Master_SSL_Key:   
  35.         Seconds_Behind_Master: 0  
  36. Master_SSL_Verify_Server_Cert: No  
  37.                 Last_IO_Errno: 0  
  38.                 Last_IO_Error:   
  39.                Last_SQL_Errno: 0  
  40.                Last_SQL_Error:   
  41.   Replicate_Ignore_Server_Ids:   
  42.              Master_Server_Id: 1  
  43. 1 row in set (0.02 sec) 

这样一个简单的mysql的主从复制就构建好了。

2、设置Master-Slave之间的半同步:

在主服务器上,添加半同步模块:

  1. mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';    
  2. mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;    
  3. mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000;   

在从服务器上,添加半同步模块:

  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;  
  4. mysql> START SLAVE; 

验证半同步功能是否开启:

在Master服务器上,执行如下命令 mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%';结果如下:

  1. +--------------------------------------------+-------+  
  2. | Variable_name                              | Value |  
  3. +--------------------------------------------+-------+  
  4. Rpl_semi_sync_master_clients               | 1     |  为1则表示证明主从半同步复制连接成功
  5. | Rpl_semi_sync_master_net_avg_wait_time     | 0     |  
  6. | Rpl_semi_sync_master_net_wait_time         | 0     |  
  7. | Rpl_semi_sync_master_net_waits             | 0     |  
  8. | Rpl_semi_sync_master_no_times              | 0     |  
  9. | Rpl_semi_sync_master_no_tx                 | 0     |  
  10. | Rpl_semi_sync_master_status                | ON    |  
  11. | Rpl_semi_sync_master_timefunc_failures     | 0     |  
  12. | Rpl_semi_sync_master_tx_avg_wait_time      | 0     |  
  13. | Rpl_semi_sync_master_tx_wait_time          | 0     |  
  14. | Rpl_semi_sync_master_tx_waits              | 0     |  
  15. | Rpl_semi_sync_master_wait_pos_backtraverse | 0     |  
  16. | Rpl_semi_sync_master_wait_sessions         | 0     |  
  17. | Rpl_semi_sync_master_yes_tx                | 0     |  
  18. +--------------------------------------------+-------+ 

3、基于ssl的mysql主从复制

首先在Master服务器上配置CA,然后分别给Master和Slave颁发证书,具体过程如下:

(1)将Master服务器做成CA服务器。

  1. 在Master服务器上
  2. #cd /etc/pki/tls/  
  3. #vim openssl.cnf //修改如下选项  
  4.   dir             = /etc/pki/CA   
  5. #cd /etc/pki/CA  
  6. # mkdir certs newcerts crl  
  7. #touch index.txt  
  8. # (umask 077;openssl genrsa -out private/cakey.pem 2048)  
  9. #openssl req -x509 -new -key private/cacert.key -out cacert.pem -days 3650  
  10. #echo 01 >serial 

(2)Master服务器申请证书

  1. 在Master服务器上
  2. #cd /usr/local/mysql/  
  3. #mkdir ssl  
  4. #chown mysql:mysql ssl  
  5. #cd ssl  
  6. #(umask 077;openssl genrsa -out master.key 1024)  
  7. #openssl req -new -key master.key -out master.csr   
  8. #openssl ca -in master.csr -out master.crt -days 365 

(3)Slave服务器向Master申请证书

  1. 在Slave服务器上:  
  2.     #cd /usr/local/mysql/  
  3.         #mkdir ssl  
  4.     #chown mysql:mysql ssl  
  5.     #cd ssl  
  6.     #(umask 077;openssl genrsa -out slave.key 1024)  
  7.     #openssl req -new -key slave.key -out slave.csr -days 365  
  8.     #scp slave.csr node1:/tmp  
  9. 在Master服务器上:  
  10.     #cd /tmp  
  11.     #openssl ca -in slave.csr -out slave.crt -days 365  
  12.     #scp slave.crt node2:/usr/local/mysql/ssl/  
  13.     #scp /etc/pki/CA/cacert.pem node2:/usr/local/mysql/ssl/ 

注意在无论是在Master服务器上还是在Slave服务器上一定要修改ssl目录及其文件的属主属主为mysql。

(4)在Master上让Mysql开启ssl功能,过程如下:

  1. #vim /etc/my.cnf    //在[mysqld]中添加如下内容  
  2. [mysqld]  
  3.     ssl  
  4.     ssl-ca=/usr/local/mysql/ssl/cacert.pem  
  5.     ssl-cert=/usr/local/mysql/ssl/master.crt  
  6.     ssl-key=/usr/local/mysql/ssl/master.key  

重新启动服务,验证ssl功能是否开启:

  1. mysql> show global variables like '%ssl%'; //验证ssl开启成功  
  2. +---------------+---------------------------------+  
  3. | Variable_name | Value                           |  
  4. +---------------+---------------------------------+  
  5. | have_openssl  | YES                             |  
  6. have_ssl      | YES                             |  
  7. | ssl_ca        | /etc/pki/CA/cacert.pem          |  
  8. | ssl_capath    |                                 |  
  9. | ssl_cert      | /usr/local/mysql/ssl/master.crt |  
  10. | ssl_cipher    |                                 |  
  11. | ssl_key       | /usr/local/mysql/ssl/master.key |  
  12. +---------------+---------------------------------+ 

创建仅允许使用ssl连接Mysqld的用户

  1. mysql> grant replication client,replication slave on *.* to qingmu@'172.16.77.1'   
  2. identified by 'redhat' require ssl;   
  3. mysql> flush privileges;  

(5)在Slave服务器开启ssl功能

  1. #vim /etc/my.cnf    //在[mysqld]中添加ssl  
  2. [mysqld]  
  3.     ssl  
  4. 保存退出后,重新启动mysql。  
  5. 验证ssl是否开启如下:  
  6. mysql> show global variables like '%ssl%';  
  7. +---------------+-------+  
  8. | Variable_name | Value |  
  9. +---------------+-------+  
  10. have_openssl  | YES   |  
  11. have_ssl      | YES   |  
  12. | ssl_ca        |       |  
  13. | ssl_capath    |       |  
  14. | ssl_cert      |       |  
  15. | ssl_cipher    |       |  
  16. | ssl_key       |       |  
  17. +---------------+-------+ 

定义指向Master服务器的语句:

  1. mysql> change master to \  
  2. master_host='172.16.76.1',   
  3. master_user='qingmu', \  
  4. master_password='redhat', \  
  5. master_log_file='mysql-bin.000007', \  
  6. master_log_pos=365,master_ssl=1, \  
  7. master_ssl_ca='/usr/local/mysql/ssl/cacert.pem', \  
  8. master_ssl_capath='/usr/local/mysql/ssl/', \  
  9. master_ssl_cert='/usr/local/mysql/ssl/slave.crt', \  
  10. master_ssl_key='/usr/local/mysql/ssl/slave.key'

查看slave服务器的状态,验证是否开启成功。

  1. mysql> show slave status\G;  
  2. *************************** 1. row ***************************  
  3.                Slave_IO_State:   
  4.                   Master_Host: 172.16.76.1  
  5.                   Master_User: qingmu  
  6.                   Master_Port: 3306  
  7.                 Connect_Retry: 60  
  8.               Master_Log_File: mysql-bin.000007  
  9.           Read_Master_Log_Pos: 365  
  10.                Relay_Log_File: mysql-relay.000001  
  11.                 Relay_Log_Pos: 4  
  12.         Relay_Master_Log_File: mysql-bin.000007  
  13.              Slave_IO_Running: No  
  14.             Slave_SQL_Running: No  
  15.               Replicate_Do_DB:   
  16.           Replicate_Ignore_DB:   
  17.            Replicate_Do_Table:   
  18.        Replicate_Ignore_Table:   
  19.       Replicate_Wild_Do_Table:   
  20.   Replicate_Wild_Ignore_Table:   
  21.                    Last_Errno: 0  
  22.                    Last_Error:   
  23.                  Skip_Counter: 0  
  24.           Exec_Master_Log_Pos: 365  
  25.               Relay_Log_Space: 107  
  26.               Until_Condition: None  
  27.                Until_Log_File:   
  28.                 Until_Log_Pos: 0  
  29.            Master_SSL_Allowed: Yes  
  30.            Master_SSL_CA_File: /usr/local/mysql/ssl/cacert.pem  
  31.            Master_SSL_CA_Path: /usr/local/mysql/ssl/  
  32.               Master_SSL_Cert: /usr/local/mysql/ssl/slave.crt  
  33.             Master_SSL_Cipher:   
  34.                Master_SSL_Key: /usr/local/mysql/ssl/slave.key  
  35.         Seconds_Behind_Master: NULL  
  36. Master_SSL_Verify_Server_Cert: No  
  37.                 Last_IO_Errno: 0  
  38.                 Last_IO_Error:   
  39.                Last_SQL_Errno: 0  
  40.                Last_SQL_Error:   
  41.   Replicate_Ignore_Server_Ids:   
  42.              Master_Server_Id: 0  
  43.  
  44. mysql> start slave;  
  45. mysql> show slave status\G;  
  46. *************************** 1. row ***************************  
  47.                Slave_IO_State: Waiting for master to send event  
  48.                   Master_Host: 172.16.76.1  
  49.                   Master_User: qingmu  
  50.                   Master_Port: 3306  
  51.                 Connect_Retry: 60  
  52.               Master_Log_File: mysql-bin.000008  
  53.           Read_Master_Log_Pos: 107  
  54.                Relay_Log_File: mysql-relay.000003  
  55.                 Relay_Log_Pos: 253  
  56.         Relay_Master_Log_File: mysql-bin.000008  
  57.              Slave_IO_Running: Yes  
  58.             Slave_SQL_Running: Yes  
  59.               Replicate_Do_DB:   
  60.           Replicate_Ignore_DB:   
  61.            Replicate_Do_Table:   
  62.        Replicate_Ignore_Table:   
  63.       Replicate_Wild_Do_Table:   
  64.   Replicate_Wild_Ignore_Table:   
  65.                    Last_Errno: 0  
  66.                    Last_Error:   
  67.                  Skip_Counter: 0  
  68.           Exec_Master_Log_Pos: 107  
  69.               Relay_Log_Space: 551  
  70.               Until_Condition: None  
  71.                Until_Log_File:   
  72.                 Until_Log_Pos: 0  
  73.            Master_SSL_Allowed: Yes  
  74.            Master_SSL_CA_File: /usr/local/mysql/ssl/cacert.pem  
  75.            Master_SSL_CA_Path: /usr/local/mysql/ssl/  
  76.               Master_SSL_Cert: /usr/local/mysql/ssl/slave.crt  
  77.             Master_SSL_Cipher:   
  78.                Master_SSL_Key: /usr/local/mysql/ssl/slave.key  
  79.         Seconds_Behind_Master: 0  
  80. Master_SSL_Verify_Server_Cert: No  
  81.                 Last_IO_Errno: 0  
  82.                 Last_IO_Error:   
  83.                Last_SQL_Errno: 0  
  84.                Last_SQL_Error:   
  85.   Replicate_Ignore_Server_Ids:   
  86.              Master_Server_Id: 1  
  87.  
  88.  Slave_IO_Running: Yes ,Slave_SQL_Running: Yes, Master_SSL_Allowed: Yes(这三项为yes表示成功) 

(6)验证是否启用了ssl连接:

在Slave服务器上:

  1. #/usr/local/mysql/bin/mysql --ssl-ca=/usr/local/mysql/ssl/cacert.pem   
  2. --ssl-cert=/usr/local/mysql/ssl/slave.crt 
  3. --ssl-key=/usr/local/mysql/ssl/slave.key   -uqingmu -h172.16.76.1 -predhat  
  4.  
  5.  mysql> \s  
  6. --------------  
  7. /usr/local/mysql/bin/mysql  Ver 14.14 Distrib 5.5.24, for linux2.6 (i686) using readline 5.1  
  8.  
  9. Connection id:      3  
  10. Current database:     
  11. Current user:       qingmu@node2  
  12. SSL:            Cipher in use is DHE-RSA-AES256-SHA  
  13. Current pager:      stdout  
  14. Using outfile:      ''  
  15. Using delimiter:    ;  
  16. Server version:     5.5.24-log MySQL Community Server (GPL)  
  17. Protocol version:   10  
  18. Connection:     172.16.76.1 via TCP/IP  
  19. Server characterset:    latin1  
  20. Db     characterset:    latin1  
  21. Client characterset:    utf8  
  22. Conn.  characterset:    utf8  
  23. TCP port:       3306  
  24. Uptime:         11 min 26 sec  
  25.  
  26. Threads: 3  Questions: 10  Slow queries: 0  Opens: 33  Flush tables: 1  Open tables: 26  Queries per second avg: 0.01  
  27.  
  28. 若SSL为:SSL:  Cipher in use is DHE-RSA-AES256-SHA 则表示成功  

这样基于ssl的mysql的主从复制就建立成功了。