溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL主從同步和讀寫分離如何配置

發(fā)布時(shí)間:2021-12-08 09:34:36 來源:億速云 閱讀:114 作者:小新 欄目:數(shù)據(jù)庫(kù)

這篇文章主要為大家展示了“MySQL主從同步和讀寫分離如何配置”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“MySQL主從同步和讀寫分離如何配置”這篇文章吧。

      現(xiàn)在使用的兩臺(tái)服務(wù)器已經(jīng)安裝了MySQL,全是rpm包裝的,能正常使用。

      為了避免不必要的麻煩,主從服務(wù)器MySQL版本盡量保持一致;

環(huán)境:192.168.0.1 (Master)

          192.168.0.2 (Slave)

MySQL Version:Ver 14.14 Distrib 5.1.48, for pc-linux-gnu (i686) using readline 5.1

1、登錄Master服務(wù)器,修改my.cnf,添加如下內(nèi)容;

server-id = 1   //數(shù)據(jù)庫(kù)ID號(hào), 為1時(shí)表示為Master,其中master_id必須為1到232–1之間的一個(gè)正整數(shù)值;

log-bin=mysql-bin   //啟用二進(jìn)制日志;

binlog-do-db=data //需要同步的二進(jìn)制數(shù)據(jù)庫(kù)名;

binlog-ignore-db=mysql   //不同步的二進(jìn)制數(shù)據(jù)庫(kù)名;這個(gè)同步后聽說很麻煩,我沒有同步;

log-bin=/var/log/mysql/updatelog //設(shè)定生成的log文件名;

log-slave-updates //把更新的記錄寫到二進(jìn)制文件中;

slave-skip-errors //跳過錯(cuò)誤,繼續(xù)執(zhí)行復(fù)制;

2、建立復(fù)制所要使用的用戶;

mysql>grant replication slave on *.* to test@192.168.0.2 identified by '********'

3、重啟mysql;

/usr/bin/mysqladmin -uroot shutdown;

/usr/bin/mysql_safe &

4、現(xiàn)在備份Master上的數(shù)據(jù);

   鎖定后我直接tar.gz data這個(gè)庫(kù)文件;

mysql>FLUSH TABLES WITH READ LOCK;

cd /var/lib/mysql

tar data.tar.gz data

接著直接執(zhí)行了遠(yuǎn)程scp;

scp ./data.tar.gz root@192.168.0.2:/var/lib/mysql

5、登錄Slave數(shù)據(jù)庫(kù)服務(wù)器,修改my.cnf;

server-id       = 3   //2已經(jīng)被用在另一個(gè)服務(wù)器上了,如果以后要再加Slave號(hào)接著往后數(shù)就OK了;

log-bin=mysql-bin

master-host     =   192.168.0.1

master-user     =   test

master-password =   ******

master-port     = 3306

master-connect-retry=60   //如果發(fā)現(xiàn)主服務(wù)器斷線,重新連接的時(shí)間差;

replicate-ignore-db=mysql //不需要備份的數(shù)據(jù)庫(kù);

replicate-do-db=data //需要備份的數(shù)據(jù)庫(kù)

log-slave-update

slave-skip-errors

6、解壓剛才從Master scp過來的文件,此處不用改權(quán)限、屬主,默認(rèn)沒有改變,可以根據(jù)實(shí)際情況進(jìn)行修改;

7、上述完成后,可以啟動(dòng)slave了;查看slave狀態(tài);

mysql>slave start; www.2cto.com

mysql>show slave status\G;

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.0.1

                  Master_User: test

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: updatelog.000001

          Read_Master_Log_Pos: 106

               Relay_Log_File: onlinevc-relay-bin.000013

                Relay_Log_Pos: 1069

        Relay_Master_Log_File: updatelog.000001

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

              Replicate_Do_DB: data

          Replicate_Ignore_DB: mysql

           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: 106

              Relay_Log_Space: 1681

              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)

ERROR:

No query specified

8、查看Master上面的狀態(tài);

mysql> show master status;

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

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

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

| updatelog.000012 |    15016 | data         | mysql            |

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

1 row in set (0.00 sec)

由此可見兩者的File、Position存在問題,所要要去Slave上設(shè)置對(duì)應(yīng)主庫(kù)的Master_Log_File、Read_Master_Log_Pos;執(zhí)行如下語句;

mysql>slave stop;

mysql>CHANGE MASTER TO MASTER_HOST='192.168.0.1',MASTER_USER='test', MASTER_PASSWORD='******',MASTER_LOG_FILE='updatelog.000012',MASTER_LOG_POS=15016;

確保Slave_IO_Running: Yes 、Slave_SQL_Running: Yes都要為YES才能證明Slave的I/O和SQL進(jìn)行正常。

9、解鎖主庫(kù)表;

UNLOCK TABLES;

到此主從MySQL服務(wù)器配置完成,測(cè)試結(jié)果如下;

mysql> show master status;

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

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

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

| updatelog.000012 |   717039 | data | mysql            |

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

1 row in set (0.00 sec)

mysql> show slave status\G;

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.0.1

                  Master_User: test

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: updatelog.000012

          Read_Master_Log_Pos: 717039

               Relay_Log_File: onlinevc-relay-bin.000013

                Relay_Log_Pos: 1222

        Relay_Master_Log_File: updatelog.000012

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

              Replicate_Do_DB: data

          Replicate_Ignore_DB: mysql

           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: 717039

              Relay_Log_Space: 1834

              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)

ERROR:

No query specified

####################################   如下是MySQL數(shù)據(jù)庫(kù)讀寫分離操作步驟##########################################

此處使用MySQL自己(Mysql-proxy)的代理實(shí)現(xiàn)數(shù)據(jù)庫(kù)的讀寫分離;

所需要安裝包如下;

1、check-0.9.8

2、glib-2.18.4

3、libevent-2.0.6-rc

4、lua-5.1.4

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

5、pkg-config-0.23

6、mysql-5.0.56

7、mysql-proxy-0.8.0

      http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/mysql-proxy-0.8.0.tar.gz

別的安裝包地址當(dāng)時(shí)沒有記地址,不過大部分都在這個(gè)網(wǎng)站上找的;http://sourceforge.net/

&&&&&&&&&& 安裝開始&&&&&&&&

1、tar -zxvf check-0.8.4.tar.gz

    cd check-0.8.4

    ./configure

    make

    make install

2、tar -zxvf glib-2.18.4.tar.gz   //系統(tǒng)rpm包可能版本低出現(xiàn)了問題3;

    ./configure

    make

    make install

3、tar -zxvf libevent-2.0.6-rc.tar.gz

    cd libevent-2.0.6-rc

    ./configure --prefix=/usr/local/libevent

     make && make install

4、tar -zxvf lua-5.1.4.tar.gz

    INSTALL_TOP= /usr/local/lua    //    為了把lua安裝到/var/lib/lua下,故要修改其下的Makefile;

或者直接執(zhí)行:sed -i 's#INSTALL_TOP= /usr/local#INSTALL_TOP= /usr/local/lua#' Makefile

root@testmysql [/software/lua-5.1.4]# make

Please do

   make PLATFORM

where PLATFORM is one of these:

   aix ansi bsd freebsd generic linux macosx mingw posix solaris

See INSTALL for complete instructions.

這處是要你選擇服務(wù)器所使用的平臺(tái);

執(zhí)行:make linux //此處執(zhí)行后出現(xiàn)了錯(cuò)誤,解決辦法在下面問題解決區(qū)1處,此處先跳過;

再執(zhí)行:make install

設(shè)置環(huán)境變量:

    export LUA_CFLAGS="-I/usr/local/lua/include" LUA_LIBS="-L/usr/local/lua/lib -llua -ldl" LDFLAGS="-L/usr/local/libevent/lib -lm"

    export CPPFLAGS="-I/usr/local/libevent/include"

    export CFLAGS="-I/usr/local/libevent/include"

5、tar -zxvf pkg-config-0.23.tar.gz

    cd pkg-config-0.23

    ./configure

    make

    make install

安裝完之后要執(zhí)行:cp etc/lua.pc /usr/local/lib/pkgconfig/lua5.1.pc      //原因見下面的問題解決區(qū)2處;

6、安裝MySQL客戶端;

因?yàn)榇朔?wù)器系統(tǒng)是默認(rèn)安裝了MySQL,沒有安裝客戶端,我又裝了client、devel如下所示已安裝的rpm包;

   root@testmysql [/software/lua-5.1.4]# rpm -qa | grep MySQL

MySQL-client-5.1.48-0.glibc23

MySQL-bench-5.0.91-0.glibc23

MySQL-test-5.1.48-0.glibc23

MySQL-shared-5.1.48-0.glibc23

MySQL-server-5.1.48-0.glibc23

MySQL-devel-5.1.48-0.glibc23

此后的Mysql-proxy時(shí)總是一直報(bào)錯(cuò),編譯不過去,無奈之下用包客戶端;(此時(shí)的rpm包都沒有卸載,直接執(zhí)行了下面的安裝)//此處問題見問題解決區(qū)4處;

    tar zxvf -5.0.56.tar.gz     //此處我直接使用了mysql的5.0.56的源碼包;

    cd mysql-5.0.56

    ./configure --prefix=/usr/local/mysql --without-server

    make && make install

7、tar xvf mysql-proxy-0.8.0.tar.gz

    cd mysql-proxy-0.8.0

    ./configure --prefix=/usr/local/mysql-proxy --with-mysql=/usr/local/mysql --with-lua    //問題解決處4有介紹;

    Make && Make install

8、在/var/lib/bin創(chuàng)建mysql-proxy.sh,內(nèi)容如下;

     #!/bin/bash

     LUA_PATH="/usr/local/mysql-proxy/lib/mysql-proxy/lua/?.lua" /usr/local/mysql-proxy/bin/mysql-proxy --proxy-backend-addresses=192.168.0.1:3306 --proxy-read-only-backend-addresses=192.168.0.2:3306 --proxy-lua-script=/usr/local/mysql-proxy/lib/mysql-proxy/rw-splitting.lua >> /var/log/mysql-proxy.log &

     然后加上可執(zhí)行權(quán)限;

     chmod a+x /var/lib/bin/mysql-proxy.sh

     執(zhí)行:/var/lib/bin/mysql-proxy.sh 啟動(dòng)服務(wù);

9、驗(yàn)證是否開戶了:4040、4041;

    root@testmysql [/usr/local/bin]# netstat -an | grep 404*

    tcp        0      0 0.0.0.0:4040                0.0.0.0:*                   LISTEN     

    tcp        0      0 0.0.0.0:4041                0.0.0.0:*                   LISTEN  

10、測(cè)試讀寫分離,此步略過,所有配置已經(jīng)完成。

&&&&&&&&&&&&&&&&&&&&&&&&&&&   問題解決區(qū)   &&&&&&&&&&&&&&&&&&&&&&&&&&&&

1、在安裝的第四步執(zhí)行make linux時(shí)報(bào)錯(cuò)如下:

root@testmysql [/software/lua-5.1.4]# make linux

cd src && make linux

make[1]: Entering directory `/software/lua-5.1.4/src'

make all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-Wl,-E -ldl -lreadline -lhistory -lncurses"

make[2]: Entering directory `/software/lua-5.1.4/src'

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lapi.o lapi.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lcode.o lcode.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o ldebug.o ldebug.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o ldo.o ldo.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o ldump.o ldump.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lfunc.o lfunc.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lgc.o lgc.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o llex.o llex.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lmem.o lmem.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lobject.o lobject.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lopcodes.o lopcodes.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lparser.o lparser.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lstate.o lstate.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lstring.o lstring.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o ltable.o ltable.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o ltm.o ltm.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lundump.o lundump.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lvm.o lvm.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lzio.o lzio.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lauxlib.o lauxlib.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lbaselib.o lbaselib.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o ldblib.o ldblib.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o liolib.o liolib.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lmathlib.o lmathlib.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o loslib.o loslib.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o ltablib.o ltablib.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lstrlib.o lstrlib.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o loadlib.o loadlib.c

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o linit.o linit.c

ar rcu liblua.a lapi.o lcode.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o lauxlib.o lbaselib.o ldblib.o liolib.o lmathlib.o loslib.o ltablib.o lstrlib.o loadlib.o linit.o

ranlib liblua.a

gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lua.o lua.c

In file included from lua.h:16,

                 from lua.c:15:

luaconf.h:275:31: error: readline/readline.h: No such file or directory

luaconf.h:276:30: error: readline/history.h: No such file or directory

lua.c: In function 鈥榩ushline鈥?

lua.c:182: warning: implicit declaration of function 鈥榬eadline鈥?

                                                                    lua.c:182: warning: assignment makes pointer from integer without a cast

lua.c: In function 鈥榣oadline鈥?

lua.c:210: warning: implicit declaration of function 鈥榓dd_history鈥?

                                                                       make[2]: *** [lua.o] Error 1

make[2]: Leaving directory `/software/lua-5.1.4/src'

make[1]: *** [linux] Error 2

make[1]: Leaving directory `/software/lua-5.1.4/src'

make: *** [linux] Error 2

解決方法:yum install libtermcap-devel

          yum install ncurses-devel                                 

          yum install libevent-devel                                   

          yum install readline-devel

2、安裝MySQL-proxy時(shí)報(bào)錯(cuò):

checking for LUA... configure: error: Package requirements (lua5.1 >= 5.1) were not met:

No package 'lua5.1' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you

installed software in a non-standard prefix.

Alternatively, you may set the environment variables LUA_CFLAGS

and LUA_LIBS to avoid the need to call pkg-config.

See the pkg-config man page for more details.

解決辦法:

cp etc/lua.pc /usr/local/lib/pkgconfig/lua5.1.pc

3、安裝MySQL-proxy時(shí)報(bào)錯(cuò):

checking for GLIB... configure: error: Package requirements (glib-2.0 >= 2.16.0) were not met:

No package 'glib-2.0' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you

installed software in a non-standard prefix.

Alternatively, you may set the environment variables GLIB_CFLAGS

and GLIB_LIBS to avoid the need to call pkg-config.

See the pkg-config man page for more details.

解決辦法:

   1、查看系統(tǒng)已經(jīng)安裝glib的rpm包;

    glibc-2.5-49.el5_5.4

    glibc-headers-2.5-49.el5_5.4

    glib2-2.12.3-4.el5_3.1

    glibc-common-2.5-49.el5_5.4

    glibc-devel-2.5-49.el5_5.4

   2、下載安裝glib-2.18.4.tar.gz

4、剛開始使用系統(tǒng)里rpm所指定的mysq_config時(shí),mysql-proxy安裝報(bào)錯(cuò),信息如下;

    configure: error: mysql_config not exists or not executable, use $ ./configure --with-mysql=/path/to/mysql_config

    看到幫助安裝文檔里要求如下:

    --with-mysql[=PATH]     Include MySQL support. PATH is the path to 'mysql_config'。

解決辦法就是:安裝包中的第6步。

以上是“MySQL主從同步和讀寫分離如何配置”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI