1. 程式人生 > >MySQL的主從複製與讀寫分離

MySQL的主從複製與讀寫分離

一、主從複製

1.伺服器資訊:主伺服器:192.168.48.4   從伺服器:192.168.48.5  均已安裝mysql

2.配置主伺服器中的 /etc/my.cnf 檔案,設定伺服器id和開啟日誌功能。設定完後儲存。進入mysql客戶端,通過show VARIABLES like 'server_id'。檢視伺服器id是否和設定一樣,此處為 4。

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
server_id=4  ###設定伺服器在叢集中的id
log-bin=mysql-bin ###開啟日誌檔案,用於主從同步日誌分析
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

3.配置從伺服器中的/etc/my.cnf 檔案

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
server_id=5  ###設定從伺服器id
log-bin=mysql-bin  ###開啟日誌
binlog_do_db=taotao  ###設定要同步的資料庫名稱,資料僅同步該資料庫,且從伺服器應由此資料庫
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

4.而後在mysql客戶端中操作

//在主伺服器MYSQL客戶端新增從伺服器用於同步資料的賬號
GRANT replication SLAVE on *.* to 'slave'@'192.168.48.5' IDENTIFIED by '234568'

show MASTER STATUS--檢視主伺服器日誌檔案及開始行數

//在從伺服器客戶端操作
//關閉同步
stop SLAVE

//設定主伺服器同步資訊
change MASTER to master_host='192.168.48.4',master_user='slave',master_password='234568',
master_log_file='mysql-bin.000002',master_log_pos=738

//開啟同步
start SLAVE

二、mysql的讀寫分離

1.在第三臺伺服器(192.168.48.3)上安裝mycat

2.加壓縮包解壓即可  tar zxvf xxx.tar.gz

3.編輯解壓後 conf 下的 server.xml檔案

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 
	- you may not use this file except in compliance with the License. - You 
	may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
	- - Unless required by applicable law or agreed to in writing, software - 
	distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
	WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
	License for the specific language governing permissions and - limitations 
	under the License. -->
<!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>
      <!--  <property name="useCompression">1</property>--> <!--1為開啟mysql壓縮協議-->
        <!--  <property name="fakeMySQLVersion">5.6.20</property>--> <!--設定模擬的MySQL版本號-->
	<!-- <property name="processorBufferChunk">40960</property> -->
	<!-- 
	<property name="processors">1</property> 
	<property name="processorExecutor">32</property> 
	 -->
		<!--預設為type 0: DirectByteBufferPool | type 1 ByteBufferArena-->
		<property name="processorBufferPoolType">0</property>
		<!--預設是65535 64K 用於sql解析時最大文字長度 -->
		<!--<property name="maxStringLiteralLength">65535</property>-->
		<!--<property name="sequnceHandlerType">0</property>-->
		<!--<property name="backSocketNoDelay">1</property>-->
		<!--<property name="frontSocketNoDelay">1</property>-->
		<!--<property name="processorExecutor">16</property>-->
		<!--
			<property name="serverPort">8066</property> <property name="managerPort">9066</property> 
			<property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property> 
			<property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
		<!--分散式事務開關,0為不過濾分散式事務,1為過濾分散式事務(如果分散式事務內只涉及全域性表,則不過濾),2為不過濾分散式事務,但是記錄分散式事務日誌-->
		<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>
	
	<!-- 全域性SQL防火牆設定 -->
	<!-- 
	<firewall> 
	   <whitehost>
	      <host host="127.0.0.1" user="mycat"/>
	      <host host="127.0.0.2" user="mycat"/>
	   </whitehost>
       <blacklist check="false">
       </blacklist>
	</firewall>
	-->
	
	<!--<user name="root">
		<property name="password">123456</property>
		<property name="schemas">TESTDB</property>-->
		
		<!-- 表級 DML 許可權設定 -->
		<!-- 		
		<privileges check="false">
			<schema name="TESTDB" dml="0110" >
				<table name="tb01" dml="0000"></table>
				<table name="tb02" dml="1111"></table>
			</schema>
		</privileges>		
		 -->
	<!--</user>

	<user name="user">
		<property name="password">user</property>
		<property name="schemas">TESTDB</property>
		<property name="readOnly">true</property>
	</user>-->

	<!-------------------------只需修改以下內容--------------------------------->

	<!--配置具有讀寫許可權的賬號 -->
	<user name="mycat">
        <property name="password">mycat</property>
        <property name="schemas">mycat</property>
    </user>
	<!--配置只有讀許可權的賬號-->
    <user name="mycat_read">
        <property name="password">mycat_read</property>
        <property name="schemas">mycat</property>
        <property name="readOnly">true</property>
    </user>

</mycat:server>

4.編輯schema.xml檔案

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <!--此處的name與server.xml中的配置賬號的屬性“schemas”關聯-->
        <schema name="mycat" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1" />

        <!--database為要讀寫分離的資料庫的名字-->
        <dataNode name="dn1" dataHost="localhost1" database="taotao" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native">
                <heartbeat>select user()</heartbeat>
                <!--配置主伺服器資訊-->
                <writeHost host="hostMaster" url="192.168.48.4:3306" user="root" password="234568">
                <!--配置從伺服器資訊,可以配置多個-->
                <readHost host="hostSlave" url="192.168.48.5:3306" user="root" password="234568"/>
                </writeHost>
        </dataHost>

</mycat:schema>

5.通過安裝mycat的伺服器192.168.48.3:8044 使用者名稱和密碼威威server中配置的即可進行登入資料庫。通過讀和寫的判斷會轉發到對應的資料庫伺服器上。