實驗系統:CentOS 6.6_x86_64
實驗前提:提前准備好編譯環境,防火牆和selinux都關閉
實驗說明:本實驗共有2台主機,IP分配如拓撲
實驗軟件:mariadb-10.0.20
實驗拓撲:
一、安裝mysql
1.編譯安裝mariadb:
tar xf mariadb-10.0.20-linux-x86_64.tar.gz -C /usr/local/ cd /usr/local/ ln -sv mariadb-10.0.20-linux-x86_64 mysql mkdir -pv /mydata/data useradd -r mysql chown -R mysql.mysql /mydata/data/ cd mysql/ chown -R root.mysql . scripts/mysql_install_db --user=mysql --datadir=/mydata/data/ cp support-files/my-large.cnf /etc/my.cnf cp support-files/mysql.server /etc/init.d/mysqld chkconfig --add mysqld chkconfig mysqld on
2.編輯配置文件:
vim /etc/my.cnf -------------------------------- datadir = /mydata/data //增加此行 -------------------------------- service mysqld start /usr/local/mysql/bin/mysql //連接測試
二、主從復制
實驗中我先讓19.43當主服務器,19.48為從服務器。
1.主服務器操作:
(1)編輯my.cnf,啟用二進制日志(如果定義到其他路徑,請給予其mysql權限):
log-bin=/mydata/data/mysql-bin
(2)定義server-id:
server-id = 1
(3)創建有復制權限的賬號:
/usr/local/mysql/bin/mysql ----------------------------------------- GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO slave@192.168.19.48 IDENTIFIED BY '123456'; //遵循最小權限原則 FLUSH PRIVILEGES;
(4)記錄最后的二進制日志信息,CHANGE MASTER時會用到:
SHOW MASTER LOGS;
2.從服務器操作:
(1)啟動中繼日志(如果定義到其他路徑,請給予其mysql權限):
relay_log=/mydata/data/relay-log
(2)從服務器用中繼日志就足夠了,關閉二進制日志,減少磁盤IO:
#log-bin=mysql-bin //將其注釋
#binlog_format=mixed
(3)定義server-id:
server-id = 2 //不能與主服務器相同
(4)配置CHANGE MASTER:
/usr/local/mysql/bin/mysql ----------------------------------------- CHANGE MASTER TO MASTER_HOST='192.168.19.43',MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=326;
SHOW SLAVE STATUS\G //查看狀態
*************************** 1. row *************************** Slave_IO_State: Master_Host: 192.168.19.43 Master_User: slave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 326 Relay_Log_File: relay-log.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: mysql-bin.000002 Slave_IO_Running: No Slave_SQL_Running: No 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: 326 Relay_Log_Space: 248 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: NULL 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: 0 Master_SSL_Crl: Master_SSL_Crlpath: Using_Gtid: No Gtid_IO_Pos: 1 row in set (0.00 sec)
(5)啟動io thread以及sql thread:
START SLAVE;
3.在主服務器創建數據庫,從服務器查看:
CREATE DATABASE jason; //主服務器創建數據庫
SHOW DATABASES; //從服務器查看
4.如果主數據庫不是新建立的,而是使用過一段時間,且里面已經有不少數據的情況下,需要先把主服務器數據導出,再導入到從服務器,然后根據上面的步驟進行主從復制,這里將不再演示。
導出數據庫命令參考:mysqldump --all-databases --lock-all-tables --master-data=2 > name.sql
三、半同步復制
1.什么是半同步復制?
因為開啟這個功能之后,主服務器只等待多個從服務器中的指定的一台從服務器復制成功,然后才進行其他寫操作,使這個從服務器和主服務器上的數據完全同步,而並不管其他的從服務器。這在一定程度上就保證了我們數據的安全性。這個功能需要打由google貢獻的補丁,它是以插件的形式存在的。補丁存放的位置在:/usr/local/mysql/lib/plugin/
2.主服務器打補丁:
/usr/local/mysql/bin/mysql --------------------------------------------- INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; SHOW GLOBAL VARIABLES LIKE '%semi%'; //查看狀態
3.主服務器修改配置:
SET GLOBAL rpl_semi_sync_master_enabled=1; SET GLOBAL rpl_semi_sync_master_timeout=1000;
4.從服務器打補丁:
/usr/local/mysql/bin/mysql --------------------------------------------- INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; SHOW GLOBAL VARIABLES LIKE '%semi%';
5.從服務器修改配置:
SET GLOBAL rpl_semi_sync_slave_enabled=1;
STOP SLAVE;
START SLAVE;
6.主服務器查看狀態:
SHOW GLOBAL STATUS LIKE '%semi%';
四、主主復制
1.由於剛才做了許多操作,為了不影響之后的實驗,我們先將數據庫進行重置:
service mysqld stop rm -rf /mydata/data/* //刪除數據庫文件 /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql/ --datadir=/mydata/data/ //初始化mysql
2.修改my.cnf:
19.43上:
vim /etc/my.cnf ------------------------------------------- [mysqld] server-id=1 log-bin=/mydata/data/mysql1-bin //開啟二進制日志 relay_log=/mydata/data/relay-log //開始中繼日志 auto-increment-increment = 2 //每次增長的數值 auto-increment-offset = 1 //開始的數值
19.48上:
vim /etc/my.cnf ------------------------------------------- [mysqld] server-id=2 log-bin=/mydata/data/mysql2-bin relay_log=/mydata/data/relay-log auto-increment-increment = 2 auto-increment-offset = 2
3.創建具有復制權限的用戶:
19.43上:
service mysqld start /usr/local/mysql/bin/mysql ------------------------------------------ GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO mmm@192.168.19.48 IDENTIFIED BY '123456'; FLUSH PRIVILEGES;
19.48上:
service mysqld start /usr/local/mysql/bin/mysql ------------------------------------------ GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO mmm@192.168.19.43 IDENTIFIED BY '123456'; FLUSH PRIVILEGES;
4.查看二進制位置:
19.43上:
SHOW MASTER LOGS;
19.48上使用同樣的命令:
5.配置CHANGE MASTER:
19.43上:
CHANGE MASTER TO MASTER_HOST='192.168.19.48',MASTER_USER='mmm',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql2-bin.000001',MASTER_LOG_POS=642; START SLAVE;
19.48上:
CHANGE MASTER TO MASTER_HOST='192.168.19.43',MASTER_USER='mmm',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql1-bin.000001',MASTER_LOG_POS=642; START SLAVE;
6.查看狀態:
SHOW SLAVE STATUS\G
之后的復制演示這里不再演示,請大家自行嘗試。至此,所有試驗演示完畢,謝謝!