搭建MySQL代理服務器實現讀寫分離+主從同步

實驗需求:

1.配置2臺MySQL服務器(192.168.100.2,192.168.100.3)+1臺代理服務器(192.168.100.1),實現MySQL代理的讀寫分離。

2.用戶只需要訪問MySQL代理服務器,實際的SQL查詢、寫入操作交給後臺的2臺MySQL服務器來完成。

3.2臺MySQL服務器實現主從同步,其中Master服務器允許SQL查詢、寫入,Slave服務器只允許SQL查詢。


一 .MASTER數據庫服務器(192.168.100.2)的配置

1.安裝軟件包(本實驗採用MySQL5.6版本)

# rpm -qa | grep -i mysql

MySQL-shared-5.6.15-1.el6.x86_64

MySQL-devel-5.6.15-1.el6.x86_64

MySQL-embedded-5.6.15-1.el6.x86_64

MySQL-test-5.6.15-1.el6.x86_64

MySQL-server-5.6.15-1.el6.x86_64

MySQL-client-5.6.15-1.el6.x86_64

MySQL-shared-compat-5.6.15-1.el6.x86_64


2.啓動服務並登錄數據庫本機對代理服務器做用戶授權

# service mysql start && chkconfig mysql on

mysql> grant  all  on *.*  to  proxyuser@"192.168.100.1" identified  by "123456";


3.創建測試數據庫和表

mysql> create database proxydb;

mysql> create table proxydb.proxytab(id int);

mysql> insert into proxydb.proxytab values (2);


二 .SLAVE數據庫服務器(192.168.100.3)的配置

1.安裝軟件包


2.啓動服務並登錄數據庫本機對代理服務器做用戶授權

# service mysql start && chkconfig mysql on

mysql> grant  all  on *.*  to  proxyuser@"192.168.100.1" identified  by "123456";  //與MASTER數據庫服務器做一樣的授權


3.創建測試數據庫和表

mysql> create database proxydb;                   //創建一樣的庫和表

mysql> create table proxydb.proxytab(id int);

mysql> insert into proxydb.proxytab values (3); //爲了能測試區分2臺不同數據庫服務器,先插入不同數據


三.MySQL代理服務器配置

1.在做代理服務器上測試授權用戶能否登錄2臺數據庫服務器

# mysql -h192.168.100.2 -uproxyuser -p123456         //登錄MASTER服務器

mysql> select * from proxydb.proxytab;

+------+

| id   |

+------+

|    2 |

+------+

1 row in set (0.00 sec)


# mysql -h192.168.100.3 -uproxyuser -p123456           //登錄SLAVE服務器

mysql> select * from proxydb.proxytab;

+------+

| id   |

+------+

|    3 |

+------+

1 row in set (0.00 sec)


2.釋放3306端口

# service mysqld stop

# chkconfig mysqld off

# netstat -tulnp | grep :3306


3.安裝提供代理服務器的軟件包

# tar zxvf mysql-proxy-0.8.3-linux-rhel5-x86-64bit.tar.gz

# mv mysql-proxy-0.8.3-linux-rhel5-x86-64bit /usr/local/mysql-proxy  //此包爲綠色免安裝

# yum -y install lua //此軟件使用LUA腳本語言,因此需要安裝好lua軟件包

代理服務啓動時 會設置  負責寫的數據庫  負責讀數據庫服務器

                       調用腳本來區分用戶的訪問類型

                       指定自己監聽的端口



4.啓動代理服務

cd /usr/local/mproxy/bin/

使用bin目錄下的mysql-proxy腳本來啓動代理服務

# ./mysql-proxy -P 192.168.100.1:3306 -r  192.168.100.3:3306  -b 192.168.100.2:3306  -s /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua &


主要命令選項:

-P:指定代理監聽的IP地址、端口

-r:指定讀服務器的IP地址、端口

-b:指定寫服務器的IP地址、端口

-s:指定lua腳本文件

--keepalive:如果服務進程崩潰,嘗試重啓此進程


5.查看代理進程是否運行

# jobs

# netstat -tulnp | grep :3306

tcp        0      0 192.168.100.1:3306          0.0.0.0:*                   LISTEN      3314/mysql-proxy    

//代理進程必須處於運行狀態,客戶端才能通過代理服務訪問到後端的數據庫服務器。


6.查看讀寫分離腳本

# vim /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua

……

40                 min_idle_connections = 4,         //默認併發請求大於4才實行讀寫分離

41                 max_idle_connections = 8,  


四.客戶端通過代理訪問數據庫服務器上的數據。

# mysql -h192.168.100.1 -uproxyuser -p123456    //測試客戶端第一個連接

mysql> select * from proxydb.proxytab;      //測試訪問到的是哪臺數據庫服務器

+------+

| id   |

+------+

|    2 |

+------+                                   //分配給了寫的那臺數據庫服務器

1 row in set (0.00 sec)        


# mysql -h192.168.100.1 -uproxyuser -p123456    //測試客戶端第二到第N個連接

mysql> select * from proxydb.proxytab;      


測試結果:

併發訪問量大於默認的最小併發連接輸4時才區分讀寫請求

併發訪問量小於併發連接數時請求會發給寫的那臺服務器

併發訪問量縮減到小於閥值後依然區分讀寫請求



四.將2臺MySQL數據庫服務器配置主從同步架構

1.MASTER數據庫服務器(192.168.100.2)配置

1.1 實現MySQL主從同步必須保證從數據庫服務器上有主數據庫服務器上的庫和表,且表結構也要一致。通過備份主服務器上現有的庫,然後導入到從服務器上。

當現有庫、表都採用MyISAM引擎時,可執行離線備份、恢復,這樣更有效率;否則,可通過mysqldump等工具來實現庫的導出、導入。

# mysqldump -uroot -p123456 --all-databases > /root/all.sql

# scp /root/all.sql 192.168.100.3:/root/all.sql       //通過scp傳給SLAVE服務器


1.2 修改/etc/my.cnf配置,重新啓動MySQL服務程序

# vim /etc/my.cnf

[mysqld]

log_bin                                  //主服務器一定要啓用binlog日誌

server_id =2                             //指定服務器ID號

innodb_flush_log_at_trx_commit=1         //優化設置

sync-binlog=1                             //允許日誌同步


# service mysql restart


1.3 管理員登錄數據庫授予SLAVE服務器複製權限

mysql> grant replication slave on *.* to slave@"192.168.100.3" identified by "123456";


1.4 檢查Master服務器的同步狀態

mysql> show master status;

+----------------------+----------+--------------+------------------+-------------------+

| File                 | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+----------------------+----------+--------------+------------------+-------------------+

| localhost-bin.000004 |      766 |              |                  |                   |

+----------------------+----------+--------------+------------------+-------------------+

1 row in set (0.00 sec)


2.MASTER數據庫服務器(192.168.100.3)配置

2.1 SLAVE服務器上導入備份的庫

# mysql -uroot -p123456 < /root/all.sql


2.2 修改/etc/my.cnf配置,重新啓動MySQL服務程序

# vim /etc/my.cnf

[mysqld]

log_bin                                  //啓用binlog日誌,從服務器也可不開啓

server_id =3                            //指定服務器ID號,不能和主相同

innodb_flush_log_at_trx_commit=1         //優化設置

sync-binlog=1                             //允許日誌同步

log_slave_updates=1                      //記錄從庫更新,便於實現“主-從-從”鏈式複製


# service mysql restart


2.3 管理員登入本機數據庫服務,發起同步操作

mysql> change  master  to

   -> master_host="192.168.100.2",             //對應Master的IP地址

   -> master_user="slaveuser",                   //同步時用戶名

   -> master_password="123456",                 //同步時密碼

   -> master_log_file="localhost-bin.000004", //對應Master的日誌文件

   -> master_log_pos=766;                      //對應Master的日誌偏移位置

Query OK, 0 rows affected, 2 warnings (0.10 sec)


mysql>  start  slave;      //一旦啓用SLAVE複製,當需要修改MASTER信息時,應先執行stop slave;停止複製,然後重新修改、啓動複製。


2.4 查看從數據庫服務器的狀態

mysql>  show slave status\G;  

……

           Slave_IO_Running: Yes

           Slave_SQL_Running: Yes

//若START SLAVE直接報錯失敗,請檢查CHANGE MASTER相關設置是否有誤,糾正後再重試;若IO線程或SQL線程有一個爲“No”,則應檢查服務器的錯誤日誌,分析並排除故障後重啓主從複製。


2.5 與從數據庫服務器相關的文件及作用

# ls /var/lib/mysql/

master.info                   //保存自己連接的主數據庫服務器的信息

localhost-relay-bin.000001    //relaybinlog日誌

localhost-relay-bin.index       //保存已有的relaybinlog日誌文件名

relay-log.info                    //relaybinlog日誌信息


五.驗證從數據庫服務器是否能同步從數據庫服務器上的數據

在MASTER服務器上寫入數據,在SLAVE服務器上查看

mysql  -uroot -p123456              //在MASTER服務器上登錄

mysql> create  database  testdb;

mysql> create table  a (id int);

            insert into  testdb.a values(100);

            insert into  testdb.a values(200);

            insert into  testdb.a values(300);


mysql -uroot -p123456                //在SLAVE服務器上登錄

mysql> select  *  from  testdb.a;    //能夠看到表裏的3條記錄則同步成功。


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