1.環(huán)境準備:
服務器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
解壓目錄結構:1.png
d.初始化mysql:
bin/mysqld --initialize --user=mysql
e.添加到MySQL 啟動腳本到系統(tǒng)服務
cp support-files/mysql.server/etc/init.d/mysql.server
f.啟動MySQL服務
啟動方式一:bin/mysqld_safe --user=mysql &
啟動方式二:service mysql.server start 或者 /support-files/mysql.server start
如若出現(xiàn)報錯: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).
給日志目錄授予讀寫權限:
$ 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
登陸報錯:
bin/mysql -uroot -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server
through socket '/tmp/mysql.sock' (2)
故障分析
查看mysql實例的狀態(tài)
$ netstat -ntlp | grep 3306tcp6 0 0 :::3306 :::* LISTEN 10794/mysqld
查看my.cnf關于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 服務
$ service mysql.server start
$Shutting down MySQL.. SUCCESS!
i.設置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
使用最高權限root用
戶登陸數(shù)據(jù)庫
3.mysql主主復制扳炬,雙向主備吏颖,高可用分布式數(shù)據(jù)庫方案
原理:主主復制在兩臺MySQL互為主從,它們都可以變更數(shù)據(jù)恨樟,其中一臺變更了數(shù)據(jù)另外一臺也會同步相應的變更半醉。
1.兩臺mysql都可讀寫,互為主備劝术,默認只使用一臺(masterA)負責數(shù)據(jù)的寫入奉呛,另一臺(masterB)備用计螺。
2.masterA是masterB的主庫,masterB又是masterA的主庫瞧壮,它們互為主從。
a.準備工作
搭建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 以使用基于二進制日志文件位置的復制匙握,必
須啟用二進制日志記錄并建立唯一的服務器ID,否則則無
法進行主從復制咆槽。
停止MySQL服務。
開啟binlog 圈纺,每臺設置不同的 server-id
$ service mysql.server stop
$ cat /etc/my.cnf
[mysqld]
log-bin=mysql-bin
server-id=37
啟動mysql配置 創(chuàng)建擁有REPLICATION SLAVE權限的用戶秦忿,從庫可以使用該用戶連接進行數(shù)據(jù)復制(指定到只有從庫可以連接)
$ /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服務,每個server-id都必須唯一,一般以ip后兩位
$ service mysql.server stop
$ cat /etc/my.cnf
[mysqld]
server-id=38
啟動登錄MySQL服務
$ 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在主庫配置的擁有復制權限的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)
啟動從服務器復制線程
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
查看復制狀態(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
......
檢查主從復制通信狀態(tài)
Slave_IO_State
#從站的當前狀態(tài)
Slave_IO_Running
: Yes #讀取主程序二進制日志的I/O線程是否正在運行
Slave_SQL_Running
: Yes #執(zhí)行讀取主服務器中二進制日志事件的SQL線程是否正在運行灯谣。與I/O線程一樣
Seconds_Behind_Master
#是否為0,0就是已經同步了
e.注意事項!!
如果需要配置雙向主從蛔琅,服務器反過來執(zhí)行一遍
主從復制會從服務器通過I/O
線程從主服務器中通過中繼日志同步變更過的數(shù)據(jù)到從服務器胎许,所以需要保證I/O
線程的通暢也就是Slave_SQL_Running
必須一直處于yes
狀態(tài) 否則無法完成同步
從服務器默認會同步主服務器中所有的變更數(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中間件搭建,實現(xiàn)讀寫分離罗售,分表分庫
a.環(huán)境
MySql-Master:172.18.113.37
MySql-Slave:172.18.113.38
Mycat:172.18.113.37
b.MySql 主從復制
見步驟3
c.在主庫172.18.113.37建庫 測試主從復制是否可用
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
進入mycat/conf目錄編輯wrapper.conf
# Java Application
wrapper.java.command=你的jdk安裝目錄
wrapper.working.dir=..
f.配置 Mycat
本文只是簡單配置在不同的服務器上進行讀寫分離只需要配置兩個文件 server.xml 和 schema.xml
schema.xml 中定義邏輯庫辜窑,表、分片節(jié)點等內容
rule.xml 中定義分片規(guī)則
server.xml 中定義用戶以及系統(tǒng)相關變量寨躁,如端口等
關于ER分片策略的兩種情況分析:
a.父表按照主鍵ID分片穆碎,子表的分片字段與父表的ID進行關聯(lián),配置為ER分片职恳,子表插入直接使用父表的分片規(guī)則所禀,如果沒有外鍵的約束即使子表在父表找不到相應的數(shù)據(jù),也能插入成功放钦,只要分片規(guī)則中有所定義色徘。所以對于這種情況,子表在插入數(shù)據(jù)時候不會去判斷主表中是否存在關聯(lián)的數(shù)據(jù)最筒,而是直接根據(jù)主表的分片規(guī)則進行插入操作
b.父表分片字段為其他字段贺氓,子表的分片字段與父表的ID進行關聯(lián),配置為ER分片床蜘,這種情況子表插入會依次到各個節(jié)點中去尋找辙培,直到找到對應的節(jié)點,否則會報can't find (root) parent sharding node for sql
找不到父分片節(jié)點
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