MyCat2 mysql8 读写分离 主从自动切换
MyCat2数据中间件应用
mysql主从配置与自动切换
环境准备
- 三台虚拟机192.168.2.5(mycat)、192.168.2.6(mysql1)、192.168.2.7(mysql2)
- jdk8
- mysql版本:mysql-8.0.20-linux-glibc2.12-x86_64.tar
- mycat版本:mycat2-1.11-05.tar.gz 下载地址:http://dl.mycat.org.cn/2.0/
数据库安装配置
关闭防火墙
systemctl stop firewalld
systemctl status firewalld
禁用防火墙(系统启动时不启动防火墙服务)
systemctl disable firewalld
systemctl is-enabled firewalld
解压
tar -xvf mysql-8.0.20-linux-glibc2.12-x86_64
重命名
mv mysql-8.0.20-linux-glibc2.12-x86_64 mysql8
移动
mv mysql8 /usr/local
访问
cd /usr/local/mysql8
创建mysql数据储存文件
mkdir data
创建mysql用户组和mysql用户
groupadd mysql useradd -g mysql mysql
改变msql8目录权限
chown -R mysql.mysql /usr/local/mysql8/
初始化数据库
注意 lower-case-table-names =1 不区分大小写 在mysql8.x中只能在初始化时修改,安装完成后不能修改
bin/mysqld --initialize --user=mysql --lower-case-table-names=1 --basedir=/usr/local/mysql8 --datadir=/usr/local/mysql8/data
记录初始密码
A temporary password is generated for root@localhost: dvBbQz=yu8mP
修改配置 vi /etc/my.cnf
最简配置
[client] port=3306 socket=/tmp/mysql8/mysql.sock[mysqld] port=3306 user=mysql socket=/tmp/mysql8/mysql.sock basedir=/usr/local/mysql8 datadir=/usr/local/mysql8/data
优化配置
在var/log中创建并赋权mysql日志文件夹、创建tmpdir文件夹并赋权
mkdir /var/log/mysql8 chown -R mysql.mysql /var/log/mysql8 touch /var/log/mysql8/mariadb.log chown -R mysql.mysql /var/log/mysql8/mariadb.log chmod 777 /var/log/mysql8/mariadb.logmkdir /var/log/mysql8/run chown -R mysql.mysql /var/log/mysql8/runmkdir /tmp/mysql8 chown -R mysql.mysql /tmp/mysql8
注意 innodb_log_file_size-日志大小可根据实际磁盘大小配置、
innodb_buffer_pool_size=251M-设置buffer pool size,一般为服务器内存60%
[mysqld_safe] log-error=/var/log/mysql8/mariadb.log pid-file=/var/log/mysql8/run/mysqld.pid [client] socket=/tmp/mysql8/mysql.sockdefault-character-set=utf8 [mysqld] port=3306 user=mysql basedir=/usr/local/mysql8tmpdir=/tmp/mysql8/tmp datadir=/usr/local/mysql8/datasocket=/tmp/mysql8/mysql.sock # 默认使用“mysql_native_password”插件认证default_authentication_plugin=mysql_native_password # 创建新表时将使用的默认存储引擎default-storage-engine=INNODB#设置页大小 innodb_page_size=16384 #关闭ssl ssl=0 lower_case_table_names = 1#设置最大连接数 max_connections=2000 #设置会话请求缓存个数back_log=2048 #关闭性能模式performance_schema=OFF max_prepared_stmt_count=128000 #服务器或客户端之间进行传输大小max_allowed_packet=128M#file #设置每个表一个文件innodb_file_per_table #设置logfile大小 1500Minnodb_log_file_size=150M #设置logfile组个数 innodb_log_files_in_group=32 #设置最大打开表个数 innodb_open_files=4000#buffers #设置buffer pool size,一般为服务器内存60%innodb_buffer_pool_size=251M #设置buffer pool instance个数,提高并发能力 innodb_buffer_pool_instances=16 #设置log buffer size大小 innodb_log_buffer_size=64M#tune #设置每次sync_binlog事务提交刷盘 sync_binlog=1 #每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去innodb_flush_log_at_trx_commit=1 #开启异步IOinnodb_use_native_aio=1 #设置spin_wait_delay 参数,防止进入系统自旋 innodb_spin_wait_delay=180 #设置spin_loops 循环次数,防止进入系统自旋 innodb_sync_spin_loops=25 #设置innodb数据文件及redo log的打开、刷写模式 innodb_flush_method=O_DIRECT # 设置innodb 后台线程每秒最大iops上限 innodb_io_capacity=20000 #设置压力下innodb 后台线程每秒最大iops上限 innodb_io_capacity_max=40000 #设置page cleaner线程每次刷脏页的数量 innodb_lru_scan_depth=9000 #设置将脏数据写入到磁盘的线程数 innodb_page_cleaners=16 #perf special #检测该页所在区(extent)的所有页,如果是脏页,那么一起进行刷新,SSD关闭该功能innodb_flush_neighbors=0 #设置写线程数innodb_write_io_threads=16 #设置读线程数 innodb_read_io_threads=16 #设置回收已经使用并分配的undo页线程数 innodb_purge_threads=32 sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_AUTO_VALUE_ON_ZERO,STRICT_ALL_TABLES
在tmp中创建mysql8文件夹 并赋权
mkdir /tmp/mysql8/tmp chown -R mysql:mysql /tmp/mysql8/tmp
拷贝mysql启动文件到系统初始化目录
cp /usr/local/mysql8/support-files/mysql.server /etc/init.d/mysqld
启动mysql 服务器
service mysqld start
连接mysql
/usr/local/mysql8/bin/mysql -u root -p
登录不了 进行修改root密码
修改配置文件免密码登录
mysql vim /etc/my.cnf
# 在 [mysqld]最后加上如下语句skip-grant-tables
重启mysql服务
service mysqld restart
连接
mysql /usr/local/mysql8/bin/mysql -u root -p
首先查看当前root用户相关信息,在mysql数据库的user表中
use mysql; select host, user, authentication_string, plugin from user;
如果当前root用户authentication_string字段下有内容,先将其设置为空
update user set authentication_string='' where user='root';
退出mysql, 删除/etc/my.cnf文件最后的 skip-grant-tables 重启mysql服务
使用root用户进行登录,因为上面设置了authentication_string为空,所以可以免密码登录
使用ALTER修改root用户密码
ALTER user 'root'@'localhost' IDENTIFIED BY 'root';
修改root用户可以远程连接
update mysql.user set host='%' where user='root';
数据库主从配置
安装好两个服务器的数据库后 修改主服务器配置
修改配置
vim /etc/my.cnf
修改内容增加
# 节点唯一id值 server-id=1 # 开启二进制日志 log-bin=mysql-bin # 指定日志格式 有mixed|row|statement 推荐mixed binlog-format=mixed # 忽略mysql,information_schema库(可选配置) binlog-ignore-db = mysql,information_schema
重启服务 查看 master 的状态
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200708164939927.png)
创建用于复制操作的用户
CREATE USER 'repl'@'192.168.2.7' IDENTIFIED WITH mysql_native_password BY 'repl'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.2.7'; flush privileges;
修改从服务器配置
修改配置
vim /etc/my.cnf
修改内容增加
# 节点唯一id值 server-id=2 # 开启二进制日志 log-bin=mysql-bin # 指定日志格式 有mixed|row|statement 推荐mixed binlog-format=mixed
在从(Slave)节点上设置主节点参数
CHANGE MASTER TO MASTER_HOST='192.168.2.6', MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=856;
查看主从同步状态
show slave status\G;
开启主从同步
start slave;
再查看主从同步状态
show slave status\G;
若I/O任务启动失败
从机的server_id改成2
set global server_id=2; #此处的数值和my.cnf里设置的一样就行
若出现错误 mysql-bin.000001’:
- the first event ‘mysql-bin.000001’ at 98, the last eventread from ‘.\mysql-bin.000001’ at 98, the last byte read from ‘.\mysql-bin.000001’ at 117.
- Slave_IO_Running: NO 或 Slave_SQL_Running: NO
解决
先进入slave中执行:"stop slave ;"来停止从库同步;
再去master中执行:"flush logs;"来清空日志;
然后在master中执行:"show master status;"查看下主库的状态,主要是日志的文件和position;
然后回到slave中,执行:“CHANGE MASTER TO MASTER_LOG_FILE=‘查看到的日志文件’,MASTER_LOG_POS=查看到的position值;”,文件和位置对应master中的;
重新开启同步并查看状态
start slave; show slave status\G;
测试主从
在主创建数据库:
CREATE DATABASE test;
在从查看数据库:
show databases;
Mycat2安装配置
下载并安装jdk8
下载jdk-8u221-linux-x64.tar.gz,官网地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
解压:tar -zxvf jdk-8u221-linux-x64.tar.gz
将解压后的文件夹移动到/usr/local目录下:mv jdk1.8.0_221 /usr/local/
打开文件 vim /etc/profile,添加以下内容:
export JAVA_HOME=/usr/local/jdk1.8.0_221 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib/dt.JAVA_HOME/lib/tools.jar:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:${PATH}
重新加载配置文件
source /etc/profile
验证
java -version
解压mycat2并运行
tar -xvf mycat2-1.11-05.tar.gz cd mycat/bin./mycat start 启动 ./mycat stop 停止 ./mycat console 前台运行 ./mycat install 添加到系统自动启动(暂未实现) ./mycat remove 取消随系统自动启动(暂未实现) ./mycat restart 重启服务 ./mycat pause 暂停 ./mycat status 查看启动状态
修改配置文件
官方配置参考
修改mycat.yml文件中
读写分离,分配配置:
schemas: [] 是读写分离,分配配置,默认无需修改,默认读写分离
schemas.schemaName:‘配置逻辑库’
数据库连接配置:
datasources:[],配置需要连接的数据库
集群配置:cluster []
name: repli 和schemas的读写配置对应
masters:主节点列表,普通主从,当主失去连接后,依次选择列表中存活的作为主节点
replicas:从节点列表
连接测试
适用navicat工具连接
测试
注意:mycay不存在创建库,创建表操作,需要主节点创建库(物理库)后在mycat配置文件中配置逻辑库,表同理,分库分表需额外配置。
创建库
在主-数据库中创建 test1 配置mycat并重启
创建表
在主-数据库中创建 test_table1 刷新mycat连接表
Mycat2管理与监控
Mycat2管理与监控相关配置
参考配置 配置9066管理端和7066监控信息列表
cd /usr/local/mycat2/mycat/conf
vim mycat.yml
# 增加以下配置
plug:
#此配置默认开启7066端口.并提供以下url供查询监控信息 http://127.0.0.1:7066/metricsextra: ["io.mycat.exporter.PrometheusExporter"]
manager:ip: 0.0.0.0port: 9066users: [{ip: '.', password: 'root', username: root}]
properties:
#此配置可以更改io.mycat.exporter.PrometheusExporter开启的端口prometheusPort: 7066
监控管理的命令
关闭连接
kill @@connection id1,id2...
id是mycat前端连接或者后端native连接的id(它们公用一个id生成器)
不能关闭jdbc连接,当关闭mycat前端连接的时候会自动关闭连接占用的jdbc连接
显示Mycat前端连接
show @@connection
ID 连接的标识符
USER_NAME 登录的用户名
HOST 客户端连接地址
SCHEMA 当前schema,与sql解析有关
AFFECTED_ROWS AFFECTED_ROWS
AUTOCOMMIT 是否自动提交
IN_TRANSACTION 是否处于事务状态
CHARSET 字符编码,一般是utf8
CHARSET_INDEX 对应mysql的字符编码序号
OPEN 连接是否打开
SERVER_CAPABILITIES 服务器能力数字
ISOLATION 事务隔离级别
LAST_ERROR_CODE 最后一次错误码
LAST_INSERT_ID 插入自增主键ID
LAST_MESSAGE 最后一次错误信息
PROCESS_STATE 请求处理状态,正在接收,正在处理,完成
WARNING_COUNT 警告数量
MYSQL_SESSION_ID 如果代理
TRANSACTION_TYPE 事务类型,XA,Proxy,Local
TRANSCATION_SNAPSHOT 事务管理器状态快照
CANCEL_FLAG 当前执行的任务是否已经被取消
显示native连接
show @@backend.native
显示mycat proxy native 连接的信息
SESSION_ID 连接ID,可被kill命令杀死
THREAD_NAME 所在线程名
DS_NAME数据源名字
LAST_MESSAGE 接收到的报文中的信息(错误信息)
MYCAT_SESSION_ID 如果有绑定前端连接,则显示它的ID
IS_IDLE 是否在连接池,即是否闲置
SELECT_LIMIT限制返回行数
IS_RESPONSE_FINISHED响应是否结束
RESPONSE_TYPE响应类型
IS_IN_TRANSACTION是否处于事务状态
IS_REQUEST_SUCCESS是否向后端数据库发起请求成功
IS_READ_ONLY是否处于readonly状态
显示数据源状态
show @@backend.datasource
显示配置中的数据源信息
显示心跳状态
show @@backend.heartbeat
显示配置中的心跳信息
显示可以使用的管理命令
show @@help
显示心跳中数据源实例中的状态
navite连接与jdbc连接使用相同的数据源配置,指向相同的服务器,那么它们的数据源实例只有一个
show @@backend.instance
NAME 数据源名字
ALIVE 是否存活
READABLE 是否可以选择为读节点
TYPE 数据源类型
SESSION_COUNT 当前连接数量
WEIGHT 负载均衡权重
MASTER是否主节点
HOST连接信息
PORT连接端口
LIMIT_SESSION_COUNT连接限制数量
REPLICA所在集群名字
显示逻辑库配置
show @@metadata.schema
显示配置中的逻辑库信息
显示逻辑表配置
show @@metadata.schema.table
显示配置中的逻辑表信息
显示reactor线程状态
reactor是mycat2的io线程,主要处理透传响应与接收报文,解析sql等任务
show @@reactor
THREAD_NAME线程名字
THREAD_ID 线程ID
CUR_SESSION_ID当前正在处理的前端,后端会话ID
BUFFER_POOL_SNAPSHOT 网络缓冲区池快照
LAST_ACTIVE_TIME 最近活跃时间
显示集群状态
show @@backend.replica
NAME 集群名字
SWITCH_TYPE 切换类型
MAX_REQUEST_COUNT 获取连接的时候尝试请求的次数
TYPE 集群类型
WRITE_DS 写节点列表
READ_DS 读节点列表
WRITE_L写节点负载均衡算法
READ_L读节点负载均衡算法
显示定时器状态
show @@schedule
显示sql统计信息
show @@stat
COMPILE_TIME 编译SQL的耗时
RBO_TIME 规则优化耗时
CBO_TIME 代价优化与生成执行器耗时
CONNECTION_POOL_TIME 连接池获取连接耗时
CONNECTION_QUERY_TIME 发起查询到获得响应耗时
EXECUTION_TIME 执行引擎耗时
TOTAL_TIME 查询总耗时
重置sql统计信息
reset @@stat
显示线程池状态
show @@threadPool
NAME 线程池名字
POOL_SIZE 线程最大数量
ACTIVE_COUNT 活跃线程数
TASK_QUEUE_SIZE 等待队列大小
COMPLETED_TASK 完成的任务数量
TOTAL_TASK 总任务数量
设置数据源实例状态
switch @@backend.instance = {name:'xxx' ,alive:'true' ,readable:'true'}
name是数据源名字
alive是数据源可用状态,值 true|false
readable是数据源可读状态,值 true|false
此命令供外部服务修改mycat里的数据源实例状态,可以以此支持多种集群服务
集群切换
switch @@backend.replica = {name:'xxx'}
name是数据源名字
手动触发集群切换
此命令供外部服务修改mycat里的数据源实例状态,可以以此支持多种集群服务
心跳开关
switch @@backend.heartbeat = {true|false}
当有心跳配置的时候,可以进心跳进行开启关闭
心跳会自动修改数据源实例的状态,关闭心跳可以自行通过上面的命令修改状态
此命令供外部服务修改mycat里的数据源实例状态,可以以此支持多种集群服务
显示心跳定时器是否正在运行
show @@backend.heartbeat.running
配置更新
reload @@config by file
修改本地的mycat.yml就可更新,支持更新metadata与jdbc数据源.请在低峰时段执行,配置更新停止IO请求,尽量选择没有事务的一刻进行更新,不保证配置前后一致性等问题
显示服务器信息
show @@server
MyCat2 mysql8 读写分离 主从自动切换相关推荐
- mycat定时向mysql存储数据_【实战演练】Linux操作系统20-MyCat实现Mysql数据库读写分离与自动切换...
#本文欢迎转载,转载请注明出处和作者. 理论部分,详见:繁星亮与鲍包包:[理论研究]业务系统高可用及负载均衡zhuanlan.zhihu.com 本篇主要实现"8.Mysql读写分离&qu ...
- k8s主从自动切换mysql_Kubernetes一键部署Mycat+Mysql主从集群
Kubernetes一键部署一主一从,读写分离,自动切换的mycat+mysql架构,其中mycat配置文件.mysqsl数据文件的volume挂载未涉及,可根据实际情况进行修改.所有代码参照gith ...
- docker二进制安装mysql_Docker搭建MySQL读写分离主从模式 分布式数据库中间件Mycat分库分表应用...
一.MySQL读写分离主从模式 1. 下载镜像 docker pull mysql 当前最新版本:mysql Ver 8.0.19 for Linux on x86_64 (MySQL Communi ...
- rocketmq DLedger主从自动切换
rocketmq DLedger主从自动切换 rocketmq从4.5开始,提供了故障自动切换功能,当主从集群中的master故障后,可自动从多个slave中选举出master,完成故障转移,不需要人 ...
- Linux企业化运维--(7)redis服务之redis配置及主从复制、主从自动切换、集群、redis+mysql、gearman实现数据同步
Linux企业化运维 实验所用系统为Redhat-rhel7.6. 目录 Linux企业化运维 Linux企业化运维--(7)redis服务之redis配置及主从复制.主从自动切换.集群.redis+ ...
- redis的主从自动切换
设置redis主从主要是在不同的主机上编辑配置文件 我们准备三台主机 分别是server1.server2.server3 redis的主从自动切换是基于sentinel(哨兵) 1.Redis 的 ...
- 双机高可用、负载均衡、MySQL(读写分离、主从自动切换)架构设计
前几天网友来信说帮忙实现这样一个架构:只有两台机器,需要实现其中一台死机之后另一台能接管这台机器的服务,并且在两台机器正常服务时,两台机器都能用上.于是设计了如下的架构. 架构简介 此架构主要是由ke ...
- php redis主从自动切换,Redis 集群的主从切换
Redis 集群的主从切换不再使用 Sentinel 作为外置监控, 而是集群内部在主节点挂掉之后选举出一个从节点取代主节点, 处理相应的分片的数据请求. 当然前提条件是对应的主节点有至少一个可连通的 ...
- mysql读写分离主从原理、事务隔离级别及使用、锁表和锁行场景、乐观锁和悲观锁、lock锁和sychronized区别及使用自己学习之后总结和参考一些博客感觉系统了解了
synchronized与Lock的区别 两者区别: 1.首先synchronized是java内置关键字,在jvm层面,Lock是个java类: 2.synchronized无法判断是否获取锁的状态 ...
最新文章
- vlookup示例_VLOOKUP示例–如何在Excel中执行VLOOKUP
- Cylinder3D :3D环境下的Lidar 点云分割
- 长沙网络推广浅析影响网站快照更新时间的因素是什么?
- Ribbon_窗体_实现Ribbon风格的窗体
- Qt Creator使用自定义着色器
- python发送邮件 退回_python 发送邮件(收到的邮件要有发送方才能回复)
- 单体、分布式、微服务、Serverless软件架构一览
- 咕泡-模板方法 template method 设计模式笔记
- 九章基础算法02:栈和队列
- unity Console窗口的输出
- java研磨设计模式_研磨设计模式之单例模式(内部类)
- 两个简单方法快速解决怎么把kux格式转mp4
- 2009 中国协同软件机遇年?
- node文件通过不同的后缀名解析不同的文件类型
- 谁来拯救中国的语言文学
- 三种照片保存形式 :JPEG、TIFF、RAW
- [转载]无线网络优化
- 莪 、不 � 是 偷 偷 想 � 了 .
- windows字体转移至linux,由 Windows 向 Linux 迁移字体 和 Linux 等宽字体
- 定时器误触发功能详解