MariaDB(MySQL):半同步複製+ssl+複製過濾

一、半同步複製  

   1.mysql的複製

   通過記錄主服務器的二進制日誌,並在從服務器上進行重放(replay)完成複製,默認都是異步進行的。

   2.半同步複製

   半同步複製是google貢獻給MySQL的一個補丁,在MySQL 5.5之後就支持了,MariaDB都是支持的。

   MySQL的插件,一般在MySQL安裝目錄下;

   半同步複製插件默認沒有啓用,需要自己安裝,/usr/local/mysql/lib/plugin可以看到semisync_master.so和semisync_slave.so和其他許多插件;進行半同步時,主啓用semisync_master.so,從啓用semisync_slave.so,且只要一個從(離主近,帶寬足夠可用)啓用半同步即可。

   3.半同步的目的

    保證Master服務器的事務必須接收指定slave服務器(一臺)的返回消息,纔會commit;否則需要等待超時時間(rpl_semi_sync_master_timeout的默認爲10s),然後切換成異步再提交;這樣做的目的可以使主從數據庫的數據延遲縮小,可以在損失很小的性能的前提下提高數據安全性。

    解決的問題:如果slve不幸落後,而更不幸的是主庫此時又出現Crash,這時備庫中的數據就是不完整的,無法使用備庫來繼續提供數據一致的服務了。Semisynchronous Replication則一定程度上保證提交的事務已經傳給了至少一個slave。


二、半同步複製的實現

   1.檢查插件

# ls /usr/local/mysql/lib/plugin
    semisync_master.so    #用於Master服務器安裝的半同步插件
    semisync_slave.so     #用於Slave服務器安裝的半同步插件

   2.安裝半同步插件


#####主服務器安裝插件(Mysql提供插件安裝機制:HELP INSTALL):
MariaDB[(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
MariaDB[(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%';
MariaDB[(none)]> SET GLOBAL rpl_semi_sync_master_enabled=ON;
                                 #開啓半同步
MariaDB[(none)]> SET GLOBAL rpl_semi_sync_master_timeout=1000;
                                #等待超時時間:單位ms;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
####從服務器插件:
MariaDB[(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME  'semisync_slave.so';
MariaDB[(none)]> SHOW GLOBAL VARIABLE LIKE '%semi%';
MariaDB[(none)]> SET GLOBAL rpl_semi_sync_slave_enabled=ON;
mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD;   #重啓IO線程生效3

   3.查看半同步開啓狀態


######在Master服務器上查看
MariaDB[(none)]> show global status like 'rpl_semi%';
    Rpl_semi_sync_master_clients      1      #已經有一個客戶端連接
    Rpl_semi_sync_master_status       ON     #已經爲開啓狀態
MariaDB[(none)]> show global variables like '%rpl%';
     rpl_semi_sync_master_enabled     ON     #Master半同步已經開啓
     rpl_semi_sync_master_timeout    1000   #超時時間
######在Slave服務器上查看
MariaDB[(none)]> show global status like 'rpl_semi%';
    Rpl_semi_sync_master_status       ON     #已經爲開啓狀態
MariaDB[(none)]> show global variables like '%rpl%';
     rpl_semi_sync_slave_enabled      ON     #Master半同步已經開啓

  4.上面的設置重啓服務後會失效的,設置開機生效

           不建議把半同步配置寫在配置文件中;

####Master:
vim /etc/my.cnf
[mysqld] 
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000   
####Slave:
vim /etc/my.cnf
[mysqld]
rpl_semi_sync_slave_enabled=1

       5.通過全局變量來設置半同步

####Master:
MariaDB[(none)]> set global rpl_semi_sync_master_enabled=1
取消加載插件
MariaDB[(none)]> uninstall plugin rpl_semi_sync_master;
####Slave:
MariaDB[(none)]> set global rpl_semi_sync_slave_enabled = 1;
MariaDB[(none)]> uninstall plugin rpl_semi_sync_slave;


三、基於SSL的複製

   Mysql的主從複製是明文傳送的,爲保證數據的安全性,使用SSL的加密進行傳輸數據。(不過,SSL的Heartblood事件之後,SSL的安全性也被大大懷疑,囧

     1.在master上自建CA服務器

# cd /etc/pki/CA/
# (umask 077;openssl genrsa -out private/cakey.pem 2048)
# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
# touch  index.txt
# echo 01 > serial

   2.master自簽證書

# mkdir /usr/local/mysql/ssl
# cd /usr/local/mysql/ssl
# (umask 077;openssl genrsa -out master.key 2048)
# openssl req -new -key master.key -out master.csr -days 3650
        //證書申請
# openssl ca -in master.csr -out master.crt -days 3650
        //簽署證書

   3.爲Slave服務器創建證書申請

# mkdir /usr/local/mysql/ssl
# cd /usr/local/mysql/ssl
# (umask 077;openssl genrsa -out slave.key 2048)
# openssl req -new -key slave.key -out slave.csr -days 3650
# scp slave.csr master.hoo.com:/tmp/

   4.爲Slave簽署證書  

//master上操作
# openssl ca -in /tmp/slave.csr -out /tmp/slave.crt -days 3650
# scp /tmp/slave.crt slave.allen.com:/usr/local/mysql/ssl/

   5.SSL文件的權限

######修改Master服務器
# chown -R mysql.mysql /usr/local/mysql/ssl
        //保證祕鑰在目錄下
######修改Slave服務器
# chown -R mysql.mysql /usr/local/mysql/ssl
         //保證祕鑰在目錄下

   6.在Master與Slave服務器修改主配置文件開啓SSL加密功能

######修改Master服務器
# vim /etc/my.cnf                          #添加如下選項
ssl                                        #開啓SSL功能
ssl_ca = /usr/local/mysql/ssl/cacert.pem    #指定CA文件位置
ssl_cert = /usr/local/mysql/ssl/master.crt  #指定證書文件位置
ssl_key = /usr/local/mysql/ssl/master.key   #指定密鑰所在位置
# service mysqld restart     #重啓服務生效
######修改Slave服務器
# vim /etc/my.cnf
ssl
ssl_ca = /usr/local/mysql/ssl/cacert.pem
ssl_cert = /usr/local/mysql/ssl/slave.crt
ssl_key = /usr/local/mysql/ssl/slave.key
# service mysqld restart

    7.在master上查看SSL是否生效;

# mysql
MariaDB[(none)]> show variables like '%ssl%';
+---------------+---------------------------------+
| Variable_name | Value                           |
+---------------+---------------------------------+
| have_openssl  | YES                             |
| have_ssl      | YES                             |
| ssl_ca        | /usr/local/mysql/ssl/cacert.pem |
| ssl_capath    |                                 |
| ssl_cert      | /usr/local/mysql/ssl/master.crt |
| ssl_cipher    |                                 |
| ssl_key       | /usr/local/mysql/ssl/master.key |
+---------------+---------------------------------+

    8.查看master的狀態

MariaDB[(none)]> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |      550 |              |                  |
+------------------+----------+--------------+------------------+

   9.添加一個用戶,並使用加密方式連接到master

####master
MariaDB[(none)]> grant replication client,replication slave on *.* to 'slave'@'172.16.%.%' identified by 'passwd' require ssl;
MariaDB[(none)]> flush privileges;
####slave
# mysql -uslave -ppasswd -h 172.16.1.3 --ssl-ca=/usr/local/mysql/ssl/cacert.pem --ssl-cert=/usr/local/mysql/ssl/slave.crt --ssl-key=/usr/local/mysql/ssl/slave.key

   10.開始基於SSL的複製

####查看Slave服務器SSL是否開啓
# mysql
MariaDB[(none)]> show variables like '%ssl%';
####獲取命令幫助
MariaDB[(none)]> help change master to
  | MASTER_SSL = {0|1}                        #是否使用SSL功能
  | MASTER_SSL_CA = 'ca_file_name'            #CA證書位置
  | MASTER_SSL_CERT = 'cert_file_name'        #指定自己的證書文件
  | MASTER_SSL_KEY = 'key_file_name'          #指定自己的密鑰文件
####連接Master服務器
MariaDB[(none)]> change master to master_host='172.16.1.3',master_user='slave',master_password='passwd',
master_log_file='mysql-bin.000004',master_log_pos=550,master_ssl=1,
master_ssl_ca='/usr/local/mysql/ssl/cacert.pem',
master_ssl_cert='/usr/local/mysql/ssl/slave.crt',
master_ssl_key='/usr/local/mysql/ssl/slave.key';

   11.查看slave服務器狀態

MariaDB[(none)]> show slave status\G;
         Slave_IO_Running: Yes
         Slave_SQL_Running: Yes
         Master_SSL_CA_File: /usr/local/mysql/ssl/cacert.pem
         Master_SSL_CA_Path:
         Master_SSL_Cert: /usr/local/mysql/ssl/slave.crt
         Master_SSL_Cipher:
         Master_SSL_Key: /usr/local/mysql/ssl/slave.key

   12.測試

       在master上創建數據庫,在slave上查看是否同步


四、補充,複製過濾器

####複製過濾器
master:
    binlog_do_db=   (白名單列表,表示複製哪些數據庫,記錄到二進制日誌)
    binlog_ignore_db=  (黑名單列表,忽略哪些數據庫)
    以上兩點不建議同時使用
slave:
    replicate_do_db=  (數據庫白名單,多個用列表)
    replicate_ignore_db=  (黑名單)
        不建議同時使用,
        如果同時啓用則以白名單爲準,
        如果同時出現在白黑名單中,則拒絕複製
    replicate_do_table= db_name.table_name  (表的白名單)
    replicate_ignore_table=(表的黑名單)
    replicate_wild_do_table=
    replicate_wild_ignore_table=
    以上兩項支持通配符,進行過濾
主服務器只能過濾到庫級別,從服務器可以過濾到表級別;





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