1、概要
首先要准備兩台服務器,一台主服務器(Master),另一台從服務器(Slave),然后要保證Master與Slave的版本要相同且Master不能高於Slave的版本,一般穩健的做法都是使其版本相同,因為MySQL不同版本之間的binlog(二進制日志)格式可能會不一樣,最后會導致同步出現異常。介紹先到這里,以下我們先確認兩台服務器的信息:
主服務器(Master):
IP:192.168.1.100
系統:Linux(Ubuntu 64位 v10.10)
MySQL版本:5.1.49
需要同步的數據庫名:myslave
用於同步的帳號:slave001
用於同步的密碼:timescode888
————————————–
從服務器(Slave)
IP:192.168.1.90
系統:Linux(Ubuntu 32位 v10.10)
MySQL版本:5.1.49
需要同步的數據庫名:myslave
注:以下的配置以及測試都是使用SSH來進行的
2、修改Master服務器的配置
#打開my.cnf配置文件
vi /etc/mysql/my.cnf
#鍵入 /server-id 找到server-id的位置,把以下內容對照設置進去,鍵入 i,激活輸入狀態
#注意,這里的Master與Slave的server-id不能相同
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
binlog_do_db = myslave #如果需要同時同步多個數據庫,請另起一行設置binlog_do_db=需要同步的數據庫名稱
binlog_ignore_db = mysql
3、在Master建立myslave數據庫並建立相關的數據表,SQL代碼如下
#建立數據庫
mysql -u root -p
mysql> CREATE DATABASE myslave CHARSET ‘utf8′;
#建立數據表
– —————————-
– Table structure for `users`
– —————————-
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL,
`website` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
– —————————-
– Table structure for `users_log`
– —————————-
DROP TABLE IF EXISTS `users_log`;
CREATE TABLE `users_log` (
`user_log_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`info` varchar(200) DEFAULT NULL,
`uid` mediumint(8) unsigned NOT NULL,
PRIMARY KEY (`user_log_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
4、建立用於replication的帳號
grant replication slave on *.* to myslave001@’%’ identified by ‘timescode888′;
quit
#重啟服務器
/etc/init.d/mysql restart
#進入mysql查看有沒有生效
mysql -u root -p
mysql> show master status;
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000001 | 106 | myslave | mysql |
+——————+———-+————–+——————+
#以上可以看出跟在my.cnf里設置的是一致的,在此要記下File以及Position的值,后面在Slave服務器上會用到
5、使用mysqldump導出Master中的myslave數據庫
#在此必須要加入–master-data選項,保證在dump時會記錄到binlog名稱和偏移值
#而使用–lock-all-tables的原因就是為了數據在導出的時候沒有其它新數據插入,保證一致性
mysqldump –master-data=1 –lock-all-tables=true -uroot -pwww.timescode.com myslave > /home/myslave_bak_20110326.sql
#具體的根據實際情況而變化,不一定要使用root帳號來導出數據
6、使用sz命令下載備份文件
sz /home/myslave_bak_20110326.sql
7、修改Slave服務器的配置
#具體的路徑以及版本都與Master服務器一樣
vi /etc/mysql/my.cnf
#請對照設置,如下
server-id = 2
master-host = 192.168.1.100
master-user = myslave001
master-password = timescode888
master-port = 3306
master-connect-retry = 5
replicate-do-db = myslave
replicate-ignore-db = mysql
8、使用rz命令上傳備份文件到Slave服務器
rz
#當彈出選項框后選取剛才下載的備份文件
#把文件上傳到home目錄,具體的你可以根據你實際環境來操作
9、建立數據庫並導入備份數據
mysql -u root -p
mysql> CREATE DATABASE myslave CHARSET ‘utf8′;
mysql> use myslave;
mysql> source /home/myslave_bak_20110326.sql;
#查看有沒有導入成功
mysql> show tables;
+——————-+
| Tables_in_myslave |
+——————-+
| users |
| users_log |
+——————-+
2 rows in set (0.00 sec)
#由於剛才沒有重啟mysql,先需要退出去重啟一下
mysql> quit
10、重啟Slave服務器上的mysql
/etc/init.d/mysql restart
mysql -u root -p
#配置Slave信息並啟動Slave服務
mysql> CHANGE MASTER TO
-> MASTER_HOST=’192.168.1.100′,
-> MASTER_USER=’myslave001′,
-> MASTER_PASSWORD=’timescode888′,
-> MASTER_LOG_FILE=’mysql-bin.000001′,
-> MASTER_LOG_POS=106;
#以上的是關鍵,具體的MASTER_LOG_FILE以及MASTER_LOG_POS的數據,可以從Master服務器獲得,如果不設置,將無法正常啟動Slave服務
#啟動Slave服務
mysql> start slave;
#查看同步狀態
mysql> show slave status;
#當輸入命令后會出現一大堆的狀態,具體的看Slave_IO_Running以及Slave_SQL_Running的狀態,如果都是Yes就代表正常
#然后還可以看到Slave_IO_State的狀態是Waiting for master to send event,含義是等待Master服務器發送事件
11、測試同步
#在Master服務器插入一條數據
mysql> use myslave;
mysql> INSERT INTO users(‘username’,'website’) VALUES(‘edison’,'http://www.timescode.com’);
#插入成功之后,稍等片刻,就可以在Slave服務器上查看到相同記錄
#如果插入不成功,放心,你可以再仔細檢查一下本配置文檔,是否有那一步有遺漏或沒正確配置。
12、后述
#如果想要查看當前Slave服務器的同步狀態及偏移值等信息,請查找master.info文件
more /var/lib/mysql/master.info
#查看Slave執行binlog文件的情況
more /var/lib/mysql/relay-log.info
#如果對本文有疑問或建議請給我留言。
Mysql 主從服務與集群的區別
Slave主要是來備份數據的,只有當Master出現故障時,Slave才會接過Master的服務,
對外部請求進行處理,直到Master恢復正常。
就是說,在Master/Slave中,要么是Master在服務,要么是Slave在服務,不會Master/Slave同時提供服務。
是Cluster的各個mysql服務在同時對外處理請求,這種模式性能更高,
同時各個集群節點的數據是基於內存進行互備的。
另外一份是基於內存的,用於與集群中的其他節點進行數據同步的。
相對來說,對系統的開銷會大一些,而且不能適應於大數據量的應用環境中,因為受到系統內存的限制。