ansible 构建 MariaDB Galera Cluster 分布式数据库集群
作者:互联网
1、环境
192.168.56.21 ansible 192.168.56.20 es1 192.168.56.19 es2 192.168.56.18 es3
2、目录总览,包括mxc、主从和单节点安装
[root@mgr ~]# tree mariadb mariadb ├── common │ ├── config_master_slaves.yaml │ ├── config_mxc.yaml │ ├── config_mysql_service_and_start_mysql.yaml │ ├── create_user_and_config_file.yaml │ ├── initialize_mysql_datadir.yaml │ ├── install_mysql_dependents.yaml │ ├── install_mysql.yaml │ ├── make_mysql_security.yaml ├── install_mariadb_galera_cluster.yaml ├── install_master_slaves.yaml ├── install_single_mysql.yaml ├── softwares │ └── mariadb-10.2.24-linux-x86_64.tar.gz ├── template │ ├── confmxc.cnf │ ├── master_slaves.sql │ ├── my.cnf │ ├── mysql.conf │ ├── mysql.service │ ├── secure.sql │ ├── startmxc.sh ├── uninstall.yaml └── vars ├── config.yaml ├── mariadb_galera_cluster.yaml └── master_slaves.yaml
3、install_mariadb_galera_cluster.yaml,本文只是介绍mxc 的配置,其他配置我会发下载连接
[root@mgr mariadb]# cat install_mariadb_galera_cluster.yaml --- - hosts: es remote_user: root become_user: root vars_files: - ./vars/config.yaml - ./vars/mariadb_galera_cluster.yaml tasks: - name: create user and config file import_tasks: common/create_user_and_config_file.yaml - name: install mysql dependents import_tasks: common/install_mysql_dependents.yaml - name: install mysql to /usr/local/mysql import_tasks: common/install_mysql.yaml - name: init mysql datadir import_tasks: common/initialize_mysql_datadir.yaml - name: config mysql service and start mysql import_tasks: common/config_mysql_service_and_start_mysql.yaml - name: sleep 15's shell: sleep 15 - name: make mysql secure import_tasks: common/make_mysql_security.yaml - name: config mysql group replication import_tasks: common/config_mxc.yaml ... [root@mgr mariadb]#
4、config.yaml
[root@mgr mariadb]# cat vars/config.yaml --- #mysql 安装包所在的目录 mariadb_packages_dir: /root/mariadb/softwares/ mariadb_package_name: mariadb-10.2.24-linux-x86_64.tar.gz #linux 系统级别mysql用户相关信息 mysql_user: mysql mysql_group: mysql mysql_user_uid: 3306 mysql_user_gid: 3306 #mysql 安装目录 mysql_base_dir: /usr/local/mysql/ #mysql 真正的datadir就会是mysql_data_dir_base+mysql_port mysql_data_dir_base: /database/mysql/data/ mysql_port: 3306 mysql_root_password: mariadb0352 mysql_rple_user: repl mysql_rple_password: repl0352 mysql_wsrep_sst_user: sstuser mysql_wsrep_sst_password: sstuser1234 #mysql 配置文件模版 mysql_binlog_format: row mysql_innodb_log_files_in_group: 16 mysql_innodb_log_file_size: 256M mysql_innodb_log_buffer_size: 64M mysql_innodb_open_files: 65535 mysql_max_connections: 1000 mysql_thread_cache_size: 256 mysql_sync_binlog: 1 mysql_binlog_cache_size: 64K mysql_innodb_online_alter_log_max_size: 128M mysql_performance_schema: 'on' with_php: 1 with_mariadb_galera_cluster: 0 [root@mgr mariadb]#
5、mariadb_galera_cluster.yaml
[root@mgr mariadb]# cat vars/mariadb_galera_cluster.yaml with_mariadb_galera_cluster: 1 mxc_port: 4567 mxc_hosts: - '192.168.56.18' - '192.168.56.19' - '192.168.56.20' [root@mgr mariadb]#
6、create_user_and_config_file.yaml
[root@mgr mariadb]# cat common/create_user_and_config_file.yaml --- - name: create mysql user user: name: mysql state: present uid: "{{mysql_user_uid}}" - name: config /etc/my.cnf template: src: ../template/my.cnf dest: /etc/my.cnf owner: mysql group: mysql backup: yes [root@mgr mariadb]#
7、install_mysql_dependents.yaml
[root@mgr mariadb]# cat common/install_mysql_dependents.yaml --- - name: install libaio-devel yum: name: libaio-devel state: present - name: install numactl-devel yum: name: numactl-devel state: present - name: install perl-Data-Dumper yum: name: perl-Data-Dumper state: present - name: install lsof yum: name: lsof state: present - name: install rsync yum: name: rsync state: present - name: install socat yum: name: socat state: present - name: install perl-DBD-MySQL yum: name: perl-DBD-MySQL state: present - name: perl-Time-HiRes yum: name: perl-Time-HiRes state: present [root@mgr mariadb]#
8、install_mysql.yaml
[root@mgr mariadb]# cat common/install_mysql.yaml --- #由本地传输mysql安装包到目标主机、并把安装包解压到/usr/local/目录 #等价bash #scp mysql-xxxx.tar.gz 192.168.xx.xx:/tmp/ #tar -xvf /tmp/mysq-xxxx.tar.gz -C /usr/local/ - name: transfer mysql install package to remote host and unarchive to /usr/local/ unarchive: src: "{{ mariadb_packages_dir }}/{{ mariadb_package_name }}" dest: /usr/local/ owner: mysql group: mysql #设置权限 #等价bash #chown -R mysql:mysql /usr/local/mysql-xxxx - name: change owner to mysql user when: mariadb_package_name.find('tar.gz') != -1 file: path: /usr/local/{{ mariadb_package_name | regex_replace('.tar.gz','') }} owner: mysql group: mysql recurse: yes #chown -R mysql:mysql /usr/local/mysql-xxxx - name: change owner to mysql user when: mariadb_package_name.find('tar.xz') != -1 file: path: /usr/local/{{ mariadb_package_name | regex_replace('.tar.xz','') }} owner: mysql group: mysql recurse: yes #创建连接文件 #等价bash #ln -s /usr/local/mysql-xxxx /usr/local/mysql - name: make link /usr/local/mysql-xx.yy.zz to /usr/local/mysql when: mariadb_package_name.find('tar.gz') != -1 file: src: /usr/local/{{ mariadb_package_name | regex_replace('.tar.gz','') }} dest: /usr/local/mysql state: link owner: mysql group: mysql - name: make link /usr/local/mysql-xx.yy.zz to /usr/local/mysql when: mariadb_package_name.find('tar.xz') != -1 file: src: /usr/local/{{ mariadb_package_name | regex_replace('.tar.xz','') }} dest: /usr/local/mysql state: link owner: mysql group: mysql #导出mysql的库文件 - name: export mysql share object (*.os) template: src: ../template/mysql.conf dest: /etc/ld.so.conf.d/mysql.conf #加载共享库 - name: load share object shell: ldconfig #导出PATH环境变量 - name: export path env variable lineinfile: path: /etc/profile line: export PATH=/usr/local/mysql/bin/:$PATH insertafter: EOF - name: export path env to /root/.bashrc lineinfile: path: /root/.bashrc line: export PATH=/usr/local/mysql/bin/:$PATH insertafter: EOF - name: remove /usr/include/mysql file: dest: /usr/include/mysql state: absent #导出头文件 - name: export include file to /usr/include/mysql file: src: /usr/local/mysql/include dest: /usr/include/mysql state: link - name: create libmysqlclient_r.so file for php-5.6 when: with_php == 1 file: src: "{{mysql_base_dir + 'lib/libmysqlclient.so'}}" dest: "{{mysql_base_dir + 'lib/libmysqlclient_r.so'}}" state: link owner: mysql group: mysql [root@mgr mariadb]#
9、initialize_mysql_datadir.yaml
[root@mgr mariadb]# cat common/initialize_mysql_datadir.yaml --- - name: create datadir file: path: "{{mysql_data_dir_base}}/{{mysql_port}}" state: directory owner: mysql group: mysql - name: initialize-insecure shell: /usr/local/mysql/scripts/mysql_install_db --user={{mysql_user}} --datadir={{mysql_data_dir_base}}/{{mysql_port}} --basedir={{mysql_base_dir}} [root@mgr mariadb]#
10、config_mysql_service_and_start_mysql.yaml
[root@mgr mariadb]# cat common/config_mysql_service_and_start_mysql.yaml - name: create systemd config file when: ansible_distribution_major_version == "7" template: src: ../template/mysql.service dest: /usr/lib/systemd/system/mysql.service - name: start mysql(sytemctl) when: ansible_distribution_major_version == "7" systemd: name: mysql state: started daemon_reload: yes - name: config mysql.service start up on boot when: ansible_distribution_major_version == "7" systemd: name: mysql enabled: yes daemon_reload: yes - name: config sysv start script when: ansible_distribution_major_version == "6" copy: remote_src: yes src: "{{mysql_base_dir + 'support-files/mysql.server'}}" dest: /etc/init.d/mysqld mode: 0755 - name: start mysql(service) when: ansible_distribution_major_version == "6" service: name: mysqld state: started - name: config mysql.service start up on boot when: ansible_distribution_major_version == "6" shell: chkconfig mysqld on[root@mgr mariadb]# [root@mgr mariadb]#
11、make_mysql_security.yaml
[root@mgr mariadb]# cat common/make_mysql_security.yaml - name: transfer sql statement to remonte template: src: ../template/secure.sql dest: /tmp/make_mysql_secure.sql - name: make mysql secure shell: mysql -hlocalhost -uroot -S /tmp/mysql.sock < /tmp/make_mysql_secure.sql - name: remove temp file /tmp/make_mysql_secure.sql file: dest: /tmp/make_mysql_secure.sql state: absent [root@mgr mariadb]#
12、config_mxc.yaml
[root@mgr mariadb]# cat common/config_mxc.yaml - name: transfer config mxc to remonte template: src: ../template/confmxc.cnf dest: /tmp/confmxc.cnf - name: transfer shell startmxc to remonte template: src: ../template/startmxc.sh dest: /tmp/startmxc.sh mode: '0777' - name: config mariadb galera cluster shell: /tmp/startmxc.sh - name: remove temp file /tmp/startmxc.sh file: dest: /tmp/startmxc.sh state: absent [root@mgr mariadb]#
13、my.cnf
[root@mgr mariadb]# cat template/my.cnf [mysql] auto-rehash socket =/tmp/mysql.sock # /tmp/mysql.sock [mysqld] ####: for global user =mysql # mysql basedir ={{ mysql_base_dir }} # /usr/local/mysql/ datadir ={{ mysql_data_dir_base }}{{mysql_port}} # /usr/local/mysql/data server_id ={{ 1024 |random(1) }} # 0 port ={{ mysql_port }} # 3306 character_set_server =utf8 # latin1 log_bin_trust_function_creators =on # 0 max_prepared_stmt_count =1048576 #log_timestamps =system # utc socket =/tmp/mysql.sock # /tmp/mysql.sock read_only =0 # off skip_name_resolve =1 # 0 auto_increment_increment =1 # 1 auto_increment_offset =1 # 1 lower_case_table_names =1 # 0 secure_file_priv = # null open_files_limit =65536 # 1024 max_connections ={{mysql_max_connections | default(1000)}} thread_cache_size ={{ [ansible_processor_count * 8,256] | max}} # 9 table_open_cache =4096 # 2000 table_definition_cache =2000 # 1400 table_open_cache_instances =32 # 16 ####: for binlog binlog_format ={{mysql_binlog_format}} # row log_bin =mysql-bin # off #binlog_rows_query_log_events =on # off log_slave_updates =on # off expire_logs_days =7 # 0 {# set binlog cache size #} {% if mysql_binlog_format == 'mixed' %} binlog_cache_size =32768 # 32768(32k) {% else %} binlog_cache_size =65536 # 65536(64k) {% endif %} {# set binlog cache size #} binlog_checksum =none # CRC32 sync_binlog =1 # 1 #slave-preserve-commit-order =ON # ####: for error-log log_error =err.log # /usr/local/mysql/data/localhost.localdomain.err {# set general log #} general_log =off # off general_log_file =general.log # hostname.log {# set general log #} ####: for slow query log slow_query_log =on # off slow_query_log_file =slow.log # hostname.log log_queries_not_using_indexes =on # off long_query_time =10.000000 # 10.000000 ####: for gtid #gtid_executed_compression_period =1000 # 1000 #gtid_mode =on # off #enforce_gtid_consistency =on # off ####: for replication skip_slave_start =0 # # 0 rpl_semi_sync_master_enabled =1 # 0 rpl_semi_sync_slave_enabled =1 # 0 rpl_semi_sync_master_timeout =1000 # 1000(1 second) plugin_load_add =semisync_master.so # plugin_load_add =semisync_slave.so # #binlog_group_commit_sync_delay =500 # 0 500(0.05% seconde) #binlog_group_commit_sync_no_delay_count = 13 # 0 ####: 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_log_group_home_dir =./ # ./ innodb_log_files_in_group ={{ mysql_innodb_log_files_in_group }} # 2 innodb_log_file_size ={{ mysql_innodb_log_file_size }} # 50331648(48M) innodb_file_per_table =on # on innodb_online_alter_log_max_size =128M # 134217728(128M) innodb_open_files ={{mysql_innodb_open_files}} # 2000 innodb_page_size =16k # 16384(16k) innodb_thread_concurrency =0 # 0 innodb_read_io_threads =4 # 4 innodb_write_io_threads =4 # 4 innodb_purge_threads =4 # 4(garbage collection) innodb_page_cleaners =4 # 4(flush lru list) 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 =200 # 200 innodb_io_capacity_max =2000 # 2000 #--------Persistent Optimizer Statistics innodb_stats_auto_recalc =on # on innodb_stats_persistent =on # on innodb_stats_persistent_sample_pages =20 # 20 {# -- set innodb_buffer_pool_instances -- #} {% if ((ansible_memtotal_mb * 0.6 // 1024) | int ) < 64 %} innodb_buffer_pool_instances ={{ [ ((ansible_memtotal_mb * 0.6 // 1024) | int ) , 1 ] | max }} {% else %} innodb_buffer_pool_instances =64 {% endif %} {# -- set innodb_buffer_pool_instances -- #} innodb_adaptive_hash_index =on # on innodb_change_buffering =all # all innodb_change_buffer_max_size =25 # 25 innodb_flush_neighbors =1 # 1 #innodb_flush_method = # innodb_doublewrite =on # on innodb_log_buffer_size ={{mysql_innodb_log_buffer_size}} # 16777216(16M) innodb_flush_log_at_timeout =1 # 1 innodb_flush_log_at_trx_commit =1 # 1 innodb_buffer_pool_size ={{ (ansible_memtotal_mb * 0.6 // 128 ) | int * 128 }}M # 134217728(128M) autocommit =1 # 1 #--------innodb scan resistant innodb_old_blocks_pct =37 # 37 innodb_old_blocks_time =1000 # 1000 #--------innodb read ahead innodb_read_ahead_threshold =56 # 56 (0..64) innodb_random_read_ahead =OFF # OFF #--------innodb buffer pool state innodb_buffer_pool_dump_pct =25 # 25 innodb_buffer_pool_dump_at_shutdown =ON # ON innodb_buffer_pool_load_at_startup =ON # ON [root@mgr mariadb]#
14、mysql.conf
[root@mgr mariadb]# cat template/mysql.conf {{mysql_base_dir + 'lib/'}}[root@mgr mariadb]# [root@mgr mariadb]#
15、secure.sql
[root@mgr mariadb]# cat template/secure.sql set sql_log_bin=0; update mysql.user set password=password('{{ mysql_root_password }}') where user='root'; delete from mysql.user where user=''; {% if with_mariadb_galera_cluster == 1 %} grant all on *.* to {{mysql_wsrep_sst_user}} identified by '{{mysql_wsrep_sst_password}}'; {% endif %} flush privileges; set sql_log_bin=1; [root@mgr mariadb]#
16、mysql.service
[root@mgr mariadb]# cat template/mysql.service [Unit] Description=MySQL Server Documentation=man:mysqld(8) Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html After=network.target After=syslog.target [Install] WantedBy=multi-user.target [Service] User=mysql Group=mysql ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf LimitNOFILE = 65536 Environment=MYSQLD_PARENT_PID=1 #Restart=on-failure #RestartPreventExitStatus=1 #PrivateTmp=false [root@mgr mariadb]#
17、confmxc.cnf
[root@mgr mariadb]# cat template/confmxc.cnf {% if with_mariadb_galera_cluster == 1 %} wsrep_on=on wsrep_provider=/usr/local/mysql/lib/galera/libgalera_smm.so wsrep_cluster_name=g_mariadb #wsrep_cluster_address="gcomm://192.168.56.20,192.168.56.19,192.168.56.18" wsrep_slave_threads=5 wsrep_sst_method=mariabackup wsrep_sst_auth={{mysql_wsrep_sst_user}}:{{mysql_wsrep_sst_password}} {% set gs = ':' + (mxc_port | string)+',' %} wsrep_cluster_address ="gcomm://{{ mxc_hosts | join(gs) + ':' + (mxc_port | string) }}" {% endif %} [root@mgr mariadb]#
18、startmxc.sh
[root@mgr mariadb]# cat template/startmxc.sh #!/bin/bash {% if ansible_distribution_major_version == "7" %} systemctl stop mysql {% else %} /etc/init.d/mysqld stop {% endif %} cat /tmp/confmxc.cnf >>/etc/my.cnf sleep 10 {% if mxc_hosts[0] in ansible_all_ipv4_addresses %} mysqld_safe --wsrep_new_cluster & sleep 10 {% else %} sleep 90 {% if ansible_distribution_major_version == "7" %} systemctl start mysql {% else %} /etc/init.d/mysqld start {% endif %} {% endif %} [root@mgr mariadb]#
标签:Galera,name,yaml,Cluster,ansible,innodb,mysql,mariadb,root 来源: https://blog.51cto.com/860143/2437614