mysql-router读写分离

本文介绍 MySQL Router 的安装配置过程及其实现的功能,包括读写分离、故障切换、负载均衡等,并通过实例展示了如何配置 MySQL Router 来实现这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL router功能有读写分离,故障切换、负载均衡、透明代理等功能

1、搭建数据库主从略

2、mysql_router安装如下:

tar -xvf mysql-router-2.1.4-linux-glibc2.12-x86-64bit.tar.gz
cp mysql-router-2.1.4-linux-glibc2.12-x86-64bit /usr/local/mysqlrouter -rf
cd /usr/local/mysqlrouter/
# 创建日志目录
mkdir -p /usr/local/mysqlrouter/logs
# 创建配置文件目录
mkdir -p /usr/local/mysqlrouter/conf
touch /usr/local/mysqlrouter/conf/mysqlrouter.ini
#配置文件为  /usr/local/mysqlrouter/conf/mysqlrouter.ini

[DEFAULT]
logging_folder = /usr/local/mysqlrouter/logs
plugin_folder = /usr/local/mysqlrouter/lib/mysqlrouter
config_folder = /usr/local/mysqlrouter/conf
runtime_folder = /usr/local/mysqlrouter/run


[logger]
#level = INFO
level = DEBUG


[routing:read_write]
bind_address = 172.16.32.102
bind_port = 7001
mode = read-write
destinations = 172.16.32.11:3307,172.16.32.10:3307
max_connections = 65535
max_connect_errors = 10000
client_connect_timeout = 9


[routing:read_only]
bind_address = 172.16.32.102
bind_port = 7002
mode = read-only
destinations = 172.16.32.10:3307,172.16.32.104:3307
max_connections = 65535
max_connect_errors = 10000
client_connect_timeout = 9


[keepalive]
interval = 60

###部分参数说明

DEFAULT]
# 定义日志目录
logging_folder = /usr/local/mysqlrouter/logs
[logger]
# 定义日志等级 
level = INFO
# 一个高可用的标签
[routing:failover]
bind_address = 0.0.0.0
bind_port = 7001
max_connections = 1024
# 目前就支持两种 : read-write 和 read-only # read-write:用于高可用,用于可读可写
# read-only:用于负载均衡,只读
mode = read-write
# 实际转发的地址
# 第一个socket如果可用,就一直会使用第一个
# 如果第一个socket无法连接了,才会连接到第二个socket 
destinations = 主库地址:3307, 备选主库地址:3307

# 一个用于复杂均衡的标签 
[routing:balancing] 
bind_address = 0.0.0.0 
bind_port = 7002 
max_connections = 1024 
# 用于负载均衡的只读模式 
mode = read-only
# 这里的两个socket是轮询用的
destinations = 从库地址:port,从库地址2:port  //读负载均衡配置


######测试如下:

##服务端口检查:netstat -tnl
看日志:
2018-02-06 16:17:59 DEBUG   [7f4fe95bb700] [routing:read_write] TCP connection from 6 accepted at 172.16.32.102:7001
2018-02-06 16:17:59 DEBUG   [7f4fd37fe700] Trying server 172.16.32.11:3307 (index 0)
2018-02-06 16:17:59 DEBUG   [7f4fd37fe700] [routing:read_write] source [172.16.32.102]:39043 - dest [172.16.32.11]:3307
2018-02-06 16:18:34 INFO    [7f4feb5bf700] keepalive
2018-02-06 16:19:00 DEBUG   [7f4fd37fe700] [routing:read_write] Routing stopped (up:481b;down:320b) 
2018-02-06 16:19:01 DEBUG   [7f4fe95bb700] [routing:read_write] TCP connection from 6 accepted at 172.16.32.102:7001
2018-02-06 16:19:01 DEBUG   [7f4fd37fe700] Trying server 172.16.32.11:3307 (index 0)
2018-02-06 16:19:01 DEBUG   [7f4fd37fe700] [routing:read_write] source [172.16.32.102]:39045 - dest [172.16.32.11]:3307
2018-02-06 16:19:34 INFO    [7f4feb5bf700] keepalive
1、实现读负载均衡
##在不同的SESSION中登陆7002访问到不同的DB
2、从库离线处理
##从库自动上线离线处理
##连接切换(秒切换)
3、主库离线与备选主库
##实现备选主库切换,主库恢复后不在使用连接
##一组多从情况下,非线性级联情况下,最后个从库同步异常
##适合多主环境、GTID,如MGR,不适合异步复制
##重启服务路由更新
4、并发测试
    ##出现服务异常,7002仍然可以访问,重启服务后恢复
##最大支持500并发



<think>问题分析:用户启动MySQL Router8.0.35容器时使用bootstrap自动生成配置文件,但生成的配置中没有包含读写分离端口6450。这通常是因为在MySQL Router8.0版本中,默认配置发生了变化。在MySQL Router8.0中,默认的读写端口是6446,只读端口是6447。而用户提到的6450端口可能是之前版本(如2.x)的默认读写端口,或者是用户自定义的端口。在8.0版本中,默认配置不再包含6450端口。解决方案:1.检查MySQL Router8.0的默认端口分配2.在bootstrap时显式指定端口3.手动修改配置文件添加6450端口以下是详细步骤: ###1.理解MySQLRouter8.0的默认端口在MySQL Router8.0中,默认端口分配如下:-6446:读写(经典协议) -6447:只读(经典协议) -6448:读写(X协议)-6449:只读(X协议)###2.在bootstrap时指定自定义端口如果需要在bootstrap时生成包含6450端口的配置,可以使用`--conf-base-port`参数来指定基础端口。例如,将基础端口设置为6450,则实际端口会基于这个基础端口分配: ```bashdocker run--namemysql-router\--networkmysql-net\-p6450:6450-p6451:6451-p6452:6452-p6453:6453\-v/use01/docker/mysqlrouter:/etc/mysqlrouter \-v/use01/docker/mysqlrouter-state:/var/lib/mysqlrouter \-e MYSQL_HOST=mysql-master \-e MYSQL_PORT=3306\-eMYSQL_USER=mgr_user \-e MYSQL_PASSWORD='admin' \-d mysql/mysql-router:8.0.35 \--bootstrapmgr_user@mysql-master:3306 \--conf-base-port6450```**注意**:上述命令中,我们通过`--conf-base-port`将基础端口设置为6450,这样生成的端口将是:-6450:读写(经典协议) -6451:只读(经典协议) -6452:读写(X协议)-6453:只读(X协议)###3.手动修改配置文件添加6450端口如果已经生成了配置文件,可以手动编辑配置文件(`/etc/mysqlrouter/mysqlrouter.conf`),添加一个额外的路由规则:```ini[routing:custom_rw]bind_address=0.0.0.0bind_port=6450destinations=metadata-cache://Cluster01/default?role=PRIMARYrouting_strategy=first-availableprotocol=classic``` **完整配置示例**:```ini[DEFAULT]logging_folder=/var/log/mysqlrouterruntime_folder=/var/run/mysqlrouterconfig_folder=/etc/mysqlrouterdata_folder=/var/lib/mysqlrouter[logger] level= INFO[metadata_cache:Cluster01]cluster_type=innodbrouter_id=1user=mgr_usermetadata_cluster=Cluster01ttl=5bootstrap_server_addresses=mysql-master:3306connect_timeout=30[routing:Cluster01_rw] bind_address=0.0.0.0bind_port=6446destinations=metadata-cache://Cluster01/default?role=PRIMARYrouting_strategy=first-availableprotocol=classic[routing:Cluster01_ro]bind_address=0.0.0.0bind_port=6447destinations=metadata-cache://Cluster01/default?role=SECONDARYrouting_strategy=round-robin-with-fallbackprotocol=classic#自定义读写端口6450[routing:custom_rw] bind_address=0.0.0.0bind_port=6450destinations=metadata-cache://Cluster01/default?role=PRIMARYrouting_strategy=first-availableprotocol=classic``` ###4.重启MySQLRouter使配置生效```bashdocker restartmysql-router```###5.验证端口监听```bashdocker execmysql-router netstat -tuln```输出中应包含: ```tcp600:::6450:::*LISTEN``` ###6.使用6450端口连接测试```bashmysql -uapp_user -p -h127.0.0.1 -P6450```###原因解释MySQLRouter8.0的bootstrap过程默认生成的是6446-6449端口,而不是6450。这是因为:-6450端口在旧版本(2.x)中是默认读写端口-8.0版本重新设计了端口分配策略,默认使用6446作为读写端口-如果需要使用6450,必须显式指定或手动配置§§相关问题§§: 1.如何为MySQL Router配置多个读写端口? 2. MySQLRouter8.0与旧版本(2.x)在配置上有哪些主要区别? 3.如何验证MySQL Router的路由规则是否正确?4.在Kubernetes中如何部署MySQL Router以实现高可用?</think>### MySQL Router 8.0.35 默认端口配置分析 在 MySQL Router 8.0.35 中,自动生成的配置文件默认**不包含 6450 端口**,这是设计上的改变。以下是详细解释和解决方案: #### 1. **端口配置变化原因** - **历史版本**:旧版 MySQL Router (2.x) 默认使用 6450 作为读写端口 - **新版变化**:8.0+ 版本默认端口调整为: - `6446`: 读写 (经典协议) - `6447`: 只读 (经典协议) - `6448`: 读写 (X协议) - `6449`: 只读 (X协议) - `6450` 不再是默认端口,需要手动添加 #### 2. **验证默认配置** 查看自动生成的 `/tmp/mysqlrouter/mysqlrouter.conf`: ```ini [routing:default_rw] bind_address=0.0.0.0 bind_port=6446 destinations=metadata-cache://Cluster01/default?role=PRIMARY routing_strategy=first-available protocol=classic [routing:default_ro] bind_address=0.0.0.0 bind_port=6447 destinations=metadata-cache://Cluster01/default?role=SECONDARY routing_strategy=round-robin-with-fallback protocol=classic ``` #### 3. **添加 6450 端口的解决方案** ##### 方法1:Bootstrap 时指定端口 (推荐) ```bash docker run --name mysql-router \ --network mysql-net \ -p 6446:6446 -p 6447:6447 -p 6450:6450 \ -e MYSQL_HOST=mysql-master \ -e MYSQL_USER=mgr_user \ -e MYSQL_PASSWORD='admin' \ -d mysql/mysql-router:8.0.35 \ --bootstrap mgr_user@mysql-master:3306 \ --conf-set-option routing.custom_rw.bind_port=6450 \ --conf-set-option routing.custom_rw.destinations=metadata-cache://Cluster01/default?role=PRIMARY ``` ##### 方法2:手动修改配置文件 创建自定义配置文件 `/use01/docker/mysqlrouter/mysqlrouter.conf`: ```ini [DEFAULT] logging_folder=/var/log/mysqlrouter runtime_folder=/var/run/mysqlrouter [logger] level = INFO [metadata_cache:Cluster01] cluster_type=innodb router_id=1 user=mgr_user metadata_cluster=Cluster01 ttl=5 # 默认端口 [routing:default_rw] bind_address=0.0.0.0 bind_port=6446 destinations=metadata-cache://Cluster01/default?role=PRIMARY routing_strategy=first-available protocol=classic # 自定义6450端口 [routing:custom_rw] bind_address=0.0.0.0 bind_port=6450 destinations=metadata-cache://Cluster01/default?role=PRIMARY routing_strategy=first-available protocol=classic # 只读端口 [routing:default_ro] bind_address=0.0.0.0 bind_port=6447 destinations=metadata-cache://Cluster01/default?role=SECONDARY routing_strategy=round-robin-with-fallback protocol=classic ``` ##### 方法3:使用环境变量扩展配置 ```bash docker run --name mysql-router \ ... -e MYSQL_ROUTER_EXTRA_CONFIG=" [routing:custom_rw] bind_port=6450 destinations=metadata-cache://Cluster01/default?role=PRIMARY " \ -d mysql/mysql-router:8.0.35 ``` #### 4. **验证 6450 端口是否生效** ```bash # 检查容器内监听端口 docker exec mysql-router netstat -tuln | grep 6450 # 测试连接 mysql -h 127.0.0.1 -P 6450 -u app_user -p ``` #### 5. **端口映射原理说明** - **容器内端口**:需要在配置文件中定义(如 `bind_port=6450`) - **宿主机映射**:通过 `-p 6450:6450` 暴露到宿主机 - **路由规则**:`role=PRIMARY` 表示路由到主节点(读写) ### 为什么 6450 不再是默认端口? 1. **标准化**:MySQL 8.0 统一了端口分配策略 2. **协议分离**:明确区分经典协议和X协议端口 3. **安全考虑**:避免与旧版本冲突 4. **集群兼容**:更好地适配 InnoDB Cluster 架构
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值