MySQL主從復(fù)制與讀寫分離

主從復(fù)制(Master-Slave)與讀寫分離(Mysql作為目前世界上使用最廣泛的免費(fèi)數(shù)據(jù)庫,相信所有從事系統(tǒng)運(yùn)維的工程師都一定接觸過。但在實(shí)際的生產(chǎn)環(huán)境中,由單臺(tái)主從復(fù)制(Master-Slave)的方式來同步數(shù)據(jù),再通過讀寫分離(MySQL的安裝與配置

具體的安裝過程,建議參考我的這一篇文章:http://heylinux.com/archives/993.html

值得一提的是,我的安裝過程都是源碼包編譯安裝的,并且所有的配置與數(shù)據(jù)等都統(tǒng)一規(guī)劃到了/opt/mysql目錄打包,然后傳到其它服務(wù)器上解包,便可立即使用。

二、主從復(fù)制

場景描述:

主數(shù)據(jù)庫服務(wù)器:192.168.10.130,MySQL已經(jīng)安裝,并且無應(yīng)用數(shù)據(jù)。

2.1 主服務(wù)器上進(jìn)行的操作

啟動(dòng)mysql/init.d/MySQL服務(wù)器

/opt/mysql?-uroot -p'new-password'

授權(quán)給從數(shù)據(jù)庫服務(wù)器192.168.10.131

mysql> GRANT REPLICATION SLAVE ON *.* to 'rep1'@'192.168.10.131' identified by ‘password’;

查詢主數(shù)據(jù)庫狀態(tài)

mysql-bin.000005 | 261 | | |

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

記錄下 FILE 及 Position 的值,在后面進(jìn)行從服務(wù)器操作的時(shí)候需要用到。

2.2 配置從服務(wù)器

修改從服務(wù)器的配置文件/opt/MySQL服務(wù)所使用。

啟動(dòng)mysql/init.d/MySQL服務(wù)器

/opt/mysql?-uroot -p'new-password'

執(zhí)行同步SQL語句

mysql-bin.000005’,

master_log_pos=261;

正確執(zhí)行后啟動(dòng)Slave同步進(jìn)程

mysql> start slave;

主從同步檢查

mysql-bin.000005

Read_Master_Log_Pos: 415

Relay_Log_File: localhost-relay-bin.000008

Relay_Log_Pos: 561

Relay_Master_Log_File:?主從復(fù)制時(shí),需要做以下處理:

(1)主數(shù)據(jù)庫進(jìn)行鎖表操作,不讓數(shù)據(jù)再進(jìn)行寫入動(dòng)作

mysql> FLUSH TABLES WITH READ LOCK;

(2)查看主數(shù)據(jù)庫狀態(tài)

mysql> show master status;

(3)記錄下 FILE 及 Position 的值。

將主服務(wù)器的數(shù)據(jù)文件(整個(gè)/opt/mysql> UNLOCK TABLES;

2.3 驗(yàn)證mysql> create database first_db;

Query Ok, 1 row affected (0.01 sec)

在主服務(wù)器上創(chuàng)建表first_tb

mysql> create table first_tb(id int(3),name char(10));

Query Ok, 1 row affected (0.00 sec)

在主服務(wù)器上的表first_tb中插入記錄

mysql> insert into first_tb values (001,’myself’);

Query Ok, 1 row affected (0.00 sec)

在從服務(wù)器上查看

mysql?|

| performance_schema |

| test |

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

5 rows in set (0.01 sec)

=============================

數(shù)據(jù)庫first_db已經(jīng)自動(dòng)生成

mysql> use first_db

Database chaged

mysql> show tables;

=============================

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

| Tables_in_first_db |

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

| first_tb |

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

1 row in set (0.02 sec)

=============================

數(shù)據(jù)庫表first_tb也已經(jīng)自動(dòng)創(chuàng)建

mysql> select * from first_tb;

=============================

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

| id | name |

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

| 1 | myself |

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

1 rows in set (0.00 sec)

=============================

記錄也已經(jīng)存在

由此,整個(gè)主從復(fù)制的過程就完成了,接下來,我們進(jìn)行MySQL讀寫分離

場景描述:

數(shù)據(jù)庫Master主服務(wù)器:192.168.10.130

數(shù)據(jù)庫Slave從服務(wù)器:192.168.10.131

MySQL-Proxy調(diào)度服務(wù)器 上進(jìn)行的。

3.1?MySQL-Proxy的讀寫分離主要是通過rw-splitting.lua腳本實(shí)現(xiàn)的,因此需要安裝lua。

lua可通過以下方式獲得

從http://www.lua.org/download.html下載源碼包

從rpm.pbone.net搜索相關(guān)的rpm包

download.fedora.redhat.com/pub/fedora/epel/5/i386/lua-5.1.4-4.el5.i386.rpm

download.fedora.redhat.com/pub/fedora/epel/5/x86_64/lua-5.1.4-4.el5.x86_64.rpm

這里我們建議采用源碼包進(jìn)行安裝

cd /opt/install

wget http://www.lua.org/ftp/lua-5.1.4.tar.gz

tar zvfx lua-5.1.4.tar.gz

cd lua-5.1.4

vi src/Makefile

在 CFLAGS= -O2 -Wall $(MYCFLAGS) 這一行記錄里加上-fPIC,更改為 CFLAGS= -O2 -Wall -fPIC $(MYCFLAGS) 來避免編譯過程中出現(xiàn)錯(cuò)誤。

make linux

make install

cp etc/lua.pc /usr/lib/pkgconfig/

export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/pkgconfig

3.4 安裝配置MySQL-Proxy可通過以下網(wǎng)址獲得:

http://MySQL-Proxy/

推薦采用已經(jīng)編譯好的二進(jìn)制版本,因?yàn)椴捎迷创a包進(jìn)行編譯時(shí),最新版的http://MySQL-Proxy/http://MySQL-Proxy/mysql.cdpa.nsysu.edu.tw/Downloads/mysql-proxy-0.8.1-linux-rhel5-x86-32bit.tar.gz

tar xzvf?mysql-proxy-0.8.1-linux-rhel5-x86-32bit /opt/mysql-proxy服務(wù)管理腳本

mkdir /opt/mysql-proxy


01#!/bin/sh

02#

03#?mysql-proxy daemon

04#

05# chkconfig: - 78 30

06# processname:?# description:?mysql

08??

09# Source function library.

10. /etc/rc.d/init.d/functions

11??

12#PROXY_PATH=/usr/local/bin

13PROXY_PATH=/opt/mysql-proxy/bin

14??

15prog="mysql-proxy"

16??

17# Source networking configuration.

18. /etc/sysconfig/network

19??

20# Check that networking is up.

21[ ${NETWORKING} ="no"?] &&exit?0

22??

23# Set default?#PROXY_OPTIONS="--daemon"

25PROXY_OPTIONS="--admin-username=root --admin-password=password --proxy-read-only-backend-addresses=192.168.10.131:3306 --proxy-backend-addresses=192.168.10.130:3306? --admin-lua-script=/opt/mysql-proxy/lua/admin.lua --proxy-lua-script=/opt/mysql-proxy/run/mysql-proxy.pid

27??

28# Source?if?[ -f /etc/sysconfig/then

30. /etc/sysconfig/fi

32??

33PATH=$PATH:/usr/bin:/usr/local/bin:$PROXY_PATH

34??

35# By default it's all good

36RETVAL=0

37??

38# See how we were called.

39case"$1"in

40??start)

41# Start daemon.

42echo?-n $"Starting $prog: "

43$NICELEVEL $PROXY_PATH/file=$PROXY_PID --user=file=/opt/mysql-proxy.log

44????????RETVAL=$?

45echo

46if[ $RETVAL = 0 ];then

47touch?/var/lock/subsys/fi

49???????;;

50??stop)

51# Stop daemons.

52echo?-n $"Stopping $prog: "

53????????killproc $prog

54????????RETVAL=$?

55echo

56if[ $RETVAL = 0 ];then

57rm?-f /var/lock/subsys/rm?-f $PROXY_PID

59fi

60???????;;

61??restart)

62????????$0 stop

63sleep?3

64????????$0 start

65???????;;

66??condrestart)

67[ -e /var/lock/subsys/mysql-proxy ] && $0 restart

68??????;;

69??status)

70status?mysql-proxy

71????????RETVAL=$?

72???????;;

73??*)

74echo"Usage: $0 {start|stop|restart|status|condrestart}"

75????????RETVAL=1

76???????;;

77esac

78??

79exit?$RETVAL

腳本參數(shù)詳解:

==============================================

PROXY_PATH=/opt/mysql-proxy服務(wù)二進(jìn)制文件路徑

PROXY_OPTIONS="--admin-username=root \ //定義內(nèi)部管理服務(wù)器賬號(hào)

--admin-password=password \ //定義內(nèi)部管理服務(wù)器密碼

--proxy-read-only-backend-addresses=192.168.10.131:3306 \ //定義后端只讀從服務(wù)器地址

--proxy-backend-addresses=192.168.10.130:3306 \ //定義后端主服務(wù)器地址

--admin-lua-script=/opt/mysql-proxy/lua/admin.lua \ //定義lua管理腳本路徑

--proxy-lua-script=/opt/mysql-proxy/run/mysql-proxy PID文件路徑

$NICELEVEL $PROXY_PATH/mysql-proxy PID文件路徑

--user=mysql用戶身份啟動(dòng)服務(wù)

--log-level=warning \ //定義log日志級(jí)別,由高到低分別有(error|warning|info|message|debug)

--log-file=/opt/mysql-proxy.log //定義log日志文件路徑

==============================================

cp?mysql-proxy/init.d/

chmod +x /opt/mysql-proxy

mkdir /opt/mysql-proxy/log

mkdir /opt/mysql-proxy源碼包中獲取

cd /opt/install

wget http://MySQL-Proxy/mysql-proxy-0.8.1.tar.gz

cd?mysql-proxy/scripts

修改讀寫分離腳本rw-splitting.lua

修改默認(rèn)連接,進(jìn)行快速測試,不修改的話要達(dá)到連接數(shù)為4時(shí)才啟用讀寫分離

vim /opt/mysql-proxy

/opt/mysql-proxy start

3.5 測試讀寫分離效果

創(chuàng)建用于讀寫分離的數(shù)據(jù)庫連接用戶

登陸主數(shù)據(jù)庫服務(wù)器192.168.10.130,通過命令行登錄管理mysql/bin/mysql> GRANT ALL ON *.* TO 'proxy1'@'192.168.10.132' IDENTIFIED BY 'password';

由于我們配置了MySQLMySQL服務(wù)器

/opt/mysql?-uroot -p'new-password'

關(guān)閉Slave同步進(jìn)程

mysql> stop slave;

Query OK, 0 rows affected (0.00 sec)

連接mysql/bin/mysql> use first_db;

Database changed

mysql> insert into first_tb values (110,’second’);

Query Ok, 1 row affected (0.00 sec)

查詢記錄

mysql> select * from first_tb;

=============================

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

| id | name |

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

| 1 | myself |

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

1 rows in set (0.00 sec)

=============================

通過讀操作并沒有看到新記錄

MySQL-Proxy

下面,分別登陸到主從數(shù)據(jù)庫服務(wù)器,對(duì)比記錄信息

首先,檢查主數(shù)據(jù)庫服務(wù)器

mysql> select * from first_tb;

=============================

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

| id | name |

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

| 1 | myself |

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

| 007 | first |

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

| 110 | second |

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

3 rows in set (0.00 sec)

=============================

兩條新記錄都已經(jīng)存在

然后,檢查從數(shù)據(jù)庫服務(wù)器

mysql> select * from first_tb;

=============================

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

| id | name |

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

| 1 | myself |

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

1 rows in set (0.00 sec)

=============================

沒有新記錄存在

由此驗(yàn)證,我們已經(jīng)實(shí)現(xiàn)了MySQLMySQLMySQL-Proxy的rw-splitting.lua腳本在網(wǎng)上有很多版本,但是最準(zhǔn)確無誤的版本仍然是源碼包中所附帶的lib/rw-splitting.lua腳本,如果有l(wèi)ua腳本編程基礎(chǔ)的話,可以在這個(gè)腳本的基礎(chǔ)上再進(jìn)行優(yōu)化;

3.MySQL-Proxy供自身使用,雖然比較低效但卻能保證穩(wěn)定性;

4.一主多從的架構(gòu)并不是最好的架構(gòu),通常比較優(yōu)的做法是通過程序代碼和中間件等方面,來規(guī)劃,比如設(shè)置對(duì)表數(shù)據(jù)的自增id值差異增長等方式來實(shí)現(xiàn)兩個(gè)或多個(gè)主服務(wù)器,但一定要注意保證好這些主服務(wù)器數(shù)據(jù)的完整性,否則效果會(huì)比多個(gè)一主多從的架構(gòu)還要差;

5.MySQL?是一款優(yōu)秀的中間件軟件,同樣可以實(shí)現(xiàn)讀寫分離,負(fù)載均衡等功能,并且穩(wěn)定性要大大超過MySQL-Proxy,甚至MySQL-Cluster。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容