該文章爲原創,作者:樑健,QQ:15141739,時間:2011年5月11日17:55:26 轉載註明作者。
最近學習了一下MySQL的集羣,發現MySQL的集羣有很多種方式,下面來介紹下學到的MySQL Master Slave配置
MySQL Master Slave 字面上理解,可以看出一個主和下屬的關係,他們能做什麼呢?我個人理解:當遇到高併發訪問數據庫的時候,可以讓查詢操作的SQL去訪問Slave服務器,插入、修改、刪除、可以在Master服務器來做,這樣就可以減輕服務器的負擔。
Slave 會根據Master 進行數據以二進制流的方式快速同步。
這兩天在網上查了很多相關的配置,但都運行不了,最後結合多種配置加上自己的理解終於成功了,太開心了!
下面我來說說我是怎麼配置的吧! 爭取讓你按我的配置一次成功!我儘量詳細。
我的機器是XP系統,安裝的MySQL5.1.32-community-log,我的虛擬機裏是Ubuntu10.10,MySQL5.1.49-1ubuntu8.1-log
Master :192.169.105.203 (XP系統)
Slave: 192.168.2.133(Linux系統)
1、XP系統中操作:
找到MySQL的安裝目錄,我的是:
D:/Program Files/MySQL/MySQL Server 5.1
修改D:/Program Files/MySQL/MySQL Server 5.1/my.ini文件,找到[mysqld] 在下面寫:
server-id = 1
log_bin = d:/mysql/mysql-test-bin.log
expire_logs_days = 10
max_binlog_size = 100M
binlog_format =mixed
binlog_do_db = test_db
注意:d:/mysql/mysql-test-bin.log 這個目錄需要自己建立,log_bin的意思是 將數據庫的內容以二進制方式寫到文件裏(Slave會根據這個文件進行同步數據);
通常Master服務器都配置 server-id=1 這個數字最好和IP最後一組數字一致,但要小於32,這裏配置爲1。
binlog_do_db准許Slave同步的數據庫,我這裏要讓寫的是test_db用於測試的數據庫(Slave裏也要有相同的數據庫和表結構,否則無法同步),如果有多個數據庫可以多寫幾個binlog_do_db=**數據庫名。
重啓MySQL服務,net stop mysql 然後net start mysql
連接數據庫 mysql -uroot -p123456
mysql> show master status;
+-----------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-----------------------+----------+--------------+------------------+
| mysql-test-bin.000001 | 106 | | |
+-----------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
這個就是生成的二進制文件的信息,Slave會根據這個同步數據。
設定 Replication Slave 權限
我們必須要在 Master Server 上做設定,讓 Slave 具有可以從 Master Server 上 Copy 數據的權限(正式的說法爲 Replication Slave Priviledges)
mysql> GRANT REPLICATION SLAVE ON *.* TO 'test_dbuser'@'192.168.2.133' IDENTIFIED BY '1234';
語句中的SLAVE是權限名,*.*是可訪問任何數據庫,test_dbuser是用戶名,192.168.2.133是准許這個IP訪問,1234是密碼。
mysql> FLUSH PRIVILEGES; (使之生效)
--------------------------
2、下面是在Ubuntu下的操作,配置Slave:
MySQL的安裝我就不多說了,apt-get install mysql ……
先說明一下我的MySQL的路徑:
/etc/init.d/mysql 下是啓動和停止服務
/var/log/mysql/ 記錄日誌,相當於我在前面XP系統裏建立的d:/mysql/mysql-test-bin.log位置
/var/lib/mysql/ 存放數據庫。MySQL配置文件:/etc/mysql/my.cnf ,其中指定了數據文件存放路徑,
datadir = /var/lib/mysql
如果你創建了一個名爲 test 的數據庫,那麼這個數據庫的數據會存放到 /var/lib/mysql/test 目錄下。
Slave Server配置:
修改MySQL配置文件:/etc/mysql/my.cnf
找到[mysqld] 在下面加入:
server-id = 2
replicate-do-db =test_db
log_bin =/var/log/mysql/mysql-bin.log
relay_log =/var/log/mysql/mysql-relay-bin.log
master-connect-retry =1
expire_logs_days = 10
max_binlog_size = 100M
#binlog_do_db = test
#binlog_ignore_db = include_database_name
binlog_format = mixed
下面說明一下:
server-id=2就是個編號,如果有多個Slave服務器,就依次向後排,3、5、6……
replicate-do-db=test_db是配置我要到Master服務器同步的數據庫,我這裏配置的是test_db數據庫。
master-connect-retry=1 是1秒鐘同步一次,這個數值可根據不同需要配置。
配置好後,重啓MySQL服務。
進入Slave Server 的MySQL:
mysql -uroot -pliangjian
查看一下master服務器狀態:
mysql> show master status/G;
*************************** 1. row ***************************
File: mysql-bin.000003
Position: 234
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
ERROR:
No query specified
啓動
mysql>start slave;
然後查看一下狀態:
mysql> show slave status/G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.105.203
Master_User: test_dbuser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-test-bin.000004
Read_Master_Log_Pos: 8272
Relay_Log_File: mysql-relay-bin.000004
Relay_Log_Pos: 1399
Relay_Master_Log_File: mysql-test-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: test_db,admob
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: 8272
Relay_Log_Space: 8727
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: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
這裏主要看的是:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果是NO,可能是連接問題導致。
下面手動執行一下同步:
同步前需要先STOP Slave一下。再執行:
mysql> change master to master_host='192.168.105.203',master_user='test_dbuser',master_password='1234', master_log_file='mysql-test-bin.000001',master_log_pos=106;
這裏的 master_log_file='mysql-test-bin.000001',master_log_pos=106; 000001和106這兩個數值如果不知道輸入多少,可以先:
mysql> show master status/G; 看一下。
配置好後在 START Slave一下。這時候你可以再 mysql> show slave status/G; 看看情況。
用show processlist; 看一下連接情況。
我這裏test_db數據庫裏有一個表t01,裏面沒有數據。Ubuntu裏的Slave服務已經配置完畢。不要關機哦!
切忌 Slave Server和Master Server 裏的test_db庫的表結構都要一樣。否則數據沒法同步。
---------------
3、回到XP系統
登入Mysql在test_db數據庫的t01表裏插入一條數據:
mysql> insert into t01 (id,name,bz) values (3,'liangjian3','heihei3');
我這裏已經有了幾條:
mysql> select * from t01;
+------+------------+---------+
| id | name | bz |
+------+------------+---------+
| 1 | liangjian | heihei |
| 2 | liangjian2 | heihei2 |
| 3 | liangjian3 | heihei3 |
+------+------------+---------+
3 rows in set (0.00 sec)
這個時候在去Ubuntu裏看test_db裏的t01表是是不是已經把數據同步過去了。
---------------------------------
以上這些操作 你可能會遇到如下問題:
在XP裏執行完:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'test_dbuser'@'192.168.2.133' IDENTIFIED BY '1234';
在Ubuntu裏:
root@MyUbnutu:/var/lib/mysql# mysql -h 192.168.2.133 -utest_dbuser -p1234
會有登陸不上的情況,給出如下提示:
ERROR 1045 (28000): Access denied for user 'test_dbuser'@'liangjian' (using password: YES)
這個時候你可以在XP裏:
GRANT REPLICATION SLAVE ON *.* TO 'test_dbuser'@'liangjian' IDENTIFIED BY '1234';
或者:
GRANT REPLICATION SLAVE ON *.* TO 'test_dbuser'@'%' IDENTIFIED BY '1234';(用%號表示准許所以外部訪問)
我不知道爲何用IP不好使,這個問題也困擾了我好長時間,最後用Ubuntu裏的用戶名連上的。這一步很關鍵。
在執行:
mysql> change master to master_host='192.168.105.203',master_user='test_dbuser',master_password='1234', master_log_file='mysql-test-bin.000001',master_log_pos=106;
最後先查看一下master的狀態,如果不對,則需要去Mysql安裝目錄下刪除master.info文件,和log下的日誌文件,然後重啓Mysql服務,否則master始終是第一次配置的那個。
---------------------------------
參考以下文章,結合自己的需求終於配置成功了:
http://www.cnblogs.com/xiazh/archive/2011/04/22/1971182.html
http://hi.baidu.com/ismayday/blog/item/5c52aec3431d1751b319a8f1.html
第一次寫教程,沒網上查的資料寫的好,但自己想要提高總要走出這一步,加油吧!