Linux下mysql基於mycat實現主從複製和讀寫分離
1.基礎設施html
兩臺虛擬機:172.20.79.232(主) 172.20.79.233(從)
1.1軟件設施java
mysql5.6.39 , mycat1.6-RELEASE , jdk1.7及其以上版本
2.實現步驟一(mycat實現讀寫分離)mysql
1.首先在兩臺服務器安裝mysqllinux
1.下載mysql的repo源git
$ wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
2.安裝mysql-community-release-el7-5.noarch.rpm包github
$ sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm
安裝這個包後,會得到兩個mysql的yum repo源:sql
/etc/yum.repos.d/mysql-community.repo /etc/yum.repos.d/mysql-community-source.repo
3.安裝mysql並修改my.cnf文件(才能使用mycat)數據庫
$ sudo yum install mysql-server
vi /etc/my.cnf
在後面追加一行或修改
lower_case_table_names = 1
根據提示安裝就能夠了,不過安裝完成後沒有密碼,須要重置密碼
4.重置mysql密碼服務器
$ mysql -u root
登陸時有可能報這樣的錯:ERROR 2002 (HY000): Can‘t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock‘ (2),緣由是/var/lib/mysql的訪問權限問題。下面的命令把/var/lib/mysql的擁有者改成當前用戶:app
$ sudo chown -R root:root /var/lib/mysql
5.開啓mysql遠程鏈接
grant all on *.* to root@'%' identified by 'admin123' with grant option; flush privileges;
6.重啓mysql服務
$ service mysqld restart
7.接下來登陸重置密碼:
$ mysql -u root //直接回車進入mysql控制檯 mysql > use mysql; mysql > update user set password=password('123456') where user='root'; mysql > exit;
2.在主服務器安裝mycat
1.下載mycat1.6
https://github.com/MyCATApache/Mycat-download
2.上傳至主服務器解壓安裝
tar zxvf Mycat-server-1.6-RELEASE-20160405120037-linux.tar.gz -C /usr/local cd /usr/local/mycat groupadd mycat useradd -g mycat mycat passwd mycat chown -R mycat.mycat /usr/local/mycat export MYCAT_HOME=/usr/local/mycat
2.1 修改(新增)
vi /etc/hosts 172.20.79.232 root232 172.20.79.233 root233
2.2 修改mycat啓動jdk路徑
vi /usr/local/mycat/conf/wrapper.conf 修改wrapper.java.command=%JAVA_HOME%/bin/java
2.3 配置mycat 文件schema.xml
vi /usr/local/mycat/conf/schema.xml <?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <!-- 這裏的mycatdb與server.xml 裏面名稱一致 dataNode有幾個節點就配置幾個節點,用逗號分隔--> <schema name="mycatdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1" /> <!-- database有幾個數據庫就配置幾行便可--> <dataNode name="dn1" dataHost="localhost1" database="db01" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <!-- 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不負擔讀壓力 writeType表示寫模式 writeType="0",全部的操做發送到配置的第一個writehost writeType="1",隨機發送到配置的全部writehost writeType="2",不執行寫操做 switchType指的是切換的模式,目前的取值也有4種: switchType=‘-1‘ 表示不自動切換 switchType=‘1‘ 默認值,表示自動切換 switchType=‘2‘ 基於MySQL主從同步的狀態決定是否切換,心跳語句爲show slave status switchType=‘3‘基於MySQL galary cluster的切換機制(適合集羣)(1.4.1),心跳語句爲show status like ‘wsrep%‘。 --> <heartbeat>select user()</heartbeat> <!--配置mysql寫入的節點--> <writeHost host="hostM1" url="172.20.79.232:3306" user="root" password="admin123"> <!--配置mysql讀取的節點--> <readHost host="hostS2" url="172.20.79.233:3306" user="root" password="admin123" /> </writeHost> </dataHost> </mycat:schema>
2.4 配置mycat 用戶名和密碼在文件server.xml
vi /usr/local/mycat/conf/schema.xml<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:server SYSTEM "server.dtd"> <mycat:server xmlns:mycat="http://io.mycat/"> <system> <property name="useSqlStat">0</property> <!-- 1爲開啓實時統計、0爲關閉 --> <property name="useGlobleTableCheck">0</property> <!-- 1爲開啓全加班一致性檢測、0爲關閉 --> <property name="sequnceHandlerType">2</property> <!--默認爲type 0: DirectByteBufferPool | type 1 ByteBufferArena--> <property name="processorBufferPoolType">0</property> <property name="handleDistributedTransactions">0</property> <!-- off heap for merge/order/group/limit 1開啓 0關閉 --> <property name="useOffHeapForMerge">1</property> <!-- 單位爲m --> <property name="memoryPageSize">1m</property> <!-- 單位爲k --> <property name="spillsFileBufferSize">1k</property> <property name="useStreamOutput">0</property> <!-- 單位爲m --> <property name="systemReserveMemorySize">384m</property> <!--是否採用zookeeper協調切換 --> <property name="useZKSwitch">true</property> </system> <user name="root"> <property name="password">admin123</property> <property name="schemas">mycatdb</property> </user> <user name="user"> <property name="password">user</property> <property name="schemas">mycatdb</property> <property name="readOnly">true</property> </user> </mycat:server>
3.測試
3.1 首先啓動mycat
cd /usr/local/mycat/bin ./mycat start
3.2 查看mycat是否啓動
netstat -ntulp |grep 8066
8066爲mycat監聽端口
3.3 修改日誌級別爲debug
vi /usr/local/mycat/conf/log4j2.xml 修改asyncRoot level="debug"
3.4 使用mycat登陸mysql
mysql -uroot -padmin -h172.20.79.232 -P8066 -Dmycatdb
3.5 測試是否讀寫分離
首先動態打印日誌
tail -f -n 500 mycat.log
在mycat中,進行測試
新建數據庫(主從都必須建):create database db01; use db01; create table test(id int not null,name varchar(24) not null); insert into test vales(1,"test1"); select * from test;
寫入的時候,日誌打印記錄若是是主mysql,查詢的時候,日誌打印記錄是從mysql ,則實現讀寫分離
3.實現步驟二(mysql實現主從複製)
1.修改Master服務器mysql的my.cnf文件
[mysqld] log_bin = mysql-bin #記錄操做日誌 binlog_ignore_db = mysql #不一樣步mysql系統數據庫 server_id = 1
2.首先登陸Master的mysql配置建立mysql 的slave用戶
mysql> grant replication slave,reload,super on *.* to slave@172.20.79.233 identified by 'slave';
3.修改Master服務器slave的my.cnf文件
log_bin = mysql-bin #記錄操做日誌 replicate_ignore_db = mysql #不一樣步mysql系統數據庫 slave_skip_errors = all server_id = 2
4.主mysql執行sql
show master status;
5.slave的mysql鏈接master的mysql
根據第2步配建立的user(slave),password(slave) 和 第4步獲取的file(mysql-bin.00004),position(120) 鏈接主mysql
mysql> change master to master_host='172.20.79.232', master_user='slave', master_password='slave',master_log_file='mysql-bin.00004',master_log_pos=120;
6.slave開啓從mysql,mysql中執行
start slave;
7.查看slave的mysql狀態,mysql執行
show slave status\G;
8.測試主從複製
首先在主從mysql上都新建數據庫db02 主mysql執行:
use db02;
create table user(id int not null primary key,name varchar(50)); 從mysql上也會產生user表,主從mysql配置成功!
到此結束!