Maison >base de données >tutoriel mysql >Exemple de séparation lecture-écriture Mycat basée sur la réplication maître-esclave MySQL

Exemple de séparation lecture-écriture Mycat basée sur la réplication maître-esclave MySQL

黄舟
黄舟original
2017-10-01 07:43:103291parcourir

Aujourd'hui, je vous propose un article sur la façon dont Mycat implémente la séparation lecture-écriture basée sur la réplication maître-esclave MySQL. Ce que vous devez noter ici, c'est que la réplication maître-esclave de MySQL repose sur le propre mécanisme de réplication maître-esclave de MySQL. Mycat n'en est pas responsable. La réplication maître-esclave de MySQL Pour plus d'informations sur la configuration de la réplication maître-esclave de MySQL, vous pouvez vous référer au billet de blog "MySQL - Configuration de la réplication maître-esclave".

1. Environnement

Système d'exploitation : CentOS-6.5-x86_64-bin-DVD1.iso
Version JDK : jdk1.7.0_80
Version MyCat : Mycat- server-1.5.1-RELEASE-20170717215510-linux.tar.gz (Téléchargez le code source et compilez-le vous-même)
IP du nœud MyCat : 192.168.209.133 Nom d'hôte : liuyazhuang133 Configuration de l'hôte : CPU 4 cœurs, mémoire 4G
Version MySQL :mysql-5.6.32.tar.gz
IP du nœud maître : 192.168.209.131 Nom d'hôte : liuyazhuang131 Configuration de l'hôte : CPU 4 cœurs, mémoire 4G
IP du nœud esclave : 192.168.209.132 Nom d'hôte : liuyazhuang132 Configuration hôte : processeur 4 cœurs, mémoire 4G

2. Introduction à MyCat (site officiel de MyCat : http://mycat.io/)

Lecture-écriture de MyCat La séparation est basée sur le cluster MySQL back-end. Elle est implémentée via la synchronisation maître-esclave et MyCat fournit la fonction de distribution des instructions. MyCat 1.4 commence à prendre en charge le mécanisme de séparation lecture-écriture de la liaison d'état de réplication maître-esclave MySQL, rendant la lecture plus sécurisée et fiable.

3. Installation de MyCat

1. Définissez le nom d'hôte de MyCat et le mappage entre l'IP et le nom d'hôte

# vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=liuyazhuang133
# vi /etc/hosts
127.0.0.1 liuyazhuang133
192.168.209.131 liuyazhuang131
192.168.209.132 liuyazhuang132
192.168.209.133 liuyazhuang133
2. Configurer les variables d'environnement Java

Étant donné que MyCat est développé en Java, JDK doit être installé pour exécuter MyCat (JRE suffit pour être précis) et JDK1.7. ou La version ci-dessus


# vi /etc/profile
## java env
export JAVA_HOME=/usr/local/java/jdk1.7.0_80
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/rt.jar
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
# source /etc/profile
# java -version
3. Téléchargez le package d'installation

Téléchargez Mycat-server-1.5.1-RELEASE-20170717215510-linux.tar.gz dans /home dans le répertoire /mycat du serveur MyCat, décompressez-le et déplacez-le vers le répertoire /usr/local/mycat


$ tar -zxvf Mycat-server-1.5.1-RELEASE-20170717215510-linux.tar.gz
# mv /home/mycat/mycat  /usr/local/
# cd /usr/local/mycat/
# ll


4. Définissez les variables d'environnement de Mycat

# vi /etc/profile
## mycat env
export MYCAT_HOME=/usr/local/mycat
export PATH=$PATH:$MYCAT_HOME/bin
# source /etc/profile
4. Configurez MyCat

1. Confirmez que la réplication maître-esclave MySQL est normale

Avant de configurer MyCat, veuillez confirmer que le La configuration de l'installation de la réplication maître-esclave MySQL est terminée et le fonctionnement est normal. La synchronisation des données maître-esclave MySQL est configurée dans MySQL et MyCat n'est pas responsable des problèmes de synchronisation des données.

Supplément :
(1) Dans la configuration de la réplication maître-esclave MySQL, s'il s'agit d'une réplication synchrone de fonctions ou de procédures stockées, vous devez ajouter la configuration log_bin_trust_function_creators=true ou dans la section [mysqld] dans /etc /my.cnf Set set global log_bin_trust_function_creators = 1 dans le client ;
(2) Si vous souhaitez effectuer un commutateur maître-esclave sous séparation lecture-écriture, le nœud esclave peut également devenir un nœud d'écriture, donc le nœud esclave ne peut pas être défini sur read_only =1.
(3) La version Linux de MySQL doit être définie sur l'insensibilité à la casse MySQL, sinon le problème de la table introuvable peut survenir. Vous pouvez ajouter lower_case_table_names=1 dans la section [mysqld] de /etc/my.cnf.

2. Configurez le schéma.xml de MyCat

schema.xml est l'un des fichiers de configuration les plus importants de MyCat. Il est utilisé pour définir la bibliothèque logique, les tables, les nœuds de données, dataHost et autres. contenu.


[root@liuyazhuang133 conf]$ cd /usr/local/root/conf/
[root@liuyazhuang133 conf]$ vi schema.xml
<?xml version="1.0"?>

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">

<mycat:schema xmlns:mycat="http://org.opencloudb/">

      <!-- 定义MyCat的逻辑库,逻辑库的概念与MySQL中的 database 概念相同 -->

      <!-- schema name="rc_schema1" checkSQLschema="false" sqlMaxLimit="100" dataNode="rc_dn1"></schema -->

		<!--schema name="pay_schema1" checkSQLschema="false" sqlMaxLimit="100" dataNode="pay_dn1"></schema-->

      <schema name="lyz_schema1" checkSQLschema="false" sqlMaxLimit="100" dataNode="lyz_dn1"></schema>

      <schema name="lyz_schema2" checkSQLschema="false" sqlMaxLimit="100" dataNode="lyz_dn2"></schema>

		<!-- 其中checkSQLschema表明是否检查并过滤SQL中包含schema的情况,如逻辑库为 TESTDB,则可能写为select * from TESTDB.edu_user,此时会自动过滤TESTDB,SQL变为select * from edu_user,若不会出现上述写法,则可以关闭属性为false -->

		<!--sqlMaxLimit默认返回的最大记录数限制,MyCat1.4版本里面,用户的Limit参数会覆盖掉MyCat的sqlMaxLimit默认设置-->

      <!-- 定义MyCat的数据节点 -->

      <dataNode name="lyz_dn1" dataHost="dtHost2" database="lyzdb1" />

      <dataNode name="lyz_dn2" dataHost="dtHost2" database="lyzdb2" />

	<!-- dataNode 中的 name 数据表示节点名称, dataHost表示数据主机名称, database表示该节点要路由的数据库的名称 -->

 

      <!-- dataHost配置的是实际的后端数据库集群(当然,也可以是非集群) -->

      <!-- 注意:schema中的每一个dataHost中的host属性值必须唯一,否则会出现主从在所有dataHost中全部切换的现象 -->

      <!-- 定义数据主机dtHost1,只连接到MySQL读写分离集群中的Master节点,不使用MyCat托管MySQL主从切换 -->

      <!--

      <dataHost name="dtHost1" maxCon="500" minCon="20" balance="0"

           writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">

           <heartbeat>select user()</heartbeat>

           <writeHost host="hostM1" url="192.168.1.205:3306" user="root" password="lyz" />

      </dataHost>

      -->

      <!-- 使用MyCat托管MySQL主从切换 -->

      <!-- 定义数据主机dtHost2,连接到MySQL读写分离集群,并配置了读写分离和主从切换 -->

      <dataHost name="dtHost2" maxCon="500" minCon="20" balance="1"

           writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">

           <!-- 通过show slave status检测主从状态,当主宕机以后,发生切换,从变为主,原来的主变为从,这时候show slave status就会发生错误,因为原来的主没有开启slave,不建议直接使用switch操作,而是在DB中做主从对调。 -->

           <heartbeat>show slave status</heartbeat>

           <!-- can have multi write hosts -->

           <writeHost host="hostM2" url="192.168.209.131:3306" user="root" password="root" />

           <writeHost host="hostS2" url="192.168.209.132:3306" user="root" password="root" />

      </dataHost>

      <!-- 参数balance决定了哪些MySQL服务器参与到读SQL的负载均衡中 -->

		<!-- balance="0",为不开启读写分离,所有读操作都发送到当前可用的writeHost上-->

      <!-- balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡-->

      <!-- balance="2",所有读操作都随机的在writeHost、readHost上分发-->

      <!-- MyCat1.4版本中,若想支持MySQL一主一从的标准配置,并且在主节点宕机的情况下,从节点还能读取数据,则需要在MyCat里配置为两个writeHost并设置balance="1" -->

      <!-- writeType="0",所有写操作都发送到可用的writeHost上 -->

      <!-- writeType="1",仅仅对于galera for mysql集群这种多主多节点都能写入的集群起效,此时Mycat会随机选择一个writeHost并写入数据,对于非galera for mysql集群,请不要配置writeType=1,会导致数据库不一致的严重问题 -->

</mycat:schema>
MyCat 1.4 commence à prendre en charge le mécanisme de séparation en lecture-écriture de la liaison d'état de réplication maître-esclave MySQL, rendant la lecture plus sécurisée et fiable.

Configuration de l'instruction de vérification du rythme cardiaque MyCat Pour afficher l'état de l'esclave, deux nouveaux attributs sont définis sur dataHost : switchType="2" et slaveThreshold="100". Cela signifie que la séparation en lecture-écriture et le mécanisme de commutation de la réplication maître-esclave MySQL. la liaison d'état est activée et le mécanisme de battement de cœur MyCat réussit la détection. Les trois champs "Seconds_Behind_Master", "Slave_IO_Running" et "Slave_SQL_Running" dans show slave status déterminent l'état actuel de la synchronisation maître-esclave et le délai de réplication maître-esclave Seconds_Behind_Master lorsque Seconds_Behind_Master. est supérieur à slaveThreshold, le filtre de séparation lecture-écriture filtrera cette machine esclave pour empêcher la lecture d'anciennes données d'il y a longtemps. Lorsque le nœud maître tombe en panne, la logique de commutation vérifiera si le Seconds_Behind_Master sur l'esclave est 0. Lorsque le nœud maître tombe en panne, la logique de commutation vérifiera si le Seconds_Behind_Master sur l'esclave est égal à 0. c'est 0, cela signifie que le maître et l'esclave sont synchronisés, et le commutateur peut être sécurisé sinon il ne commutera pas.


3. Configuration server.xml

server.xml est principalement utilisé pour définir les variables système, gérer les utilisateurs, définir les autorisations des utilisateurs, etc.


[root@liuyazhuang133 conf]$ vi server.xml
4. Ouvrez les ports 8066 et 9066 dans le pare-feu
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mycat:server SYSTEM "server.dtd">

<mycat:server xmlns:mycat="http://org.opencloudb/">

      <system>

		<property name="defaultSqlParser">druidparser</property>

		<property name="charset">utf8mb4</property>

		  <!-- <property name="useCompression">1</property>-->

		  <!--1为开启mysql压缩协议-->

		  <!-- <property name="processorBufferChunk">40960</property> -->

		  <!--

		  <property name="processors">1</property>

		  <property name="processorExecutor">32</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="mutiNodeLimitType">1</property> 0:开启小数量级(默认) ;1:开启亿级数据排序

					  <property name="mutiNodePatchSize">100</property> 亿级数量排序批量

					 <property name="processors">32</property> <property name="processorExecutor">32</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>

			   -->

		  </system>

		  <!-- 用户1,对应的MyCat逻辑库连接到的数据节点对应的主机为MySQL主从复制配置中的Master节点,没实现读写分离,读写都在该Master节点中进行  -->

		  <!--

		  <user name="user1">

			   <property name="password">roncoo.1</property>

			   <property name="schemas">rc_schema1,pay_schema1</property>

		  </user>

		  -->

		  <!-- 用户2,对应的MyCat逻辑库连接到的数据节点对应的主机为主从复制集群,并通过MyCat实现了读写分离 -->

		  <user name="lyz">

			   <property name="password">lyz.123</property>

			   <property name="schemas">lyz_schema1,lyz_schema2</property>

		  </user>

		  <!-- 用户3,只读权限-->

		  <user name="userlyz">

			   <property name="password">lyz.123</property>

			   <property name="schemas">lyz_schema1,lyz_schema2</property>

			   <property name="readOnly">true</property>

		  </user>

</mycat:server>

Le port de données par défaut de MyCat est 8066, et mycat reçoit les demandes d'accès des clients de base de données via ce port.

Le port de gestion est 9066, qui est utilisé pour recevoir les commandes de surveillance de mycat, interroger l'état d'exécution de mycat, recharger les fichiers de configuration, etc.



Ajouté :
[root@liuyazhuang133 mycat]# vi /etc/sysconfig/iptables


Redémarrez le pare-feu :
## MyCat
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8066 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 9066 -j ACCEPT


Modifiez le niveau de journalisation pour déboguer.
[root@liuyazhuang133 mycat]# service iptables restart

Modifier le niveau de journalisation pour déboguer afin de confirmer l'état de fonctionnement des données de la séparation lecture-écriture du cluster de base de données MySQL basé sur MyCat via le journal (peut être modifié au niveau information avant la production officielle)


[root@liuyazhuang133 conf]$ vi /usr/local/mycat/conf/log4j.xml

6、启动root

[root@liuyazhuang133 bin]$ cd /usr/local/root/bin/

(1) 控制台启动,这种启动方式在控制台关闭后,root服务也将关闭,适合调试使用:

[root@liuyazhuang133 bin]$ ./root console

(2) 可以采用以下后台启动的方式:

[root@liuyazhuang133 bin]$ ./root start
Starting root-server...
(对应的,重启: root restart , 关闭: root stop )

7、MyCat连接测试

(1) 如果本地Windows安装有MySQL,可以使用已有的mysql客户端远程操作Mycat


(2) Nativecat连接Mycat




8、读写分离测试

(1) 监听MyCat日志

[root@liuyazhuang133 ~]$ cd /usr/local/mycat/logs/
[root@liuyazhuang133 logs]$ tail -f mycat.log

(2) 读测试

$ mysql -uuserlyz -plyz.123 -h192.168.209.233 -P8066
mysql> show databases;


mysql> use lyz_schema2;


mysql> show tables;


mysql> select * from lyz_user_02;


执行上面的查询语句,此时对应的MyCat日志信息如下:


多次执行 select * from lyz_user_02 语句,Mycat打印出来的日志信息显示读操作请求都是路由到Slave节点(192.168.209.132)

(2) 写测试

mysql> insert into lyz_user_02 (userName, pwd) values(&#39;liuyazhuang&#39;, &#39;lyz。123&#39;);


执行上面的新增插入语句后,此时对应的Mycat日志信息如下:


多次执行以上插入语句,发现新增数据都是从 Master节点(192.168.209.131)插进入的,并且Slave节点通过Binlog同步了Master节点中的数据。


综上,基于MyCat的读写分离集群配置成功。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn