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)創建邏輯卷用於存放數據
- 創建一個20G的分區本機爲/dev/sda5,調整器類型爲8e
- #pvcreate /dev/sda5
- #vgcreate myvg /dev/sda5
- #lvcreate -n mylv -L 10G myvg
- #mke2fs -j /dev/myvg/mylv
- #mkdir -p /data/mydata
- 編寫/etc/fstab文件讓其能夠開機自動掛載
- /dev/myvg/mylv /data/mydata ext3 defaults 0 0
(2)安裝MYSQL
- #useradd -r mysql
- #tar xf mysql-5.5.24-linux2.6-i686.tar.gz -C /usr/local
- #cd /usr/local
- #ln -sv mysql-5.5.24-linux2.6-i686 mysql
- #cd mysql
- #chown -R mysql.mysql .
- #scripts/mysql_install_db --user=mysql --datadir=/data/mydata
- #cp support-files/my-large.cnf /etc/my.cnf
- #cp support-files/mysql.server /etc/rc.d/init.d/mysqld
- 編輯主配置文件/etc/my.cnf
- thread_concurrency = 2 datadir = /data/mydata
- log-bin=mysql-bin //開啓二進制日誌
- binlog_format=mixed
- server-id = 1 //從服務器的Server-id不能與此值相同
- #chown -R root .
- #service mysqld start
(3)配置相關屬性
- #/usr/local/mysql/bin/mysql
- mysql>grant replication slave,replication client on *.* to
- repluser@'192.168.0.%' identified by 'sql123'; //創建有複製權限的用戶
- mysql>flush privileges;
- mysql> show master status;
- +------------------+----------+--------------+------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +------------------+----------+--------------+------------------+
- | mysql-bin.000001 | 355 | | |
- +------------------+----------+--------------+------------------+
在從服務器rs2上
(1)前面兩個步驟與主服務器相同,但在編輯配置文件時有所不同。
- #vim /etc/my.cnf
- thread_concurrency = 2
- datadir = /data/mydata
- log-bin=mysql-bin //二進制日誌可以開啓也可以關閉
- relay-log=mysql-relay //一定要開啓中繼日誌
- binlog_format=mixed
- server-id = 21 //從服務器的Server-id不能與此值相同
- #service mysqld restart //重啓讓修改生效
(2)配置相關屬性
- #/usr/local/mysql/bin/mysql
- mysql> show global variables like '%relay_log%';//配置生效
- +-----------------------+----------------+
- | Variable_name | Value |
- +-----------------------+----------------+
- | max_relay_log_size | 0 |
- | relay_log | mysql-relay |
- | relay_log_index | |
- | relay_log_info_file | relay-log.info |
- | relay_log_purge | ON |
- | relay_log_recovery | OFF |
- | relay_log_space_limit | 0 |
- | sync_relay_log | 0 |
- | sync_relay_log_info | 0 |
- +-----------------------+----------------+
- mysql> show global variables like 'server_id';
- +---------------+-------+
- | Variable_name | Value |
- +---------------+-------+
- | server_id | 11 |
- +---------------+-------+
- mysql> change master to
- master_host='192.168.0.100', //主服務器的地址
- master_user='repluser' ,
- master_password='sql123',
- master_log_file='mysql-bin.000001',
- master_log_pos=355;
- mysql> show slave status\G
- *************************** 1. row ***************************
- Slave_IO_State:
- Master_Host: 192.168.0.100
- Master_User: repluser
- Master_Port: 3306
- Connect_Retry: 60
- Master_Log_File: mysql-bin.000001
- Read_Master_Log_Pos: 355
- Relay_Log_File: mysql-relay.000001
- Relay_Log_Pos: 4
- Relay_Master_Log_File: mysql-bin.000001
- Slave_IO_Running: No
- Slave_SQL_Running: No
- 此時IO線程和SQL線程沒有啓動,執行如下命令使其啓用
- mysql>start slave;
4、測試
此時主從基本配置已完成。下面進行一個小小的測試。
在主服務器上創建一個數據庫testdb,在從服務器上查看。
- mysql> show databases;
- +---------------------+
- | Database |
- +---------------------+
- | information_schema |
- | #mysql50#lost+found |
- | mysql |
- | performance_schema |
- | test |
- | testdb |
- +---------------------+
testdb已顯示出來,配置完成。
二、主-主模型
兩臺服務器都有二進制日誌和中繼日誌;服務器可讀可寫。但請注意配置對於有自動增長字段的數據要設置特別的屬性。
1、使用與主從模型相同的主機
2、配置
在rs1服務器上
(1)安裝軟件步驟同上述內容
(2)配置相關屬性
- #vim /etcmy.cnf
- log-bin=mysql-bin //二進制日誌必須開啓
- relay-log=mysql-relay //中繼日誌必須開啓
- auto-increment-increment = 2 //增長間隔爲2
- auto-increment-offset = 1 //自動增長的字段從1開始
- server-id = 10
- 進入mysql命令行
- mysql>grant replication slave,replication client on *.*
- to repluser@'192.168.0.%' identified by 'sql123';
- mysql> show global variables like '%auto_increment%';
- +--------------------------+-------+
- | Variable_name | Value |
- +--------------------------+-------+
- | auto_increment_increment | 2 |
- | auto_increment_offset | 1 |
- +--------------------------+-------+
- mysql> show master status;
- +------------------+----------+--------------+------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +------------------+----------+--------------+------------------+
- | mysql-bin.000001 | 355 | | |
- +------------------+----------+--------------+------------------+
在從服務器rs2上
(1)同樣的基本配置同上。在此直接編輯配置文件
- log-bin=mysql-bin
- relay-log=mysql-relay
- auto-increment-increment = 2
- auto-increment-offset = 2
- server-id = 20
- mysql> show global variables like '%auto_increment%';
- +--------------------------+-------+
- | Variable_name | Value |
- +--------------------------+-------+
- | auto_increment_increment | 2 |
- | auto_increment_offset | 2 |
- +--------------------------+-------+
- mysql>change master to
- master_host='192.168.0.100',
- master_user='repluser',
- master_password='sql123',
- master_log_file='mysql-bin.000001',
- master_log_pos=355;
- mysql>start slave;
- mysql>grant replicatin slave,replication client on *.* to
- repluser2@'192.168.0.%' identified by 'sql456'; //創建授權用戶
- mysql> show master status;
- +------------------+----------+--------------+------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +------------------+----------+--------------+------------------+
- | mysql-bin.000002 | 286 | | |
- +------------------+----------+--------------+------------------+
現在rs1已是rs2的主服務器,接下來配置rs2成爲rs1的主。回到rs1服務器上。
- 進入mysql命令行
- change master to
- master_host='192.168.0.101',
- master_user='repluser2',
- master_password='sql456',
- master_log_file='mysql-bin.000002',
- master_log_pos=286; //這裏定義的值是從從服務器中得到的。
- mysql> show slave status\G
- *************************** 1. row ***************************
- Slave_IO_State:
- Master_Host: 192.168.0.101
- Master_User: repluser2
- Master_Port: 3306
- Connect_Retry: 60
- Master_Log_File: mysql-bin.000002
- Read_Master_Log_Pos: 286
- Relay_Log_File: mysql-relay.000001
- Relay_Log_Pos: 4
- Relay_Master_Log_File: mysql-bin.000002
- Slave_IO_Running: No
- Slave_SQL_Running: No
- mysql>start slave
3、測試
現在rs1上創建一個有自動增長類型的字段,查看設置的屬性是否生效。
插入兩個字段。查看效果
三、半同步模型
MYSQL複製時的默認方式爲異步,但異步方式會產生很多滯後操作,因此引進了半同步式的模式。半同步模式是依靠插件模塊來實現的。它可以將在主服務器上寫操作轉發至從服務器的內存中,大大提高了數據的同步性。
1、配置一個主從模型
2、在主服務器上
- mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
- //裝載插件模塊
- mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1; //啓動插件
- mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000; //設置超時參數
- mysql> show global status like 'rpl_semi%';
- +--------------------------------------------+-------+
- | Variable_name | Value |
- +--------------------------------------------+-------+
- | Rpl_semi_sync_master_clients | 1 |
- | Rpl_semi_sync_master_net_avg_wait_time | 0 |
- | Rpl_semi_sync_master_net_wait_time | 0 |
- | Rpl_semi_sync_master_net_waits | 0 |
- | Rpl_semi_sync_master_no_times | 0 |
- | Rpl_semi_sync_master_no_tx | 0 |
- | Rpl_semi_sync_master_status | ON |
- | Rpl_semi_sync_master_timefunc_failures | 0 |
- | Rpl_semi_sync_master_tx_avg_wait_time | 0 |
- | Rpl_semi_sync_master_tx_wait_time | 0 |
- | Rpl_semi_sync_master_tx_waits | 0 |
- | Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
- | Rpl_semi_sync_master_wait_sessions | 0 |
- | Rpl_semi_sync_master_yes_tx | 0 |
- +--------------------------------------------+-------+
- clients 變爲1 ,證明主從半同步複製連接成功。
3、在從服務器上
- mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
- mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
- mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
- mysql> show global status like 'rpl_semi%';
- +----------------------------+-------+
- | Variable_name | Value |
- +----------------------------+-------+
- | Rpl_semi_sync_slave_status | ON |
- +----------------------------+-------+
配置完成。
如果想要配置永久生效則只需在各自服務器的/etc/my.cnf的[mysqld]段添加上述操作中set指令後的內容即可。
四、基於ssl的MYSQL複製
MYSQL的複製過程中數據的傳輸是明文顯示的,這對企業來說是非常不安全的。所以我們採取某種機制對數據進行相應的加密,而ssl就是首選機制了。下面就進行ssl配置。
1、首先配置主-從服務。在此不再詳述。
2、將rs1設置爲CA服務器
- #vim /etc/pki/tls/openssl.cnf
- 將 dir = ../../CA修改爲
- dir = /etc/pki/CA
- #(umask 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上的Mysql準備私鑰以及頒發證書
- #mkdir /usr/local/mysql/ssl
- #cd ssl/
- #(umask 077;openssl genrsa 1024 > mysql.key)
- #openssl req -new -key mysql.key -out mysql.csr
- #openssl ca -in mysql.csr -out mysql.crt
- #chown -R mysql.mysql ssl/
3、爲rs2頒發證書
- #mkdir /usr/local/mysql/ssl
- #cd /usr/local/mysql
- #chown -R mysql.mysql ssl/
- #cd ssl/
- #(umask 077;openssl genrsa 1024 > slave.key)
- #openssl req -new -key slave.key -out slave.csr
- #scp slave.csr 192.168.0.100:/root
- 在rs1上爲rs2簽發證書
- #openssl ca -in slave.csr -out slave.crt
- #scp slave.crt 192.168.0.101:/usr/local/mysql/ssl
- #cd /etc/pki/CA
- #scp cacert.pem 192.168.0.101:/etc/pki/CA
4、在主服務器rs1上配置開啓ssl
- #vim /etc/my.cnf
- [mysqld]
- ssl-ca=/etc/pki/CA/cacert.pem
- ssl-cert=/usr/local/mysql/ssl/mysql.crt
- ssl-key=/usr/local/mysql/ssl/mysql.key
- #serivce mysqld restart
5、在從服務器上
- # vim my.cnf
- [mysqld]
- ssl-ca=/etc/pki/CA/cacert.pem
- ssl-cert=/usr/local/mysql/ssl/slave.crt
- ssl-key=/usr/local/mysql/ssl/slave.key
- 登錄從服務器mysql 更改master的相關選項,以實現ssl功能
- mysql> change master to
- -> master_host='192.168.0.100',
- -> master_user='repluser',
- -> master_password='sql123',
- -> master_ssl=1,
- -> master_ssl_ca = '/etc/pki/CA/cacert.pem',
- -> master_ssl_capath = 'ettc/pki/CA',
- -> master_ssl_cert = '/usr/local/mysql/ssl/slave.crt',
- -> master_ssl_key = '/usr/local/mysql/ssl/slave.key';
- mysql>start slave;
- mysql>show slave status;
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
- Master_SSL_Allowed: Yes
- Master_SSL_CA_File: /etc/pki/CA/cacert.pem
- Master_SSL_CA_Path: /etc/pki/CA
- Master_SSL_Cert: /usr/local/mysql/ssl/slave.crt
- Master_SSL_Cipher:
- Master_SSL_Key: /usr/local/mysql/slave.key
至此,基於ssl的MYSQL複製配置完成。