简介
Cetus是由C语言开发的MySQL的中间件,主要提供了一个全面的数据库访问代理功能。Cetus连接方式与MySQL基本兼容,应用程序几乎不用修改即可通过Cetus访问数据库,实现了数据库层的水平扩展和高可用。
关键特性
- 支持SQL读写分离
- 支持原生MySQL协议,对客户端透明(无感知)
- 支持状态监控
- 支持MGR
- 支持黑白名单
- 支持主从延迟检测(自动切换读到主)
针对我们关心的问题,详细说明
- 统一接入入口,客户端可以像连接mysql一样连接到Cetus
- 屏蔽读写分离,Cetus会解析并判断sql该转发到主库还是从库
- 故障转移
- 主库宕机时
- 当主库地址配置为dns:MHA切换dns指向从库,Cetus发现到主库的连接不通,会重新解析dns,然后连接到新的uri
- 当主库地址配置为ip:通过MHA脚本发送命令
update backends
到Cetus,切换主/从库地址
- 从库宕机时,请求会被转发至另一个已配置的从库地址,当所有从库地址都不可用时,会转发到主库
- Cetus宕机时,通过部署多台Cetus保证高可用
- 主库宕机时
- 可运维性
- 支持管理命令(没有web页面)
- 支持动态修改配置
Cetus不能做哪些事
- 不支持批量sql语句的执行
- 不支持TLS
- 不支持多租户
- 单进程工作模式,建议在docker容器使用
- 只支持linux系统
- 不支持客户端ctl+c操作,即不支持kill query操作
- set命令的有限支持,不支持global级别的set命令,支持部分session级别的set命令
- sql语句的有限支持,包括以下几点:
- 不支持将LAST_INSERT_ID 嵌套在INSERT或者其他的语句中
- 不支持客户端的change user命令
举例一些配置
Cetus 共3个配置文件,包括用户配置文件(users.json)、变量处理配置文件(variables.json)和启动配置文件(proxy.conf)
users.json
用来配置用户登陆信息
{
"users":[
{
"user": "XXXX",
"client_pwd": "XXXXXX",
"server_pwd": "XXXXXX"},
{
"user": "XXXX",
"client_pwd": "XXXXXX",
"server_pwd": "XXXXXX"
}
]
}
- user的值是用户名
- client_pwd的值是前端登录Cetus的密码
- server_pwd的值是Cetus登录后端的密码。
variables.json
用来支持会话级系统变量的设置,可以通过在variables.json配置允许发送的值和静默处理的值
{
"variables": [
{
"name": "sql_mode", # 会话级系统变量的名称
"type": "string-csv", # 变量的类型,可以为string或string-csv逗号分隔的字符串值
"allowed_values": # 指定允许设定的变量值,可以使用通配符*表示此变量设任意值都允许
["STRICT_TRANS_TABLES",
"NO_AUTO_CREATE_USER",
"NO_ENGINE_SUBSTITUTION"
]
},
{
"name": "connect_timeout",
"type": "string",
"allowed_values": ["*"],
"silent_values": ["10", "100"] # silent_values的值是指定静默处理的值,可以使用通配符*
}
]
}
proxy.conf
[cetus]
# Loaded Plugins
plugins=proxy,admin #加载的插件,读写分离插件、管理插件
# Defines the number of worker processes.
worker-processes=4 # 工作进程数量为4
# Proxy Configuration
proxy-address=127.0.0.1:1234 # 客户端访问地址
proxy-backend-addresses=127.0.0.1:3306 # 读写(主库)节点,可配置多个,可配置dns
proxy-read-only-backend-addresses=127.0.0.1:3307 #只读节点,可配置多个,可配置dns
# Admin Configuration 管理模块的配置
admin-address=127.0.0.1:5678
admin-username=admin
admin-password=admin
# Backend Configuration
default-db=test # 默认数据库,当连接未指定db时,使用的默认数据库名称
default-username=dbtest # 默认登陆用户名,在Proxy启动时自动创建连接使用的用户名
# File and Log Configuration
log-file=cetus.log
log-level=debug
读写分离
proxy-address=192.168.222.175:13306
proxy-backend-addresses=192.168.222.172:3306
proxy-read-only-backend-addresses=192.168.222.173:3306,192.168.222.174:3306
网友评论