4.1實戰案例——構建讀寫分離的資料庫集群 使用Mycat作為資料庫中間件服務構建讀寫分離的資料庫集群 使用一臺虛擬機部署Mycat資料庫中間件服務,將用戶提交的讀寫操作識別分發給相應的資料庫 節點。這樣將用戶的訪問操作、資料庫的讀與寫操作分給3台主機,只有資料庫集群的主節點接 收增、刪、改SQL語 ...
4.1實戰案例——構建讀寫分離的資料庫集群
使用Mycat作為資料庫中間件服務構建讀寫分離的資料庫集群
使用一臺虛擬機部署Mycat資料庫中間件服務,將用戶提交的讀寫操作識別分發給相應的資料庫
節點。這樣將用戶的訪問操作、資料庫的讀與寫操作分給3台主機,只有資料庫集群的主節點接
收增、刪、改SQL語句,從節點接收查詢語句,分擔了主節點的查詢壓力
基礎準備
使用CentOS 7.2系統,創建3台虛擬機進行實驗。
其中2台虛擬機db1和db2部署MariaDB資料庫服務,搭建主從資料庫集群;一臺作為主節點,負
責寫入資料庫信息;另一臺作為從節點,負責讀取資料庫信息。
基礎環境配置
修改主機名
# hostnamectl set-hostname mycat
# hostnamectl set-hostname db1
# hostnamectl set-hostname db2
修改完之後使命令生效
# bash
編輯hosts文件(mycat,db1,db2)
# vi /etc/hosts
安裝JDK環境(mycat)
安裝java環境
# yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
查看java版本
# java -version
部署MariaDB主從資料庫集群服務
安裝MariaDB服務(db1和db2)
# yum install -y mariadb mariadb-server
啟動服務並設置開機自啟
# systemctl start mariadb
# systemctl enable mariadb
初始化MariaDB資料庫(db1和db2)
初始化MariaDB資料庫,並設置MariaDB資料庫root訪問用戶的密碼為123456
# mysql_secure_installation
還沒有設置根密碼,直接回車
設置根密碼,yes
刪除匿名用戶,yes
不允許遠程登陸,no
刪除測試資料庫並訪問它,yes
現在重新載入特權表,yes
配置資料庫集群主節點(db1)
編輯配置文件
# vi /etc/my.cnf
log_bin = mysql-bin 記錄操作日誌
binlog_ignore_db = mysql 不同步MySQL系統資料庫
server_id = 12 資料庫集群中的每個節點ip都要不同,一般使用ip最後段的數字
編輯完成後重啟服務
# systemctl restart mariadb
關閉防火牆
# systemctl stop firewalld
開放資料庫許可權(db1)
登錄資料庫
# mysql -uroot -p123456
授權在任何客戶端機器上可以以root用戶登錄到資料庫
> grant all privileges on *.* to root@'%' identified by "123456";
創建一個用戶,並賦予從節點同步主節點資料庫的許可權
> grant replication slave on *.* to 'user'@'db2' identified by '123456';
配置同步(db2)
登錄資料庫
# mysql -uroot -p123456
配置連接信息
> change master to master_host='db1',master_user='user',master_password='123456';
開啟從服務
> start slave;
查看從服務狀態
> show slave status\G;
驗證主從資料庫的同步功能
創建庫表數據(db1)
創建庫test
> create database test;
在庫test中創建表company
> use test
> create table company(id int not null primary key,name varchar(50),addr varchar(255));
插入表數據
> insert into company values(1,"facebook","usa");
查看表數據
> select * from company;
查詢是否同步(db2)
查詢資料庫
> show databases;
查詢表company
> select * from test.company;
部署mycat讀寫分離中間件服務
安裝mycat服務(mycat)
將軟體包上傳到mycat的/root目錄下,將軟體包解壓
# tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
賦予許可權
# chown -R 777 /usr/local/mycat/
添加系統變數,並生效變數
# echo export MYCAT_HOME=/usr/local/mycat/ >> /etc/profile
# source /etc/profile
編輯邏輯庫配置文件(mycat)
在文件中定義一個邏輯庫
# vi /usr/local/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="USERDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"></schema>
<dataNode name="dn1" dataHost="localhost1" database="test" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" dbType="mysql" dbDriver="native" writeType="0" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="172.16.51.18:3306" user="root" password="123456">
<readHost host="hostS1" url="172.16.51.30:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
保存並退出
註釋:
sqlMaxLimit 配置預設查詢數量
database 為真實資料庫名
balance="0" 不開啟讀寫分離機制,所有讀操作都發送到當前可用的writeHost上
balance="1" 全部的readHost與stand by writeHost參與select語句的負載均衡,簡單來說,當雙主雙從模式(M1->S1,M2->S2,並且M1與M2互為主備),正常情況下,M2、S1、S2都參與select語句的負載均衡
balance="2" 所有讀操作都隨機的在writeHost、readhost上分發
balance="3" 所有讀請求隨機地分發到wiriterHost對應的readhost執行,writerHost不負擔讀壓力,註意balance=3只在1.4及其以後版本有,1.3版本沒有
writeType="0" 所有寫操作發送到配置的第一個writeHost,第一個掛了需要切換到還生存的第二個writeHost,重新啟動後已切換後的為準,切換記錄在配置文件dnindex.properties中
writeType="1" 所有寫操作都隨機的發送到配置的writeHost
修改配置文件許可權(mycat)
修改schema.xml的用戶許可權
# chown root:root /usr/local/mycat/conf/schema.xml
編輯訪問用戶(mycat)
修改root用戶的訪問密碼與資料庫
# vi /usr/local/mycat/conf/server.xml
修改內容
刪除內容
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
保存並退出
啟動服務(mycat)
啟動資料庫中間件服務
# /bin/bash /usr/local/mycat/bin/mycat start
查看虛擬機埠開放情況(8066和9066)
# netstat -ntpl
驗證資料庫集群服務讀寫分離功能
查詢資料庫信息(mycat)
安裝服務
# yum install -y mariadb mariadb-client
登錄資料庫
# mysql -h127.0.0.1 -P8066 -uroot -p123456
查看邏輯庫
> show databases;
> use USERDB
> show tables;
查看表company
> select * from company;
添加表數據(mycat)
在表中添加一條數據
> insert into company values(2,"bastetball","usa");
查看表信息
> select * from company;
驗證讀寫操作分離(mycat)
查詢對資料庫讀寫操作的分離信息
# mysql -h127.0.0.1 -P9066 -uroot -p123456 -e 'show @@datasource;'