MySQL Master Slave 數據同步,集羣。

該文章爲原創,作者:樑健,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

第一次寫教程,沒網上查的資料寫的好,但自己想要提高總要走出這一步,加油吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章