daixijun.mysql
mysql
用于快速部署 MySQL 集群。
支持以下几种集群模式:
- 基于 GTID 的主从复制
- 默认开启半同步增强(Semi-Sync)
- 基于 MHA 架构的主从复制
- MGR 单主模式(默认)
- MGR 多主模式
- ReplicaSet 复制集
支持的 MySQL 发行版本:
- Oracle 官方 MySQL Community Server
- 万里开源 GreatSQL
- Percona Percona Server for MySQL
环境要求
- CentOS 7+
- Ansible 2.9+
- MySQL 8.0+
变量
变量名 | 类型 | 默认值 | 变量说明 |
---|---|---|---|
mysql_version | 字符串 | 8.0.23 | MySQL 版本 |
mysql_upgrade | 布尔值 | false | 是否需要执行版本升级操作 |
mysql_download_url | 字符串 | 免安装压缩包下载地址 | |
mysql_inventory_group | 字符串 | mysql | Ansible 主机清单中的组名,默认为 mysql |
mysql_basedir | 字符串 | /usr/local/mysql | 安装目录 |
mysql_datadir | 字符串 | /data/mysql | 数据文件存放目录 |
mysql_logdir | 字符串 | /var/log/mysqld | 日志存放目录 |
mysql_pidfile | 字符串 | /var/run/mysqld/mysqld.pid | PID 文件位置 |
mysql_socket | 字符串 | /var/run/mysqld/mysqld.sock | Socket 文件位置 |
mysql_port | 整数 | 3306 | 监听端口 |
mysql_bind_address | 字符串 | 0.0.0.0 | 监听地址 |
mysql_interface | 字符串 | "" | 指定网卡,默认使用非 lo 的第一张网卡 |
mysql_default_time_zone | 字符串 | +8:00 | 指定时区 |
mysql_character_set_server | 字符串 | utf8mb4 | 默认字符集 |
mysql_collation_server | 字符串 | utf8mb4_general_ci | 默认字符序 |
mysql_max_connections | 整数 | 1005 | 最大连接数 |
mysql_max_user_connections | 整数 | 1000 | 用户最大连接数,必须小于 mysql_max_connections ,需要给管理员预留几个连接处理异常情况 |
mysql_interactive_timeout | 整数 | 28800 | 服务器关闭交互式连接前等待活动的秒数 |
mysql_wait_timeout | 整数 | 28800 | 服务器关闭非交互连接前等待活动的秒数 |
mysql_max_connect_errors | 整数 | 200 | 最大错误连接数 |
mysql_root_password | 字符串 | "" | root 账号的密码 |
mysql_cluster_type | 字符串 | mgr | 集群类型(默认 mgr),可选 mgr (Mysql Group Replication)/ms (主从模式) |
mysql_cluster_name | 字符串 | default | 集群名称,适用于 InnodbCluster/ReplicaSet |
mysql_mha_enabled | 布尔值 | false | 是否开启基于 MHA 的主从高可用 |
mysql_mha_config_dir | 字符串 | /etc/mha | MHA 配置文件目录 |
mysql_mha_manager_workdir | 字符串 | /var/log/mha | MHA 工作目录,存放日志及状态信息 |
mysql_mha_user | 字符串 | mha | 用于连接管理 MySQL 的用户,需要有 ALL 权限 |
mysql_mha_password | 字符串 | "" | MySQL 管理密码 |
mysql_mha_repl_user | 字符串 | repl | 用于 MySQL 主从复制的账号 |
mysql_mha_repl_password | 字符串 | "" | 用于 MySQL 主从复制的密码 |
mysql_mha_ssh_user | 字符串 | root | 节点间通信的 SSH 账号 |
mysql_mha_ssh_port | 整数 | 22 | 节点间通信的 SSH 端口 |
mysql_mha_ping_interval | 整数 | 2 | master 节点状态心跳间隔 |
mysql_mha_vip | 字符串 | "" | 用于绑定到 master 节点的 VIP |
mysql_mha_wechat_token | 字符串 | "" | 企业微信机器人的 Key,用于发送报警通知 |
mysql_mha_proxy | 字符串 | "" | 用于发送报警通知(send_report)脚本使用的代理 |
mysql_repl_user | 字符串 | repl | 用于主从/组复制的账号 |
mysql_repl_password | 字符串 | 用于主从/组复制账号的密码 | |
mysql_group_replication_name | uuid | "" | 组复制集群名,在 MySQL 中使用 SELECT UUID() 或 shell 中使用 uuidgen 生成 |
mysql_group_replication_single_primary_mode | 布尔值 | true | MGR 集群是否为单主模式 |
mysql_innodb_cluster_enable | 布尔值 | true | 是否开启 Innodb Cluster |
mysql_innodb_cluster_username | 字符串 | ic | 用于创建和管理 Innodb Cluster 的账号,需要具备 ALL WITH GRANT OPTION 权限 |
mysql_innodb_cluster_password | 字符串 | "" | 管理密码 |
mysql_proxysql_config | 布尔值 | false | 是否使用 proxysql 作为代理层 |
mysql_proxysql_monitor_username | 字符串 | monitor | proxysql 监控 MGR 状态的账号 |
mysql_proxysql_monitor_password | 字符串 | "" | proxysql 监控 MGR 状态的密码 |
mysql_databases | 数组 | [] | 需要创建的业务数据库 |
mysql_users | 数组 | [] | 需要创建的用户 |
依赖
collections:
示例
安装
ansible-galaxy collection install -r requirements.yml
使用
- hosts: servers
roles:
- { role: mysql, mysql_version: 8.0.20 }
已知问题
- mysql_user 模块对于 MySQL 8.0 以上版本,给用户授权
ALL
权限时会出现幂等性问题 Idempotence all grant
待办事项
- 主从模式下支持半同步复制
- 完善 MHA 下的副作用测试
- 支持版本更新
- 支持节点重建
- 在 MGR 集群中,极端情况下所有节点都宕机后,需要找到 gtid 最大的实例作为 primary 节点重新引导集群
集群异常修复
MGR 集群异步宕机后恢复
取并集,执行 select RECEIVED_TRANSACTION_SET from performance_schema.replication_connection_status
+ show variables like 'gtid_executed'
,然后选择主节点最大者,作为 primary。