天天看點

MySQL_PXC叢集_綜合應用簡述部署PXC叢集和主從差別綜合應用

MySQL_PXC叢集_綜合應用

  • 簡述
  • 部署
  • PXC叢集和主從差別
  • 綜合應用
    • 部署PXC叢集
    • 部署主從複制叢集
      • Master
      • Slave
    • 部署MyCat
      • 節點一
      • 節點二
    • 部署HAProxy

簡述

Percona XtraDB Cluster(簡稱PXC)是針對MySQL使用者的高可用性和擴充性解決方案,基于Percona Server 。其 包括了Write Set REPlication更新檔,使用Galera 2.0庫,這是一個針對事務性應用程式的同步多主機複制插件。

Percona Server是MySQL的改進版本,使用 XtraDB 存儲引擎,在功能和性能上較 MySQL 有着很顯著的提升,如提 升了在高負載情況下的 InnoDB 的性能,為 DBA 提供了一些非常有用的性能診斷工具,另外有更多的參數和指令來 控制伺服器行為。

Percona XtraDB Cluster提供了:

同步複制,事務可以在所有節點上送出。 多主機複制,你可以寫到任何節點。 從(slave)伺服器上的并行應用事件,真正的“并行複制”。 自動節點配置。 資料一緻性,不再有未同步的從伺服器。

官網:https://www.percona.com/software/mysql-database/percona-xtradb-cluster

部署

MySQL_PXC叢集_綜合應用簡述部署PXC叢集和主從差別綜合應用
#建立資料卷(存儲路徑:/var/lib/docker/volumes) 
docker volume create v1 
docker volume create v2 
docker volume create v3

#拉取鏡像 
docker pull percona/percona-xtradb-cluster:5.7

#重命名 
docker tag percona/percona-xtradb-cluster:5.7 pxc

#建立網絡 
docker network create --subnet=172.30.0.0/24 pxc-network

#建立容器 
#第一節點 
docker create -p 13306:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=pxc --name=pxc_node1 --net=pxc-network --ip=172.30.0.2 pxc

#第二節點(增加了CLUSTER_JOIN參數) 
docker create -p 13307:3306 -v v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=pxc --name=pxc_node2 -e CLUSTER_JOIN=pxc_node1 --net=pxc-network -ip=172.30.0.3 pxc

#第三節點(增加了CLUSTER_JOIN參數) 
docker create -p 13308:3306 -v v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=pxc --name=pxc_node3 -e CLUSTER_JOIN=pxc_node1 --net=pxc-network -ip=172.30.0.4 pxc

#檢視叢集節點 
show status like 'wsrep_cluster%';

備注:先啟動第一個節點,等到mysql用戶端可以連接配接到服務後再啟動其它節點。
           

說明

1、盡可能的控制PXC叢集的規模,節點越多,資料同步速度越慢

2、所有PXC節點的硬體配置要一緻,如果不一緻,配置低的節點将拖慢資料同步速度

3、PXC叢集隻支援InnoDB引擎,不支援其他的存儲引擎

PXC叢集和主從差別

1、PXC叢集方案所有節點都是可讀可寫的,Replication從節點不能寫入,因為主從同步是單向的,無法從slave節 點向master點同步。

2、PXC同步機制是同步進行的,這也是它能保證資料強一緻性的根本原因,Replication同步機制是異步進行的, 它如果從節點停止同步,依然可以向主節點插入資料,正确傳回,造成資料主從資料的不一緻性。

3、PXC是用犧牲性能保證資料的一緻性,Replication在性能上是高于PXC的。是以兩者用途也不一緻。PXC是用于 重要資訊的存儲,例如:訂單、使用者資訊等。Replication用于一般資訊的存儲,能夠容忍資料丢失,例如:購 物車,使用者行為日志等。

綜合應用

主從架構、Mycat中間件、HAProxy負載均衡、PXC叢集架構,在實際的項目中,往往不單單是一種架 構,更多的使用的混合架構,下面我們将好客租房項目采用混合架構的方式進行完善資料庫叢集。

MySQL_PXC叢集_綜合應用簡述部署PXC叢集和主從差別綜合應用

1、HAProxy作為負載均衡器

2、部署了2個Mycat節點作為資料庫中間件

3、部署了2個PXC叢集節點,作為2個Mycat分片,每個PXC叢集中有2個節點,作為資料的同步存儲

4、部署了1個主從複制叢集

5、房源資料儲存到PXC分片中,其餘資料儲存到主從架構中

部署PXC叢集

MySQL_PXC叢集_綜合應用簡述部署PXC叢集和主從差別綜合應用
#建立資料卷(存儲路徑:/var/lib/docker/volumes) 
docker volume create haoke-v1 
docker volume create haoke-v2 
docker volume create haoke-v3 
docker volume create haoke-v4

#拉取鏡像 
docker pull percona/percona-xtradb-cluster:5.7

#建立網絡 
docker network create --subnet=172.30.0.0/24 pxc-network

#建立容器 
#叢集1,第一節點 
docker create -p 13306:3306 -v haoke-v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=pxc --name=pxc_node1 --net=pxc-network --ip=172.30.0.2 pxc

#第二節點(增加了CLUSTER_JOIN參數) 
docker create -p 13307:3306 -v haoke-v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=pxc --name=pxc_node2 -e CLUSTER_JOIN=pxc_node1 --net=pxc-network -ip=172.30.0.3 pxc

#叢集2 
#第一節點 
docker create -p 13308:3306 -v haoke-v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=pxc --name=pxc_node3 --net=pxc-network --ip=172.30.0.4 pxc

#第二節點(增加了CLUSTER_JOIN參數) 
docker create -p 13309:3306 -v haoke-v4:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=pxc --name=pxc_node4 -e CLUSTER_JOIN=pxc_node3 --net=pxc-network -ip=172.30.0.5 pxc

#啟動 
docker start pxc_node1 && docker logs -f pxc_node1 
docker start pxc_node2 && docker logs -f pxc_node2
docker start pxc_node3 && docker logs -f pxc_node3 
docker start pxc_node4 && docker logs -f pxc_node4

#檢視叢集節點 show status like 'wsrep_cluster%';

說明:
2個叢集,4個節點,均啟動成功。
分别在2個叢集中建立資料庫以及相關資料表tb_house_resources。
           

部署主從複制叢集

Master

#建立目錄 
mkdir /data/mysql/haoke/master01 -p 
cd /data/mysql/haoke/master01 
mkdir conf data 
chmod 777 * -R

#建立配置檔案 
cd /data/mysql/haoke/master01/conf 
vim my.cnf

#輸入如下内容 
[mysqld] 
log-bin=mysql-bin  #開啟二進制日志 
server-id=1  #服務id,不可重複 sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO ,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

#建立容器 
docker create --name percona-haoke-master01 -v /data/mysql/haoke/master01/data:/var/lib/mysql -v /data/mysql/haoke/master01/conf:/etc/my.cnf.d -p 23306:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23

#啟動 
docker start percona-haoke-master01 && docker logs -f percona-haoke-master01

#建立同步賬戶以及授權 
create user 'itcast'@'%' identified by 'itcast'; 
grant replication slave on *.* to 'itcast'@'%'; 
flush privileges;

#檢視master狀态 
show master status;
           

Slave

#建立目錄 
mkdir /data/mysql/haoke/slave01 -p 
cd /data/mysql/haoke/slave01 
mkdir conf data 
chmod 777 * -R

#建立配置檔案 
cd /data/mysql/haoke/slave01/conf 
vim my.cnf

#輸入如下内容 
[mysqld] 
server-id=2  #服務id,不可重複 sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO ,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

#建立容器 
docker create --name percona-haoke-slave01 -v /data/mysql/haoke/slave01/data:/var/lib/mysql -v /data/mysql/haoke/slave01/conf:/etc/my.cnf.d -p 23307:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23

#啟動 
docker start percona-haoke-slave01 && docker logs -f percona-haoke-slave01

#設定master相關資訊 
CHANGE MASTER TO 
master_host='192.168.1.18', 
master_user='itcast', 
master_password='itcast', 
master_port=23306, 
master_log_file='mysql-bin.000002', 
master_log_pos=648;

#啟動同步 
start slave;

#檢視master狀态 
show slave status;
           
MySQL_PXC叢集_綜合應用簡述部署PXC叢集和主從差別綜合應用

建立資料庫以及建立廣告表tb_ad

部署MyCat

節點一

cd /data/ 
mkdir mycat 
cp /haoke/mycat . -R 
mv mycat/mycat-node1
           

配置server.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE mycat:server SYSTEM "server.dtd"> 
<mycat:server xmlns:mycat="http://io.mycat/">    
	<system>
	<property name="nonePasswordLogin">0</property>
        <property name="useHandshakeV10">1</property>
        <property name="useSqlStat">0</property>
        <property name="useGlobleTableCheck">0</property>        
        <property name="sequnceHandlerType">2</property>        
        <property name="subqueryRelationshipCheck">false</property>        
        <property name="processorBufferPoolType">0</property>        
        <property name="handleDistributedTransactions">0</property>        
        <property name="useOffHeapForMerge">1</property>        
        <property name="memoryPageSize">64k</property>        
        <property name="spillsFileBufferSize">1k</property>        
        <property name="useStreamOutput">0</property>        
        <property name="systemReserveMemorySize">384m</property>        
        <property name="useZKSwitch">false</property>    
	</system>    <!--這裡是設定的itcast使用者和虛拟邏輯庫-->    
	<user name="itcast" defaultAccount="true">        
		<property name="password">itcast123</property>        
		<property name="schemas">haoke</property>    
	</user> 
</mycat:server>
           

配置schema.xml:

<?xml version="1.0"?> 
<!DOCTYPE mycat:schema SYSTEM "schema.dtd"> 
<mycat:schema xmlns:mycat="http://io.mycat/">    
	<!--配置資料表-->    
	<schema name="haoke" checkSQLschema="false" sqlMaxLimit="100">     
		<!-- tb_house_resources表位于dn1和dn2并分片存資料 -->       
		<table name="tb_house_resources" dataNode="dn1,dn2" rule="mod-long" />
		<!-- tb_ad表位于dn3 -->        
		<table name="tb_ad" dataNode="dn3"/>    
	</schema>    
	<!--配置分片關系-->    
	<dataNode name="dn1" dataHost="cluster1" database="haoke" />    
	<dataNode name="dn2" dataHost="cluster2" database="haoke" />    
	<dataNode name="dn3" dataHost="cluster3" database="haoke" />    
	<!--配置連接配接資訊-->    
	<dataHost name="cluster1" maxCon="1000" minCon="10" balance="2"                 writeType="1" dbType="mysql" dbDriver="native" switchType="1"                  slaveThreshold="100">        
		<heartbeat>select user()</heartbeat>        
		<writeHost host="W1" url="192.168.1.18:13306" user="root"                      password="root">            
			<readHost host="W1R1" url="192.168.1.18:13307" user="root"                         password="root" />      
		</writeHost>    
	</dataHost>    
	<dataHost name="cluster2" maxCon="1000" minCon="10" balance="2"                 writeType="1" dbType="mysql" dbDriver="native" switchType="1"                  slaveThreshold="100">        
		<heartbeat>select user()</heartbeat>        
		<writeHost host="W2" url="192.168.1.18:13308" user="root"                      password="root">
			<readHost host="W2R1" url="192.168.1.18:13309" user="root"                         password="root" />         
		</writeHost>    
	</dataHost>
	<!--  balance=3 為讀寫分離-->    
	<dataHost name="cluster3" maxCon="1000" minCon="10" balance="3"                 writeType="1" dbType="mysql" dbDriver="native" switchType="1"                  slaveThreshold="100">        
		<heartbeat>select user()</heartbeat>        
		<writeHost host="W3" url="192.168.1.18:23306" user="root"                      password="root">            
			<readHost host="W3R1" url="192.168.1.18:23307" user="root"                         password="root" />        
		</writeHost>    
	</dataHost> 
</mycat:schema>
           

配置rule.xml:

<function name="mod-long" class="io.mycat.route.function.PartitionByMod">    
    <property name="count">2</property> 
</function>
           

設定端口以及啟動:

vim wrapper.conf 
#設定jmx端口 
wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=11985

vim server.xml 
#設定服務端口以及管理端口 
<property name="serverPort">18067</property> 
<property name="managerPort">19067</property>

./startup_nowrap.sh && tail -f ../logs/mycat.log
           

測試插入資料

tb_house_resources表插入兩條資料,node1/node2和node3/node4分片接受資料

節點二

cp mycat-node1/ mycat-node2 -R

vim wrapper.conf 
#設定jmx端口 
wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=11986
vim server.xml 

#設定服務端口以及管理端口 
<property name="serverPort">18068</property> 
<property name="managerPort">19068</property>

./startup_nowrap.sh && tail -f ../logs/mycat.log
           

部署HAProxy

#修改檔案 
vim /haoke/haproxy/haproxy.cfg

#輸入如下内容 global
    log         127.0.0.1 local2    
    maxconn     4000    
    daemon
    
defaults
    mode                    http    
    log                        global    
    option                   httplog    
    option                   dontlognull    
    option http-server-close    
    option forwardfor       except 127.0.0.0/8
    option                  redispatch    
    retries                 3    
    timeout http-request    10s    
    timeout queue           1m    
    timeout connect         10s    
    timeout client          1m    
    timeout server          1m    
    timeout http-keep-alive 10s    
    timeout check           10s    
    maxconn                 3000

listen   admin_stats
    bind    0.0.0.0:4001    
    mode  http    
    stats uri       /dbs    
    stats realm  Global\ statistics    
    stats auth    admin:admin123

listen   proxy-mysql
    bind    0.0.0.0:4002    
    mode  tcp    
    balance  roundrobin    
    option   tcplog    
    #代理mycat服務    
    server   mycat_1  192.168.1.18:18067  check  port  18067  maxconn  2000    
    server   mycat_2  192.168.1.18:18068  check  port  18068  maxconn  2000

#啟動容器 
docker start haproxy && docker logs -f haproxy
           

通路:

MySQL_PXC叢集_綜合應用簡述部署PXC叢集和主從差別綜合應用
MySQL_PXC叢集_綜合應用簡述部署PXC叢集和主從差別綜合應用