一, 複制的工作機制:由主伺服器産生資料,從伺服器從主伺服器将資料同步過來。靠三個線程來實作:
(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公司提供一個更新檔。半同步如果無法在指定時間完成-->自動 降到異步模式。
三,實驗步驟:
四,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> grant replication slave,replication client on *.* to repluser@'172.16.150.%' identified by 'redhat';
建立使用者,并賦權為replication。能複制所有資料庫。
mysql> flush privileges;
mysql> 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> change master to
> master_host='172.16.150.30',
>master_user='repluser',
>master_password='redhat',
>master_log_file='mysql-bin.000001', 在master執行show master status所看到的。
>master_log_pos=356;數字是整數不能加引号
mysql > 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 > 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 > serial
二,給master自己簽署證書
# mkdir /etc/mysql_ssl
#chown mysql:mysql /etc/mysql_ssl
如果不修改這個證書存放目錄,會導緻Mysql使用者可能沒有權限讀驗證書
# cd /etc/mysql_ssl
#(umask 077;openssl genrsa 1024 > 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 > 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> 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> grant replication client,replication slave on *.* to rep@'172.16.150.%' identified by 'redhat' require ssl;
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+ | File
| Position | Binlog_Do_DB | Binlog_Ignore_DB
| +------------------+----------+--------------+------------------+ |
mysql-bin.000005 | 544 | |
| +------------------+----------+--------------+------------------+
八,在slave伺服器上配置複制的資訊:
mysql> change master to
-> master_host='172.16.150.30',
-> master_user='rep',
-> master_password='redhat',
-> master_log_file='mysql-bin.000005',
-> master_log_pos=544,
-> master_ssl=1,
-> master_ssl_ca='/etc/mysql_ssl/cacert.pem',
-> master_ssl_cert='/etc/mysql_ssl/slave.crt',
-> master_ssl_key='/etc/mysql_ssl/slave.key';
驗證有沒有生效:
mysql> start slave;
mysql> 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,如需轉載請自行聯系原作者