mycat搭建mysql高可用分布式數(shù)據(jù)庫(分庫,分表,讀寫分離,主從切換)

1.環(huán)境準(zhǔn)備:

服務(wù)器centos7.2.5: 172.18.113.37(主) 172.18.113.38(從)兩臺
數(shù)據(jù)庫mysql-5.7.25:
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz
數(shù)據(jù)庫中間件mycat-1.6.7.1:
wget http://dl.mycat.io/1.6.7.1/Mycat-server-1.6.7.1-release-20190213150257-linux.tar.gz
yum mysql數(shù)據(jù)依賴的libaio 庫
yum search libaio
yum install libaio

2.mysql安裝:

a.添加mysql組:groupadd mysql

b.添加mysql組mysql用戶:useradd mysql -g mysql

c.上傳mysql包至該路徑 : cd /home/mysql;
解壓:tar -zxvf MySQL-5.7/mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz
更改目錄名稱: mv ./mysql-5.7.25-linux-glibc2.12-x86_64/ ./mysql
解壓目錄結(jié)構(gòu):

1.png

d.初始化mysql: bin/mysqld --initialize --user=mysql

e.添加到MySQL 啟動腳本到系統(tǒng)服務(wù)
cp support-files/mysql.server/etc/init.d/mysql.server

f.啟動MySQL服務(wù)
啟動方式一: bin/mysqld_safe --user=mysql &
啟動方式二: service mysql.server start 或者 /support-files/mysql.server start
如若出現(xiàn)報(bào)錯:mysqld_safe error: log-error set to '/var/log/mariadb/mariadb.log', however file don't exists. Create writable for user 'mysql'. ERROR! The server quit without updating PID file (/var/lib/mysql/node1.pid).
給日志目錄授予讀寫權(quán)限:
$ mkdir /var/log/mariadb
$ touch /var/log/mariadb/mariadb.log
$ chown -R mysql:mysql /var/log/mariadb

g.登陸mysql:
mysql免密登陸: vim /etc/my.cnf 在[mysqld] 下面新增一行 skip- grant-tables
登陸報(bào)錯:
bin/mysql -uroot -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server
through socket '/tmp/mysql.sock' (2)
故障分析
查看mysql實(shí)例的狀態(tài)
$ netstat -ntlp | grep 3306tcp6 0 0 :::3306 :::* LISTEN 10794/mysqld
查看my.cnf關(guān)于socket的配置
$ more /etc/my.cnf |grep sock socket=/var/lib/mysql/mysql.sock
解決方法,修改/etc/my.cnf
$ vi /etc/my.cnf
修改 [mysqld]組下的 socket 路徑,我是選擇注釋掉,加一行為
tmp/mysql.soc
[mysqld]
datadir=/var/lib/mysql
#socket=/var/lib/mysql/mysql.sock
socket=/tmp/mysql.sock

h.重啟MySQL 服務(wù)
$ service mysql.server start
$Shutting down MySQL.. SUCCESS!

i.設(shè)置MySQL密碼
mysql> use mysql;
mysql> update user set host='%',authentication_string
=password("mima") where user='root';
mysql> flush privileges;
mysql> grant all privileges on *.* to 'root'@'%' identified by
'mima' with grant option;
mysql> flush privileges;
mysql> exit;

j.去除免密登陸腳本,skip-grant-tables 使用最高權(quán)限r(nóng)oot用
戶登陸數(shù)據(jù)庫

3.mysql主主復(fù)制,雙向主備,高可用分布式數(shù)據(jù)庫方案

原理:主主復(fù)制在兩臺MySQL互為主從,它們都可以變更數(shù)據(jù),其中一臺變更了數(shù)據(jù)另外一臺也會同步相應(yīng)的變更。
1.兩臺mysql都可讀寫,互為主備,默認(rèn)只使用一臺(masterA)負(fù)責(zé)數(shù)據(jù)的寫入,另一臺(masterB)備用。
2.masterA是masterB的主庫,masterB又是masterA的主庫,它們互為主從。

a.準(zhǔn)備工作

搭建mysql見步驟2
Mysql版本:MySQL 5.7.25
Master-Server : 172.18.113.37
Slave-Server : 172.18.113.38

b. Master-Server 配置

修改 my.cnf
配置 Master 以使用基于二進(jìn)制日志文件位置的復(fù)制,必
須啟用二進(jìn)制日志記錄并建立唯一的服務(wù)器ID,否則則無
法進(jìn)行主從復(fù)制。
停止MySQL服務(wù)。
開啟binlog ,每臺設(shè)置不同的 server-id
$ service mysql.server stop
$ cat /etc/my.cnf
[mysqld]
log-bin=mysql-bin
server-id=37

啟動mysql配置 創(chuàng)建擁有REPLICATION SLAVE權(quán)限的用戶,從庫可以使用該用戶連接進(jìn)行數(shù)據(jù)復(fù)制(指定到只有從庫可以連接)
$ /usr/local/mysql/bin/mysql -uroot -p
mysql> CREATE USER 'replication'@'172.18.113.38'
IDENTIFIED BY 'mima';
mysql> GRANT REPLICATION SLAVE ON *.* TO
'replication'@'172.18.113.38';

c.Slave-Server 配置

修改 my.cnf 停止MySQL服務(wù),每個server-id都必須唯一,一般以ip后兩位
$ service mysql.server stop
$ cat /etc/my.cnf
[mysqld]
server-id=38

啟動登錄MySQL服務(wù)
$ service mysql.server start
$ /home/mysql/bin/mysql -uroot -p

d配置主庫通信

登陸主庫查看 Master-Server , binlog File 文件名稱和 Position值位置 并且記下來
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000015 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+

登陸從庫配置剛才步驟b在主庫配置的擁有復(fù)制權(quán)限的replication用戶
執(zhí)行如下語句:MASTER_LOG_POS給0也沒問題
mysql> CHANGE MASTER TO
-> MASTER_HOST='172.18.113.37',
-> MASTER_USER='replication',
-> MASTER_PASSWORD='mima',
-> MASTER_LOG_FILE='mysql-bin.000015 ',
-> MASTER_LOG_POS=154 ;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

啟動從服務(wù)器復(fù)制線程
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)

查看復(fù)制狀態(tài)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.18.113.37
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000015
Read_Master_Log_Pos: 154
Relay_Log_File: master2-relay-bin.000003
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
......
檢查主從復(fù)制通信狀態(tài)
Slave_IO_State #從站的當(dāng)前狀態(tài)
Slave_IO_Running: Yes #讀取主程序二進(jìn)制日志的I/O線程是否正在運(yùn)行
Slave_SQL_Running: Yes #執(zhí)行讀取主服務(wù)器中二進(jìn)制日志事件的SQL線程是否正在運(yùn)行。與I/O線程一樣
Seconds_Behind_Master #是否為0,0就是已經(jīng)同步了

e.注意事項(xiàng)!!

如果需要配置雙向主從,服務(wù)器反過來執(zhí)行一遍
主從復(fù)制會從服務(wù)器通過I/O線程從主服務(wù)器中通過中繼日志同步變更過的數(shù)據(jù)到從服務(wù)器,所以需要保證I/O線程的通暢也就是Slave_SQL_Running必須一直處于yes狀態(tài) 否則無法完成同步
從服務(wù)器默認(rèn)會同步主服務(wù)器中所有的變更數(shù)據(jù)庫信息 有時候我們卻只需要同步我們想要的數(shù)據(jù)庫信息 這時可以配置一下Replicate_Do_DB屬性指定需要同步的數(shù)據(jù)庫
vim /etc/my.cnf
[mysqld]
replicate-do-db=ensen_db1
replicate-do-db=ensen_db2
replicate-do-db=ensen_db3

4.mycat中間件搭建,實(shí)現(xiàn)讀寫分離,分表分庫

a.環(huán)境

MySql-Master:172.18.113.37
MySql-Slave:172.18.113.38
Mycat:172.18.113.37

b.MySql 主從復(fù)制

見步驟3

c.在主庫172.18.113.37建庫 測試主從復(fù)制是否可用

CREATE DATABASE `ensen_db1`;
CREATE DATABASE `ensen_db2`;
CREATE DATABASE `ensen_db3`;

d.安裝 JDK

由于mycat是使用java開發(fā)的中間件 所以需要jdk的支持
未安裝的請先自行安裝好jdk1.8以上版本然后再往下操作

e.搭建mycat

上傳步驟1下載好的Mycat-server-1.6.7.1-release-20190213150257-linux.tar.gz包至/home/mysql/目錄
解壓:tar -zxvf Mycat-server-1.6.7.1-release-20190213150257-linux.tar.gz得到mycat目錄

配置mycat環(huán)境變量
vim /etc/profile
export PATH=${JAVA_HOME}/bin:${MYCAT_HOME}/lib:$PATH
export MYCAT_HOME=/home/mysql/mycat/
source /etc/profile
進(jìn)入mycat/conf目錄編輯wrapper.conf
# Java Application
wrapper.java.command=你的jdk安裝目錄
wrapper.working.dir=..

f.配置 Mycat

本文只是簡單配置在不同的服務(wù)器上進(jìn)行讀寫分離只需要配置兩個文件 server.xml 和 schema.xml

schema.xml 中定義邏輯庫,表、分片節(jié)點(diǎn)等內(nèi)容
rule.xml 中定義分片規(guī)則
server.xml 中定義用戶以及系統(tǒng)相關(guān)變量,如端口等

關(guān)于ER分片策略的兩種情況分析:
a.父表按照主鍵ID分片,子表的分片字段與父表的ID進(jìn)行關(guān)聯(lián),配置為ER分片,子表插入直接使用父表的分片規(guī)則,如果沒有外鍵的約束即使子表在父表找不到相應(yīng)的數(shù)據(jù),也能插入成功,只要分片規(guī)則中有所定義。所以對于這種情況,子表在插入數(shù)據(jù)時候不會去判斷主表中是否存在關(guān)聯(lián)的數(shù)據(jù),而是直接根據(jù)主表的分片規(guī)則進(jìn)行插入操作
b.父表分片字段為其他字段,子表的分片字段與父表的ID進(jìn)行關(guān)聯(lián),配置為ER分片,這種情況子表插入會依次到各個節(jié)點(diǎn)中去尋找,直到找到對應(yīng)的節(jié)點(diǎn),否則會報(bào)can't find (root) parent sharding node for sql找不到父分片節(jié)點(diǎn)

g.啟動 Mycat

cd /home/mysql/mycat/bin
./mycat start啟動mycat
./mycat stop停止mycat
./mycat status查看mycat狀態(tài)
./mycat restart重啟mycat

h.查看日志

啟動 mycat 的日志
tail -f /home/mysql/mycat/logs/wrapper.log
訪問 mycat 的日志
tail -f/home/mysql/mycat/logs/mycat.log

i.Mycat的使用

登錄 Mycat 客戶端
mysql -uroot -p -h密碼 172.18.113.37 -P 8066
mysql> show databases;
mysql> use test_schema;

mysql> use tables;

登錄 Mycat 管理端
mysql -uroot -p密碼 -h172.18.113.37 -P 9066

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,682評論 6 413
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內(nèi)容