diff --git a/mysql_ansible/playbooks/common_config.yml b/mysql_ansible/playbooks/common_config.yml index 1f28ec01f9a1a5ca5ea45fc96efceca49e7960b1..3e5954ec2c9f229662855dd73658f267ccc9303a 100644 --- a/mysql_ansible/playbooks/common_config.yml +++ b/mysql_ansible/playbooks/common_config.yml @@ -1,5 +1,5 @@ ## In most cases, just adjust these two parameters. -mysql_version: "8.0.36" +mysql_version: "8.4.0" mysql_port: 3306 # The 'server_specs' variable defines the hardware specifications for the server deployment. @@ -61,6 +61,7 @@ mysql57_innodb_log_files_in_group: 16 mysql57_innodb_log_file_size: 256M use_write_set: 1 sock_type: 1 # 1 for ${datadir}/mysql.sock, 2 for /tmp/mysql${port}.sock, 3 for ${mysql_data_dir_base}/run/mysql${port}.sock +mgr_use_random_uuid: 1 ## Feature Control Switch fcs_skip_db_mount_verification: 1 @@ -70,6 +71,7 @@ fcs_create_mysql_fast_login: 1 fcs_backup_script_create_backup_user: 1 fcs_mysql_use_jemalloc: 0 fcs_use_greatsql_ha: 1 +fcs_auto_download_mysql: 1 ## Feature Control Switch vars fcs_create_mysql_fast_login_name: db{{ mysql_port }} diff --git a/mysql_ansible/playbooks/default/common_config.yml b/mysql_ansible/playbooks/default/common_config.yml index 1f28ec01f9a1a5ca5ea45fc96efceca49e7960b1..3e5954ec2c9f229662855dd73658f267ccc9303a 100644 --- a/mysql_ansible/playbooks/default/common_config.yml +++ b/mysql_ansible/playbooks/default/common_config.yml @@ -1,5 +1,5 @@ ## In most cases, just adjust these two parameters. -mysql_version: "8.0.36" +mysql_version: "8.4.0" mysql_port: 3306 # The 'server_specs' variable defines the hardware specifications for the server deployment. @@ -61,6 +61,7 @@ mysql57_innodb_log_files_in_group: 16 mysql57_innodb_log_file_size: 256M use_write_set: 1 sock_type: 1 # 1 for ${datadir}/mysql.sock, 2 for /tmp/mysql${port}.sock, 3 for ${mysql_data_dir_base}/run/mysql${port}.sock +mgr_use_random_uuid: 1 ## Feature Control Switch fcs_skip_db_mount_verification: 1 @@ -70,6 +71,7 @@ fcs_create_mysql_fast_login: 1 fcs_backup_script_create_backup_user: 1 fcs_mysql_use_jemalloc: 0 fcs_use_greatsql_ha: 1 +fcs_auto_download_mysql: 1 ## Feature Control Switch vars fcs_create_mysql_fast_login_name: db{{ mysql_port }} diff --git a/mysql_ansible/playbooks/default/var_mgr.yml b/mysql_ansible/playbooks/default/var_mgr.yml index 5bfe0c70f12896c6ad9127e32d71b94ea2b3a713..57c759305c47d103296ff81b1137536a4a58f19c 100644 --- a/mysql_ansible/playbooks/default/var_mgr.yml +++ b/mysql_ansible/playbooks/default/var_mgr.yml @@ -3,9 +3,15 @@ mysql_binlog_format: row mysql_mgr_port: "{{ mysql_port * 10 + 1 }}" sub_nets: 1% mysql_mgr_hosts: - - '192.168.199.171' - - '192.168.199.172' - - '192.168.199.173' -greatsql_vip: 192.168.199.174 + - '192.168.199.131' + - '192.168.199.132' + - '192.168.199.133' + + +# If you have installed MySQL instead of GreatSQL, the following parameters will have no effect. +greatsql_vip: 192.168.199.134 greatsql_net_work_interface: "ens33" greatsql_netmask: "255.255.255.255" +greatsql_group_replication_arbitrator: false +greatsql_group_replication_arbitrator_hosts: + - '192.168.199.133' diff --git a/mysql_ansible/playbooks/pre_tasks/confirmation.yml b/mysql_ansible/playbooks/pre_tasks/confirmation.yml index 03a55373c05f49ac5d3c75991fb2a8ef32beb76f..f0428663a193f455995c9e3311d85076b54267ee 100644 --- a/mysql_ansible/playbooks/pre_tasks/confirmation.yml +++ b/mysql_ansible/playbooks/pre_tasks/confirmation.yml @@ -9,7 +9,7 @@ - name: Assert if OS type is supported ansible.builtin.assert: that: - - os_type in ['BigCloud21', 'BigCloud7', 'BigCloud8', 'Anolis OS8', 'openEuler20', 'CentOS7', 'CentOS8', 'openEuler22', 'RedHat7', 'RedHat8'] + - os_type in ['Rocky9', 'BigCloud21', 'BigCloud7', 'BigCloud8', 'Anolis OS8', 'openEuler24', 'openEuler20', 'CentOS7', 'CentOS8', 'openEuler22', 'RedHat7', 'RedHat8'] fail_msg: "Unsupported OS type: {{ os_type }}" - name: Check for Python 3 @@ -54,6 +54,17 @@ run_once: true delegate_to: localhost +- name: Generate random UUID if mgr_use_random_uuid is set to 1 + command: uuidgen + register: random_uuid_result + when: mgr_use_random_uuid == 1 + run_once: true + delegate_to: localhost + +- set_fact: + mysql_group_replication_group_name: "{{ random_uuid_result.stdout }}" + when: mgr_use_random_uuid == 1 + - name: Display the list of target hosts and additional information ansible.builtin.debug: msg: "{{ base_msg + master_ip_msg + slave_ips_msg + vip_msg + manager_ip_msg }}" diff --git a/mysql_ansible/playbooks/pre_tasks/validate_common_config_setting.yml b/mysql_ansible/playbooks/pre_tasks/validate_common_config_setting.yml index f83b15a780e32ac3318aa7a064bccbdaca801ce1..9bb8e21abdf97011200448248fdc039ec53fbbbe 100644 --- a/mysql_ansible/playbooks/pre_tasks/validate_common_config_setting.yml +++ b/mysql_ansible/playbooks/pre_tasks/validate_common_config_setting.yml @@ -63,7 +63,8 @@ - db_type == 'mysql' and ( (mysql_version.startswith('5.7') and mysql_version is version('5.7.26', '<')) or (mysql_version.startswith('8.0') and mysql_version is version('8.0.28', '<')) or - (not (mysql_version.startswith('5.7') or mysql_version.startswith('8.0'))) + (mysql_version.startswith('8.4') and mysql_version is version('8.4.0', '<')) or + (not (mysql_version.startswith('5.7') or mysql_version.startswith('8.0') or mysql_version.startswith('8.4'))) ) - name: Validate db_type is a valid option diff --git a/mysql_ansible/playbooks/pre_tasks/validate_greatsql_arbitrator.yml b/mysql_ansible/playbooks/pre_tasks/validate_greatsql_arbitrator.yml new file mode 100644 index 0000000000000000000000000000000000000000..3b3383d66e05a5dfff53b842951b43253bd5eeac --- /dev/null +++ b/mysql_ansible/playbooks/pre_tasks/validate_greatsql_arbitrator.yml @@ -0,0 +1,7 @@ +- name: Check if greatsql_group_replication_arbitrator_hosts is a strict subset of mysql_mgr_hosts + ansible.builtin.fail: + msg: "{{ ansible_play_name }}: `greatsql_group_replication_arbitrator_hosts` must be a strict subset of `mysql_mgr_hosts`" + when: > + (greatsql_group_replication_arbitrator_hosts | length >= mysql_mgr_hosts | length) or + (greatsql_group_replication_arbitrator_hosts | difference(mysql_mgr_hosts) | length > 0) or + (greatsql_group_replication_arbitrator_hosts | length == mysql_mgr_hosts | length) diff --git a/mysql_ansible/playbooks/pre_tasks/validate_mgr.yml b/mysql_ansible/playbooks/pre_tasks/validate_mgr.yml index 755bf1002664c97f6c9cbcd29b1fe88b27ed590a..f1dd85f4c4417e9c8f03396a652f6ad1083a495b 100644 --- a/mysql_ansible/playbooks/pre_tasks/validate_mgr.yml +++ b/mysql_ansible/playbooks/pre_tasks/validate_mgr.yml @@ -21,6 +21,10 @@ msg: "Invalid number of elements in mysql_mgr_hosts list" when: "mysql_mgr_hosts | length not in [3, 4, 5, 6, 7, 8, 9]" +- name: Validate GreatSQL arbitrator var + ansible.builtin.import_tasks: validate_greatsql_arbitrator.yml + when: db_type == 'greatsql' and greatsql_group_replication_arbitrator + - name: Validate GreatSQL HA var ansible.builtin.import_tasks: validate_greatsql_ha.yml when: db_type == 'greatsql' and fcs_use_greatsql_ha == 1 diff --git a/mysql_ansible/playbooks/single_node.yml b/mysql_ansible/playbooks/single_node.yml index d37f210c7e4dcff43fe03b5dd350068afe22e22b..eddc63a1420642368352a8250f7f1705a97f1d45 100644 --- a/mysql_ansible/playbooks/single_node.yml +++ b/mysql_ansible/playbooks/single_node.yml @@ -12,6 +12,7 @@ - "../roles/pre_check_and_set" - "../roles/mysql_server" mtls_with_mysql_group_replication: 0 + roles_precheckandset_check_networkcardnames: 1 pre_tasks: - name: Import tasks to validate setting in common_config.yml ansible.builtin.import_tasks: pre_tasks/validate_common_config_setting.yml diff --git a/mysql_ansible/playbooks/vars/var_mgr.yml b/mysql_ansible/playbooks/vars/var_mgr.yml index 5bfe0c70f12896c6ad9127e32d71b94ea2b3a713..57c759305c47d103296ff81b1137536a4a58f19c 100644 --- a/mysql_ansible/playbooks/vars/var_mgr.yml +++ b/mysql_ansible/playbooks/vars/var_mgr.yml @@ -3,9 +3,15 @@ mysql_binlog_format: row mysql_mgr_port: "{{ mysql_port * 10 + 1 }}" sub_nets: 1% mysql_mgr_hosts: - - '192.168.199.171' - - '192.168.199.172' - - '192.168.199.173' -greatsql_vip: 192.168.199.174 + - '192.168.199.131' + - '192.168.199.132' + - '192.168.199.133' + + +# If you have installed MySQL instead of GreatSQL, the following parameters will have no effect. +greatsql_vip: 192.168.199.134 greatsql_net_work_interface: "ens33" greatsql_netmask: "255.255.255.255" +greatsql_group_replication_arbitrator: false +greatsql_group_replication_arbitrator_hosts: + - '192.168.199.133' diff --git a/mysql_ansible/roles/install_xtrabackup/tasks/install_xtrabackup.yml b/mysql_ansible/roles/install_xtrabackup/tasks/install_xtrabackup.yml index 10a13832815d8e4090544f215e7ab7d3edc1f107..d887e9c79c8ad1a6342aa17dafea7918e244977a 100644 --- a/mysql_ansible/roles/install_xtrabackup/tasks/install_xtrabackup.yml +++ b/mysql_ansible/roles/install_xtrabackup/tasks/install_xtrabackup.yml @@ -1,7 +1,7 @@ -- name: Fail if mysql version is 8.0 +- name: Fail if mysql version is not 5.7 ansible.builtin.fail: msg: "backup script is only support MySQL 5.7 !" - when: mysql_package.split('.')[0] == 'mysql-8' and mysql_package.split('.')[1] == '0' + when: not (mysql_version.startswith('5.7') - name: Install xtrabackup dependents ansible.builtin.yum: @@ -21,15 +21,15 @@ - name: Transfer xtrabackup ansible.builtin.copy: - src: "../files/{{ (os_type in ['BigCloud21', 'openEuler22', 'openEuler20', 'CentOS8', 'BigCloud8', 'Anolis OS8']) | ternary('percona-xtrabackup-24-2.4.28-1.el8.x86_64.rpm', 'percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm') }}" - dest: "/tmp/{{ (os_type in ['BigCloud21', 'openEuler22', 'openEuler20', 'CentOS8', 'BigCloud8', 'Anolis OS8']) | ternary('percona-xtrabackup-24-2.4.28-1.el8.x86_64.rpm', 'percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm') }}" + src: "../files/{{ (os_type in ['Rocky9', 'BigCloud21', 'openEuler24', 'openEuler22', 'openEuler20', 'CentOS8', 'BigCloud8', 'Anolis OS8']) | ternary('percona-xtrabackup-24-2.4.28-1.el8.x86_64.rpm', 'percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm') }}" + dest: "/tmp/{{ (os_type in ['Rocky9', 'BigCloud21', 'openEuler24', 'openEuler22', 'openEuler20', 'CentOS8', 'BigCloud8', 'Anolis OS8']) | ternary('percona-xtrabackup-24-2.4.28-1.el8.x86_64.rpm', 'percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm') }}" mode: '0755' owner: "{{ mysql_user }}" group: "{{ mysql_group }}" - name: Install xtrabackup ansible.builtin.yum: - name: "/tmp/{{ (os_type in ['BigCloud21', 'openEuler22', 'openEuler20', 'CentOS8', 'BigCloud8', 'Anolis OS8']) | ternary('percona-xtrabackup-24-2.4.28-1.el8.x86_64.rpm', 'percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm') }}" + name: "/tmp/{{ (os_type in ['Rocky9', 'BigCloud21', 'openEuler24', 'openEuler22', 'openEuler20', 'CentOS8', 'BigCloud8', 'Anolis OS8']) | ternary('percona-xtrabackup-24-2.4.28-1.el8.x86_64.rpm', 'percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm') }}" state: present disable_gpg_check: true diff --git a/mysql_ansible/roles/make_mgr/tasks/main.yml b/mysql_ansible/roles/make_mgr/tasks/main.yml index 0c4bff6aaee34c8c591e830161ba17a2539e6f81..0bdca1eee0fa65975408db4f0cdd302d43fb357b 100644 --- a/mysql_ansible/roles/make_mgr/tasks/main.yml +++ b/mysql_ansible/roles/make_mgr/tasks/main.yml @@ -1,7 +1,7 @@ -- name: Fail if mysql version is not 8.0 +- name: Fail if mysql version is not 8.0.x or 8.4.x ansible.builtin.fail: - msg: "group replication install playbook only support 8.0!" - when: mysql_package.split('.')[0] != 'mysql-8' and mysql_package.split('.')[1] != '0' + msg: "group replication install playbook only support 8.0.x or 8.4.x!" + when: not (mysql_version.startswith('8.0') or mysql_version.startswith('8.4')) - name: Check is mysqld install by dbops or not ansible.builtin.stat: diff --git a/mysql_ansible/roles/make_mgr/templates/config_group_replication.sql.j2 b/mysql_ansible/roles/make_mgr/templates/config_group_replication.sql.j2 index a85e5c206e187b0fda3551f24ac6ebc23f11568b..99b2ad8d5c0040e1c18362c4b4c558ca3a51b969 100644 --- a/mysql_ansible/roles/make_mgr/templates/config_group_replication.sql.j2 +++ b/mysql_ansible/roles/make_mgr/templates/config_group_replication.sql.j2 @@ -5,11 +5,19 @@ set sql_log_bin=1; install plugin group_replication soname 'group_replication.so'; +{% if mysql_version.startswith('8.4') and db_type == 'mysql' %} +change replication source to + source_user='{{ mysql_mgr_user }}', + source_password='{{ mysql_mgr_password }}' + for channel 'group_replication_recovery'; + +{% else %} + change master to master_user='{{ mysql_mgr_user }}', master_password='{{ mysql_mgr_password }}' for channel 'group_replication_recovery'; - +{% endif %} {% if mysql_mgr_hosts[0] in ansible_all_ipv4_addresses %} @@ -20,4 +28,3 @@ change master to select sleep(15); start group_replication; {% endif %} - diff --git a/mysql_ansible/roles/make_replication/templates/master_slaves.sql.j2 b/mysql_ansible/roles/make_replication/templates/master_slaves.sql.j2 index 4ac6ff1598eb6e16ba72a6673a7e7f952664acd3..b7eef0ac154fe3485a00305ad50eccebcf440d36 100644 --- a/mysql_ansible/roles/make_replication/templates/master_slaves.sql.j2 +++ b/mysql_ansible/roles/make_replication/templates/master_slaves.sql.j2 @@ -7,6 +7,17 @@ select sleep(10); set @@global.super_read_only=on; +{% if mysql_version.startswith('8.4') and db_type == 'mysql' %} +change replication source to + source_host='{{master_ip}}', + source_port={{mysql_port}}, + source_user='{{mysql_rple_user}}', + source_password='{{mysql_rple_password}}', + source_auto_position=1, + get_source_public_key=1; + +start replica; +{% else %} change master to master_host='{{master_ip}}', master_port={{mysql_port}}, @@ -16,3 +27,4 @@ change master to start slave; {% endif %} +{% endif %} diff --git a/mysql_ansible/roles/mysql_server/tasks/initialize_mysql_datadir.yml b/mysql_ansible/roles/mysql_server/tasks/initialize_mysql_datadir.yml index 07e09f83e0889ac08e00f881c464521ecfface25..b4712bfc95d00aab428d4a9efcbe20ab6916ab43 100644 --- a/mysql_ansible/roles/mysql_server/tasks/initialize_mysql_datadir.yml +++ b/mysql_ansible/roles/mysql_server/tasks/initialize_mysql_datadir.yml @@ -3,7 +3,8 @@ when: " '-5.7' in mysql_package " changed_when: true -- name: Initialize-insecure for mysql-8.0.x +- name: Initialize-insecure for mysql-8.0.x or mysql-8.4.x ansible.builtin.command: /usr/local/mysql/bin/mysqld --defaults-file={{ mysql_data_dir_base }}/etc/{{ mysql_port }}/my.cnf --initialize-insecure - when: " '-8.0' in mysql_package " + when: " '-8.0' in mysql_package or '-8.4' in mysql_package " changed_when: true + diff --git a/mysql_ansible/roles/mysql_server/tasks/install_mysql_dependents.yml b/mysql_ansible/roles/mysql_server/tasks/install_mysql_dependents.yml index 57cba1a4d8d9003c9c907339572edd3b5c5721bd..3d008c70836213c45ba4d129c07ac0146c28dfcf 100644 --- a/mysql_ansible/roles/mysql_server/tasks/install_mysql_dependents.yml +++ b/mysql_ansible/roles/mysql_server/tasks/install_mysql_dependents.yml @@ -24,7 +24,7 @@ - name: Set jemalloc rpm file name based on OS ansible.builtin.set_fact: - mysql_server__jemalloc_rpm_file: "{{ 'jemalloc-3.6.0-1.el8.x86_64.rpm' if os_type in ['openEuler22', 'openEuler20', 'BigCloud21', 'CentOS8', 'BigCloud8', 'Anolis OS8'] else 'jemalloc-3.6.0-1.el7.x86_64.rpm' }}" + mysql_server__jemalloc_rpm_file: "{{ 'jemalloc-3.6.0-1.el8.x86_64.rpm' if os_type in ['Rocky9', 'openEuler24', 'openEuler22', 'openEuler20', 'BigCloud21', 'CentOS8', 'BigCloud8', 'Anolis OS8'] else 'jemalloc-3.6.0-1.el7.x86_64.rpm' }}" - name: Copy jemalloc rpm to target server ansible.builtin.copy: diff --git a/mysql_ansible/roles/mysql_server/tasks/mkdir_and_config_file.yml b/mysql_ansible/roles/mysql_server/tasks/mkdir_and_config_file.yml index 9a7e545fcb8d13dfb593b6a78906117cfec51c78..564d35bd888df500c0b0a1ca92787c04ce31933a 100644 --- a/mysql_ansible/roles/mysql_server/tasks/mkdir_and_config_file.yml +++ b/mysql_ansible/roles/mysql_server/tasks/mkdir_and_config_file.yml @@ -33,7 +33,7 @@ mode: '0644' backup: true -- name: Config /etc/my.cnf for mysql-8.x.x +- name: Config /etc/my.cnf for mysql-8.0.x when: mysql_version.startswith('8.0') and db_type == 'mysql' ansible.builtin.template: src: ../templates/8.0/my.cnf.j2 @@ -43,6 +43,16 @@ mode: '0644' backup: true +- name: Config /etc/my.cnf for mysql-8.4.x + when: mysql_version.startswith('8.4') and db_type == 'mysql' + ansible.builtin.template: + src: ../templates/8.4/my.cnf.j2 + dest: "{{ mysql_data_dir_base }}/etc/{{ mysql_port }}/my.cnf" + owner: "{{ mysql_user }}" + group: "{{ mysql_group }}" + mode: '0644' + backup: true + - name: Config /etc/my.cnf for percona-5.7.x when: mysql_version.startswith('5.7') and db_type == 'percona' ansible.builtin.template: diff --git a/mysql_ansible/roles/mysql_server/templates/8.0/greatsql-my.cnf.j2 b/mysql_ansible/roles/mysql_server/templates/8.0/greatsql-my.cnf.j2 index 00fb12f41e9718d3e45ba90d0f3d78bd82403949..3ec46ce8bbd497f5af2ecfab09d1e60c8435e6e7 100644 --- a/mysql_ansible/roles/mysql_server/templates/8.0/greatsql-my.cnf.j2 +++ b/mysql_ansible/roles/mysql_server/templates/8.0/greatsql-my.cnf.j2 @@ -211,7 +211,9 @@ loose-group_replication_compression_threshold =1024 loose-group_replication_flow_control_mode =QUOTA # QUOTA loose-group_replication_consistency =BEFORE_ON_PRIMARY_FAILOVER # EVENTUAL loose-group_replication_exit_state_action =OFFLINE_MODE # READ_ONLY -loose-group_replication_paxos_single_leader =on # off +loose-group_replication_paxos_single_leader =off # off +loose-group_replication_single_primary_fast_mode =1 # 0 +loose-group_replication_primary_election_mode =GTID_FIRST # WEIGHT_ONLY {% for ip in ansible_all_ipv4_addresses %} {%- for host_ip in mysql_mgr_hosts %} {%- if ip == host_ip %} @@ -294,3 +296,8 @@ loose-group_replication_single_primary_mode=1 loose-group_replication_enforce_update_everywhere_checks=0 {% endif %} + +{% if greatsql_group_replication_arbitrator and inventory_hostname in greatsql_group_replication_arbitrator_hosts %} +#GreatSQL MGR arbitrator +loose-group_replication_arbitrator = ON +{% endif %} diff --git a/mysql_ansible/roles/mysql_server/templates/8.4/my.cnf.j2 b/mysql_ansible/roles/mysql_server/templates/8.4/my.cnf.j2 new file mode 100644 index 0000000000000000000000000000000000000000..89f15c9c4c2df18f7f0342e619f727fc37d34aae --- /dev/null +++ b/mysql_ansible/roles/mysql_server/templates/8.4/my.cnf.j2 @@ -0,0 +1,247 @@ +[mysql] +auto-rehash + +[mysqld] +##: User Configuration +####: Global Configuration Defaults +user = {{ mysql_user }} # mysql +basedir = {{ mysql_base_dir }} # /usr/local/mysql/ +datadir = {{ mysql_data_dir_base }}/data/{{ mysql_port }} # /usr/local/mysql/data +tmpdir = {{ mysql_data_dir_base }}/tmp/{{ mysql_port }} +log_bin = {{ mysql_data_dir_base }}/log/binlog/{{ mysql_port }}/mysql-bin # ON +relay_log = {{ mysql_data_dir_base }}/log/relaylog/{{ mysql_port }}/relay-bin +innodb_log_group_home_dir = {{ mysql_data_dir_base }}/log/redolog/{{ mysql_port }} # datadir +port = {{ mysql_port }} # 3306 +admin_port = {{ (mysql_port*10 + 2) | string }} # 33062 +mysqlx_port = {{ (mysql_port*10) | string }} # 33060 +{% if sock_type == 1 %} +socket = mysql.sock # /tmp/mysql.sock +mysqlx_socket = mysqlx.sock # /tmp/mysqlx.sock +{% elif sock_type == 2 %} +socket = /tmp/mysql{{ mysql_port }}.sock +mysqlx_socket = /tmp/mysqlx{{ mysql_port }}.sock +{% elif sock_type == 3 %} +socket = {{ mysql_data_dir_base }}/run/mysql{{ mysql_port }}.sock +mysqlx_socket = {{ mysql_data_dir_base }}/run/mysqlx{{ mysql_port }}.sock +{% endif %} + +####: Customizable User Settings +character_set_server = {{ mysql_character_set_server }} # utf8mb4 +max_connections = {{ mysql_max_connections | default(1000) }} # 151 +transaction_isolation = {{ mysql_transaction_isolation }} # REPEATABLE-READ +innodb_open_files = {{ mysql_innodb_open_files }} # -1 (auto) +innodb_log_buffer_size = {{ mysql_innodb_log_buffer_size }} # 67108864(64M) +default_time_zone = {{ mysql_default_time_zone }} + +##: Automatic Settings +####: Auto-Generated by dbops +server_id = {{ mysql_server_id }} # 0 +report_host = {{ ansible_default_ipv4.address }} + +####: Special Calculations by dbops +thread_cache_size = {{ [(server_specs_processor_count | int ) * 8, 256 ] | max }} # 8 + (max_connections / 100), capped to a limit of 100 +table_open_cache_instances = {{ [(server_specs_processor_count | int ) // 2, 16 ] | max }} # 16 +replica_parallel_workers = {{ [(server_specs_processor_count | int ) * 4 ,32] | min }} # 0 + +####: Dedicated Server Settings or Auto-Generated by dbops Specifications +{% if server_specs != "auto" %} +innodb_read_io_threads={{ [(server_specs_processor_count | int) // 2, 4] | max }} # (available logical processors / 2), min of 4 +innodb_purge_threads={{ 1 if server_specs_processor_count | int <= 16 else 4 }} # 1 if # of available logical processors is <= 16; otherwise 4 +innodb_parallel_read_threads={{ [(server_specs_processor_count | int) // 8, 4] | max }} # Default value: calculated by the number of available logical processors on the system divided by 8, with a minimum default value of 4 +{# 根据服务器规格设置innodb_buffer_pool_size和innodb_buffer_pool_instances #} +{% set temp_ram = server_specs_memtotal_gb | int * 0.03 %} +{% set temptable_max_ram_val = [temp_ram, 1] %} +{% if temptable_max_ram_val | max > 4 %} +{% set temptable_max_ram_final = 4 %} +{% else %} +{% set temptable_max_ram_final = temptable_max_ram_val | max %} +{% endif %} +temptable_max_ram={{ (temptable_max_ram_final | round(0, 'ceil')) | int }}GB # 3% of total memory: min 1 GB, max 4 GB +{% set innodb_buffer_pool_size_mb = ((server_specs_memtotal_gb | int) * 0.6 * 1024) | round(0, 'ceil') | int %} +innodb_buffer_pool_size={{ innodb_buffer_pool_size_mb }}M # 134217728(128M) # dbops set it 60% of total memory +{% if innodb_buffer_pool_size_mb <= 1024 %} +innodb_buffer_pool_instances=1 # 1 if innodb_buffer_pool_size <= 1 GiB; otherwise min(1/2*(innodb_buffer_pool_size/innodb_buffer_pool_chunk_size), 1/4*CPU cores), range 1-64. +{% else %} +{% set buffer_pool_chunk_size_mb = 128 %} +{% set buffer_pool_hint = (innodb_buffer_pool_size_mb / buffer_pool_chunk_size_mb / 2) | round(0, 'ceil') | int %} +{% set cpu_hint = server_specs_processor_count | int // 4 %} +{% set instances = [buffer_pool_hint, cpu_hint, 64] | min %} +innodb_buffer_pool_instances={{ instances }} # 1 if innodb_buffer_pool_size <= 1 GiB; otherwise min(1/2*(innodb_buffer_pool_size/innodb_buffer_pool_chunk_size), 1/4*CPU cores), range 1-64. +{% endif %} +{% set redo_log_capacity_gb = ((server_specs_processor_count | int) / 2) | round(0, 'ceil') | int %} +{% if redo_log_capacity_gb > 16 %} +{% set redo_log_capacity_gb = 16 %} +{% endif %} +innodb_redo_log_capacity={{ redo_log_capacity_gb }}GB # Setup by dbops, refer to the implementation of innodb_dedicated_server. Redo log capacity: (logical processors / 2) GB, max 16 GB. +{% endif %} +{% if server_specs == "auto" %} +innodb_dedicated_server=ON # OFF , ON will auto set innodb_buffer_pool_size and innodb_redo_log_capacity +{% else %} +innodb_dedicated_server=OFF # OFF +{% endif %} + +##: Standard Configurations +log_bin_trust_function_creators = ON # OFF +max_prepared_stmt_count = 1048576 # 16382 +log_timestamps = SYSTEM # UTC +pid_file = mysqld.pid +read_only = OFF # OFF +super_read_only = OFF # OFF +skip_name_resolve = ON # OFF +auto_increment_increment = 1 # 1 +auto_increment_offset = 1 # 1 +lower_case_table_names = 1 # 0 +open_files_limit = 65536 # 5000, with possible adjustment +table_open_cache = 4000 # 4000 +table_definition_cache = 2000 # MIN(400 + table_open_cache / 2, 2000) +local_infile = OFF # OFF +disabled_storage_engines = archive,blackhole,example,federated,memory,merge,ndb,myisam # empty +plugin_load = "rpl_semi_sync_source=semisync_source.so;rpl_semi_sync_replica=semisync_replica.so" +admin_address = 127.0.0.1 # null +event_scheduler = OFF # ON +sql_require_primary_key = ON # OFF +activate_all_roles_on_login = ON # OFF +plugin-load-add = mysql_clone.so +#default_authentication_plugin = caching_sha2_password # caching_sha2_password +explicit_defaults_for_timestamp = ON # ON +log_error_verbosity = 2 # 2 +max_allowed_packet = 64M # 64M +terminology_use_previous = NONE # NONE +autocommit = ON # ON +sql_generate_invisible_primary_key = ON # OFF + +####: for binlog +binlog_expire_logs_seconds = 604800 # 2592000 (equivalent to 30 days) +binlog_error_action = ABORT_SERVER # ABORT_SERVER +binlog_rows_query_log_events = ON # OFF +log_replica_updates = ON # ON +binlog_checksum = CRC32 # CRC32 +sync_binlog = 1 # 1 +replica_preserve_commit_order = ON # ON + +####: for gtid +gtid_executed_compression_period = 0 # 0 +gtid_mode = ON # OFF +enforce_gtid_consistency = ON # OFF + +####: for replication +skip_replica_start = OFF # OFF +relay_log_recovery = ON # OFF +#replica_parallel_type = LOGICAL_CLOCK # LOGICAL_CLOCK, is deprecated and will be removed in a future release + +loose-rpl_semi_sync_source_enabled = ON # OFF +loose-rpl_semi_sync_replica_enabled = ON # OFF +loose-rpl_semi_sync_source_timeout = 1000 # 10000(10 second) +binlog_group_commit_sync_delay = 500 # 0 500(0.05% second) +binlog_group_commit_sync_no_delay_count = 13 # 0 + +####: for error-log +log_error = error.log # hostname.err + +general_log = OFF # OFF +general_log_file = general.log # hostname.log + +####: for slow query log +slow_query_log = ON # OFF +slow_query_log_file = slow.log # hostname.log +log_queries_not_using_indexes = OFF # OFF +long_query_time = 2.000000 # 10.000000 + + + +####: for innodb +default_storage_engine = InnoDB # InnoDB +default_tmp_storage_engine = InnoDB # InnoDB +innodb_data_file_path = ibdata1:64M:autoextend # ibdata1:12M:autoextend +innodb_temp_data_file_path = ibtmp1:12M:autoextend # ibtmp1:12M:autoextend +innodb_buffer_pool_filename = ib_buffer_pool # ib_buffer_pool +innodb_file_per_table = ON # ON +innodb_online_alter_log_max_size = 128M # 134217728(128M) +innodb_page_size = 16K # 16384(16K) +innodb_thread_concurrency = 0 # 0 +innodb_write_io_threads = 4 # 4 +innodb_print_all_deadlocks = ON # OFF +innodb_deadlock_detect = ON # ON +innodb_lock_wait_timeout = 50 # 50 +innodb_spin_wait_delay = 6 # 6 +innodb_autoinc_lock_mode = 2 # 1 +innodb_io_capacity = 10000 # 10000 +innodb_io_capacity_max = 20000 # 2 * innodb_io_capacity +innodb_adaptive_hash_index = OFF # OFF +innodb_change_buffering = none # none +innodb_flush_neighbors = 0 # 0 +innodb_doublewrite = ON # ON +innodb_flush_log_at_timeout = 1 # 1 +innodb_flush_log_at_trx_commit = 1 # 1 +#innodb_flush_method = O_DIRECT # fsync +#innodb_change_buffer_max_size = 25 # 25 + +innodb_old_blocks_pct = 37 # 37 +innodb_old_blocks_time = 1000 # 1000 + +innodb_read_ahead_threshold = 56 # 56 (0..64) +innodb_random_read_ahead = OFF # OFF + +innodb_buffer_pool_dump_pct = 25 # 25 +innodb_buffer_pool_dump_at_shutdown = ON # ON +innodb_buffer_pool_load_at_startup = ON # ON + +innodb_undo_log_truncate = ON # ON +innodb_max_undo_log_size = 2G # 1G + +innodb_stats_auto_recalc = ON # ON +innodb_stats_persistent = ON # ON +innodb_stats_persistent_sample_pages = 20 # 20 + +####: for performance_schema +performance_schema = ON # ON +performance_schema_show_processlist = ON # OFF + +performance_schema_consumer_events_stages_current = ON # OFF +performance_schema_consumer_events_stages_history = ON # OFF +performance_schema_consumer_events_stages_history_long = OFF # OFF +performance_schema_consumer_events_statements_cpu = OFF # OFF +performance_schema_consumer_events_statements_current = ON # ON +performance_schema_consumer_events_statements_history = ON # ON +performance_schema_consumer_events_statements_history_long = OFF # OFF +performance_schema_consumer_events_transactions_current = ON # ON +performance_schema_consumer_events_transactions_history = ON # ON +performance_schema_consumer_events_transactions_history_long = OFF # OFF +performance_schema_consumer_events_waits_current = ON # OFF +performance_schema_consumer_events_waits_history = ON # OFF +performance_schema_consumer_events_waits_history_long = OFF # OFF +performance_schema_consumer_global_instrumentation = ON # ON +performance_schema_consumer_thread_instrumentation = ON # ON +performance_schema_consumer_statements_digest = ON # ON + +performance_schema_instrument = 'memory/%=COUNTED' + +{% if mtls_with_mysql_group_replication == 1 %} +####: for mysql group replication +loose-group_replication_recovery_retry_count = 10 # 10 +loose-group_replication_recovery_reconnect_interval = 60 # 60 +loose-group_replication_ip_allowlist = AUTOMATIC # AUTOMATIC +loose-group_replication_group_name = "{{ mysql_group_replication_group_name if mgr_use_random_uuid == 1 else 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' }}" +loose-group_replication_start_on_boot = OFF # ON +loose-group_replication_bootstrap_group = OFF # OFF +loose-group_replication_single_primary_mode = ON # ON +loose-group_replication_enforce_update_everywhere_checks = OFF # OFF +loose-group_replication_gtid_assignment_block_size = 1000000 # 1000000 +loose-group_replication_poll_spin_loops = 0 # 0 +loose-group_replication_compression_threshold = 1000000 # 1000000 +loose-group_replication_flow_control_mode = QUOTA # QUOTA +loose-group_replication_consistency = BEFORE_ON_PRIMARY_FAILOVER # BEFORE_ON_PRIMARY_FAILOVER +loose-group_replication_exit_state_action = OFFLINE_MODE # OFFLINE_MODE +loose-group_replication_paxos_single_leader = ON # OFF +loose-group_replication_recovery_get_public_key = ON # OFF +{% for ip in ansible_all_ipv4_addresses %} + {%- for host_ip in mysql_mgr_hosts %} + {%- if ip == host_ip %} +loose-group_replication_local_address = "{{ ip }}:{{ mysql_mgr_port }}" + {%- endif %} + {%- endfor %} +{% endfor %} + +{% set gs = ':' + (mysql_mgr_port | string)+',' %} +loose-group_replication_group_seeds = "{{ mysql_mgr_hosts | join(gs) + ':' + (mysql_mgr_port | string) }}" +{% endif %} diff --git a/mysql_ansible/roles/mysql_server/templates/mysql.service.j2 b/mysql_ansible/roles/mysql_server/templates/mysql.service.j2 index 876e8d4b99b51645755598e8f169ca9781a25dee..1cb68159ad8b4fa7dc48ec3fd43c83291d0543e2 100644 --- a/mysql_ansible/roles/mysql_server/templates/mysql.service.j2 +++ b/mysql_ansible/roles/mysql_server/templates/mysql.service.j2 @@ -25,7 +25,7 @@ TimeoutStartSec=900 TimeoutStopSec=0 Environment=MYSQLD_PARENT_PID=1 {% if fcs_mysql_use_jemalloc == 1 %} -{% if os_type in ['openEuler22','openEuler20','BigCloud21'] %} +{% if os_type in ['Rocky9', 'openEuler24','openEuler22','openEuler20','BigCloud21'] %} Environment="LD_PRELOAD=/usr/lib64/libjemalloc.so.2" {% else %} Environment="LD_PRELOAD=/usr/lib64/libjemalloc.so.1" diff --git a/mysql_ansible/roles/mysql_server/templates/secure.sql.j2 b/mysql_ansible/roles/mysql_server/templates/secure.sql.j2 index 3457450336983a2ca1bb351499d7fda7c63d9769..ea57a1a68072aeecb3ea757bc7adbc5c996a64f9 100644 --- a/mysql_ansible/roles/mysql_server/templates/secure.sql.j2 +++ b/mysql_ansible/roles/mysql_server/templates/secure.sql.j2 @@ -4,5 +4,8 @@ set sql_log_bin=0; alter user {{ mysql_admin_user }}@'localhost' identified by '{{ mysql_admin_password }}' ; create user {{ mysql_admin_user }}@'127.0.0.1' identified by '{{ mysql_admin_127_password }}' ; grant all on *.* to {{ mysql_admin_user }}@'127.0.0.1' with grant option; + {% if mysql_version.startswith('8.4') %} + INSTALL COMPONENT 'file://component_validate_password'; + {% endif %} set sql_log_bin=1; diff --git a/mysql_ansible/roles/pre_check_and_set/tasks/main.yml b/mysql_ansible/roles/pre_check_and_set/tasks/main.yml index 3df89c1703280c2b2b39f17c50fbbb3fa974f172..e32504c6dcdea61005ecc18bc5ffcb8b88e6ffd4 100644 --- a/mysql_ansible/roles/pre_check_and_set/tasks/main.yml +++ b/mysql_ansible/roles/pre_check_and_set/tasks/main.yml @@ -10,7 +10,8 @@ ansible.builtin.yum: name: ncurses-compat-libs state: present - when: os_type in ['BigCloud21', 'openEuler22', 'openEuler20', 'CentOS8', 'RedHat8', 'BigCloud8', 'Anolis OS8'] + enablerepo: "{{ 'devel' if os_type == 'Rocky9' else omit }}" + when: os_type in ['Rocky9', 'BigCloud21', 'openEuler24', 'openEuler22', 'openEuler20', 'CentOS8', 'RedHat8', 'BigCloud8', 'Anolis OS8'] - name: Intall tar for openEuler20 ansible.builtin.yum: @@ -167,6 +168,7 @@ fail_msg: "Network card names are different!" run_once: true delegate_to: 127.0.0.1 + when: roles_precheckandset_check_networkcardnames is not defined or roles_precheckandset_check_networkcardnames != 0 - name: Delete /tmp/net_aliases.txt ansible.builtin.file: