日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

读写分离mysql数据库mariadb_MariaDB数据库读写分离实现(一):mysql-proxy的使用

發布時間:2024/4/14 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 读写分离mysql数据库mariadb_MariaDB数据库读写分离实现(一):mysql-proxy的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.mysql-proxy簡介

MySQL-Proxy是處在你的MySQL數據庫客戶和服務端之間的程序,它還支持嵌入性腳本語言Lua。這個代理可以用來分析、監控和變換(transform)通信數據,它支持非常廣泛的使用場景:

負載平衡和故障轉移處理

查詢分析和日志

SQL宏(SQL macros)

查詢重寫(query rewriting)

執行shell命令

MySQL-Proxy更強大的一項功能是實現“讀寫分離(Read/Write Splitting)”。基本的原理是讓主數據庫處理事務性查詢,而從數據庫處理SELECT查詢。數據庫復制被用來把事務性查詢導致的變更同步到集群中的從數據庫。

簡單的說,MySQL Proxy就是一個連接池,負責將前臺應用的連接請求轉發給后臺的數據庫,并且通過使用lua腳本,可以實現復雜的連接控制和過濾,從而實現讀寫分離和負載平衡。對于應用來說,MySQL Proxy是完全透明的,應用則只需要連接到MySQL Proxy的監聽端口即可。當然,這樣proxy機器可能成為單點失效,但完全可以使用多個proxy機器做為冗余,在應用服務器的連接池配置中配置到多個proxy的連接參數即可。

其實現如圖所示:

二.基本環境介紹,

主數據庫服務器:172.16.31.20,MariaDB已經安裝

從數據庫服務器:172.16.31.21,MariaDB已經安裝

主從復制架構配置完畢,實現了主從復制;詳細配置參考博客:

http://sohudrgon.blog.51cto.com/3088108/1608207

Mysql-proxy讀寫分離服務器節點:172.16.31.22,未配置;

規劃架構如圖:

三.mysql-proxy讀寫分離實現;

1.安裝mysql-proxy軟件

如果你有epel源,epel源收錄了mysql-proxy的軟件包,我們可以使用yum安裝mysql-proxy,省去了編譯安裝的麻煩;但是EPEL源將讀寫分離的LUN腳本給去掉了,我們還需要從源碼包中就讀寫分離腳本復制出來;

我這里提供mysql-proxy的下載,還提供一個讀寫分離的lun腳本文件:

http://down.51cto.com/data/1978347

下面就開始進行mysql-proxy的安裝

查看yum源中的mysql-proxy包:[root@node5?~]#?yum?list?all?mysql-proxy

Loaded?plugins:?fastestmirror,?refresh-packagekit,?security

base?????????????????????????????????????????????????????|?3.2?kB?????00:00

base/primary_db??????????????????????????????????????????|?3.3?MB?????00:00

epel?????????????????????????????????????????????????????|?3.0?kB?????00:00

epel/primary_db??????????????????????????????????????????|?7.2?MB?????00:00

extra????????????????????????????????????????????????????|?2.9?kB?????00:00

extra/primary_db?????????????????????????????????????????|?1.1?MB?????00:00

Available?Packages

mysql-proxy.i686?????????????????????????0.8.5-1.el6????????????????????????epel

mysql-proxy.x86_64???????????????????????0.8.5-1.el6????????????????????????epel

安裝mysql-proxy包:[root@node5?~]#?yum?install?-y?mysql-proxy

我們查看epel源的mysql-proxy包提供的lun腳本:[root@node5?~]#?ls?/usr/share/doc/mysql-proxy-0.8.5/examples/

tutorial-basic.lua??????tutorial-prep-stmts.lua??tutorial-states.lua

tutorial-constants.lua??tutorial-query-time.lua??tutorial-tokenize.lua

tutorial-inject.lua?????tutorial-resultset.lua???tutorial-union.lua

tutorial-keepalive.lua??tutorial-rewrite.lua?????tutorial-warnings.lua

tutorial-monitor.lua????tutorial-routing.lua

tutorial-packets.lua????tutorial-scramble.lua

可以發現沒有rw-splitting.lua 這個讀寫分離腳本,我們去下載一個同版本的源碼包,將其中的讀寫分離腳本拷貝到指定目錄:[root@node5?~]#?tar?xf?mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz

[root@node5?~]#?ls?mysql-proxy-0.8.5-linux-el6-x86-64bit/share/doc/mysql-proxy/

active-queries.lua???????ro-balance.lua???????????tutorial-resultset.lua

active-transactions.lua??ro-pooling.lua???????????tutorial-rewrite.lua

admin-sql.lua????????????rw-splitting.lua?????????tutorial-routing.lua

analyze-query.lua????????tutorial-basic.lua???????tutorial-scramble.lua

auditing.lua?????????????tutorial-constants.lua???tutorial-states.lua

commit-obfuscator.lua????tutorial-inject.lua??????tutorial-tokenize.lua

commit-obfuscator.msc????tutorial-keepalive.lua???tutorial-union.lua

COPYING??????????????????tutorial-monitor.lua?????tutorial-warnings.lua

histogram.lua????????????tutorial-packets.lua?????xtab.lua

load-multi.lua???????????tutorial-prep-stmts.lua

README???????????????????tutorial-query-time.lua

[root@node5?~]#?ls?/usr/lib64/mysql-proxy/lua/proxy/

auto-config.lua??balance.lua??commands.lua??parser.lua??test.lua??tokenizer.lua

[root@node5?~]#?cp?mysql-proxy-0.8.5-linux-el6-x86-64bit/share/doc/mysql-proxy/rw-splitting.lua?/usr/lib64/mysql-proxy/lua/

[root@node5?~]#?ls?/usr/lib64/mysql-proxy/lua/

admin.lua???glib2.so??lpeg.so???posix.so??rw-splitting.lua

chassis.so??lfs.so????mysql.so??proxy

2.配置mysql-proxy讀寫分離[root@node5?~]#?vim?/etc/mysql-proxy.cnf

[mysql-proxy]

daemon?=?true

pid-file?=?/var/run/mysql-proxy.pid

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

log-level?=?debug

max-open-files?=?1024

plugins?=?admin,proxy

user?=?mysql-proxy

#

#代理配置

#Proxy?Configuration

#代理的地址和端口

proxy-address?=?0.0.0.0:3306

#后端的讀寫mysql節點服務器

proxy-backend-addresses?=?172.16.31.20:3306

#后端的只讀mysql服務器節點;

proxy-read-only-backend-addresses?=?172.16.31.21:3306

#實現讀寫分離的lun腳本配置文件;

proxy-lua-script?=?/usr/lib64/mysql-proxy/lua/rw-splitting.lua

#proxy-skip-profiling?=?true

#

#管理配置

#?Admin?Configuration

#admin-address?=?0.0.0.0:4041

admin-lua-script?=?/usr/lib64/mysql-proxy/lua/admin.lua

admin-username?=?admin

admin-password?=?admin

3.配置完成啟動mysql-proxy服務器:[root@node5?~]#?service?mysql-proxy?start

Starting?mysql-proxy:??????????????????????????????????????[??OK??]

查看監聽端口:[root@node5?~]#?ss?-tunl?|grep?tcp

tcp????LISTEN?????0??????128???????????????????:::22???????????????????:::*

tcp????LISTEN?????0??????128????????????????????*:22????????????????????*:*

tcp????LISTEN?????0??????128????????????127.0.0.1:631???????????????????*:*

tcp????LISTEN?????0??????128??????????????????::1:631??????????????????:::*

tcp????LISTEN?????0??????100??????????????????::1:25???????????????????:::*

tcp????LISTEN?????0??????100????????????127.0.0.1:25????????????????????*:*

tcp????LISTEN?????0??????128????????????127.0.0.1:6010??????????????????*:*

tcp????LISTEN?????0??????128??????????????????::1:6010?????????????????:::*

tcp????LISTEN?????0??????128????????????????????*:54181?????????????????*:*

tcp????LISTEN?????0??????128????????????????????*:4041??????????????????*:*

tcp????LISTEN?????0??????128????????????????????*:3306??????????????????*:*

tcp????LISTEN?????0??????128???????????????????:::111??????????????????:::*

tcp????LISTEN?????0??????128????????????????????*:111???????????????????*:*

tcp????LISTEN?????0??????128???????????????????:::49776????????????????:::*

3306代理端口和管理端口4041都是啟動的;

5.主從服務器節點需要授權一個遠程連接允許mysql-proxy服務器訪問后端的主從服務器節點:

在master節點node3上授權即可:MariaDB?[hellodb]>?grant?all?on?*.*?to?'root'@'172.16.%.%'?identified?by?'oracle';

Query?OK,?0?rows?affected?(0.00?sec)

MariaDB?[hellodb]>?flush?privileges;

Query?OK,?0?rows?affected?(0.00?sec)

我們在node5節點通過這個節點的代理訪問數據庫:[root@node5?~]#?mysql?-uroot?-h172.16.31.22?-poracle?-e?'show?databases';

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

|?Database???????????|

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

|?binlog?????????????|

|?hellodb????????????|

|?information_schema?|

|?mysql??????????????|

|?performance_schema?|

|?relaylog???????????|

|?test???????????????|

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

可以發現數據庫是后端節點的數據庫;

6.讀寫分離測試:

讀寫分離測試我們先查看一下管理端口:[root@node5?~]#?mysql?-uadmin?-padmin?-P4041?-h172.16.31.22

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

Your?MySQL?connection?id?is?1

Server?version:?5.0.99-agent-admin

Copyright?(c)?2000,?2013,?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.

#可以發現主節點172.16.31.20是讀寫數據庫服務器節點,狀態是up,正常;

#而172.16.31.21是只讀數據庫服務器節點,但是狀態未知,我們需要去讀取一些后端只讀服務器的數據;

mysql>?select?*?from?backends;

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

|?backend_ndx?|?address???????????|?state???|?type?|?uuid?|?connected_clients?|

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

|???????????1?|?172.16.31.20:3306?|?up??????|?rw???|?NULL?|?????????????????0?|

|???????????2?|?172.16.31.21:3306?|?unknown?|?ro???|?NULL?|?????????????????0?|

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

2?rows?in?set?(0.00?sec)

我們退出管理端口去執行一些select語句:[root@node5?~]#?mysql?-uroot?-h172.16.31.22?-poracle?-e?'select?*?from?hellodb.teachers';

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

|?TID?|?Name??????????|?Age?|?Gender?|

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

|???1?|?Song?Jiang????|??45?|?M??????|

|???2?|?Zhang?Sanfeng?|??94?|?M??????|

|???3?|?Miejue?Shitai?|??77?|?F??????|

|???4?|?Lin?Chaoying??|??93?|?F??????|

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

多執行一些select語句,不同的最好;

執行完成后去查看管理端口狀態:[root@node5?~]#?mysql?-uadmin?-padmin?-P?4041?-h172.16.31.22

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

Your?MySQL?connection?id?is?1

Server?version:?5.0.99-agent-admin

Copyright?(c)?2000,?2013,?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?backends;

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

|?backend_ndx?|?address???????????|?state?|?type?|?uuid?|?connected_clients?|

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

|???????????1?|?172.16.31.20:3306?|?up????|?rw???|?NULL?|?????????????????0?|

|???????????2?|?172.16.31.21:3306?|?up????|?ro???|?NULL?|?????????????????0?|

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

2?rows?in?set?(0.00?sec)

全部up了,狀態正常;

至此,基于mysql-proxy實現數據庫讀寫分類的實驗就實現了。

總結

以上是生活随笔為你收集整理的读写分离mysql数据库mariadb_MariaDB数据库读写分离实现(一):mysql-proxy的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。