docker&&mgr&&maxscale

docker容器下的mgr集群,研究maxscale的转发规则

docker快速启动mysql集群

docker下载&&安装&&启动

wget https://mirrors.cloud.tencent.com/docker-ce/linux/static/stable/x86_64/docker-19.03.9.tgz
tar -xf docker-19.03.9.tgz
mv docker /usr/local/
ln -s /usr/local/docker/* /usr/local/bin/
dockerd &
docker version

load docker镜像

docker load < aa65c3d806de.tar
docker images

创建docker容器通信网段

docker network create --subnet=172.18.0.0/16 mynetwork

mv newdk /usr/local/bin/
newdk 80 1 在172.18.80.x网段创建172.18.80.1的ip,使用这个ip创建一个mysql的镜像容器

#newdk文件内容
#!/bin/bash

if (( $2<10 ))
then
  name_tail=0$2
else
  name_tail=$2
fi

if (( $1==57 ))
then
  docker run --hostname mysql80-${name_tail} --name mysql57-${name_tail} --network mynetwork --ip 172.18.57.$2 -it -d -w /root mysql-autostart:5.7.30 /bin/bash
elif (( $1==80 ))
then
  docker run --hostname mysql80-${name_tail} --name mysql80-${name_tail} --network mynetwork --ip 172.18.80.$2 -it -d -w /root mysql-autostart:8.0.21 /bin/bash
else
  docker run --hostname dk-${name_tail} --name dk-${name_tail} --network mynetwork --ip 172.18.1.$2 -it -d -w /root --privileged=true centos-custom:7.4 /usr/sbin/init
fi

docker ps -a

CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS                    PORTS               NAMES
771dfad329d1        mysql-autostart:8.0.21   "/root/docker-entryp…"   9 days ago          Up 8 days                                     mysql80-01

关闭selinux 防火墙

setenforce 0
systemctl stop firewalld

启动其他几个mysql实例
newdk 80 2

newdk 80 3

登陆容器并进入mysql

docker exec -it 容器id bash
mysql -uroot -pletsg0 -h172.18.80.1 -P3306
which mysql
yum install crypto*

mgr学习资料

环境:

docker容器启动的mysql实例

CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS                    PORTS               NAMES
58308933687b        mysql-autostart:8.0.21   "/root/docker-entryp…"   9 days ago          Up 8 days                                     mysql80-09
64773d2e3a28        mysql-autostart:8.0.21   "/root/docker-entryp…"   9 days ago          Up 8 days                                     mysql80-08
771dfad329d1        mysql-autostart:8.0.21   "/root/docker-entryp…"   9 days ago          Up 8 days                                     mysql80-07

修改配置文件

#### Group Replication #mgr配置的相关参数 需要group_replication插件
plugin-load-add='group_replication.so'
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name='aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'   #自定义
loose-group_replication_start_on_boot=off
loose-group_replication_enforce_update_everywhere_checks=off
loose-group_replication_ip_whitelist='0.0.0.0/0'                            #格式类似于阿里云的http白名单
loose-group_replication_local_address='172.18.80.7:33061'                   #都写当前机器的ip 端口
loose-group_replication_group_seeds='172.18.80.7:33061,172.18.80.8:33061,172.18.80.9:33061'   #其群中所有机器的ip &&端口
loose-group_replication_bootstrap_group=off
loose-group_replication_single_primary_mode=on
loose-group_replication_clone_threshold=50000

#### Clone Plugin   #利用clone plugin 主从搭建,初始化从库,达到跟主库基本一致的环境。也可以通过xtrbackup进行主从搭建
plugin-load-add=mysql_clone.so
loose-clone_autotune_concurrency=ON
loose-clone_max_concurrency=16
loose-clone_max_data_bandwidth=100
loose-clone_max_network_bandwidth=100
loose-clone_ddl_timeout=300
#### 修改后重启mysql实例

配置文件参数:

group_replication_group_seeds参数为种子节点的service地址

group_replication_local_address为当前节点service地址 

  >就是本机的ip

group_replication_start_on_boot在有PRIMARY节点时,建议重新设置为ON

group_replication_clone_threshold为超过指定事务延迟数量后触发Clone Plugin重搭备库 #----自动解决主从延迟问题

从库clone主库数据(初次创建可忽略)

可参考https://blog.csdn.net/n88Lpo/article/details/105872240

SET GLOBAL clone_valid_donor_list = '[主库ip]:[主库数据库端口]'
CLONE INSTANCE FROM '[主库管理权限账号]'@'[主库ip]':[主库数据库端口] IDENTIFIED BY '[用户密码]' ;

集群创建

  • 创建用户(可以加入到docker-entrypoint.sh)
mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';
  • 配置复制通道(所有members都指定复制通道)
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
  • 启动集群
### 引导节点启动
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;

### 非引导节点启动(返回OK才能代表集群加入成功)
mysql> START GROUP_REPLICATION;

高可用

找出主节点
  • 在单主模式的拓扑中找出当前的主节点,可以使用performance_schema.replication_group_members表中的MEMBER_ROLE列值来判断,MEMBER_ROLE列值为PRIMARY的组成员即为当前组中的主节点。replication_group_members表的内容查询示例如下:
mysql> SELECT MEMBER_HOST, MEMBER_ROLE FROM performance_schema.replication_group_members;
+-------------+-------------+
| MEMBER_HOST | MEMBER_ROLE |
+-------------+-------------+
| mgr2        | PRIMARY     |
| mgr3        | SECONDARY   |
| mgr1        | SECONDARY   |
+-------------+-------------+
3 rows in set (0.00 sec)
检查节点运行状态
mysql> select member_state from performance_schema.replication_group_members where member_id=@@server_uuid;
+--------------+
| member_state |
+--------------+
| ONLINE       |
+--------------+
1 row in set (0.00 sec)
组成员状态
* ONLINE:表示该成员已经准备好作为一个功能齐全的组成员(活跃成员),这意味着该成员可以正常接受客户端的访问(单主模式下,主要节点可接受读写访问,辅助节点只可接受只读访问;多主模式下,所有成员都是主要节点,都可以接受读写访问)。
* RECOVERING:表示该成员正在成为该组的活跃成员,目前正在恢复过程中,正在接受来自donor节点的状态转移数据。
* OFFLINE:表示该Server已加载了MGR插件,但此时Server不属于任何组。
* ERROR:表示该成员处于错误状态,不能作为任何组的成员正常工作。如果该Server曾经成功加入过组一次,后续发生任何故障,则会根据系统变量group_replication_exit_state_action设置的在退出操作(默认值为READ_ONLY)时执行不同的调整,使得成员在执行退出之后所处的状态可能不同。如果设置为READ_ONLY,则该成员退出时处于只读模式(super_read_only= on),成员状态可能可能为OFFLINE;如果设置为OFFLINE_MODE,则该成员退出时处于脱机模式(offline_mode= on, super_read_only= on ),此时成员状态为ERROR,而不是OFFLINE状态。如果设置为ABORT_SERVER,则该成员在意外脱离组并耗尽了重新加入组的尝试次数之后,数据库的实例进程将被自动关闭,并从组的视图中删除该成员。
* UNREACHABLE:当本地故障检测器怀疑某个给定的成员不可访问时(例如,由于非自愿与组断开了连接时),将显示该成员的状态为UNREACHABLE。

maxscale学习资料

是啥东西,干啥用的

MaxScale 是 MariaDB 开发的一个数据库智能代理服务,允许根据数据库 SQL 语句将请求转向目标一个到多个服务器,可设定各种复杂程度的转向规则。MaxScale 设计用于透明的提供数据库的负载均衡和高可用性,同时提供高度可伸缩和灵活的架构,支持不同的协议和路由决策。MaxScale 使用 C 语言开发,利用 Linux 下的异步 I/O 功能。使用 epoll 作为事件驱动框架。
  Maxscale有两种方式实现读/写分离。

​ 一种是基于connect的,类似于Haproxy,不解析SQL语句,可以通过PHP Yii框架或Java Mybatis框架实现。在此方式中,用Maxscale做多台slave的负载均衡,并且支持主从同步延迟检测功能。(不关心)

​ 另一种是基于statement的,要解析SQL语句。在这种方式里,前端程序不需要修改,通过Maxscale对SQL语句进行解析,把读/写请求自动路由到后端数据库节点上,从而实现读/写分离。商业软件OneProxy中间件也是基于statement方式实现读/写分离的。这种方式的好处是不修改程序代码,减少了复杂度,可平滑迁移,无感知;缺点是解析SQL势必会增加CPU的性能损耗,性能没有基于connect的方式好。

Maxscale的插件

MaxScale 目前提供的插件功能分为5类:

认证插件

提供了登录认证功能,MaxScale 会读取并缓存数据库中 user 表中的信息,当有连接进来时,先从缓存信息中进行验证,如果没有此用户,会从后端数据库中更新信息,再次进行验证

协议插件

包括客户端连接协议,和连接数据库的协议

路由插件

决定如何把客户端的请求转发给后端数据库服务器,读写分离和负载均衡的功能就是由这个模块实现的

监控插件

对各个数据库服务器进行监控,例如发现某个数据库服务器响应很慢,那么就不向其转发请求了

日志和过滤插件

提供简单的数据库防火墙功能,可以对SQL进行过滤和容错

创建用户 配置 安装

首先通过docker快速启动mysql集群中的步骤快速启动一个实例

newdk 80 10

中间件的docker容器的ip地址为172.18.80.10

创建用户用户授权

create user maxscale_route@'%' identified by "123456";
GRANT SELECT ON mysql.user TO maxscale_route@'%';
GRANT SELECT ON mysql.db TO maxscale_route@'%';
GRANT SELECT ON mysql.tables_priv TO maxscale_route@'%';
GRANT SHOW DATABASES ON *.* TO maxscale_route@'%';

配置详解

# cat /etc/maxscale.cnf

[maxscale]
admin_host=0.0.0.0														##REST API侦听的网络接口。默认值为127.0.0.1仅侦听本地连接的IPv4地址。
ms_timestamp=1																##在日志文件中启用或禁用高精度时间戳。启用此选项可以为所有日志文件时间戳增加毫秒精度。
syslog=0																		  ##启用或禁用将消息记录到syslog。 0表示不启用
maxlog=1																			##启用以禁用将消息记录到MariaDB MaxScale的日志文件中。 要启用到MariaDB MaxScale日志文件的日志记录,请使用值1,而禁用则使用值0。
log_to_shm=0																	##启用或禁用将maxscale.log文件写入共享内存。要启用到共享内存的日志记录,请使用值1;要禁用日志记录,请使用值0。

log_warning=1																	##启用或禁用系统日志优先级为warning的消息的日志记录。
log_notice=1																	##启用或禁用的消息,其syslog优先权在日志通知。
#log_info=1																		##启用或禁用系统日志优先级为info的消息的日志记录。
log_debug=0                                   ##启用或禁用系统日志优先级为debug的消息的日志记录
log_augmentation=1														##启用或禁用消息扩充。如果启用了此功能,则每个记录的消息都将附加记录消息的函数的名称。

execdir=/usr/local/maxscale/bin             	##配置可执行文件所在的目录。启动的所有内部进程将使用此目录查找可执行文件。
libdir=/usr/local/maxscale/lib64/maxscale     ##设置MariaDB MaxScale在其中查找模块的目录。

datadir=/var/lib/maxscale/data								##datadir
logdir=/var/lib/maxscale/log                  ##设置日志文件的存储目录。
cachedir=/var/lib/maxscale/cache							##配置MariaDB MaxScale用于存储缓存数据的目录。从后端服务器获取的身份验证数据就是缓存数据的一个示例。
piddir=/var/lib/maxscale/run									##为MariaDB MaxScale的PID文件配置目录。

threads=auto																	##此参数控制正在处理来自内核的事件的工作线程的数量。默认为1个线程。建议您从一个线程开始,如果需要更高的性能,则增加线程数量。

##server [servern] 服务器部分用于定义可以形成服务的后端数据库服务器。服务器可以是MariaDB MaxScale中一个或多个服务的成员。
#[server1]
#类型=服务器
#地址= 127.0.0.1
#端口= 3000
#protocol= MariaDBBackend      用于将MariaDB MaxScale连接到数据库的协议模块的名称。当前仅支持一种后端协议,即MariaDBBackend模块。



[server1]
type=server
address=172.18.80.7
port=3306
protocol=MySQLBackend

[server2]
type=server
address=172.18.80.8
port=3306
protocol=MySQLBackend

[server3]
type=server
address=172.18.80.9
port=3306
protocol=MySQLBackend

##监控模块
#[Galera Monitor]
#type=monitor
#module=galeramon
#servers=server1,server2,server3
#user=myuser
#passwd=mypwd

[MySQL-Monitor]
type=monitor
module=grmon
servers=server1,server2,server3
user=maxmon
passwd=maxmon
monitor_interval=10000

##路由模块 服务的router参数定义路由器模块的名称,该模块将用于实现MariaDB MaxScale客户端与后端数据库之间的路由算法。
##控制路由选择的两个参数是router和router_options。路由器选项特定于特定路由器,用于修改路由器的行为。
[Read-Write-Service]
type=service
router=readwritesplit                      ##读写分离
servers=server1,server2,server3
user=maxscale
passwd=maxscale
max_slave_connections=100%
enable_root_user=1

##读取连接路由器可以传递主,从或同步选项,将服务配置为使用此路由器并将服务器的选择限制为从状态的服务器的示例如下。
[Read-Only-Service]
type=service
router=readconnroute											
servers=server2,server3
user=maxscale
passwd=maxscale
router_options=slave
enable_root_user=1

[MaxAdmin-Service]
type=service
router=cli

##Listener													侦听器定义用于侦听与服务的连接的端口和协议对。一个服务可能具有与之关联的多个侦听器,以支持多个协议或多个端口。与配置的其他元素一样,部分名称是侦听器名称,可以自由选择。类型参数用于将节标识为侦听器定义。地址是可选的,它允许用户仅将连接限制为某些接口。套接字也是可选的,用于Unix套接字连接。

#[]
#type=listener											
#service=]            侦听器所关联的服务。这是在配置文件中其他位置定义的服务的名称。
#protocol=[MariaDBClient|HTTPD]			客户端与MariaDB MaxScale本身之间进行通信所使用的协议模块的名称。
#address=[IP|hostname]
#port=

[Read-Write-Listener]
type=listener
service=Read-Write-Service					##使用上方Read-Write-Service的路由模块
protocol=MySQLClient
port=4006

[Read-Only-Listener]
type=listener
service=Read-Only-Service					  ####使用上方Read-Write-Service的路由模块
protocol=MySQLClient
port=4007

[MaxAdmin-Unix-Listener]
type=listener
service=MaxAdmin-Service
protocol=maxscaled									##maxadmin客户端应用程序用于连接到MariaDB MaxScale并访问命令行界面使用的协议。
socket=default											##该socket选项可能包含在侦听器定义中,这将侦听器配置为使用Unix域套接字来侦听传入的连接。给定的参数值是要使用的套接字的名称。

[MaxAdmin-Inet-Listener]
type=listener
service=MaxAdmin-Service
protocol=maxscaled
port=6603

配置文件参数详解

MaxScale配置文件内容一共分为五个部分,每个部分使用[]标记,典型的ini文件格式:

[maxscale]

在名为[MaxScale]的部分中,全局设置允许对MariaDB MaxScale进行整体调优的各种参数。

[Service]

Service表示MariaDB MaxScale为客户提供的数据库服务。一般来说,服务由一组后端数据库服务器和一种路由算法组成,它决定了MariaDB MaxScale如何决定发送语句或路由到这些后端服务器的连接。

[Server]

Server段用于定义可以提供服务的后端数据库服务器。server可以是MariaDB MaxScale中的一个或多个服务的成员。服务器由服务器名标识,服务器名是配置文件中的部分名称。服务器有一个服务器的类型参数,加上地址端口和协议参数。

[Listener]

侦听器定义了用于侦听服务连接的端口和协议对。服务可能有多个与之相关的侦听器,以支持多个协议或多个端口。与配置的其他元素一样,section名称是侦听器名称,可以自由选择。类型参数用于标识作为侦听器定义的部分。

[Monitor]

Monitor模块被MariaDB MaxScale用于内部监控后台数据库的状态,以便为这些服务器设置服务器标志。然后,路由器模块使用这些标志来确定特定的服务器是否适合用于特定查询分类的路由连接。这些监视器运行在MariaDB MaxScale的单独线程中,不影响MariaDB MaxScale的路由性能。

下面就对各个模块进行参数的解释:

全局模块[maxscale]

[maxscale]
threads=1
auth_connect_timeout=10
auth_read_timeout =10
auth_write_timeout=10
ms_timestamp=<0|1>  #启用或禁用日志文件中的高精度时间戳。这样可以为所有的日志文件时间戳增加毫秒的精度。
skip_permission_checks =<true|false> #跳过服务和监视用户权限检查。当你知道权限是可以的,你想加快启动进程时,这是很有用的。这个参数需要一个布尔值,默认情况下是禁用的。建议不要禁用权限检查,这样当maxscale启动时就会检测到任何缺失的特权。如果您正在经历一个缓慢启动的MaxScale,因为在检查权限时大量的连接超时,禁用权限检查可以加快启动进程。
syslog=<0|1> #启用或禁用对syslog的消息记录。
maxlog=<0|1> #允许禁用向MariaDB MaxScale的日志文件记录消息。默认的日志记录是启用的。
log_to_shm=<0|1> #启用或禁用maxscale.log日志文件的共享内存。如果启用,那么将在/dev/ shm下创建实际的日志文件,并在MaxScale日志目录中创建一个指向该文件的符号链接。如果启用log_info和/或log_debug,日志记录到共享内存可能是合适的,因为日志记录到一个常规文件可能会导致性能下降,因为记录的数据量是这样的。但是,由于共享内存是一种稀缺资源,所以对共享内存的日志记录应该只是临时的,而不是定期的。由于MariaDB MaxScale可以记录到文件和syslog,因此提供最大灵活性的方法是启用syslog和log_to_shm,以及禁用maxlog。这样,消息通常会登录到syslog,但是如果有什么要调查的话,则可以从maxadmin启用log_info和maxlog,在这种情况下,信息消息将被记录到maxscale。共享内存中的日志文件。
log_warning=<0|1> #启用或禁用syslog优先级警告的日志记录。默认情况下启用此优先级的消息。
log_notice=<0|1> #启用或禁用syslog优先级通知的日志记录。这个优先级的消息提供了关于MariaDB MaxScale功能的信息,默认情况下是启用的。
log_info=<0|1> #启用或禁用syslog优先级信息的日志记录。这些消息提供了关于MariaDB MaxScale内部工作的详细信息,不应该由于它们的频率而启用,除非有特定的原因。例如,从这些信息中可以明显看出。为什么一个特定的查询被路由到主服务器而不是一个奴隶。这些信息在默认情况下是禁用的。
log_augmentation=<0|1> #启用或禁用消息的增强。如果启用了这个操作,那么每个已登录的消息将附加到日志记录的函数的名称。这主要用于开发目的,因此在默认情况下是禁用的。
log_throttling=X,Y,Z #如果持续存在错误的原因,可能会一次又一次地记录一个特定的错误(或警告)。为了防止日志被洪水淹没,可以指定一个特定的错误可能在一个时间段内记录多少次,在这个错误的日志记录被抑制一段时间之前。默认值是10、1000、10000,这意味着如果同样的错误在1秒内被记录10次,那么在接下来的10秒中,记录错误的日志就会被抑制。要禁用log throttling,添加一个带有空值的条目:log_throttling=
logdir=path   #设置日志文件存储的目录。该文件夹需要由运行MariaDB MaxScale的用户可读和写。
datadir=path  #设置MariaDB MaxScale使用的数据文件存储的目录。模块可以写入这个目录,例如binlogrouter使用这个文件夹作为存储二进制日志的默认位置。
libdir=/home/user/lib64/  #设置MariaDB MaxScale寻找模块的目录。库目录是MariaDB MaxScale在搜索模块时使用的唯一目录。如果您有MariaDB MaxScale的自定义模块,请确保将它们放在这个文件夹中。
cachedir=/tmp/maxscale_cache/ #配置MariaDB MaxScale用于存储缓存数据的目录。缓存数据的一个示例是从后端服务器获取的身份验证数据。如果连接到后端服务器是不可能的,那么MariaDB MaxScale存储这些数据。
piddir=/tmp/maxscale_cache/ #为MariaDB MaxScale配置PID文件的目录。这个文件包含运行的MariaDB MaxScale进程的进程ID。
execdir=/usr/local/bin/  #配置可执行文件所在的目录。启动的所有内部流程将使用此目录查找可执行文件。
connector_plugindir=/usr/lib/plugin/ #MariaDB connector-c插件目录的位置。在MaxScale中使用的MariaDB connector - c可以使用此目录加载身份验证插件。插件的版本必须与MaxScale所构建的连接器版本兼容。
persistdir=/var/lib/maxscale/maxscale.cnf.d/  #配置保存持久配置的目录。当通过MaxAdmin创建新服务器时,它将存储在这个目录中。不要使用或修改该目录的内容,使用/etc/maxscale.cnf.d /代替。
module_configdir=/var/lib/maxscale/  #配置存储模块配置的目录。路径参数解析相对于这个目录。该目录应该用于存储特定于模块的配置,例如dbfwfilter规则文件。任何非绝对路径的配置参数都将被解释为相对路径。相对路径使用模块配置目录作为工作目录。例如,配置参数file= my_file.txt将被解释为/etc/maxscale.cnf.d/my_file.txt,而file=/home/user/my_file.txt将被解释为/home/user/my_file.txt。

Server模块[Server]

1 [server1] 
2 type=server
3 address=IP
4 port=3306
5 protocol=MySQLBackend

[Read-Write Service]
type=service
router=readwritesplit | readconnroute   #服务的路由器参数定义了路由器模块的名称,该模块将用于实现MariaDB MaxScale客户机和后端数据库之间的路由算法。另外,路由器也可以通过一个逗号分隔的选项列表来控制路由算法的行为。控制路由选择的两个参数是router和router_options。路由器选项是特定于特定路由器的,并被用来修改路由器的行为。读取的连接路由器可以通过master、slave或synced的选项,例如配置一个服务来使用此路由器,并限制服务器对处于从属状态的服务器的选择。
router_options=slave | master,slave
servers=server1  #服务定义中的servers参数提供了包含服务的后端服务器的逗号分隔列表。服务器名是使用服务器类型参数的块的名称部分使用的名称(见下文)。
user=myuser
passwd=mypwd
filters=counter | QLA
enable_root_user=[0|1]  #此参数控制root连接到MariaDB MaxScale的能力,并通过MariaDB MaxScale将其转到后端服务器。默认值为0,禁用root连接到MariaDB MaxScale。
localhost_match_wildcard_host=[0|1]  #该参数使“127.0.0.1”(localhost)与“%”通配符匹配,用于MySQL协议验证。默认值为0,因此为了验证与MariaDB MaxScale正在运行的同一机器的连接,MySQL用户表中需要一个显式user@localhost条目。
version_string=5.5.37-MariaDB-RWsplit  #这个参数设置了一个自定义的版本字符串,它是由MariaDB MaxScale向客户端发送的。
connection_timeout=300 #connection_timeout参数用于将会话与已经闲置太久的MariaDB MaxScale断开连接。默认情况下,会话超时是禁用的。要启用它们,请在服务的配置部分中以秒为单位定义超时。
max_connections=100  #最大同时连接MaxScale应该允许该服务。如果参数为零或省略,则没有限制。在到达极限后,任何试图建立更多连接的尝试都会导致返回“太多的连接”错误。
log_auth_warnings=[0|1]  #启用或禁用认证失败和警告的日志记录。该参数采用布尔值。MariaDB MaxScale通常会抑制关于失败身份验证的警告消息。启用此选项将把这些消息记录到消息日志中,并详细介绍谁尝试连接到MariaDB MaxScale和从何处连接。
auth_all_servers=[0|1] #此参数控制在从后端服务器加载用户时仅使用单个服务器或所有服务器。这需要一个布尔值,当启用时,将在所有服务器上创建所有用户和授予的联合。
strip_db_esc=[0|1] #当从后端服务器加载用户时,strip_db_esc参数从数据库名称中删除字符。该参数采用布尔值,当启用时,将从数据库名称中删除所有反斜杠(\)字符。自MaxScale 2.0.1以来,该参数的默认值为true。在以前的版本中,默认值为false。一些可视化数据库管理工具会自动地避开一些字符,这可能会导致当MariaDB MaxScale试图对用户进行身份验证时发生冲突。
retry_on_failure=[0|1] # retry_on_failure参数控制MariaDB MaxScale是否尝试重新启动失败的服务并接受布尔值。此功能默认启用,以防止由于网络中断导致服务启动失败而导致永久禁用服务。如果在启动MariaDB MaxScale时不能启动服务,禁用重新启动失败的服务将使它们永久禁用。
max_slave_connections=100%

安装步骤

scp 10.10.30.190:/usr/local/maxscale.tar.gz .
tar -xf maxscale.tar.gz
mv maxscale /usr/local/
ln -s /usr/local/maxscale/bin/* /usr/local/bin

yum install yum install gnutls

groupadd maxscale

useradd -g maxscale maxscale

mkdir -p /var/lib/maxscale/{data,cache,log,run}
chown -R maxscale:maxscale /var/lib/maxscale

maxscale --config=/etc/maxscale.cnf --user=maxscale
maxadmin list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server             | Address         | Port  | Connections | Status
-------------------+-----------------+-------+-------------+--------------------
server1            | 172.18.80.7     |  3306 |           0 | Master, Running
server2            | 172.18.80.8     |  3306 |           0 | Slave, Running
server3            | 172.18.80.9     |  3306 |           0 | Slave, Running
-------------------+-----------------+-------+-------------+--------------------

测试验证读写分离

基于statement方式(SQL解析)的测试

环境

mysql> SELECT MEMBER_HOST, MEMBER_ROLE FROM performance_schema.replication_group_members;
+-------------+-------------+
| MEMBER_HOST | MEMBER_ROLE |
+-------------+-------------+
| mgr2        | PRIMARY     |
| mgr3        | SECONDARY   |
| mgr1        | SECONDARY   |
+-------------+-------------+
3 rows in set (0.00 sec)

maxadmin list servers;
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server             | Address         | Port  | Connections | Status
-------------------+-----------------+-------+-------------+--------------------
server1            | 172.18.80.7     |  3306 |           0 | Master, Running
server2            | 172.18.80.8     |  3306 |           0 | Slave, Running
server3            | 172.18.80.9     |  3306 |           0 | Slave, Running
-------------------+-----------------+-------+-------------+--------------------

测试之前,在mysql07,08,09上打开General Log,命令:

  1. show variables like 'general_log'; -- 查看日志是否开启
  2. set global general_log=on; -- 开启日志功能
  3. show variables like 'general_log_file'; -- 看看日志文件保存位置
  4. set global general_log_file='/tmp/general.log'; -- 设置日志文件保存位置
  5. show variables like 'log_output'; -- 看看日志输出类型 table或file
  6. set global log_output='table'; -- 设置输出类型为 table
  7. set global log_output='file'; -- 设置输出类型为file

general log的关闭参考 https://blog.csdn.net/u010735147/article/details/81871560

读写分离测试

通过客户端连接Maxscale 4006端口

mysql -uchenhao -p -P4006 -h 172.18.80.10
//创建测试库,测试表
CREATE DATABASE web_cmdb charset=utf8;

use web_cmdb;

CREATE TABLE `cmdb_hostsinfo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `host_id` int(11) NOT NULL,
  `host_name` varchar(64) NOT NULL,
  `ip_addr` varchar(64) NOT NULL,
  `brand_name` varchar(10) NOT NULL,
  `type` varchar(32) DEFAULT NULL,
  `cpu_info` varchar(32) NOT NULL,
  `mem_info` varchar(32) NOT NULL,
  `disk_info` varchar(32) NOT NULL,
  `status` int(11) NOT NULL,
  `add_time` date NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;

INSERT INTO `cmdb_hostsinfo` VALUES ('2', '2', 'slavedb02.ueboms.com', '172.16.2.236', 'lenovo', 'x3650 m5', 'Xeon(R) CPU E5-2620 v2', '128g', '1024g', '2', '2017-04-11');

drop table cmdb_hostsinfo;

mysql07日志

2020-10-09T08:13:54.324089-00:00	  352 Connect	[email protected] on  using TCP/IP
2020-10-09T08:14:10.628573-00:00	  352 Query	CREATE DATABASE web_cmdb charset=utf8
2020-10-09T08:14:10.629144-00:00	  352 Query	show warnings
2020-10-09T08:14:10.630166-00:00	  352 Init DB	web_cmdb
2020-10-09T08:14:10.634301-00:00	  352 Query	CREATE TABLE `cmdb_hostsinfo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `host_id` int(11) NOT NULL,
  `host_name` varchar(64) NOT NULL,
  `ip_addr` varchar(64) NOT NULL,
  `brand_name` varchar(10) NOT NULL,
  `type` varchar(32) DEFAULT NULL,
  `cpu_info` varchar(32) NOT NULL,
  `mem_info` varchar(32) NOT NULL,
  `disk_info` varchar(32) NOT NULL,
  `status` int(11) NOT NULL,
  `add_time` date NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4
2020-10-09T08:14:10.695342-00:00	  352 Query	show warnings
2020-10-09T08:14:10.697011-00:00	  352 Query	INSERT INTO `cmdb_hostsinfo` VALUES ('2', '2', 'slavedb02.ueboms.com', '172.16.2.236', 'lenovo', 'x3650 m5', 'Xeon(R) CPU E5-2620v2', '128g', '1024g', '2', '2017-04-11')
2020-10-09T08:14:12.389321-00:00	  352 Query	drop table cmdb_hostsinfo

mysql08日志

2020-10-09T08:13:54.324171-00:00	   88 Connect	[email protected] on  using TCP/IP
2020-10-09T08:13:54.324443-00:00	   88 Query	select @@version_comment limit 1
2020-10-09T08:13:54.326159-00:00	   88 Query	select USER()
2020-10-09T08:14:10.630210-00:00	   88 Init DB	web_cmdb
2020-10-09T08:14:10.722377-00:00	   13 Query	CREATE TABLE `cmdb_hostsinfo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `host_id` int(11) NOT NULL,
  `host_name` varchar(64) NOT NULL,
  `ip_addr` varchar(64) NOT NULL,
  `brand_name` varchar(10) NOT NULL,
  `type` varchar(32) DEFAULT NULL,
  `cpu_info` varchar(32) NOT NULL,
  `mem_info` varchar(32) NOT NULL,
  `disk_info` varchar(32) NOT NULL,
  `status` int(11) NOT NULL,
  `add_time` date NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4
2020-10-09T08:14:10.729531-00:00	   13 Query	BEGIN
2020-10-09T08:14:10.730699-00:00	   13 Query	COMMIT /* implicit, from Xid_log_event */
2020-10-09T08:14:12.425411-00:00	   13 Query	DROP TABLE `cmdb_hostsinfo` /* generated by server */

mysql09日志

2020-10-09T08:13:54.324462-00:00	   63 Connect	[email protected] on  using TCP/IP
2020-10-09T08:14:10.630314-00:00	   63 Init DB	web_cmdb
2020-10-09T08:14:10.725768-00:00	   13 Query	CREATE TABLE `cmdb_hostsinfo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `host_id` int(11) NOT NULL,
  `host_name` varchar(64) NOT NULL,
  `ip_addr` varchar(64) NOT NULL,
  `brand_name` varchar(10) NOT NULL,
  `type` varchar(32) DEFAULT NULL,
  `cpu_info` varchar(32) NOT NULL,
  `mem_info` varchar(32) NOT NULL,
  `disk_info` varchar(32) NOT NULL,
  `status` int(11) NOT NULL,
  `add_time` date NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4
2020-10-09T08:14:10.732867-00:00	   13 Query	BEGIN
2020-10-09T08:14:10.734045-00:00	   13 Query	COMMIT /* implicit, from Xid_log_event */
2020-10-09T08:14:12.425298-00:00	   13 Query	DROP TABLE `cmdb_hostsinfo` /* generated by server */

update cmdb_hostsinfo set host_name='new_slavedb02.ueboms.com' where host_id=2;
select host_id,host_name,ip_addr,brand_name,cpu_info,mem_info from cmdb_hostsinfo;
+---------+----------------------+--------------+------------+------------------------+----------+
| host_id | host_name            | ip_addr      | brand_name | cpu_info               | mem_info |
+---------+----------------------+--------------+------------+------------------------+----------+
|       2 | slavedb02.ueboms.com | 172.16.2.236 | lenovo     | Xeon(R) CPU E5-2620 v2 | 128g     |
+---------+----------------------+--------------+------------+------------------------+----------+
1 row in set (0.00 sec)

mysql07日志

2020-10-09T08:21:12.133170-00:00	  352 Query	update cmdb_hostsinfo set host_name='new_slavedb02.ueboms.com' where host_id=2

mysql08日志

2020-10-09T08:22:19.337614-00:00	   88 Query	select host_id,host_name,ip_addr,brand_name,cpu_info,mem_info from cmdb_hostsinfo

mysql09日志

null ...

通过General Log得知,MaxScale会把MaxScale会把create、insert、update、delete、drop语句的请求转发到mysql07上,select语句的请求转发到mysql08上

模拟mgr一台从库宕机推出集群

//mysql08执行`stop group_replication`

//登陆中间件mysql -uchenhao -p -P4006 -h 172.18.80.10
use web_cmdb;
select host_id,host_name,ip_addr,brand_name,cpu_info,mem_info from cmdb_hostsinfo;

日志

mysql07
2020-10-09T08:50:41.934325-00:00	  355 Query	SET SESSION group_replication_consistency= EVENTUAL
mysql08
2020-10-09T08:50:48.610831-00:00	   93 Query	SET SESSION group_replication_consistency= EVENTUAL
mysql09
2020-10-09T08:50:41.934325-00:00	   66 Query	SET SESSION group_replication_consistency= EVENTUAL
2020-10-09T08:51:27.111586-00:00	   65 Query	select host_id,host_name,ip_addr,brand_name,cpu_info,mem_info from cmdb_hostsinfo

通过查看General Log可以得知,select查询请求不再被转发到mysql08上,而是被转发到mysql09上。

模拟mgr所有从库宕机退出集群

//mysql09执行`stop group_replication`

//登陆中间件mysql -uchenhao -p -P4006 -h 172.18.80.10
use web_cmdb;
select host_id,host_name,ip_addr,brand_name,cpu_info,mem_info from cmdb_hostsinfo;

日志

mysql07
2020-10-09T08:59:38.166458-00:00	  357 Query	select host_id,host_name,ip_addr,brand_name,cpu_info,mem_info from cmdb_hostsinfo
mysql08
null
mysql09
2020-10-09T08:58:44.195557-00:00	   67 Query	stop group_replication
2020-10-09T08:58:51.015489-00:00	   68 Connect
2020-10-09T08:58:51.015635-00:00	   68 Query

通过查看General Log可以得知,select查询请求不再被转发到任何SECONDARY上,而是被转发到mysql07(PRIMARY)上

你可能感兴趣的:(mysql)