TH小破站

  • 首页
  • 容器
    • 认识Docker
    • DockerFile详解
  • k8s
    • 认识Kubernetes
    • Kubernetes部署--(kubeadm方式)
    • kubeasz部署k8s集群
    • Ansible-binary部署k8s集群-1.31.2
  • Ceph
    • 认识分布式存储
    • CPEH部署
  • CI/CD
    • DevOps认识
    • 部署--Gitlab
  • ELK
    • ELK简介
    • Elasticsearch
    • Kibana部署
    • Logstash
    • ELK--收集 tomcat 日志(实战)
  • HD
    • 认识--大数据
    • Hadoop-单机部署
    • Hadoop-伪分布部署
    • Hadoop-完全分布部署
    • Hadoop-(HA)完全分布部署
    • Ambari自动部署--Hadoop
  • Nginx
    • Nginx功能介绍
    • Nginx安全选项
    • Nginx配置文件简单介绍
    • 网站服务器部署
  • 监控
    • ZABBIX-部署(yum)
    • ZABBIX-编译安装
  • 云计算
    • KVM 概述
    • OpenStack企业级部署(T版)
    • OpenStack之dashboard部署
    • OpenStack-controller的高可用
    • openstack(Caracal版_ubuntu版本)部署
  • 数据库
    • mariadb与mysql
    • mysql主从
    • MySQL--冷备(实战)
    • MySQL--热备(dump表)
    • MySQL--热备(dump库)
    • 数据恢复实战案例
    • Xtrabackup实现MySql8.x全量备份
    • MyCat实现数据库读写分离
    • MHA实现数据库高可用
    • Percona XtraDB(PXC)实现数据库集群高可用
    • 数据库压力测试
    • PostgreSQL 基操
    • PostgreSQL备份恢复
    • PostgreSQL高可用
    • MongDB安装配置基础使用
    • MongoDB实现复制集
    • MongoDB备份还原
  • 自动化
    • ssh远程服务原理及配置
    • Ansible剧本文件应用
    • Ansible管理服务介绍
    • Ansible自动化部署node_exporter(包含升级,回滚)
    • Saltstack-部署安装
  • 脚本
    • 一键查看服务器资源利用率
    • 一键生成SSL证书
    • 保存指定数量的文件/目录
    • 初始化服务器
    • 扫描可用IP
    • 批量分发SSH密钥
    • 监控多主机磁盘脚本
    • 一键安装MySQL8.x脚本
    • Python脚本监控ES集群
    • 资源巡检脚本
    • 查看各用户使用的cpu占比
热衷于分享
架构师成长之路 !!!

MyCat实现数据库读写分离

数据库实现读写分离

架构

主机名 IP 角色
mysql-master 192.168.139.31 主MySQL
mysql-slave 192.168.139.32 从MySQL
mycat 192.168.139.33 Mycat

1)主从的搭建

1.1)配置主

[root@mysql-master ~]# cat /etc/my.cnf
[mysql]
port = 3306
socket = /data/mysql/data/mysql.sock
[mysqld]
server-id = 31 #重要
port = 3306
mysqlx_port = 33060
log-bin = /data/mysql/logbin/mysql-bin #重要
mysqlx_socket = /data/mysql/data/mysqlx.sock
basedir = /usr/local/mysql
datadir = /data/mysql/data
socket = /data/mysql/data/mysql.sock
pid-file = /data/mysql/data/mysqld.pid
log-error = /data/mysql/log/error.log
default-authentication-plugin = mysql_native_password
log_timestamps = SYSTEM
[root@mysql-master ~]# service mysqld restart 
Shutting down MySQL. SUCCESS! 
Starting MySQL. SUCCESS! 
[root@mysql-master ~]# mysql -uroot -p123456
# 查看二进制位置
mysql> show master logs;
+------------------+-----------+-----------+
| Log_name         | File_size | Encrypted |
+------------------+-----------+-----------+
| mysql-bin.000001 |       180 | No        |
| mysql-bin.000002 |       486 | No        |
| mysql-bin.000003 |       157 | No        |
+------------------+-----------+-----------+
3 rows in set (0.00 sec)
# 创建账号
mysql> create user 'stangj'@'%' identified by 'stj@123';
# 授权账号复制权限
mysql> grant replication slave on *.* to 'stangj'@'%';
# 刷新权限
mysql> FLUSH PRIVILEGES;    

1.2)配置从

# CHANGE MASTER TO
#   MASTER_HOST='192.168.139.31',
#   MASTER_USER='stangj',
#   MASTER_PASSWORD='stj@123',
#   MASTER_PORT=3306,
#   MASTER_LOG_FILE='mysql-bin.000003',
#   MASTER_LOG_POS=157;
[root@mysql-slave ~]# cat /etc/my.cnf
[mysql]
port = 3306
socket = /data/mysql/data/mysql.sock
[mysqld]
server-id = 32 # 重要
relay_log=/data/mysql/logbin  #重要
read-only # 重要
port = 3306
mysqlx_port = 33060
log-bin = /data/mysql/logbin/mysql-bin #重要
mysqlx_socket = /data/mysql/data/mysqlx.sock
basedir = /usr/local/mysql
datadir = /data/mysql/data
socket = /data/mysql/data/mysql.sock
pid-file = /data/mysql/data/mysqld.pid
log-error = /data/mysql/log/error.log
default-authentication-plugin = mysql_native_password
log_timestamps = SYSTEM
[root@mysql-slave ~]# service mysqld restart 
Shutting down MySQL. SUCCESS! 
Starting MySQL. SUCCESS! 
[root@mysql-slave ~]# mysql -uroot -p123456
# 连接同步主mysql
mysql> CHANGE MASTER TO
       MASTER_HOST='192.168.139.31',
       MASTER_USER='stangj',
       MASTER_PASSWORD='stj@123',
       MASTER_PORT=3306,
       MASTER_LOG_FILE='mysql-bin.000003',
       MASTER_LOG_POS=157;
# 启动服务
mysql> start slave;

1.3)查看主从是否配置成功

# 验证主从状态
mysql> show slave status\G
...............................
...............................
             Slave_IO_Running: Yes 
            Slave_SQL_Running: Yes
            # 这两个值为YES则为主从配置成功
...............................
...............................
# 查看是否已经同步了stangj用户
mysql> select user from mysql.user;
+------------------+
| user             |
+------------------+
| stangj           |
| mysql.infoschema |
| mysql.session    |
| mysql.sys        |
| root             |
+------------------+

2)配置MyCat

2.1)安装

`下载jdk`
[root@mycat ~]# yum -y install java-1.8.0-openjdk
`下载mycat`
[root@mycat ~]# wget http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
`解压配置`
[root@mycat ~]# mkdir /apps
[root@mycat ~]# tar xf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /apps/
[root@mycat ~]# echo 'PATH=/apps/mycat/bin:$PATH' >> /etc/profile
[root@mycat ~]# source /etc/profile
`启动mycat`
[root@mycat ~]# mycat start
Starting Mycat-server...
`查看是否成功启动`
[root@mycat ~]# cat /apps/mycat/logs/wrapper.log 
STATUS | wrapper  | 2023/12/29 21:06:52 | --> Wrapper Started as Daemon
STATUS | wrapper  | 2023/12/29 21:06:52 | Launching a JVM...
INFO   | jvm 1    | 2023/12/29 21:06:53 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
INFO   | jvm 1    | 2023/12/29 21:06:53 |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.
INFO   | jvm 1    | 2023/12/29 21:06:53 | 
INFO   | jvm 1    | 2023/12/29 21:06:53 | MyCAT Server startup successfully. see logs in logs/mycat.log
``

2.2)测试连接mycat

[root@mysql-master ~]# mysql -uroot -p123456 -h192.168.139.33 -P8066
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.29-mycat-1.6.7.4-release-20200105164103 MyCat Server (OpenCloudDB)
​
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
​
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
​
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
​
mysql> 

2.3)修改mycat配置

[root@mycat ~]# vim /apps/mycat/conf/server.xml
...............
        <user name="root" defaultAccount="true"> # 账号
                <property name="password">stj123456</property> # 登录密码
                <property name="schemas">TESTDB</property>
                <property name="defaultSchema">TESTDB</property>
...................
[root@mycat ~]# vim /apps/mycat/conf/schema.xml 
[root@mycat ~]# cat /apps/mycat/conf/schema.xml 
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>
    <dataNode name="dn1" dataHost="localhost1" database="hellodb" />  # 数据库名
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="host1" url="192.168.139.31:3306" user="root" password="123456">  # 写服务器指主mysql
        <readHost host="host2" url="192.168.139.32:3306" user="root" password="123456" />  # 读服务器指从mysql
                </writeHost>
        </dataHost>
</mycat:schema>

2.4)重启mycat

[root@mycat ~]# mycat restart
[root@mycat ~]# tail -f /apps/mycat/logs/wrapper.log 
STATUS | wrapper  | 2023/12/29 22:03:36 | --> Wrapper Started as Daemon
STATUS | wrapper  | 2023/12/29 22:03:36 | Launching a JVM...
INFO   | jvm 1    | 2023/12/29 22:03:36 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
INFO   | jvm 1    | 2023/12/29 22:03:36 |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.
INFO   | jvm 1    | 2023/12/29 22:03:36 | 
INFO   | jvm 1    | 2023/12/29 22:03:57 | MyCAT Server startup successfully. see logs in logs/mycat.log

3)在mysql中创建hellodb数据库并配置用户

[root@mysql-master ~]# mysql -uroot -p123456
# 创建数据库
mysql> create database hellodb;
# 切换到hellodb数据库
mysql> use hellodb;
# 创建表
mysql> CREATE TABLE student (
    id int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(20) NOT NULL,
    age tinyint UNSIGNED,
    gender ENUM('M','F') default 'M'
    ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
# 插入三条数据
mysql> insert student (name,age)values('xiaoming',20);
mysql> insert student (name,age)values('wangwu',36);
mysql> insert student (name,age)values('tanghao',18);
# 授权账号
# 创建账号
mysql> GRANT ALL ON *.* TO 'root'@'192.168.139.%' IDENTIFIED BY '123456' WITH GRANT OPTION;
# 查看信息
mysql> select  user,host from mysql.user;
+------------------+---------------+
| user             | host          |
+------------------+---------------+
| stangj           | %             |
| root             | 192.168.139.% |
| mysql.infoschema | localhost     |
| mysql.session    | localhost     |
| mysql.sys        | localhost     |
| root             | localhost     |
+------------------+---------------+
GRANT ALL ON *.* TO 'root'@'192.168.139.%' IDENTIFIED BY '123456' WITH GRANT OPTION;

4)连接mycat验证数据

[root@mysql-master ~]# mysql -uroot -pstj123456 -h192.168.139.33 -P8066
mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB   |
+----------+
mysql [TESTDB]> show tables;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| student           |
+-------------------+
mysql [TESTDB]> select * from student;
+----+----------+------+--------+
| id | name     | age  | gender |
+----+----------+------+--------+
| 10 | xiaoming |   20 | M      |
| 11 | wangwu   |   36 | M      |
| 12 | tanghao  |   18 | M      |
+----+----------+------+--------+

5)验证是否是实现了读写分离

5.1)启用通用日志

  • 主从都要启用(我演示一个)

[root@mysql-master/slave ~]# mysql -uroot -proot
`启动通用日志`
mysql > set global general_log=on;
`查看是否启用`
mysql> show variables like 'general_log'; 
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log   | ON    |
+---------------+-------+
mysql> show variables like 'general_log_file';
+------------------+------------------+
| Variable_name    | Value            |
+------------------+------------------+
| general_log_file | mysql-master.log |
+------------------+------------------+

5.2)主MySQL追踪通用日志

[root@mysql-master ~]# cd /var/lib/mysql/
[root@mysql-master mysql]# tail -f mysql-master.log 

5.3)从MySQL追踪通用日志

[root@mysql-slave ~]# cd /var/lib/mysql/
[root@mysql-slave mysql]# tail -f mysql-slave.log 

5.4)在mycat执行查数据操作

[root@mysql-master ~]# mysql -uroot -pstj123456 -h 192.168.139.33 -P8066
...............
mysql [TESTDB]> select * from student;
​
`从MySQL查看`
[root@mysql-slave mysql]# tail -f mysql-slave.log 
........
231229 23:25:49     6 Query select user()
231229 23:25:59    13 Query select user()
231229 23:26:09    10 Query select user()
231229 23:26:19    14 Query select user()
231229 23:26:27    11 Query SET names utf8;select * from student  # 日志很明显

5.5)在mycat执行写数据操作

[root@mysql-master ~]# mysql -uroot -pstj123456 -h 192.168.139.33 -P8066
...............
mysql> insert student (name,age)values('stj',21);
​
`主MySQL查看`
[root@mysql-master mysql]# tail -f mysql-master.log 
231229 23:28:59    10 Query select user()
231229 23:29:09    14 Query select user()
231229 23:29:19    11 Query select user()
231229 23:29:29     8 Query select user()
231229 23:29:39    12 Query select user()
231229 23:29:49     9 Query select user()
231229 23:29:51     5 Query insert student (name,age)values('stj',21)

 

COPYRIGHT © 2025 TH小破站. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

渝ICP备2023013789号

渝公网安备50011702500926号