基于阿里开源的Cobar产品而研发,Cobar的稳定性、可靠性、优秀的架构和性能以及众多成熟的使用案例使得MYCAT一开始就拥有一个很好的起点,站在巨人的肩膀上,我们能看到更远。业界优秀的开源项目和创新思路被广泛融入到Mycat的基因中,使Mycat在很多方面都领先于目前其他一些同类的开源项目,甚至超越某些商业产品。
Mycat背后有一支强大的技术团队,其参与者都是5年以上软件工程师、架构师、DBA等,优秀的技术团队保证了Mycat的产品质量。
Mycat并不依托于任何一个商业公司,因此不像某些开源项目,将一些重要的特性封闭在其商业产品中,使得开源项目成了一个摆设。
# yum源安装
$ yum search jdk
$ yum -y install java-1.8.0-openjdk.x86_64
# 查看jsk版本
$ java -version
$ cd /usr/local/src/
$ wget http://dl.mycat.org.cn/1.6.7.6/20211016233725/Mycat-server-1.6.7.6-release-20211016233725-linux.tar.gz
#mysql8的驱动
$ wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.18/mysql-connector-java-8.0.18.jar
# 解压
# 解压
$ tar -zxvf Mycat-server-1.6.7.6-release-20211016233725-linux.tar.gz
# 改名(可忽略)
$ mv mycat/ mycat-1.6.7.6
# 移动到/usr/local目录
$ mv mycat-1.6.7.6/ /usr/local/
#替换mysql-connector-java-8.0.18.jar
$ cd /usr/local/mycat-1.6.7.6/lib
$ mv mysql-connector-java-8* /tmp
$ mv /usr/local/src/mysql-connector-java-8.0.18.jar .
# 进入配置文件目录,并查看文件
$ cd /usr/local/mycat-1.6.7.6/conf
# 修改server.xml
$ vi server.xml
# 修改底部管理员用户和只读用户信息及密码,配置schemas
<user name="root" defaultAccount="true">
<property name="password">Xinnet@2021</property>
<property name="schemas">ZABBIXDB</property>
<property name="defaultSchema">ZABBIXDB</property>
</user>
<user name="zabbixuser" defaultAccount="true">
<property name="password">zabbixuser@2021</property>
<property name="schemas">ZABBIXDB</property>
<property name="defaultSchema">ZABBIXDB</property>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">ZABBIXDB</property>
<property name="readOnly">true</property>
<property name="defaultSchema">ZABBIXDB</property>
</user>
#多创建了一个zabbixuser用户
# 修改schema.xml
vi schema.xml
# 替换为以下内容
# 其中10.12.69.51为写主机(主数据库)IP,10.12.69.52为读主机(从数据库)IP。
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="ZABBIXDB" checkSQLschema="false" sqlMaxLimit="1000" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="host1" database="zabbix" />
<dataHost name="host1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="jdbc:mysql://10.12.69.51:3306" user="root" password="Xinnet@2021">
<readHost host="hostS1" url="jdbc:mysql://10.12.69.52:3306" user="root" password="Xinnet@2021" />
</writeHost>
</dataHost>
</mycat:schema>
dataHost节点中的balance(负载均衡类型)属性值共四种情况:
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”
所有读请求随机的分发到readhost 执行,writerHost不负担读压力。
# 重新启动
$ cd /usr/local/mycat-1.6.7.6/bin/
$ ./mycat restart
# 查看启动状态
$ ./mycat status
# 注意关闭防火墙或者放开端口8066
#查看日志是否启动成功
tail -f ../logs/switch.log
tail -f ../logs/mycat.log -n 400
#查看主数据库日志记录开关、日志记录路径是否打开
mysql> show variables like 'general_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log | OFF |
+---------------+-------+
1 row in set (0.00 sec)
mysql> show variables like 'general_log_file';
+------------------+------------------------------------------------------+
| Variable_name | Value |
+------------------+------------------------------------------------------+
| general_log_file | /var/lib/mysql/bj-smzy-devops-zabbix-10-12-69-51.log |
+------------------+------------------------------------------------------+
mysql> set global general_log=ON; ## 打开记录日志开关
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'general_log'; #再次查看
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log | ON |
+---------------+-------+
打开多个终端监控日志
主数据库:
$ tail -f /var/lib/mysql/bj-smzy-devops-zabbix-10-12-69-51.log
从数据库:
$ tail -f /var/lib/mysql/bj-smzy-devops-zabbix-10-12-69-52.log
$ mysql -h 10.12.69.53 -uroot -p -P8066mysql> show databases;+----------+| DATABASE |+----------+| ZABBIXDB |+----------+# 创建测试表mysql> create table t_data2_test(`id`int not null primary key auto_increment, `value` varchar(255));# 插入一条记录mysql> insert into t_data2_test(`value`) values('C3Stones');# 查询mysql> select * from t_data2_test;
读查询语句是否只从从库执行
写库语句是否只从主库执行
可以看到读只从读库52上执行,写库只从51主库上执行(因为配置了主从复制,所以看写库日志的时间,主库是先写进去的,从库是随后通过binlog执行写操作的)
场景:应用使用zbbixuser用户连接mycat
#主从库全部创建zabbixuser用户并且访问授权mysql> create user 'zabbixuser'@'%' identified with mysql_native_password by 'zabbixuser@2021';Query OK, 0 rows affected (0.33 sec)mysql> grant all privileges on *.* to 'zabbixuser'@'%' with grant option; Query OK, 0 rows affected (0.11 sec)mysql> flush privileges;Query OK, 0 rows affected (0.02 sec)
Xinnet@2021 ZABBIXDB ZABBIXDB zabbixuser@2021 ZABBIXDB ZABBIXDB user ZABBIXDB true ZABBIXDB
新增user zabbixuser 其他保持不变 ,重启macat
$ cd /usr/local/mycat-1.6.7.6/bin/$ ./mycat restart# 测试使用zabbixuser用户连接数据库$ mysql -h 10.12.69.53 -uzabbixuser -p -P8066Enter password: Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 7Server version: 5.6.29-mycat-1.6.7.6-release-20211018151034 MyCat Server (OpenCloudDB)Copyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>
成功!