1. 程式人生 > >實現在同一臺linux主機上mysql主從複製與讀寫分離

實現在同一臺linux主機上mysql主從複製與讀寫分離

環境情況:由於資源有限,僅在一臺CentOS release 6.6上實現M-S主從複製與讀寫分離

一、mysql安裝與配置

具體安裝過程建議參考我的上篇一部落格文章

二、mysql主從複製

主從伺服器場景如下

主(m)   :172.30.204.111:3307

從1(s1):172.30.204.111:3308

從2(s2):172.30.204.111:3309

[[email protected] dingmingyi]# netstat-anlpt|grep mysql

tcp       0      0 0.0.0.0:3307                0.0.0.0:*                   LISTEN      19411/mysqld       

tcp       0      0 0.0.0.0:3308                0.0.0.0:*                   LISTEN     19734/mysqld       

tcp       0      0 0.0.0.0:3309                0.0.0.0:*                   LISTEN      20202/mysqld

2.1主伺服器操作:

[[email protected] dingmingyi]# cat /usr/local/mysql-m/etc/my.cnf

[mysqld]

basedir=/usr/local/mysql-m

datadir=/opt/database-m

socket=/var/run/mysql-m/mysql-m.sock

pid-file=/var/run/mysql-m/mysql-m.pid

port=3307

user=mysql

server-id=1                          

log-bin=mysql-bin

binlog_ignore_db=mysql

character_set_server=utf8

[mysqld_safe]

log-error=/var/log/mysql-m/mysql--error.log

[mysql]

socket = /var/run/mysql-m/mysql-m.sock

default-character-set=utf8

只要在my.cnf裡面新增內容都要重新啟動服務#service mysql-m restart

[[email protected] dingmingyi]#/usr/local/mysql-m/bin/mysqladmin -uroot password '321321'  -S /var/run/mysql-m/mysql-m.sock               #為M-mysql設定密碼;

[[email protected] dingmingyi]# /usr/local/mysql-m/bin/mysql-uroot -p321321 -S /var/run/mysql-m/mysql-m.sock

授權給從伺服器

mysql> grant replication slave on *.* [email protected] identified by '123123';

mysql> grant replication slave on *.* [email protected] identified by '123123';

mysql>flush privileges;

查詢主資料庫狀態

mysql>  show master status;

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

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

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

| mysql-bin.000001 |      670 |              | mysql            |                   |

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

1 row in set (0.00 sec)

記錄file和position的值,在配置從伺服器時需要用到

2.2從伺服器操作

修改從伺服器配置檔案/usr/local/mysql-s1/etc/my.cnf

將server-id=10 ,確保此id與主伺服器不同                                                     #設定多個從伺服器必須與M-S和S-S都不同

同樣在[mysql]下增加default-character-set=utf8 ,在[mysqld]下增加character_set_server=utf8

重啟服務

登陸從伺服器

/usr/local/mysql-s1/bin/mysql -uroot -p -S/var/run/mysql-s1/mysql-s1.sock              #由於沒設密碼,可以直接回車進入

執行同步語句

>change master to

 master_host='localhost',

 master_user='s1',

master_password='123123',

master_log_file='mysql-bin.000001',

master_log_pos=670,

master_port=3307;                                #一定要指定相應的埠號,不然在檢視狀態時會出錯

>start slave;

mysql> show slave status\G

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

                  Slave_IO_State: Waiting for master to send event

                       Master_Host: localhost

                       Master_User: s1

                        Master_Port: 3307

                   Connect_Retry: 60

                Master_Log_File: mysql-bin.000001

    Read_Master_Log_Pos: 670

                     Relay_Log_File: mysql-s1-relay-bin.000002

                     Relay_Log_Pos: 283

    Relay_Master_Log_File: mysql-bin.000001

               Slave_IO_Running: Yes            #以下兩排都要為YES才表明狀態正常

            Slave_SQL_Running: Yes

                 Replicate_Do_DB:          

   …………………………..省略若干…………………………………

另一從伺服器也做類似以上操作

2.3 驗證主從複製效果

主伺服器上操作

mysql> create database ding;

Query OK, 1 row affected (0.00 sec)

mysql> create table ding.d_tb(id int(3),name char(16),age char(4));

Query OK, 0 rows affected (0.14 sec)

mysql> insert into ding.d_tb values(001,'xixi','23');

Query OK, 1 row affected (0.03 sec)

兩臺從伺服器上都可以檢視相同的內容

mysql> show databases;

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

| Database           |

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

| information_schema |

| ding             |

| mysql              |

| performance_schema |

| test               |

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

5 rows in set (0.00 sec)

mysql> use ding;

Database changed

mysql> show tables;

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

| Tables_in_d_test |

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

| d_tb             |

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

1 row in set (0.00 sec)

mysql> select * from ding.d_tb;

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

| id   | name | age  |

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

|    1 | xixi | 23   |

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

1 row in set (0.00 sec)

同步成功!!!

三、Mysql-proxy讀寫分離

 Mysql-proxy代理:將寫操作分到mysql-master,讀操作分到mysql-slave

Mysql-proxy的讀寫分離是通過rw-splitting.lua指令碼實現,因此需要安裝lua

3.1安裝lua

[[email protected] dingmingyi]# yum -y install gcc gcc-c++ libedit libedit-devel libtermcap-devel ncurses-devel libevent-devel readline-devel

[[email protected] dingmingyi]# wget http://www.lua.org/ftp/lua-5.2.3.tar.gz

[[email protected] dingmingyi]# tar zxvf lua-5.2.3.tar.gz

[[email protected] dingmingyi]#cd lua-5.2.3

[[email protected] lua-5.2.3]#make linux

[[email protected] lua-5.2.3]#make install

3.2 下載mysql-proxy

[[email protected] dingmingyi]# tar zxvf mysql-proxy-0.8.4-linux-glibc2.3-x86-64bit.tar.gz

[[email protected] dingmingyi]# mv mysql-proxy-0.8.4-linux-glibc2.3-x86-64bit /usr/local/mysql_proxy

[[email protected] dingmingyi]# cd /usr/local/mysql_proxy/

[[email protected] mysql_proxy]# mkdir scripts

[[email protected] mysql_proxy]# cp share/doc/mysql-proxy/rw-splitting.lua scripts/

[[email protected] mysql_proxy]# vim scripts/rw-splitting.lua

if not proxy.global.config.rwsplit then

     proxy.global.config.rwsplit = {

              min_idle_connections = 1,           #預設4           改為1,表示最小連結數只有超過1時才會進行讀寫分離

             max_idle_connections = 1,           #預設8

         is_debug = false

      }

end

[[email protected] mysql_proxy]# vim proxy.conf      #此為手動建立

  1 [mysql-proxy]

  2 admin-username=proxy

  3 admin-password=123123

  4

  5 admin-lua-script=/usr/local/mysql_proxy/lib/mysql-proxy/lua/admin.lua                       #定義管理指令碼路徑

  6 proxy-read-only-backend-addresses=172.30.204.111:3308,172.30.204.111:3309        #讀伺服器地址

  7 proxy-backend-addresses=172.30.204.111:3307                         #寫伺服器地址

  8 proxy-lua-script=/usr/local/mysql_proxy/scripts/rw-splitting.lua                 #讀寫分離指令碼路徑

  9 log-file=/var/log/mysql-proxy.log

 10 log-level=debug

 11 daemon=true

 12 keepalive=true

~                  

[[email protected] mysql_proxy]# chmod 660 proxy.conf

[[email protected] mysql_proxy]# bin/mysql-proxy -P 172.30.204.111:3310 --defaults-file=/usr/local/mysql_proxy/proxy.conf

[[email protected] mysql_proxy]# lsof -i:3310

COMMAND    PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME

mysql-pro 1416 root   10u  IPv4 1011376      0t0  TCP master.jay.com:dyna-access (LISTEN)

登陸主伺服器上

mysql> grant all on *.* to [email protected]'%'identified by '123123';

mysql>flush privileges;

由於配置了主從複製,可以在從資料庫伺服器上檢視到同步的資料

從伺服器上

mysql> select host,user,password from mysql.user;     

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

| host           | user  | password                                  |

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

| localhost      | root  |                                           |

| master.jay.com | root  |                                           |

| 127.0.0.1      | root  |                                           |

| ::1            | root  |                                           |

| localhost      |       |                                           |

| master.jay.com |       |                                           |

| %              | proxy | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |

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

7 rows in set (0.00 sec)

為了更顯著看到讀寫分離效果,現將兩臺slave關閉

mysql> stop slave;

注:這裡以ding.d_tb為測試資料庫,由於前面進行主從複製,在從伺服器中也存在ding.d_tb庫。

為了看到單點效果,現做如下操作:

mysql> insert into ding.d_tbvalues(004,'master','4');                   ----〉主伺服器

mysql> insert into ding.d_tbvalues(005,'slave-1','5');                 -----〉從伺服器 s1

mysql> insert into ding.d_tbvalues(006,'slave-2','6');                 ----->從伺服器s2

測試機已安裝mysql,現遠端連線mysql-proxy

[[email protected] mysql-p]# bin/mysql -uproxy -p123123 -h172.30.204.111 -P3310 –e” insert into d_tb values(002,'dingding','25');”     #插入資料

[[email protected] mysql-p]# bin/mysql -uproxy -p123123 -h172.30.204.111 -P3310    

mysql> select * from ding.d_tb;      #此時看到的是從伺服器s1上的資料,上一步新增的資料沒有

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

| id   | name     | age  |

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

|    1 | xixi     | 23   |

|    2 | haha     | 24   |

|    2 | dingding | 25   |

|    5 | slave-1  | 5    |

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

4 rows in set (0.00 sec)

去主庫中查詢:

mysql>  select * from ding.d_tb;

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

| id   | name     | age  |

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

|    1 | xixi     | 23   |

|    2 | haha     | 24   |

|    2 | dingding | 25   |

|    4 | master   | 4    |

|    2 | dingding | 25   |

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

資料已插入

最後檢查從資料庫

S1:

mysql>  select * from ding.d_tb;

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

| id   | name     | age  |

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

|    1 | xixi     | 23   |

|    2 | haha     | 24   |

|    2 | dingding | 25   |

|    5 | slave-1  | 5    |

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

4 rows in set (0.00 sec)

S2:

mysql>  select * from ding.d_tb;

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

| id   | name     | age  |

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

|    1 | xixi     | 23   |

|    2 | haha     | 24   |

|    2 | dingding | 25   |

|    6 | slave-2  | 6    |

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

4 rows in set (0.00 sec)

由於關閉了主從同步,也沒有記錄。

現停掉S1服務   #service mysql-s1 stop

再次登陸測試機

[[email protected] mysql-p]# bin/mysql -uproxy -p123123 -h172.30.204.111 -P3310

Warning: Using a password on the command line interface can be insecure.

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 4

Server version: 5.6.24-debug Source distribution

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select * from ding.d_tb;     

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

| id   | name     | age  |

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

|    1 | xixi     | 23   |

|    2 | haha     | 24   |

|    2 | dingding | 25   |

|    6 | slave-2  | 6    |

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

4 rows in set (0.00 sec)

發現已自動切到S2上讀取資料了

由此驗證,已經實現mysql讀寫分離,目前寫操作都在master主伺服器上,用了避免資料不同步;讀操作都分攤給其他各個slave從伺服器,用來分擔資料庫壓力。

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

配置過程出現的問題及相應的解決方法

1、mysql> showmaster status;

Empty set (0.00 sec)

解決:沒開啟log-bin導致。在主伺服器my.cnf中[mysqld]新增log-bin=mysql-bin,重啟

2、mysql> show slavestatus\G;

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

               Slave_IO_State: Connecting tomaster

                  Master_Host: localhost

                  Master_User: s1

                  Master_Port: 3308

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000001

         Read_Master_Log_Pos: 120

               Relay_Log_File:mysql-s1-relay-bin.000001

                Relay_Log_Pos: 4

       Relay_Master_Log_File: mysql-bin.000001

            Slave_IO_Running: Connecting

           Slave_SQL_Running: Yes

解決:

對照以下三條:網路不通、密碼不對、pos不對

>stop slave;

>change master to

   master_host='localhost',

   master_user='s1',

   master_password='123123',

   master_log_file='mysql-bin.000001',

master_log_pos=120,

master_port=3307;         #一定要指定埠號

>start slave;

3、mysql> show slavestatus\G;

……………….省略若干………………….

ERROR:

No query specified

解決:mysql> show slave status\G不要後面的;(==》分號)

4、# make linux

cd src && make linux

make[1]: Entering directory`/home/dingmy/lua-5.2.4/src'

make allSYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl-lreadline"

make[2]: Entering directory `/home/dingmy/lua-5.2.4/src'

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

lua.c:67:31: error: readline/readline.h: Nosuch file or directory

lua.c:68:30: error: readline/history.h: Nosuch file or directory

lua.c: In function ?.ushline?.

lua.c:265: warning: implicit declaration offunction ?.eadline?

lua.c:265: warning: assignment makespointer from integer without a cast

lua.c: In function ?.oadline?.

lua.c:297: warning: implicit declaration offunction ?.dd_history?

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

make[2]: Leaving directory`/home/dingmy/lua-5.2.4/src'

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

make[1]: Leaving directory`/home/dingmy/lua-5.2.4/src'

make: *** [linux] Error 2

解決:yum install readline-devel

5、

[[email protected] dingmingyi]#/usr/local/mysql-m/bin/mysql -uroot -p321321 -S /var/run/mysql-m/mysql-m.sock

Warning: Using a password on the commandline interface can be insecure.

/usr/local/mysql-m/bin/mysql: Unknown OScharacter set 'GB18030'.

/usr/local/mysql-m/bin/mysql: Switching tothe default character set 'latin1'.

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 1

Server version: 5.6.24-debug-log Sourcedistribution

Copyright (c) 2000, 2015, Oracle and/or itsaffiliates. All rights reserved.

Oracle is a registered trademark of OracleCorporation and/or its

affiliates. Other names may be trademarksof their respective

owners.

Type 'help;' or '\h' for help. Type '\c' toclear the current input statement.

mysql>

解決:

# vim /usr/local/mysql-m/etc/my.cnf

在[mysql]下增加default-character-set=utf8 

在[mysqld]下增加character_set_server=utf8

# service mysql-m restart

6、[[email protected] mysql-p]#bin/mysql -uproxy -p123123 -P3310 -h172.30.204.111

Warning: Using a password on the commandline interface can be insecure.

ERROR 1045 (28000): Access denied for user'proxy'@'master.jay.com' (using password: YES)

解決:進入主伺服器中

mysql> select host,user,password frommysql.user;

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

| host           | user   | password                                  |

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

| localhost      | root  | *4160291B4C8CC2573CC94951203FFBC858754907 |

| master.jay.com | root   |                                           |

| 127.0.0.1      |root   |                                           |

| ::1            | root   |                                           |

| localhost      |       |                                           |

| master.jay.com |        |                                           |

| localhost      | s1    | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |

| localhost      | s2    | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |

| %              | proxy  | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |

| %              | proxy1 |*E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |

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

10 rows in set (0.00 sec)

mysql> delete from mysql.user wherehost='master.jay.com';      #刪除host=master.jay.com

Query OK, 2 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

重新連線mysql-proxy成功!!

相關推薦

實現同一linux機上mysql主從複製分離

環境情況:由於資源有限,僅在一臺CentOS release 6.6上實現M-S主從複製與讀寫分離 一、mysql安裝與配置 具體安裝過程建議參考我的上篇一部落格文章 二、mysql主從複製 主從伺服器場景如下 主(m)   :172.30.204.111:3307 從1

部署MySQL主從複製分離

一、實驗壞境 1.一臺CentOS 7作為客戶端測試,對應的地址為:192.168.80.1202.一臺CentOS 7作為Amoeba前端代理伺服器,對應的地址為:192.168.80.1103.一臺CentOS 7作為mysql主伺服器,對應的地址為:192.168.80.1004.兩臺CentOS 7

mysql主從複製分離

主從複製原理:在主資料庫執行後,都會寫入本地的日誌系統A中。假設,實時的將變化了的日誌系統中的資料庫事件操作,在主資料庫的3306埠,通過網路發給從資料。從資料庫收到後,寫入本地日誌系統B,然後一條條的將資料庫事件在資料庫中完成。那麼,主資料庫的變化,從資料庫

mysql主從複製分離配置詳解

mysql主從複製與讀寫分離配置詳解 當網站達到一定規模時,資料庫最先出現壓力,這時候使用者會明顯感覺到卡頓,其原因是資料庫的寫入操作,影響了查詢的效率。這時可以考慮對資料庫配置主從複製和讀寫分離。設定多臺資料庫伺服器,包括一個主伺服器和n個從伺服器,主伺服器負責寫入資料,從伺服器負

【純幹貨】Amoeba實現MySQL主從同步分離

exec strong arc all abstract a star status utf prop 【純幹貨】Amoeba實現MySQL主從同步與讀寫分離 一、簡介 amoeba簡介 Amoeba(變形蟲)項目,該開源框架於2008年開始發布一款 Amoeba f

【Mycat】資料庫效能提升利器(三)——Mycat實現Mysql主從複製分離

一、前言       在前一篇文章中,小編向大家 介紹了使用Mycat水平切分資料庫。可以說,使用了水平分庫後,資料庫提升還是很高的。如果想更高的提高資料庫效能,就可以考慮對Mysql進行主從複製和讀寫分離了。       在這篇部落格中,小編就向大家介紹基於Mycat的M

CentOS6.5搭建MySQL主從複製分離(冷月宮親自整理,最簡單明瞭)

CentOS6.5搭建MySQL主從複製,讀寫分離MySQL主從複製的優點:1、 如果主伺服器出現問題, 可以快速切換到從伺服器提供的服務,保證高可用性2、 可以在從伺服器上執行查詢操作, 降低主伺服器的訪問壓力3、 可以在從伺服器上執行備份, 以避免備份期間影響主伺服器的服

MySQL主從同步分離

修改配置 monit 相關 流量 修改配置文件 l數據庫 cli 授權 san MySQL主從同步MySQL AB復制1.對指定庫的異地同步。2.MySQL主-->從復制架構的實現。3.MySQL服務器的只讀控制。 主從:單向復制時,建議將從庫設置為只讀。 主從復制

MySQL高可用--主從複製分離

一、Mysql高可用概念  二、MySQL主從複製原理  叢集目的,減輕單臺伺服器壓力 三、MySQL主從複製配置 實際操作mysql伺服器叢集,主從複製的過程 master   192.168.230.128 slav

MySQL主從複製分離

一、主從複製 1.伺服器資訊:主伺服器:192.168.48.4   從伺服器:192.168.48.5  均已安裝mysql 2.配置主伺服器中的 /etc/my.cnf 檔案,設定伺服器id和開啟日誌功能。設定完後儲存。進入mysql客戶端,通過show VARIAB

[MySQL高階](七) MySQL主從複製分離實戰

1. 簡介   隨著技術的發展,在實際的生產環境中,由單臺MySQL資料庫伺服器不能滿足實際的需求。此時資料庫叢集就很好的解決了這個問題。採用MySQL分散式叢集,能夠搭建一個高併發、負載均衡的叢集伺服器。在此之前我們必須要保證每臺MySQL伺服器裡的資料同步。資料同步我們

mysql主從複製分離、分庫分表、分片

第1章 引言 隨著網際網路應用的廣泛普及,海量資料的儲存和訪問成為了系統設計的瓶頸問題。對於一個大型的網際網路應用,每天幾十億的PV無疑對資料庫造成了相當高的負載。對於系統的穩定性和擴充套件性造成了極大的問題。通過資料切分來提高網站效能,橫向擴充套件資料層已經成為架構研發人員首選的方式。 水平切分資料庫:可

[mysql終極優化]之主從複製分離詳細設定教程

記下File及Position下的值。以備在配置從伺服器時使用。 注:File:當前binlog的檔名,每重啟一次mysql,就會生成一個新binlog檔案       Position:當前binlog的指標位置 三、從伺服器配置 1、配置mysql.cnf # vi /etc/my.cnf (1)修改

SpringBoot微服務 +tomcat叢集+Ngnix負載均衡+Mysql主從複製分離(4)

四:mysql主從複製,讀寫分離 1.首先把mysql原始碼包檔案拷到兩臺linux伺服器上,然後在兩臺伺服器上安裝Mysql資料庫 安裝 MySQL 1 安裝 ncurses Ncurses 提供字元終端處理庫,包括面板和選單。它提供了

一步一圖搭建-分散式伺服器部署之mysql叢集-主從複製分離

傳統專案模型: 1.傳統的裝置搭建時,如果採用單臺伺服器.則會出現很多的問題.如果伺服器出現宕機/斷電/硬體裝置的損壞,都會直接影響使用者體驗. 2.如果傳統專案中遇到了高併發的情況.單臺伺服器不足以支援 分散式的處理: 傳統資料庫中存在

mysql主從複製分離到資料庫水平拆分及庫表雜湊

web專案最原始的情況是一臺伺服器只能連線一個mysql伺服器(c3p0只能配置一個mysql),但隨著專案的增大,這種方案明顯已經不能滿足需求了。Mysql主從複製,讀寫分離:上面的方案使用mysql-Proxy代理,分發讀寫請求,寫操作轉發到Mysql主伺服器,讀操作轉發

Mysql主從複製分離+MyCat資料庫中介軟體

最近搭建了 MySQL 主從 並使用MyCat作為資料庫中介軟體 版本: Mysql  5.5.48 Linux :CentOS 6.8 MyCat : 1.4 節點: 192.168.152.11Cluster1 192.168.152.12Cluster2 192.1

使用Mycat實現Mysql資料庫的主從複製分離、分表分庫、負載均衡和高可用

Mysql叢集搭建 使用Mycat實現Mysql資料庫的主從複製、讀寫分離、分表分庫、負載均衡和高可用(Haproxy+keepalived),總體架構:   說明:資料庫的訪問通過keepalived的虛擬IP訪問HAProxy負載均衡器,實現HAProxy的高可用,HAProxy用於實

MySQL搭建主從伺服器分離實現

一 丶為什麼要搭建主從伺服器和實現讀寫分離 1.總結起來就一點,實現併發吞吐和負載能力。通過搭建主從伺服器實現讀寫分離,提高MySQL的負載能力 2.主從的基本實現原理 (本例 主伺服器ip: 192.168.2.187,後面簡稱 master;從伺服器ip: 192.168

mysql 主從實戰及分離

logs 啟動 毫秒 class -- systemctl position 讀寫 mas 1. MYSQL主從原理    1) 至少需要2臺數據庫服務器,一主一從,Master開啟bin-log功能用於記錄主庫增加、刪除、修改、更新SQL語句。   2) 異步復