1.简介
MariaDB MaxScale是一个数据库代理,它将数据库语句转发到一个或多个数据库服务器。
转发的规则有两种 一种是根据sql语句的语义判断 另一种是根据数据库在集群中的角色判断。
MariaDB MaxScale 目的是为了提供读写分离和高可用的功能。
MariaDB MaxScale有灵活的、可扩展的体系结构,通过插件支持不同的协议和路由方法。
参考: https://mariadb.com/kb/en/maxscale-25-tutorials/
2.使用MariaDB Monitor自动进行故障转移
MariaDB Monitor不仅能够监控MariaDB主从集群的状态,还能够执行故障转移和切换 故障转移(以及切换和重新连接)功能仅支持与基于gtid的复制相结合,而且最初仅支持一主多从结构 故障转移,切换和重新加入功能是MariaDB Monitor的固有部分,但是默认情况下未启用自动故障转移和自动重新加入功能。 配置模板:
[server1]
type=server
address=192.168.121.51
port=3306
protocol=MariaDBBackend
[server2]
...
[server3]
...
[server4]
...
[TheMonitor]
type=monitor
module=mariadbmon
servers=server1,server2,server3,server4
...
如果一切正常将显示 maxctrl list servers 如果master因为任何原因宕机,那么集群状态将是这样的: 由于默认情况下没有启用故障转移,故障转移机制必须手动调用:
maxctrl call command mariadbmon failover TheMonitor
MariaDB Monitor现在将自动推断哪个slave最适合提升为master,将其提升为master,并相应地修改其他slave。 如果我们现在检查集群状态,我们将看到一个剩余的从服务器已经变成了主服务器。 如果server1现在恢复 它将不会重新加入集群,如下所示: 如果在监视器monitor配置部分中指定了auto_rejoin=true,则会尝试重新加入server1。
2.1 自动Failover
要启用自动故障转移,只需将auto_failover=true添加到配置文件中的监视器monitor部分。
[TheMonitor]
type=monitor
module=mariadbmon
servers=server1,server2,server3,server4
auto_failover=true
auto_rejoin=true
...
如果正常情况下 server1现在宕机,将自动执行故障转移,并将现有的从服务器提升为新的主服务器。 如果持续监视服务器状态,会注意到server1的状态是Down,而server2的状态仍然是Slave,Running。
2.2 Rejoin
要启用自动重新连接,只需将auto_rejoin=true添加到配置文件中的监视器monitor位置。
[TheMonitor]
type=monitor
module=mariadbmon
servers=server1,server2,server3,server4
auto_rejoin=true
...
当启用了自动重新加入时,如果一个失败的主节点重新出现,MariaDB Monitor将尝试将其作为从节点重新加入。
2.3 Switchover
用于明确希望将主角色从一个服务器移动到另一个服务器的情况 如果我们继续前面例子结尾的集群状态,并想让server1再次成为主服务器,那么我们必须发出以下命令:
maxctrl call command mariadbmon switchover TheMonitor server1 server2
maxctrl -u admin -p mariadb -h 10.10.80.163:8989 call command mariadbmon switchover Monitor_name server1 server2
如果命令成功执行,我们将以以下集群状态结束:
2.4 配置Servers
第一步是定义组成集群的服务器。这些服务器将由Servers使用,并由监视器监视。
[dbserv1]
type=server
address=192.168.2.1
port=3306
protocol=MariaDBBackend
[dbserv2]
type=server
address=192.168.2.2
port=3306
protocol=MariaDBBackend
[dbserv3]
type=server
address=192.168.2.3
port=3306
protocol=MariaDBBackend
在address和port参数告诉所在服务器的位置。 protocol应始终设置为MariaDBBackend。 要为MaxScale-to-MariaDB通信启用加密,请添加ssl=true 到server部分
2.5 配置mariadb监视器
[Replication-Monitor]
type=monitor
module=mariadbmon
servers=dbserv1, dbserv2, dbserv3
user=monitor_user
password=
monitor_interval=2000ms
参数解析: 对象类型 monitor 监视模块 mariadbmon 要监视的服务器列表 dbserv1, dbserv2, dbserv3 连接到服务器时要使用的用户名和密码 monitor_user my_password monitor_interval 监控间隔时间 单位ms
监视用户需要REPLICATION CLIENT特权才能进行基本监视。要创建具有适当授权的用户,请执行以下SQL。
CREATE USER 'monitor_user'@'%' IDENTIFIED BY 'my_password';
GRANT REPLICATION CLIENT on *.* to 'monitor_user'@'%';
如果将使用MariaDB Monitor的自动故障转移,则用户将需要其他授权
GRANT SUPER, RELOAD on *.* to 'monitor_user'@'%';
2.6 使用MariaDB MaxScale的连接路由
本教程的目的是配置一个具有两个可用端口的系统,一个用于写连接,另一个用于读连接。读取连接在从属服务器之间实现负载平衡。
MaxScale检查传入的客户端是否有效。为此,MaxScale需要从后端数据库检索用户身份验证信息。为此,您可以在数据库集群的主服务器上执行以下SQL命令来创建一个特殊的用户帐户。以下教程将使用这些凭据。
CREATE USER 'maxscale'@'%' IDENTIFIED BY '1234567';
GRANT SELECT ON mysql.user TO 'maxscale'@'%';
GRANT SELECT ON mysql.db TO 'maxscale'@'%';
GRANT SELECT ON mysql.tables_priv TO 'maxscale'@'%';
GRANT SELECT ON mysql.columns_priv TO 'maxscale'@'%';
GRANT SELECT ON mysql.proxies_priv TO 'maxscale'@'%';
GRANT SELECT ON mysql.roles_mapping TO 'maxscale'@'%';
GRANT SHOW DATABASES ON *.* TO 'maxscale'@'%';
我们需要客户端应用程序可以连接到的两个服务和端口。一种服务将客户端连接路由到主服务器,另一种负载平衡从服务器之间的负载。为此,我们需要在配置文件中定义两个服务。 在配置文件中创建以下两个部分。部分名称是服务的名称,应该有意义。在本教程中,我们使用名称 Write-Service和Read-Service。
[Write-Service]
type=service
router=readconnroute
router_options=master
servers=dbserv1, dbserv2, dbserv3
user=maxscale
password=maxscale_pw
[Read-Service]
type=service
router=readconnroute
router_options=slave
servers=dbserv1, dbserv2, dbserv3
user=maxscale
password=maxscale_pw
router定义了使用的路由模块。在这里,我们使用readconnroute进行连接级路由 servers名称必须与配置文件中servers部分的名称匹配 router_options参数告诉readconnroute-module它应该将客户端连接路由到哪些服务器。对于写服务,我们使用master类型,对于读服务,我们使用slave类型。
2.7 配置监听器
要允许与服务的网络连接,必须将网络端口与之关联。这是通过在配置文件中创建一个单独的侦听器部分来完成的。一个服务可能有多个侦听器
[Write-Listener]
type=listener
service=Write-Service
protocol=MariaDBClient
port=3306
[Read-Listener]
type=listener
service=Read-Service
protocol=MariaDBClient
port=3307
service参数告诉侦听器连接到哪个服务 对于Write-Listener,我们将其设置为Write-Service,对于Read-Listener,我们将其设置为Read-Service。
可选的address参数定义了侦听器应该绑定到的本地地址。当主机具有多个网络接口时,可能需要这样做。
3.合作模式 (高可用)
参考文档: https://mariadb.com/resources/blog/mariadb-maxscale-2-5-cooperative-monitoring/ https://mariadb.com/kb/en/mariadb-maxscale-25-mariadb-monitor/#cooperative-monitoring
MariaDB MaxScale 2.5合作监视 MariaDB MaxScale是高级数据库代理,防火墙和查询路由器,可为使用MariaDB Server的MariaDB复制部署提供自动故障转移,以实现高可用性。当主服务器发生故障时,MaxScale自动将副本服务器提升为新的主服务器时,就会发生自动故障转移。协作监视是MaxScale 2.5中许多重要的新功能之一。通过协作监视,如果集群中指定的主要MaxScale节点发生故障,MaxScale节点会自动指定一个新的主要MaxScale节点。
与早期版本所需的非标准化解决方案相比,MaxScale 2.5使用协作监视来分配新的主节点而无需干预。协作监视通过使用后端锁来防止创建多个主服务器。启用协作监视后,MaxScale尝试使用该GET_LOCK()功能在后端MariaDB服务器上获取锁 。如果特定的MaxScale实例可以获取大多数服务器上的锁,则将其视为主要的MaxScale实例。
锁由以下公式计算: n_servers / 2 + 1
其中“ n_servers”是服务器的数量,但是可以通过两种不同的方法来计算服务器的数量。 使用配置文件maxscale.cnf参数cooperative_monitoring_locks启用协同监视 默认情况下,cooperative_monitoring_locks设置为“none ”并禁用。它可以在两种模式“启用majority_of_all ”和“ majority_of_running ” 不同的模式下 他们计算服务器的数量n_servers,是不同的
majority_of_all模式下 “ n_servers ”是群集中的服务器总数 甚至需要对[Down]的服务器进行计数 例如,在以下情况下:
4个节点主/副本设置,所需的最小锁定数为4/2 + 1 = 3 8个节点主/副本设置,所需的最小锁定数为8/2 + 1 = 5
这样可以避免脑裂现象,但是,如果太多的MariaDB节点同时发生故障,则MaxScale节点将不会成为主节点 ,因为没有一个节点可以达到所需的最小数量的锁。这种情况下的结果是所有节点都变为“辅助”节点。
在majority_of_running 模式下 锁仍将计算为n_servers / 2 + 1,但“ n_servers ”的计算方式是群集中“正在运行”的节点数,而不是群集中的节点总数。随着服务器故障,“ n_servers ”相应减少,最小锁要求也相应减少
例如,在使用的4节点群集中majority_of_running,最小锁要求的计算将如下所示:
所有4个节点都处于活动状态:4/2 + 1 = 3 1个节点发生故障:3/2 + 1 = 2 2个节点中断:2/2 +1 = 2 3个节点中断:1/2 +1 = 1
这支持更多的节点故障,同时仍然能够处理自动MariaDB故障转移。但是,在多个数据中心的情况下,如果两个数据中心之间的网络丢失 ,majority_of_running可能会导致脑裂的情况,并导致创建多个主数据库。majority_of_running仅适用于群集位于同一数据中心的情况。
当主maxscale关闭时 从maxscale将有如下日志:
GUI页面可以插查看状态 也可以通过 show monitors 命令查看 maxctrl -u admin -p mariadb -h 10.10.80.163:8988 show monitors
4.MariaDB MaxScale GUI入门
参考 https://mariadb.com/resources/blog/getting-started-with-the-mariadb-maxscale-gui/
4.1非https配置 简易测试
配置参数到[maxscale] 可以不添加加密 直接访问 ip:port 默认用户名密码为:admin:mariadb admin_secure_gui=false
修改密码: https://mariadb.com/kb/en/mariadb-maxscale-6-mariadb-maxscale-administration-tutorial/#managing-maxctrl-and-rest-api-users
启动后访问: http://10.10.80.67:8989/ http://10.10.80.39:8989/
4.2 加密配置
有两种表示密码的选项,可以使用纯文本或加密密码。为了使用加密密码,必须生成一组密钥,加密和解密过程将使用这些密钥。要生成密钥,请使用该maxkeys命令
存储在 maxscale.cnf 文件中的密码可以选择加密以增加安全性。这是通过在安装 MariaDB MaxScale 时创建加密密钥来完成的。可以通过使用文件名参数执行 maxkeys 实用程序来手动创建加密密钥以存储密钥。MariaDB MaxScale 存储密钥的默认位置是/var/lib/maxscale。密码使用 256 位 AES CBC 加密进行加密。
maxkeys /var/lib/maxscale/
更改 MariaDB MaxScale 的加密密钥将使存储在 maxscale.cnf 文件中的任何当前加密的密钥失效。
maxpasswd /var/lib/maxscale/ MaxScalePw001
61DD955512C39A4A8BC4BB1E5F116705
maxpasswd 命令的输出是一个十六进制字符串,它应该被插入到 maxscale.cnf 文件中来代替普通的纯文本密码。MariaDB MaxScale 会将其确定为加密密码,并在将其发送到数据库服务器之前自动对其进行解密。
默认情况下,密钥文件将在/var/lib/maxscale. 如果需要不同的目录,它可以作为程序的第一个参数。有关更多信息,请参阅maxkeys --help。 创建密钥后,该maxpasswd命令可用于生成加密密码。 maxpasswd plainpassword 96F99AA1315BDC3604B006F427DD9484 用户名和密码,无论是加密的还是纯文本的,都使用user和password参数存储在SERVICE部分中 如果自定义密钥文件位置 ,请将其作为第一个参数传递给 maxpasswd,并将要加密的密码作为第二个参数传递 示例配置。
[My-Service]
type=service
router=readconnroute
router_options=master
servers=dbserv1, dbserv2, dbserv3
user=maxscale
password=96F99AA1315BDC3604B006F427DD9484
如果密钥文件不在默认位置,则datadir必须将该 参数设置为包含它的目录。
4.3功能展示
4.3.1.可以在线更改部分参数
4.3.2. 查看当前server状态
4.3.3.添加新部件
4.3.4.手动切换主从
把当前master为server2的集群 切换主到server1 TheMonitor 表示监视器的名字 maxctrl call command mariadbmon switchover TheMonitor server1 server2
4.3.5.其他
1.暂停、移除 monitor server 2.修改service变量 3.修改server变量 4.修改monitor变量 5.配置service
4.4 query log查询日志
配置范例:
[MyLogFilter]
type=filter
module=qlafilter
filebase=/tmp/SqlQueryLog
options=ignorecase,case,extended
log_type=unified
log_data=date,user,query,service,session,reply_time,default_db
newline_replacement="LN"
separator=,
flush=true
append=true
[MyService]
type=service
router=readconnroute
servers=server1
user=myuser
password=mypasswd
filters=MyLogFilter
该qlafilter日志可以通过执行 maxctrl rotate logs 这将导致在下一条消息写入文件时重新打开日志文件 常用参数:
filebase
为每个会话创建的输出文件的基本名称。必填
match,exclude和options
这些正则表达式设置会 限制记录哪些查询 查询在到达路由模块的途中到达过滤器时进行匹配。如果 定义了match,则过滤器仅作用于匹配该模式的查询。如果未定义match,则认为所有查询都匹配。 如果定义了exclude,则过滤器仅作用于与该模式不匹配的查询。如果 没有定义exclude,则不排除任何内容。 如果两者都定义了,则查询需要匹配match但不匹配exclude。
match=select.*from.*customer.*where
exclude=^insert
options=case,extended
user和 source
这些可选参数限制会话级别的日志记录。如果user已定义,则仅记录具有匹配客户端用户名的会话。如果 source已定义,则仅记录具有匹配客户端源地址的会话。
user=john
source=127.0.0.1
log_type
要使用的日志文件的类型。默认值为session session 写入特定于会话的文件 unified 对所有会话使用一个文件 stdout 与统一相同,但到标准输出
log_data
要记录在日志文件中的数据类型。 service 服务名称 session 唯一会话 ID date 时间戳 user 客户端的用户名和主机名 reply_time 响应时间 query sql语句 default_db 默认(当前)数据库
flush
每次写入后刷新日志文件。默认值为假
append
将新条目附加到日志文件而不是覆盖它们 默认值为假。
separator
默认值为“,”(逗号)。定义日志条目元素之间的分隔符字符串。该值应括在引号中。
newline_replacement
默认值为“”(一个空格)。SQL 查询可能包括换行符,如果直接打印到日志中,可能会中断自动解析。此参数定义应在换行序列(\r、\n 或 \r\n)位置写入的内容。如果将其设置为空字符串,则不会替换换行符并按原样打印到输出。该值应括在引号中。
newline_replacement="NL"
5.查询脱敏 Masking
参考 https://mariadb.com/resources/blog/sensitive-data-masking-with-mariadb-maxscale/
过滤器仅可以被用于掩蔽以下类型的列:BINARY,VARBINARY,CHAR,VARCHAR,BLOB,TINYBLOB, MEDIUMBLOB,LONGBLOB,TEXT,TINYTEXT,MEDIUMTEXT,LONGTEXT, ENUM和SET。如果列的类型是其他类型,则不会执行屏蔽。
Masking过滤器与以下类型的配置设置一起使用。
[Mask-SSN]
type=filter
module=masking
rules=...
[SomeService]
type=service
...
filters=Mask-SSN
5.1 配置
5.1.1 rules
指定存储屏蔽规则的文件的路径。相对路径是相对于 MariaDB MaxScale的模块配置目录进行解释的。默认模块配置目录是 /etc/maxscale.modules.d
rules=/data/maxscale/rule/test.json
5.1.2 warn_type_mismatch
使用此可选参数,可以指示屏蔽过滤器在屏蔽规则与不属于允许类型之一的列匹配时记录警告。
可以使用的值为neverand always,never是默认值。
5.1.3 large_payload
此可选参数指定掩码过滤器应如何处理大于 的16MB负载 可以使用的值为ignore,这意味着此类有效负载中的列不会被屏蔽,以及abort,这意味着如果遇到此类有效负载,则关闭客户端连接。默认值为abort.
5.1.4 prevent_function_usage
此可选参数指定如果应屏蔽的列与某些函数结合使用时屏蔽过滤器的行为方式。 如果值prevent_function_usage是true,那么这会包含有关蒙面列函数的所有语句将被拒绝。由于这意味着使用潜在无害函数(例如 )的查询也会LENGTH(masked_column)被拒绝,因此可以关闭此功能。
prevent_function_usage=false
5.1.5 require_fully_parsed
如果为 true,则无法完全解析(由于解析器限制)的语句将被阻止 默认值为true。
5.1.6 treat_string_arg_as_field
此可选参数指定屏蔽过滤器应如何处理用作函数参数的字符串。如果为 true,它们将作为字段处理,这将导致字段被屏蔽,默认值为true。
5.1.7 check_user_variables
此可选参数指定屏蔽过滤器在用户变量方面的行为方式。如果为true,则像这样的语句 set @a = (select ssn from customer where id = 1); 如果ssn是应屏蔽的列,则将被拒绝。 默认值为true。
5.1.8 check_unions
此可选参数指定屏蔽过滤器相对于 UNION 的行为方式。如果为真,则像这样的语句 SELECT a FROM t1 UNION select b from t2; 如果b是应屏蔽的列,则将被拒绝。 默认值为true。
5.1.9 check_subqueries
此可选参数指定屏蔽过滤器在子查询方面的行为方式。如果为真,则像这样的语句 SELECT * FROM (SELECT a as b FROM t1) as t2; 如果a是应屏蔽的列,则将被拒绝。 默认值为true。
5.2 规则
屏蔽规则表示为 JSON 对象。 顶级对象应包含一个键,rules其值为规则对象数组 规则阵列中的每个规则是JSON对象,预期含有键replace,with,applies_to和 exempted。前两个是必须的,后两个是可选的。
{
"rules": [
{
"replace": { ... },
"with": { ... },
"applies_to": [ ... ],
"exempted": [ ... ]
}
]
}
5.2.1 replace
此键的值是一个对象,用于指定应屏蔽其值的列。该对象必须包 column并且可以包含 table和database。这些键的值必须是字符串。
{
"rules": [
{
"replace": {
"database": "db1",
"table": "person",
"column": "ssn"
},
"with": { ... },
"applies_to": [ ... ],
"exempted": [ ... ]
}
]
}
可选键match可以部分替换原始值:只有匹配的部分会被填充字符替换。
"replace": {
"column": "ssn",
"match": "(123)"
},
"with": {
"fill": "X#"
}
5.2.2 obfuscate
允许通过混淆算法对值进行混淆。不可逆 虽然原则上不可能从混淆后的值中获得原始值,但如果可能的原始值范围有限,则可以通过混淆算法运行所有可能的值来直接找出可能的原始值,并且然后比较结果。
"obfuscate": {
"column": "name"
}
如:SELECT name from db1.tbl1;`
+------+
| name |
+------+
| $-~) |
+------+
5.2.3 with
此键的值是一个对象,用于指定应为replace规则替换匹配列的值。 该对象应包含 key value或 key fill 如果指定value,则其值用于逐字替换实际值,并且指定值的长度必须与实际返回值(来自服务器)完全匹配。如果长度不匹配,fill则使用的值 来屏蔽实际值。
{
"rules": [
{
"replace": {
"column": "ssn"
},
"with": {
"value": "XXX-XX-XXXX"
},
"applies_to": [ ... ],
"exempted": [ ... ]
},
{
"replace": {
"column": "age"
},
"with": {
"fill": "*"
},
"applies_to": [ ... ],
"exempted": [ ... ]
},
{
"replace": {
"column": "creditcard"
},
"with": {
"value": "1234123412341234",
"fill": "0"
},
"applies_to": [ ... ],
"exempted": [ ... ]
},
]
}
5.2.3 applies_to
使用这个可选的键,它的值必须是一个字符串数组,它可以指定规则应用于哪些用户。每个字符串都应该是一个 MariaDB 账户字符串 ,%是一个通配符。
如果未指定此key,则对所有用户执行屏蔽 除了exempted中的用户
{
"rules": [
{
"replace": { ... },
"with": { ... },
"applies_to": [ "'alice'@'host'", "'bob'@'%'" ],
"exempted": [ ... ]
}
]
}
5.2.4 exempted
使用这个可选的键,它的值必须是一个字符串数组,它可以指定规则不应用于哪些用户。每个字符串都应该是一个 MariaDB 账户字符串, %是一个通配符。
{
"rules": [
{
"replace": { ... },
"with": { ... },
"applies_to": [ ... ],
"exempted": [ "'admin'" ]
}
]
}
6.MaxScale 2.5更新日志
1.MaxAdmin已被删除。 2.介绍了一个新的基于浏览器的工具MaxGUI,用于配置和管理MaxScale。 3.MaxInfo-router和相关的httpd-protocol已被移除。 4.服务器权重已被移除。 服务现在可以在目标参数的帮助下直接路由到其他服务。 服务器参数protocol和authenticator已弃用。任何定义都会被忽略。 Listeners 支持多个身份验证器。 从服务器的复制延迟现在必须小于max_slave_replication_lag,而在旧版本中,复制延迟必须小于或等于配置的限制。 已弃用全局设置auth_read_timeout和auth_write_timeout。任何定义都会被忽略。 除了Columnstore监视器1.0和1.2之外,Columnstore监视器现在还能够监视Columnstore 1.5。 MariaDB-Monitor支持协作监控。 MaxScale缓存现在可以在两个MaxScale实例之间共享,在这种情况下,memcached或Redis都可以用作缓存存储。此外,缓存现在还可以执行表级失效,并且特定于特定用户。 一个全新的binlog路由器实现。 新的 routers, mirror 和kafkacdc. Service-to-service路由现在可以使用targets参数。 TLS CRL和对端主机验证支持。 causal_reads的多种操作模式。
7.MariaDB MaxScale安装
从MariaDB下载页面下载MaxScale软件包: https://mariadb.com/downloads/#mariadb_platform-mariadb_maxscale 下载: wget https://dlm.mariadb.com/1611664/MaxScale/2.5.11/yum/centos/7/x86_64/maxscale-2.5.11-1.rhel.7.x86_64.rpm 安装: yum -y install maxscale-2.5.11-1.rhel.7.x86_64.rpm 编辑配置文件 - 启动 sudo -u maxscale maxscale -f /data/maxscale/maxscale1.cnf
----二进制包安装-------- mkdir /data/maxscale/ cd /data/maxscale/ wget maxscale-6.2.1.rhel.7.tar.gz 获取包 groupadd maxscale useradd -g maxscale maxscale tar -xzvf maxscale-6.2.1.rhel.7.tar.gz mv maxscale-6.2.1.rhel.7 maxscale
cd maxscale sudo chown -R maxscale var
mkdir /data/maxscale/log/ mkdir /data/maxscale/data/ mkdir /var/lib/maxscale mkdir /var/cache/maxscale
chown maxscale /data/maxscale/log/ chown maxscale /data/maxscale/data/ chown maxscale /var/lib/maxscale chown maxscale /var/cache/maxscale
监视器的用户:
CREATE USER 'monitor_user'@'%' IDENTIFIED BY 'my_password';
GRANT REPLICATION CLIENT,SUPER, RELOAD on *.* to 'monitor_user'@'%';
配置服务用
CREATE USER 'maxscale'@'%' IDENTIFIED BY 'maxscale_pw';
GRANT SELECT,SHOW DATABASES ON *.* TO 'maxscale'@'%';
环境变量配置 vim /etc/profile.d/maxscale.sh
PATH=$PATH:/data/maxscale/maxscale/bin
export PATH
刷新环境变量配置 source /etc/profile
使用systemd管理maxscale vim /usr/lib/systemd/system/maxscaled.service
[Unit]
Description=maxscale Server
After=network.target
After=syslog.target
[Service]
User=maxscale
Group=maxscale
PIDFile=/data/maxscale/maxscale.pid
ExecStart=/data/maxscale/maxscale/bin/maxscale -f /data/maxscale/maxscale.cnf --basedir=/data/maxscale/maxscale
Restart=on-failure
RestartPreventExitStatus=1
TimeoutSec=0
PrivateTmp=false
LimitNOFILE=50000
[Install]
WantedBy=multi-user.target
刷新生效 systemctl daemon-reload
7.1 数据库账户授权:
CREATE USER ‘maxscale’@‘%’ IDENTIFIED BY ‘1234567’; GRANT SHOW DATABASES ON . TO ‘maxscale’@‘%’; GRANT SELECT ON mysql.* TO ‘maxscale’@‘%’;
CREATE USER ‘monitoruser’@‘%’ IDENTIFIED BY ‘123456’; GRANT REPLICATION CLIENT on . to ‘monitoruser’@‘%’; GRANT REPLICATION slave on . to ‘monitoruser’@‘%’; GRANT SUPER,RELOAD,SELECT on . to ‘monitoruser’@‘%’;
8.MariaDB MaxScale配置
文档:https://mariadb.com/kb/en/mariadb-maxscale-6-mariadb-maxscale-configuration-guide/ 默认情况下将在/etc/maxscale.cnf 文件中读取MariaDB MaxScale配置 或者在启动时通过参数–configdir=PATH或 -f (如 maxscale -f /data/maxscale/maxscale1.cnf ) 指定配置文件 不在第一行上的参数值必须在它们之前至少有一个空格字符,以便将它们识别为多行参数的一部分。 注释通过在行前面加一个 # 来定义。不支持尾随注释。
size定义: max_size=1000000000000 max_size=1000000000k max_size=1000000M max_size=1000G max_size=1T
8.0 配置模板:
[maxscale]
threads=auto
admin_host=10.10.80.60
admin_port=6610
admin_secure_gui=false
logdir=/data/maxscale/log/
datadir=/data/maxscale/data/
piddir=/data/maxscale/
module_configdir=/data/maxscale/maxscale/etc/
libdir=/data/maxscale/maxscale/lib64/maxscale/
sharedir=/data/maxscale/maxscale/share/maxscale
persistdir=/var/lib/maxscale/maxscale.cnf.d/
[server1]
type=server
address=10.10.80.33
port=6000
protocol=MariaDBBackend
[server2]
type=server
address=10.10.80.60
port=6000
protocol=MariaDBBackend
[server3]
type=server
address=10.10.80.55
port=6000
protocol=MariaDBBackend
[MariaDB-Monitor]
type=monitor
module=mariadbmon
servers=server1,server2,server3
servers_no_promotion=server3
user=monitoruser
password=123456
monitor_interval=2000
backend_connect_timeout=3s
failcount=5
enforce_read_only_slaves=1
cooperative_monitoring_locks=majority_of_running
auto_failover=true
auto_rejoin=true
replication_user=user
replication_password=password
[Mask-SSN]
type=filter
module=masking
rules=/data/maxscale/masking
[Read-Write-Service]
type=service
router=readwritesplit
servers=server1,server2,server3
user=maxscale
password=1234567
[Read-Service]
type=service
filters=Mask-SSN
router=readconnroute
router_options=slave
servers=server2,server1
user=maxscale
password=1234567
[Read-Write-Listener]
type=listener
service=Read-Write-Service
protocol=MariaDBClient
port=4006
[Read-Listener]
type=listener
service=Read-Service
protocol=MariaDBClient
port=4007
8.1 全局设置
8.1.1 threads
此参数控制正在处理来自内核的事件的辅助线程的数量。默认为1个线程。将工作线程数量增加到处理器内核数量以上并不会提高性能,反而可能会降低性能 设置为auto时 MariaDB MaxScale将检测可用处理器的数量并将线程数量设置为等于该数量。仅应将其用于专用于运行MariaDB MaxScale的系统
8.1.2 auth_connect_timeout
持续时间,默认10 s。这个设置定义了当尝试从后端服务器获取MariaDB/MySQL/Clustrix用户时的连接超时的时间。同样也用于读写超时时间。增加这个值将导致MaxScale在用户获取失败之前等待服务器响应的时间更长。然后可能会尝试其他服务器。 该值以持续时间的形式给出。如果没有提供显式的单位,则该值被解释为秒。
8.1.3 query_retries
当内部请求中断时重试的次数,默认情况下重试一次查询; 仅用于检索身份验证数据和监视服务器。
8.1.4 query_retry_timeout
任何重试查询的总超时时间(以秒为单位)。默认值为5秒
8.1.5 passive
控制MaxScale是否为多个MaxScale实例集群中的被动节点。缺省值为false。 此参数用于多个MaxScale实例,这些实例使用故障转移功能以某种形式操作集群。被动节点只观察被监视的集群,不采取直接行动。 启用被动模式时,禁用以下功能: 1.mariadbmon模块中的自动故障转移 2.在mariadbmon模块中自动重新加入 3.启动监控脚本
8.1.6 ms_timestamp
在日志文件中启用或禁用高精度时间戳。启用此功能可以为所有日志文件时间戳增加毫秒精度。
#有效选项为:
#ms_timestamp = <0 | 1>
ms_timestamp = 1
log_warning(默认启用)、log_info(默认禁用)、log_debug(默认禁用) 记录该级别的日志
8.1.7 log_throttling
如果错误原因持续存在,则可能会一遍又一遍地记录特定的错误(或警告)。为了防止日志泛滥,可以在一段时间内抑制某个错误的记录 log_throttling=8, 2s, 15000ms 如果在2秒内已记录8次相同的错误,则此错误的记录将在接下来的15秒钟内被抑制。 默认值为10, 1000ms, 10000ms
要禁用日志限制,请添加具有空值的条目 log_throttling = 或任何一个为0的整数 log_throttling = 0,0,0
8.1.8 logdir
设置日志文件的存储目录。运行MariaDB MaxScale的用户必须可读写该文件夹。 默认值为/var/log/maxscale/
8.1.9 datadir
设置MariaDB MaxScale使用的数据文件的存储目录。模块可以写入此目录,例如binlogrouter将此文件夹用作存储二进制日志的默认位置。 默认值为/var/lib/maxscale/
8.1.10 libdir
设置MariaDB MaxScale在其中查找模块的目录。库目录是MariaDB MaxScale搜索模块时使用的唯一目录。如果您具有用于MariaDB MaxScale的自定义模块,请确保将其放在此文件夹中。 默认值取决于操作系统。对于RHEL版本,该值为/usr/lib64/maxscale/。对于Debian和Ubuntu /usr/lib/x86_64-linux-gnu/maxscale/
8.1.11 cachedir
配置MariaDB MaxScale用于存储缓存数据的目录。 默认值为/var/cache/maxscale/。
8.1.12 piddir
为MariaDB MaxScale的PID文件配置目录。该文件包含正在运行的MariaDB MaxScale进程的进程ID。 默认值为/var/run/maxscale/。
8.1.13 execdir
配置可执行文件所在的目录。启动的所有内部进程将使用此目录查找可执行文件。 默认值为/usr/bin/。
8.1.1X persistdir
配置存储持久化配置的目录。当通过 MaxCtrl 创建新对象时,它将存储在此目录中。(通过web页面创建的配置也会记录于此) 默认值为/var/lib/maxscale/maxscale.cnf.d/。
8.1.14 query_classifier_cache_size
指定查询分类器缓存的最大大小。从MaxScale 2.3.7开始,默认限制为系统总内存的15%。在旧版本中,默认限制是系统总内存的40% #1MB查询分类器缓存 query_classifier_cache_size = 1MB MaxScale为每个工作线程使用一个单独的缓存。要获取每个线程可用的内存量,请将高速缓存大小除以的值threads 使用maxctrl show threads它可以检查高速缓存的实际大小,并查看性能统计信息。 QC cache evictions 必须从高速缓存中删除高速缓存条目多少次,以便为另一个提供空间 如果语句从高速缓存中逐出(在诊断输出中可见),请考虑增加高速缓存的大小。
8.1.15 query_classifier_args
查询分类器的参数。 query_classifier = qc_sqlite query_classifier_args = log_unrecognized_statements = 1 这将记录所有无法完全解析的语句。如果您怀疑MariaDB MaxScale将语句路由到错误的服务器
8.1.16 sql_mode
指定查询分类器解析器最初应使用MariaDB 还是PL / SQL类型的SQL 可选值 default(默认) oracle
8.1.17 local_address
连接到服务器时要使用的特定本地地址/ 这可用于确保 MaxScale 在连接到服务器时使用特定接口,以防运行 MaxScale 的计算机具有多个接口
local_address = 192.168.1.254
8.1.18 users_refresh_time
MaxScale最多几秒钟(最多几秒钟)可以从后端服务器刷新用户 MaxScale将在启动时从后端服务器加载用户,但是如果用户的身份验证失败,则MaxScale认为这是因为已创建了新用户,因此将刷新用户。默认情况下,MaxScale最多每30秒执行一次此操作
8.1.19 users_refresh_interval
MaxScale在几秒钟内自动从后端服务器刷新用户的频率 此配置用于定期刷新后端用户,以确保它们是最新的。此设置的默认值为0,这意味着不会定期刷新用户。但是,如果身份验证失败,仍然可以刷新它们,具体取决于users_refresh_time
users_refresh_time=120s
users_refresh_interval=2h
8.1.20 writeq_high_water
网络写缓冲区的高水位线。当单个连接的MaxScale中的出站网络缓冲区的大小超过此值时,将开始限制该连接的网络流量。该参数接受 大小类型值。默认值为16777216字节。 更具体地说,如果客户端写队列高于此值,它将阻止来自后端服务器的流量。如果后端写队列高于此值,它将阻止来自客户端的流量。 writeq_low_water 网络写缓冲区的低水位线。 默认值为8192字节
网络限制当两个writeq_high_water和 writeq_low_water具有非零值时才启动。要禁用限制,请将值都设置为0。
8.1.21 load_persisted_configs
在启动时加载运行时配置的更改。此参数接受布尔值,默认启用。该参数在MaxScale 2.3.6中增加。
所有运行时配置更改都持久化在生成的配置文件中,缺省情况下位于/var/lib/maxscale/maxscale.cnf.d/中,并在读取主配置文件后启动时加载。
8.1.22 max_auth_errors_until_block
认证失败的最大次数 超过之后将阻塞该host 默认值为10 当主机被阻塞后,来自该主机的连接将被拒绝60秒。要禁用此功能,请将该值设置为0。
8.1.23 debug
–debug 调试选项仅用于测试目的,不用于生产中。
8.2 REST API配置
MaxScale REST API是一个HTTP接口,提供旨在由监视应用程序和可视化工具使用的JSON格式数据。 必须在配置文件中的[maxscale]部分下定义以下选项。
admin_host REST API侦听的网络接口。默认值为127.0.0.1仅侦听本地连接的IPv4地址。 admin_port REST API侦听的端口。默认值为端口8989。 admin_auth 使用HTTP基本访问身份验证启用REST API身份验证。如果没有HTTPS,这不是一种安全的身份验证方法,但确实会增加一小层安全性。默认情况下启用此选项。
admin_ssl_key 管理界面的 PEM 格式的 TLS 私钥的路径。 admin_ssl_cert PEM 格式的 TLS 公共证书的路径 如果admin_ssl_key和admin_ssl_cert选项都已定义,管理界面将使用加密的 HTTPS 而不是普通的 HTTP。
admin_ssl_ca_cert PEM 格式的 TLS CA 证书的路径 admin_ssl_version 控制使用 REST API 所需的最低 TLS 版本。 默认值为 MAX,它协商客户端和服务器都支持的最高加密级别
admin_enabled 启用或禁用管理界面。这样可以完全禁用管理界面,以防止对其进行访问。 admin_gui 启用或禁用管理员图形用户界面。此参数为布尔值,默认情况下启用。 admin_log_auth_failures 记录管理界面的身份验证失败。此参数需要一个布尔值并默认启用
8.3 Service配置
代表MariaDB MaxScale提供给客户端的数据库服务。通常,服务由一组后端数据库服务器和一个路由算法组成,该算法确定MariaDB MaxScale如何决定发送语句或将连接路由到那些后端服务器。 service 可以被视为MariaDB MaxScale提供给其客户端的虚拟数据库服务器。
[Test-Service]
type=service
8.3.1 router
服务的router参数定义路由器模块的名称,该模块将用于实现MariaDB MaxScale客户端与后端数据库之间的路由算法 控制路由选择的两个参数是router和router_options。
router=readconnroute
router_options=slave
router=readconnroute
router_options=master,slave
8.3.2 filters
过滤器选项允许为服务定义一组过滤器。来自客户端的请求将通过这些过滤器传递,然后再发送到路由器以分派到后端服务器 根据配置文件的过滤器定义部分中的定义,filters参数采用一个或多个过滤器名称。多个过滤器使用 | 分隔 请求按照配置参数中定义的顺序从左到右通过过滤器。
filters=counter | QLA
targets 该targets参数是服务器和/或服务名称的逗号分隔列表,其中包含服务的路由目标
targets=My-Service,server2
8.3.3 targets
targets参数是一个逗号分隔的服务器和/或服务名称列表,这些名称组成了服务的路由目标。这个参数是在MaxScale 2.5.0中添加的。 此参数允许定义嵌套服务配置,而不必为所有服务配置侦听器。
targets=My-Service,server2
注意:“targets”参数与“cluster”和“servers”参数互斥。
8.3.4 server
服务定义中的servers参数提供了组成服务的后端服务器的逗号分隔列表。
servers=server1,server2,server3
8.3.5 cluster
由service使用的server由为此配置参数值的监视器定义指定。
cluster=TheMonitor
8.3.6 user & password
此设置定义了服务用于从后端获取用户帐户信息的凭据。密码可以是明文密码,也可以是加密密码。
user=maxscale
password=Mhu87p2D
8.3.7 enable_root_user
这个参数控制根用户连接到MariaDB MaxScale的能力,从而通过MariaDB MaxScale连接到后端服务器。 默认值为0,表示禁止root用户连接MariaDB MaxScale。
enable_root_user=1
也可以使用 on或true来表示 如:
enable_root_user=true
8.3.8 auth_all_servers
此参数控制从后端服务器加载用户时是只使用单个服务器还是使用所有服务器。它接受一个布尔值,当启用时,将在所有服务器上创建所有用户的联合和授权。
auth_all_servers=true
8.3.9 strip_db_esc
此设置控制从后端服务器加载用户授权时是否从数据库名称中删除转义字符 ( \ )。该设置采用布尔值,默认情况下处于启用状态。启用后,诸如这样的授权 grant select on test\_ .* to ‘user’@‘%’; 将被读作: grant select on test_ .* to ‘user’@‘%’;
8.3.10 log_auth_warnings
启用或禁用身份验证失败和警告的日志记录。此参数采用布尔值。 MariaDB MaxScale 通常会禁止有关身份验证失败的警告消息。启用此选项会将这些消息记录到消息日志中,其中包含有关尝试连接到 MariaDB MaxScale 的人员以及从何处连接的详细信息。
8.3.11 connection_timeout
connection_timeout 参数用于断开连接到空闲时间过长的 MariaDB MaxScale 的会话。默认情况下禁用会话超时。 要启用它们,请在服务的配置部分中以秒为单位定义超时。零值被解释为没有超时,就像未定义参数一样。
[Test-Service]
connection_timeout=300s
8.3.12 max_connections
MaxScale 应允许此服务的最大同时连接数。如果参数为零或省略,则没有限制。任何在达到限制后建立更多连接的尝试都将导致返回“Too many connections”错误。
[Test-Service]
max_connections=100
8.3.13 connection_keepalive
通过向后端服务器发送ping使空闲连接保持活跃。 缺省值是300秒。要禁用此功能,请将该值设置为0
8.3.14 net_write_timeout
此参数控制对客户机的网络写入可以保持多长时间的缓冲。该功能默认禁用。
8.4 Server配置
server部分定义了MaxScale使用的后端数据库服务器。服务器由配置文件中的组名标识。server的唯一必选参数是type,但是address 和port 通常也被定义。一个服务器可以是一个或多个services的成员。一个服务器最多只能被一个监视器监视。
[MyMariaDBServer1]
type=server
address=127.0.0.1
port=3000
8.4.1 address
运行数据库服务器的机器的 IP 地址或主机名 MaxScale 使用此地址连接到服务器
8.4.2 port
运行数据库的端口 MaxScale 使用此端口连接到服务器 默认值为 3306
8.4.3 socket
MariaDB 服务器正在侦听的 UNIX 域套接字的绝对路径
8.4.4 monitoruser 和 monitorpw
这些设置定义了用于监视特定于服务器的server的的用户名和密码。Monitors通常使用自己配置部分中的凭据连接到所有server。
monitoruser=mymonitoruser
monitorpw=mymonitorpasswd
8.4.5 extra_port
用于监视服务器的备用端口。这允许MaxScale在到达后端服务器上的max_connections时仍然进行连接。如果定义了此参数,并且连接到正常端口失败,则使用另一个端口。
8.4.6 proxy_protocol
MaxScale 2.2 和 MariaDB 10.3 中引入了代理协议。
如果proxy_protocol设置为on, MaxScale将在连接客户端会话到服务器时发送一个PROXY协议头。头包含原始的客户端IP地址和端口,正如MaxScale所看到的。然后服务器将读取报头并执行身份验证,就好像连接来自这个地址而不是MaxScale的IP地址一样。有了这个特性,后端服务器上的用户帐户可以简化为只包含实际的客户机主机,而不包含MaxScale主机。
参考连接: https://www.chriscalender.com/viewing-the-originating-host-or-ip-address-with-maxscales-proxy-protocol/
1.配置mariadb 参数 proxy_protocol_networks(mariadb10.3.x支持) 可以动态设置: set global proxy_protocol_networks=‘::1,10.10.0.0/16,localhost’; 2. 在MaxScale 配置文件 maxscale.cnf中设置
[server]
proxy_protocol=true
效果: 版本要求
MariaDB 10.3将支持代理协议
mariadb10.2.12版本无参数:
8.4.7 rank
此参数控制使用服务器的顺序。取值为primary和secondary。默认为primary。 这种行为取决于路由器的实现,但一般经验法则是主服务器将先于辅助服务器使用 Readconnroute将始终在次要服务器之前使用主服务器,只要它们与配置的服务器类型匹配。 readwritessplit将选择与当前主服务器具有相同级别的服务器
8.5 Monitor配置
监控用户必须具有以下权限
CREATE USER 'maxscale'@'maxscalehost' IDENTIFIED BY 'maxscale-password';
GRANT REPLICATION CLIENT ON *.* TO 'maxscale'@'maxscalehost';
如果监视器需要查询服务器磁盘空间 (即设置disk_space_threshold)需要 FILE-grant
GRANT FILE ON *.* TO 'maxscale'@'maxscalehost';
如果使用集群操作 ,则需要以下额外授权:
GRANT SUPER, RELOAD, PROCESS, SHOW DATABASES, EVENT ON *.* TO 'maxscale'@'maxscalehost';
GRANT SELECT ON mysql.user TO 'maxscale'@'maxscalehost';
如果使用replication_user和replication_password,则必须向其定义的用户授予以下授权:
CREATE USER 'replication'@'replicationhost' IDENTIFIED BY 'replication-password';
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'replicationhost';
MariaDB 10.5.8 和更新版本需要一组不同的授权:
CREATE USER 'replication'@'replicationhost' IDENTIFIED BY 'replication-password';
GRANT REPLICATION SLAVE, SLAVE MONITOR ON *.* TO 'replication'@'replicationhost';
在任何给定时间,只有一个后端可以是MASTER。master必须状态是running(监视器成功连接到它),并且它的read_only设置必须为off。
如果出现以下情况,现有主服务器将变为无效: 1.它是不可写的(read_only处于开启状态)。 2.它已经关闭了超过失败计数监视器通过并且没有正在运行的从属。在关闭的中继计数后面运行从属设备。 3.它以前没有从集群中的另一台服务器复制,但现在正在复制。 4.它以前是多主控组的一部分,但不再是多主控组的一部分,或者多主控组正在从不在该组中的服务器进行复制。
监视器的最低配置需要一组用于监视的服务器以及连接到这些服务器的用户名和密码。
[MyMonitor]
type=monitor
module=mariadbmon
servers=server1,server2,server3
user=myuser
password=mypwd
8.5.1常用监控参数
user
监视器用于连接到后端服务器的用户名。
password
使用user参数定义的用户的密码
monitor_interval
定义监视器更新服务器状态的频率。默认值为 2 秒。如果应该更频繁地查询服务器,请选择较低的值。可能的最小值为 100 毫秒
monitor_interval=2500ms
backend_connect_timeout
此参数控制连接到受监控服务器的超时时间 最小值为 1 秒,默认值为 3 秒。
backend_connect_timeout=3s
backend_write_timeout
此参数控制写入受监控服务器的超时时间
backend_read_timeout
此参数控制从受监控服务器读取的超时时间
backend_connect_attempts
此参数定义了每个监控循环尝试后端连接的最大次数。默认值为 1。 每次尝试最多可能需要 backend_connect_timeout几秒钟才能执行。如果所有尝试均未成功,则认为后端无法访问且已关闭。
backend_connect_attempts=1
disk_space_threshold
此参数复制disk_space_threshold 服务器参数 与磁盘监控相关
disk_space_check_interval
使用此参数可以指定磁盘空间检查之间的最短时间 默认值为 0,表示默认情况下不会检查磁盘空间。
disk_space_check_interval=10000ms
script
此命令将在服务器状态更改时执行。参数应该是命令的绝对路径,或者命令应该在可执行路径中。运行 MaxScale 的用户应该对文件本身及其所在的目录具有执行权限。脚本可能具有占位符,MaxScale 将在启动脚本时用有用信息替换这些占位符。
占位符及其替换结果是:
$INITIATOR -> 发起事件的服务器的 IP 和端口
$EVENT -> 事件描述,例如“server_up”
$LIST -> 所有服务器的 IP 和端口列表
$NODELIST -> 所有正在运行的服务器的 IP 和端口列表
$SLAVELIST -> 所有从服务器的 IP 和端口列表
$MASTERLIST -> 所有主服务器的 IP 和端口列表
$SYNCEDLIST -> 所有同步 Galera 节点的 IP 和端口列表
$PARENT-> 发起事件的服务器的父服务器的 IP 和端口。对于主从设置,如果启动服务器是从服务器,这将是主服务器。
$CHILDREN-> 发起事件的服务器的子节点的 IP 和端口列表。对于主从设置,如果启动服务器是主服务器,这将是从服务器列表。
script_timeout
已执行脚本的超时时间 默认90s
events
导致脚本执行的事件名称列表。如果未定义此选项,则所有事件都会导致执行脚本。该列表必须包含一个逗号分隔的事件名称列表。
events=master_down,slave_down
事件名称 描述 master_down 主服务器出现故障 master_up 主服务器出现了 slave_down 从属服务器宕机 slave_up 从服务器出现了 server_down 没有分配角色的服务器出现故障 server_up 一个没有分配角色的服务器出现了 lost_master 服务器失去了 Master 状态 lost_slave 一个服务器丢失了 Slave 状态 new_master 检测到新的 Master new_slave 检测到新的 Slave
journal_max_age
最大日志文件年龄 默认值为 28800 秒。 当监视器启动时,它会读取任何存储的日志文件。如果日志文件早于journal_max_age的值,它将被删除
脚本示例
下面是一个示例监视器配置,它使用所有支持的替换启动一个脚本。示例脚本读取结果并将其打印到文件并作为电子邮件发送。
[MyMonitor]
type=monitor
module=mariadbmon
servers=C1N1,C1N2,C1N3
user=maxscale
password=password
monitor_interval=10000
script=/path/to/maxscale_monitor_alert_script.sh --initiator=$INITIATOR --parent=$PARENT --children =$CHILDREN --event=$EVENT --node_list=$NODELIST --list=$LIST --master_list=$MASTERLIST --slave_list=$SLAVELIST --synced_list=$SYNCEDLIST
maxscale_monitor_alert_script.sh:
#!/usr/bin/env bash
initiator=""
parent=""
children=""
event=""
node_list=""
list=""
master_list=""
slave_list=""
synced_list=""
process_arguments()
{
while [ "$1" != "" ]; do
if [[ "$1" =~ ^--initiator=.* ]]; then
initiator=${1#'--initiator='}
elif [[ "$1" =~ ^--parent.* ]]; then
parent=${1#'--parent='}
elif [[ "$1" =~ ^--children.* ]]; then
children=${1#'--children='}
elif [[ "$1" =~ ^--event.* ]]; then
event=${1#'--event='}
elif [[ "$1" =~ ^--node_list.* ]]; then
node_list=${1#'--node_list='}
elif [[ "$1" =~ ^--list.* ]]; then
list=${1#'--list='}
elif [[ "$1" =~ ^--master_list.* ]]; then
master_list=${1#'--master_list='}
elif [[ "$1" =~ ^--slave_list.* ]]; then
slave_list=${1#'--slave_list='}
elif [[ "$1" =~ ^--synced_list.* ]]; then
synced_list=${1#'--synced_list='}
fi
shift
done
}
process_arguments $@
read -r -d '' MESSAGE << EOM
A server has changed state. The following information was provided:
Initiator: $initiator
Parent: $parent
Children: $children
Event: $event
Node list: $node_list
List: $list
Master list: $master_list
Slave list: $slave_list
Synced list: $synced_list
EOM
echo "$MESSAGE" > /path/to/script_output.txt
echo "$MESSAGE" | mail -s "MaxScale received $event event for initiator $initiator." mariadb_admin@domain.com
脚本及sql文件写入测试 3m3s集群 先把所有的test库(test库不进行主从复制)创建测试表 create table test.maxscale_test (note1 varchar(100)); 当前集群状态: maxscale 配置文件添加:
[MyMonitor]
script=/tmp/maxscale_monitor_alert_script.sh --initiator=$INITIATOR --parent=$PARENT --children =$CHILDREN --event=$EVENT --node_list=$NODELIST --list=$LIST --master_list=$MASTERLIST --slave_list=$SLAVELIST --synced_list=$SYNCEDLIST
events=master_down
promotion_sql_file=/tmp/promotion.sql
demotion_sql_file=/tmp/demotion.sql
准备对test库进行写入 给monitor使用的用户赋权: grant all on test.* to monitor_user@‘%’ 创建相关文件 如果找不到sql文件或sh脚本 maxscale启动报错 vim /tmp/maxscale_monitor_alert_script.sh chmod +x /tmp/maxscale_monitor_alert_script.sh vim /tmp/promotion.sql vim /tmp/demotion.sql
[root@slave1 /data/maxscale]
insert into test.maxscale_test values ('promotion');
[root@slave1 /data/maxscale]
insert into test.maxscale_test values ('demotion');
停止主库4000后 再次开启4000 观察变化: 脚本结果: sql语句也执行了
8.5.2 MariaDB 监视器可选参数
assume_unique_hostnames
默认值:ON 此设置必须为 ON 才能使用任何集群操作功能,例如故障转移或切换
master_conditions
默认值:primary_monitor_master。为Master状态指定附加条件 ,即有资格进行读写查询。 此设置的默认值是 master_requirements=primary_monitor_master为了确保两个监视器在协作时使用相同的主服务器。
可用的条件是:
1.none : 没有附加条件 2.connection_slave :至少有一个直接从站(不在中继之后)正在尝试从主站复制或正在从主站复制(Slave_IO_Running 是“是”或“正在连接”,Slave_SQL_Running 是“是”)。如果从站当前关闭,则使用上次成功的监视器滴答的结果。 3.connected_slave :与上面相同,不同之处在于复制连接必须已启动(Slave_IO_Running 为“是”)。如果从站当前关闭,则使用上次成功的监视器滴答的结果。 4.running_slave:同connecting_slave,增加了奴隶,还必须运行。 5.primary_monitor_master :如果此 MaxScale 与另一个 MaxScale合作并且这是次要 MaxScale,则要求主 MaxScale 也选择候选主。
例如,要要求主站必须有一个既已连接又在运行的从站,请设置
master_conditions=connected_slave,running_slave
slave_conditions
枚举,默认值:none。为Slave -status指定附加条件,即有资格进行读取查询。 可用的条件是: 1.none :没有附加条件。这是默认值。 2.Linked_master :从站必须连接到主站(Slave_IO_Running 和 Slave_SQL_Running 是’Yes’),并且主站必须是Running。这同样适用于从站和主站之间的任何继电器。 3.running_master :master 必须正在运行。继电器可能已关闭。 4.writable_master :master 必须是可写的,即标记为Master。 5.primary_monitor_master :如果此 MaxScale 与另一个 MaxScale合作并且这是次要 MaxScale,则要求主 MaxScale 也选择候选主。
例如,要要求集群的主服务器必须正在运行且可写,任何服务器才能具有Slave -status,请设置 slave_conditions=running_master,writable_master
ignore_external_masters
布尔值,默认值:OFF。忽略不受此监视器监视但属于复制拓扑一部分的任何servers。
外部服务器是不受此监视器监视的服务器。如果服务器正在从外部服务器复制,它通常会获得外部服务器的Slave -status。如果启用此设置,则不会设置状态。
failcount
主服务器在被视为失败之前 监视器检测失败的次数。如果启用了自动故障转移 ( auto_failover=true),则可能会在此时执行。值 0 或 1 启用立即故障转移。
如果无法进行自动故障转移,监视器将尝试搜索另一台服务器来履行主角色。有关 详细信息,请参阅主选择部分 。更改主服务器可能会破坏复制,因为查询可能会路由到没有先前事件的服务器。为防止出现这种情况,请避免在集群中拥有多个有效的主服务器。
默认值为 5 次失败。
主故障和故障转移开始之间的最坏情况延迟可以通过将超时值相加monitor_interval并将其乘以failcount来估计:
(monitor_interval + backend_connect_timeout) * failcount
enforce_read_only_slaves
默认情况下禁用此功能。如果设置为 ON,监视器会尝试给任何带有read_only=OFF 的从属服务器上将 read_only设置为 ON 。在每次监视器迭代时检查该标志。监视器用户需要super权限才能使用此功能。当read_only-flag 为 ON 时,只有具有 SUPER 权限的用户才能写入后端服务器。如果需要临时写访问,则应在尝试禁用之前禁用此功能read_only。否则监视器会很快重新启用它。
maintenance_on_low_disk_space
默认情况下启用此功能。如果不是主服务器或中继主服务器的正在运行的服务器磁盘空间不足,则服务器将设置为维护模式。此类服务器不用于路由器会话,并且在执行故障转移或其他集群修改操作时会被忽略。
cooperative_monitoring_locks
当多个 MaxScales 正在监视同一个后端集群时,建议使用此设置。启用后,监视器会尝试获取后端服务器上的排他锁。如果监视器拥有大多数锁,则它认为自己是主监视器。
允许值: 1.none默认值,无锁定。2.majority_of_all主监视器需要大多数锁,甚至计算 [Down] 的服务器。3.majority_of_running主监视器需要对 [Running] 服务器的大部分锁定。
此设置独立于全局 MaxScale 设置passive。如果 设置了passive,即使监视器已获取锁,集群操作也会被禁用。通常,最好不要将协作监控与被动设置混合使用。
8.5.3 配置参数
auto_failover
启用自动主故障转移。此参数需要一个布尔值,默认值为 false。 注意 当 MaxScale 配置为被动实例时,不会发生故障转移 监视器用户必须具有 SUPER 和 RELOAD 权限才能进行故障转移。
auto_rejoin
启用服务器自动加入集群。此参数需要一个布尔值,默认值为 false。
switchover_on_low_disk_space
默认情况下禁用此功能。如果启用,监视器将尝试用从属服务器切换磁盘空间不足的主服务器。只有在找到没有磁盘空间问题的从属设备时才会进行切换。 要使此参数生效,disk_space_threshold必须为server 或monitor指定。此外,还 必须为监视器定义disk_space_check_interval。
enforce_simple_topology
此设置告诉监视器假定服务器应安排在 1-master-N-slaves 拓扑中,并且监视器应尽量保持这种方式。 如果enforce_simple_topology启用,则设置assume_unique_hostnames、 auto_failover和auto_rejoin也会被激活,而不管其各自的设置如何。
replication_user 和 replication_password
复制用户的用户名和密码 切换主库使用的账号名密码
replication_master_ssl
类型:bool 默认值:off 如果设置为 ON,则CHANGE MASTER TO生成的任何-command 都将设置MASTER_SSL=1为启用复制流的加密。仅当后端服务器配置为 ssl 时才应启用此设置。这通常意味着在服务器配置文件中设置ssl_ca、ssl_cert和 ssl_key。
failover_timeout 和 switchover_timeout
故障转移和切换操作的时间限制。两者的默认值都是 90 秒。 switchover_timeout也用作重新加入操作的时间限制。重新加入应该很少超时,因为它比切换操作更快。 如果在配置的时间段内未成功进行故障切换/切换,则会记录一条消息并禁用自动故障切换。这可以防止对行为异常的集群进行进一步的自动修改。
verify_master_failure 和 master_failure_timeout
为自动故障转移启用额外的主故障验证。 verify_master_failure是一个布尔值(默认值:true),它启用此功能并master_failure_timeout定义超时(默认值:10 秒)。 通过检查从服务器是否仍然连接到主服务器并接收事件来执行故障验证。
servers_no_promotion
这是一个以逗号分隔的服务器名称列表,在故障转移期间不会选择用于主升级或自动选择用于切换。如果用户选择要升级的服务器,这不会影响切换。使用此设置可能会中断故障转移的新主服务器选择,从而选择非最佳服务器。在最坏的情况下,这将导致复制中断。或者,如果所有有效的提升候选人都在排除列表中,则故障转移可能会失败。
server_no_promotion=backup_dc_server1,backup_dc_server2
promotion_sql_file 和 demotion_sql_file
这些可选设置是包含 SQL 语句的文本文件的路径。在升级或降级期间,内容被逐行读取并在后端执行。使用这些设置在服务器上执行自定义语句以补充内置操作 空行或以“#”开头的行将被忽略。语句返回的任何结果都将被忽略。所有语句都必须成功,故障转移、切换或重新加入才能继续。监视器用户可能需要额外的权限和授权才能成功执行自定义命令。
在切换或故障转移期间将从服务器提升为主服务器时,在禁用只读标志后,将在新的主服务器上读取并执行promotion_sql_file
demotion_sql_file在旧主机开始从新主机复制之前,在降级为从机期间在旧主机上运行。该文件也在将独立服务器重新加入集群之前运行
由于文件中的查询是在修改复制拓扑的操作期间运行的,因此需要小心。如果promotion_sql_file包含数据修改 (DML) 查询,新的主服务器可能无法从外部主服务器成功复制。demotion_sql_file不应包含 DML 查询,因为这些查询可能不会在从线程停止之前复制到从服务器,从而破坏复制。
Promotion_sql_file=/home/root/scripts/promotion.sql
demotion_sql_file=/home/root/scripts/demotion.sql
handle_events
默认情况下,此设置处于启用状态。如果启用,监视器会连续查询服务器以获取已启用的计划事件,并在执行集群操作时使用此信息,根据需要启用和禁用事件。
8.6 Listener配置
侦听器定义了MaxScale侦听传入连接的端口。接受的连接与MaxScale服务相连接。多个侦听器可以提供相同的服务。
[MyListener1]
type=listener
service=MyService1
protocol=MariaDBClient
port=3006
8.6.1 service
要监听的服务 名字由service配置
8.6.2 protocol
用于客户端和MaxScale之间通信的协议模块的名称。同样的协议也用于后端通信。通常将其设置为MariaDBClient。
8.6.3 address
这设置了侦听套接字绑定到的地址。地址可以指定为“点符号”中的 IP 地址或主机名。如果未定义,侦听器将绑定到所有网络接口。
8.6.4 port
侦听器侦听的端口。如果未定义,则使用协议的默认端口。
8.6.5 socket
如果已定义,该侦听器将使用Unix域套接字侦听传入连接。参数值是要使用的套接字的名称。
8.6.6 sql_mode
为Listener指定sql模式类似于全局sql_mode设置。如果两者都使用,则此设置将覆盖此侦听器的全局设置。
8.6.7 authenticator
authenticator=PAMAuth,mysqlauth,gssapiauth
要使用的验证器模块
8.6.8 authenticator_options
这定义了身份验证的其他选项。
8.6.9 connection_init_sql_file
带有sql查询的文本文件的路径。从侦听器创建的任何会话都将在身份验证后将文件的内容发送到后端。文件中的每一个非空行都被解释为一个查询。每个查询必须成功,后端连接才能用于客户端查询。查询不应该返回任何数据。
connection_init_sql_file=/home/dba/init_queries.txt
用于设置一些变量 例如
set @myvar = 'mytext';
set @myvar2 = 4;
9.加密密码
存储在 maxscale.cnf 文件中的密码可以选择加密以增加安全性。 MariaDB MaxScale 存储密钥的默认位置是/var/lib/maxscale。密码使用 256 位 AES CBC 加密进行加密。
maxkeys /var/lib/maxscale/
更改 MariaDB MaxScale 的加密密钥将使存储在 maxscale.cnf 文件中的任何当前加密的密钥失效。
9.1 创建加密密码
通过使用 .secrets 文件的位置和加密所需的密码作为参数执行 maxpasswd 命令来创建加密密码。
maxpasswd /var/lib/maxscale/ MaxScalePw001
61DD955512C39A4A8BC4BB1E5F116705
maxpasswd 命令的输出是一个十六进制字符串,它应该被插入到 maxscale.cnf 文件中来代替普通的纯文本密码。MariaDB MaxScale 会将其确定为加密密码,并在将其发送到数据库服务器之前自动对其进行解密。
[Split-Service]
type=service
router=readwritesplit
servers=server1,server2,server3,server4
user=maxscale
password=61DD955512C39A4A8BC4BB1E5F116705
10.MariaDB MaxScale模块简介
10.1 Monitor
监视模块能够监视特定种类的群集的状态,并使该状态对MaxScale的路由器可用 监视模块的示例包括mariadbmon:能够监视常规的主从集群以及执行切换 和故障转移; 配置例如:
[MariaDB-Monitor]
type=monitor
module=mariadbmon
10.2 Filter
过滤器模块位于MaxScale的请求处理链中的路由器前面。也就是说,过滤器将在请求到达路由器之前以及将响应发送回客户端之前看到请求。这允许过滤器拒绝,处理,更改或记录有关请求的信息
10.3 Router
路由器模块能够根据请求的特征和/或路由器实现的算法将请求路由到后端服务器。路由器的示例readconnroute提供连接路由,即在创建会话并将所有请求随后路由到该服务器时根据指定的规则选择服务器,并readwritesplit提供语句路由,即每个单独的请求都路由到最合适的服务器。 路由器在MaxScale配置文件中没有其自己的部分,但可以通过services进行引用 配置例如:
[Read-Write-Service]
type=service
router=readwritesplit
......
[Read-Service]
type=service
router=readconnroute
备注:由于readconnroute是把当前连接分配给某一服务器一直使用,如果此时该服务器down 无法查询 那么maxscale将尝试重连到其他服务器,并保持连接 如图:
10.4 Service
对一组数据库进行抽象,并使它们在客户端中显示为单个数据库。根据服务使用的路由器(例如readconnroute或 readwritesplit),以某种特定方式使用服务器。如果服务使用过滤器,则所有请求将在到达路由器之前以某种方式进行预处理。
10.5 Listener
侦听器定义MaxScale侦听的端口。到达该端口的连接请求将转发到与侦听器关联的服务。侦听器可能与单个服务相关联,但几个侦听器可能与同一服务相关联。 配置例如:
[Read-Write-Listener]
type=listener
service=Read-Write-Service
protocol=MariaDBClient
port=4006
[Read-Listener]
type=listener
service=Read-Service
protocol=MariaDBClient
port=4007
10.MaxCtrl
MaxCtrl是MaxScale的命令行管理客户端 默认情况下,MaxScale REST API侦听本地主机上的端口8989。REST API的默认凭据为: 用户名admin 密码:mariadb
如果执行maxctrl语句报错: [root@master1 ~]# maxctrl list servers Error: Could not connect to MaxScale
则补充好相关用户名密码 ip、端口
maxctrl -u admin -p mariadb -h 10.10.80.67:8989 list servers
maxctrl list servers maxctrl list services maxctrl list listeners maxctrl list monitors
list servers list services list listeners list monitors list sessions list filters list modules list threads list users list commands show server show servers show service show services show monitor show monitors show session show sessions show filter show filters show listener show listeners show module show modules show maxscale show thread show threads show logging show commands show qc_cache show dbusers set server clear server drain server enable log-priority disable log-priority create server create monitor create service create filter create listener create user destroy server destroy monitor destroy listener destroy service destroy filter destroy user link service link monitor unlink service unlink monitor start service start monitor start services stop service stop monitor stop services alter server alter monitor alter service alter service-filters alter logging alter maxscale alter user rotate logs reload service reload the call command cluster cluster diff cluster sync api get classify
11.keepalive+maxscale
只使用合作模式仍然不能解决maxscale的高可用问题 所以需要通过keepalive漂移vip的方式 让vip在两个maxscale之间选择可用的服务 节点: maxscale1 :10.10.80.67 maxscale2: 10.10.80.39 vip设置:10.10.80.199 数据库分别在 10.10.80.55、60、33上的6000端口 连接数据库的方式有 1.直连数据库:mysql -u online -p -P 6000 -h 10.10.80.55/60/33 2.连接maxscale的listener:mysql -u online -p -P 4006 -h 10.10.80.39/67 3.通过vip连接maxscale的listener:mysql -u online -p -P 4006 -h 10.10.80.199
最后使用的就是第三种方式 这样数据库的高可用由maxscale保证 无需业务更换ip maxscale的高可用由keepalive保证 一台maxscale宕机,会由另一台maxscale进行服务(注意服务配置要想同)
11.1 安装keepalived
yum install keepalived -y
11.2 配置文件
cd /etc/keepalived vim keepalived.conf
! Configuration Fileforkeepalived
global_defs {
script_user root
enable_script_security
}
vrrp_script chk_http_port {
script "/etc/keepalived/check_haproxy.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface ens192
virtual_router_id 51
priority 153
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port
}
virtual_ipaddress {
10.10.80.199
}
}
vim /etc/keepalived/check_haproxy.sh
startmaxscale='sudo -u maxscale maxscale -f /data/maxscale/maxscale1.cnf '
LOGFILE="/var/log/keepalived-maxscale.log"
echo "[check_maxscale status]" >> $LOGFILE
A=`ps -C maxscale --no-header |wc -l`
echo "[check_maxscale status]" >> $LOGFILE
date>>$LOGFILE
if [ $A -eq 0 ];then
echo $startmaxscale >> $LOGFILE
$startmaxscale >> $LOGFILE 2>&1
fi
if [ `ps -C maxscale --no-header |wc -l ` -eq 0 ];then
exit 0
ps -ef | grep keepalive | grep -v grep | awk '{print $2}' |xargs kill
else
exit 1
fi
另一台机器 配置 (脚本不需要改变 脚本需要赋权 可执行) vim /etc/keepalived/check_haproxy.sh
! Configuration Fileforkeepalived
global_defs {
script_user root
enable_script_security
}
vrrp_script chk_http_port {
script "/etc/keepalived/check_haproxy.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens192
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port
}
virtual_ipaddress {
10.10.80.199
}
}
chmod +x /etc/keepalived/check_haproxy.sh (启动maxscale sudo -u maxscale maxscale -f /data/maxscale/maxscale1.cnf ) 启动keepalived /usr/sbin/keepalived -f /etc/keepalived/keepalived.conf -D -d -S 0 查看keepalive日志 tail -f /var/log/messages 查看虚拟ip ip addr show
11.3 keepalive日志配置
keepalived默认会把日志打在/var/log/messages。 vim /etc/sysconfig/keepalived 把KEEPALIVED_OPTIONS=“-D” 修改为 KEEPALIVED_OPTIONS=“-D -d -S 0”
在/etc/rsyslog.conf 末尾添加 vim /etc/rsyslog.conf local0.* /var/log/keepalived.log
重启日志记录服务 [root@vm-122-100 ~]# systemctl restart rsyslog [root@vm-122-100 ~]# systemctl status rsyslog
重启keepalived服务
注意: 脚本中kill 进程 ps -ef | grep keepalive | grep -v grep | awk ‘{print $2}’ |xargs kill #不能用-9 否则原来的vip不会消失
12 注意事项
在集群被maxscale监控或切换之后 将在数据目录中保存集群的当前状态,如果中途关闭maxscale服务并调整了主从结构,那么在maxscale再次开启时 会尝试恢复之前的状态,所以如果想让maxscale以一个全新集群的眼光管理这个集群的话 需要在启动maxscale之前 先删除掉data目录中保存的旧集群信息
2.连接路由 有两种方式 readconnroute提供连接路由,即在创建会话并将所有请求随后路由到该服务器时根据指定的规则选择服务器 readwritesplit提供语句路由,即每个单独的请求都路由到最合适的服务器 readwritesplit 在使用事务begin的时候无论读写都会转发到master上 如果想要避免这种情况 可以采用如下配置:
[Write-Service]
type=service
router=readwritesplit
servers=server1
user=maxscale
password=maxscale_pw
[Read-Service]
type=service
router=readconnroute
router_options=slave
servers=server2,server3
user=maxscale
password=maxscale_pw
至于从库读取选用哪种路由可以根据实际情况选择
3.同时监控多个集群 需要新增以下配置: 实例新增:
[test_3309_master]
type=server
address=10.10.80.193
port=3309
protocol=MariaDBBackend
[test_3310_slave]
type=server
address=10.10.80.193
port=3310
protocol=MariaDBBackend
[test_3311_slave]
type=server
address=10.10.80.193
port=3311
protocol=MariaDBBackend
监视器新增
[monitor_test]
type=monitor
module=mariadbmon
servers=test_3310_slave,test_3311_slave,test_3309_master
user=monitor_user
password=my_password
monitor_interval=10000
backend_connect_timeout=3s
failcount=5
enforce_read_only_slaves=1
cooperative_monitoring_locks=majority_of_all
auto_failover=true
auto_rejoin=true
replication_user=slave
replication_password=didaRepli
服务新增
[test_Write_service]
type=service
router=readconnroute
router_options=master
servers=test_3310_slave,test_3311_slave,test_3309_master
user=maxscale
password=maxscale_pw
[test_Read_service]
type=service
router=readconnroute
router_options=slave
servers=test_3310_slave,test_3311_slave,test_3309_master
user=maxscale
password=maxscale_pw
监听新增:注意端口不要和其他监听重复 注意服务名要与上边配置的服务名一致
[test-Write-Listener]
type=listener
service=test_Write_service
protocol=MariaDBClient
port=4008
[test-Read-Listener]
type=listener
service=test_Read_service
protocol=MariaDBClient
port=4009
4.主从切换使用的MASTER_USE_GTID = current_pos 所以在从库上进行的操作,即使是在复制过滤的数据库也需要 set session sql_log_bin=0 以防打乱从库的current_pos 切换后maxscale会自动为新主库接触read_only限制,旧主库作为slave加入后会自动添加read_only限制 其余从库状态不变
5.在一台机器同时启动两个maxscale服务需要新增以下目录 来区分不同的maxscale #web端口冲突注意 admin_port=8988 #日志目录 不新建两个服务都会写入一个文件 logdir=/data/maxscale/log2/ ##数据目录 datadir=/data/maxscale/data2/ #pid文件 piddir=/data/maxscale/data2/ cachedir=/var/cache/maxscale2/
6.如果使用以下路由方式 #readwritesplit 即每个单独的请求都路由到最合适的服务器 router=readwritesplit 那么需要确保主从库的账号一致 如果主库存在账号从库不存在那么 日志将会报错 例如: 2022-03-29 18:10:47 error : (2306653) Authentication to ‘server1’ failed: 1045, #28000: Access denied for user ‘user1’@‘192.168.11.11’ (using password: YES)
|