天天看點

mysql 5.5主從複制與基于ssl加密複制

一, 複制的工作機制:由主伺服器産生資料,從伺服器從主伺服器将資料同步過來。靠三個線程來實作:

(1)dump thread:當從伺服器來複制時,dump會去讀取二進制日志的語句并發送給從伺服器

(2)io thread:在從伺服器由io thread到主服務上去請求二進制日志中語句的内容。每隔一段時間就會啟動,io thread到主伺服器上檢視二進制日志是否有變化。如果有變化則就請求傳輸,一條語句複制過來。

(3)SQL thread(單線程):io thread擷取到之後将其存儲到relay log中。一條語句一條語句執行。

<a target="_blank" href="http://blog.51cto.com/attachment/201208/114408607.jpg"></a>

二,Mysql複制有三個種方式:異步,同步,半同步

1)異步:主伺服器的修改操作本地完成就認為完成。至于後面的事,并不理會

2)同步指定是:主伺服器涉及的修改操作,要等待從伺服器也完成

3)半同步:在一主多從的環境中,隻等待一台從伺服器同步完成操作。設定一個等待逾時時間,如果超過這個時間,則降級為異步。在5.5可以使用半同步,google公司提供一個更新檔。半同步如果無法在指定時間完成--&gt;自動 降到異步模式。

三,實驗步驟:

四,mysql的資料目錄最好存儲在lvm的磁盤中,是以下面分别對兩台虛拟機建立一個lvm的分區。

#pvcreate /dev/sda5  

#vgcreate myvg /dev/sda5  

#lvcreate -L 5G -n mylv myvg   

# mke2fs -j /dev/myvg/mylv  

# vim /etc/fstab   

/dev/myvg/mylv          /data/mysql             ext3    defaults        0 0 

# mount -a  

# df  

# chown -R mysql:mysql /data/mysql/  

#cd /usr/local/mysql 

# cp support-files/my-large.cnf /etc/my.cnf 

vim /etc/my.cnf 

thread_concurrency = 4 

datadir = /data/mysql 

#cp support-files/mysql.server /etc/rc.d/init.d/mysqld 

#chmod +x /etc/rc.d/init.d/mysqld 

#chkconfig --add mysqld 

#chown -R :mysql * 

#scripts/mysql_install_db --user=mysql --datadir=/data/mysql 

#service mysqld start 

五,在master上,執行下列mysql語句

mysql&gt; grant replication slave,replication client on *.* to repluser@'172.16.150.%' identified by 'redhat';

建立使用者,并賦權為replication。能複制所有資料庫。

mysql&gt; flush privileges; 

mysql&gt; show master status; 記錄目前的二進制日志名,與所處的位置。

+------------------+----------+--------------+------------------+ 

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | 

| mysql-bin.000001 |      356 |              |                  | 

六,在slave上,先修改配置檔案:

vim /etc/my.cnf  

[mysqld] 在mysqld段中修改 

thread_concurrency = 4  

datadir = /data/mysql  

#log-bin=mysql-bin  禁止二進制日志,在此實作中并不需要二進制日志 

relay_log      = mysql-relay 啟用中繼日志,需要自己添加 

server-id = 2修改為2,不要與master的server-id相同就ok

  上面修改完之後啟用 service mysqld resstart

七,在slave連接配接到mysql,并執行下面mysql語句

 mysql&gt; change master to 

&gt; master_host='172.16.150.30', 

&gt;master_user='repluser', 

&gt;master_password='redhat', 

&gt;master_log_file='mysql-bin.000001', 在master執行show master status所看到的。

&gt;master_log_pos=356;數字是整數不能加引号 

mysql &gt; start slave;啟動重伺服器線程

此時已經完成一個簡單的主從複制。在從伺服器使用者還可以新增資料與表,如果這樣會導緻主從的資料不能保持一至。此時需要從伺服器的配置檔案添加一個行

[mysqld] 

read-only = 1 

添加完之後需要重新開機mysqld服務,這并不能阻止具有super權限修改資料,隻能阻止普通使用者。如果從伺服器重新啟用後,slave會自動啟動,那麼此時想做一些維護工作并不合适,此時在配置檔案中添加一項

[mysqld]

skip_slave_start=1 

八,在主伺服器的配置檔案中,最好在在配置檔案添加下列選項:

sync_binlog=1 

在事務送出時,會先寫到記憶體緩存的日志中,=1任何一個事務送出之後就立即寫入到磁盤中的二進制檔案 

innodb_flush_logs_at_trx_commit=1 

表示任何一個事物送出之後就立即寫入到磁盤中的日志檔案 

 到此一個比較安全的主從的複制完。

由于Mysq的複制是明文傳輸,很難儲存其資料的安全,是以需要利用ssl加密協定來加強安全。将/data/mysql的資料删除,删除之前先停止mysql服務,并重新初始化。

# vim /etc/pki/tls/openssl.cnf  

dir             = ../../CA 将這行修改 =/etc/pki/CA 

# cd /etc/pki/CA 

# (umaks 077; openssl genrsa 2048 &gt; private/cakey.pem) 

# openssl req -new -x509 -key private/cakey.pem  -out cacert.pem -days 3650 

# mkdir certs crl newcerts 

# touch index.txt 

# echo 01 &gt; serial 

二,給master自己簽署證書

# mkdir /etc/mysql_ssl 

#chown mysql:mysql /etc/mysql_ssl 

如果不修改這個證書存放目錄,會導緻Mysql使用者可能沒有權限讀驗證書

# cd /etc/mysql_ssl 

#(umask 077;openssl genrsa 1024 &gt; master.key) 

#openssl req -new -key master.key -out master.csr

#openssl ca -in master.csr -out master.crt

#cp /etc/pki/CA/cacert.pem . 

三,slave上生成私鑰與證書

# mkdir /etc/mysql_ssl  

#chown mysql:mysql /etc/mysql_ssl  

# cd /etc/mysql_ssl  

#(umask 077;openssl genrsa 1024 &gt; slave.key)  

#openssl req -new -key slave.key -out slave.csr 

#scp slave.csr 172.16.150.30:/tmp 

四,在master簽署slave的證書

#cd /tmp 

#openssl ca -in slave.csr -out slave.crt 

#scp /etc/pki/CA/cacert.pem 172.16.150.30:/etc/mysql_ssl 

#scp slave.crt 172.16.150.30:/etc/mysql_ssl 

五,在master的my.cnf中添加下面内容,并重新開機服務。

ssl 

ssl-ca=/etc/mysql_ssl/cacert.pem 

ssl-cert=/etc/mysql_ssl/master.crt 

ssl-key=/etc/mysql_ssl/master.key 

檢視有沒有生效

mysql&gt; show variables like '%ssl%'; 

+---------------+---------------------------+ 

| Variable_name | Value                     | 

| have_openssl  | YES  啟用openssl                     | 

| have_ssl      | YES    啟用ssl加密                   | 

| ssl_ca        | /etc/mysql_ssl/cacert.pem | 

| ssl_capath    |                           | 

| ssl_cert      | /etc/mysql_ssl/master.crt | 

| ssl_cipher    |                           | 

| ssl_key       | /etc/mysql_ssl/master.key | 

+---------------+--------------------------- 

六,在slave上,也需要添加,重新開機服務,檢視有沒有生效

ssl-cert=/etc/mysql_ssl/slave.crt 

ssl-key=/etc/mysql_ssl/slave.key 

七,在master建立使用者指定複制時必要在使用ssl加密,也可以修改之前的使用者,下面新增一個使用者。

mysql&gt; grant replication client,replication slave on *.* to rep@'172.16.150.%' identified by 'redhat' require ssl; 

mysql&gt; flush privileges;

Query OK, 0 rows affected (0.00 sec)

mysql&gt; show master status;

+------------------+----------+--------------+------------------+ | File

| Position | Binlog_Do_DB | Binlog_Ignore_DB

| +------------------+----------+--------------+------------------+ |

mysql-bin.000005 | 544 | |

| +------------------+----------+--------------+------------------+

八,在slave伺服器上配置複制的資訊:

mysql&gt; change master to 

    -&gt; master_host='172.16.150.30', 

    -&gt; master_user='rep', 

    -&gt; master_password='redhat', 

    -&gt; master_log_file='mysql-bin.000005', 

    -&gt; master_log_pos=544, 

    -&gt; master_ssl=1, 

    -&gt; master_ssl_ca='/etc/mysql_ssl/cacert.pem', 

    -&gt; master_ssl_cert='/etc/mysql_ssl/slave.crt', 

    -&gt; master_ssl_key='/etc/mysql_ssl/slave.key'; 

驗證有沒有生效:

mysql&gt; start slave; 

mysql&gt; show slave status\G 

*************************** 1. row *************************** 

               Slave_IO_State: Waiting for master to send event 

                  Master_Host: 172.16.150.30 

                  Master_User: rep 

                  Master_Port: 3306 

                Connect_Retry: 60 

              Master_Log_File: mysql-bin.000005 

          Read_Master_Log_Pos: 544 

               Relay_Log_File: mysql-relay.000002 

                Relay_Log_Pos: 253 

        Relay_Master_Log_File: mysql-bin.000005 

             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: 544 

              Relay_Log_Space: 405 

              Until_Condition: None 

               Until_Log_File:  

                Until_Log_Pos: 0 

           Master_SSL_Allowed: Yes 

           Master_SSL_CA_File: /etc/mysql_ssl/cacert.pem 

           Master_SSL_CA_Path:  

              Master_SSL_Cert: /etc/mysql_ssl/slave.crt 

            Master_SSL_Cipher:  

               Master_SSL_Key: /etc/mysql_ssl/slave.key 

        Seconds_Behind_Master: 0 

Master_SSL_Verify_Server_Cert: No 

                Last_IO_Errno: 0 

                Last_IO_Error:  

               Last_SQL_Errno: 0 

               Last_SQL_Error:  

  Replicate_Ignore_Server_Ids:  

             Master_Server_Id: 1 

1 row in set (0.00 sec) 

十,在master上建立一個資料庫,并檢視slave上會不會生效。

本文轉自 deng304749970 51CTO部落格,原文連結:http://blog.51cto.com/damondeng/956980,如需轉載請自行聯系原作者