MariaDB 单机及集群部署

一、Linux单机部署

  1. 添加MariaDB的yum文件MariaDB.repo;

   2. 添加MariaDB.repo仓库配置;

[mariadb]
name=MariaDB
baseurl=https://mirrors.aliyun.com/mariadb/yum/10.4/centos7-amd64/
gpgkey=https://mirrors.aliyun.com/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1

  3. 安装MariaDB:yum install -y mariadb-server,若卸载执行yum autoremove mariadb;

   4. 启动MariaDB服务:systemctl start mariadb,并设为开机自启;

复制代码
# 设置开机启动
systemctl enable mariadb
# 启动服务
systemctl start mariadb 
# 重新启动
systemctl restart mariadb
# 停止
systemctl stop mariadb
复制代码

 

   5. 登录数据库:mysql -u root -p,root账号密码为空,直接回车即可;

   6. 初始化MariaDB配置:mysql_secure_installation;

   7. 重启MariaDB:systemctl restart mariadb;

   8. 授予外网登陆权限:grant all privileges on *.* to root@'%' identified by 'root'。

设置密码:ALTER USER root@localhost IDENTIFIED VIA mysql_native_password USING PASSWORD("123456")

 

二、Linux Galera集群介绍及部署

  简介:Galera Cluster是免费开源的Mariadb数据库高可用方案,新版本Mariadb自带Galera,其本身具有multi-master特性,支持多点写入,Galera Cluster的三个及以上节点是对等关系,每个节点均支持写入,集群内部会保证写入数据的一致性与完整性,Galera集群是基于wsrep协议工作的。

  1. Galera Cluster特性

    优点:

      A. 同步复制(几乎),没有复制延迟;

      B. 双活多主拓扑,任意集群节点可以同时读写数据库,无需读写分离;

      C. 自动成员控制,故障节点从集群中删除,自动节点加入,无需手动拷贝数据;

      D. 真正的并行复制,在行级别体现;

      E. 读取可扩展性强;

    缺点:

      A. 节点上数据重复,新加入节点需要复制完整数据导致开销大;

      B. 事务提交需要跨节点通信,因此分布式事务操作时写入会比主从复制慢;

      C. 对于两个节点集群,如果网络出现波动不稳定,则可能集群会发生脑裂,导致服务不可用,因此建议最少3个节点(需奇数);

  2. Galera对比MySQL的局限性

    A. 目前复制仅支持InnoDB存储引擎;

    B. 所有表都应该都一个主键,因为DELETE操作需要;

    C. 不支持XA事务及部分显示锁;

  3. 搭建集群环境

    A. 环境准备:OS版本 CentOS7.4,三台虚拟机;

    B. 防火墙设置:关闭防火墙 systemctl stop firewalld,或者防火墙开发以下端口;

      4567是Galera做数据复制的通讯和数据传输端口,需要在防火墙放开TCP和UDP

      4568是Galera做增量数据传输使用的端口(Incremental State Transfer, IST),需要防火墙放开TCP

      4444是Galera做快照状态传输使用的端口(State Snapshot Transfer, SST),需要防火墙放开TCP;

    C. 关闭selinux:vi /etc/selinux/config,设置SELINUX=disabled;

    D. 修改文件描述符

    E. 配置hosts文件:vi /etc/hosts

      192.168.10.101 rhxy-db1

      192.168.10.102 rhxy-db2

      192.168.10.103 rhxy-db3

    F. 下载安装mariadb:yum 安装时文件默认放在var/lib/mysql中,若要指定datadir目录需要将文件拷贝过去

      yum remove mariadb 

      yum install -y MariaDB-server rsync

    G. 修改配置文件:vi /etc/my.cnf.d/server.cnf

#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see
#
# See the examples of server my.cnf files in /usr/share/mysql/
#

# this is read by the standalone daemon and embedded servers
[server]

# this is only for the mysqld standalone daemon
[mysqld]
skip-name-resolve
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET collation_connection = utf8mb4_unicode_ci'
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake=true
skip-external-locking
#skip-grant-tables
#**#开启性能监控
performance_schema=ON

#**#暂存的连接数量
back_log=128
max_connections=1256

interactive_timeout = 120
wait_timeout = 120
# Connection and Thread variables

port                           = 3306                                # default 3306
#socket                         = /data/mysql/data/mysql.sock                             # Use mysqld.sock on Ubuntu, conflicts with AppArmor otherwise
# basedir                        = %BASEDIR%
datadir                        =/data/mysql/data
# tmpdir                         = '%INSTANCEDIR%/tmp'
# innodb_tmpdir                  = '%INSTANCEDIR%/tmp'                 # MySQL 5.7

# MySQL error log

log_error                      = /data/mysql/logs/master_error.log   # Adjust AppArmor configuration: /etc/apparmor.d/local/usr.sbin.mysqld
# log_timestamps                 = SYSTEM                              # MySQL 5.7, equivalent to old behaviour
log_warnings                   = 2                                   # MySQL 5.6, equivalent to log_error_verbosity = 3
# log_error_verbosity            = 3                                   # MySQL 5.7, equivalent to log_warnings = 2, MariaDB does NOT support this!
innodb_print_all_deadlocks     = 1
# wsrep_log_conflicts            = 1                                   # for Galera only!

general_log=ON
general_log_file =/data/mysql/logs/master_general.log

# Slow Query Log

slow_query_log_file            = /data/mysql/logs/master_slow.log   # Adjust AppArmor configuration: /etc/apparmor.d/local/usr.sbin.mysqld
slow_query_log                 = 0
log_queries_not_using_indexes  = 0                                   # Interesting on developer systems!
long_query_time                = 1
min_examined_row_limit         = 100


# InnoDB variables

innodb_strict_mode             = ON
# innodb_file_format_check       = 1                                   # Desupported in MySQL 8.0
# innodb_file_format             = Barracuda                           # For dynamic and compressed InnoDB tables, default in 5.7
innodb_buffer_pool_size        = 2G                                    # Go up to 80% of your available RAM
innodb_buffer_pool_instances   = 8                                     # Bigger if huge InnoDB Buffer Pool or high concurrency

innodb_file_per_table          = 1                                   # Is the recommended way nowadays
# innodb_flush_method            = O_DIRECT                            # O_DIRECT is sometimes better for direct attached storage
# innodb_write_io_threads        = 8                                   # If you have a strong I/O system or SSD
# innodb_read_io_threads         = 8                                   # If you have a strong I/O system or SSD
# innodb_io_capacity             = 1000                                # If you have a strong I/O system or SSD

innodb_flush_log_at_trx_commit = 2                                   # 1 for durability, 0 or 2 for performance
innodb_log_buffer_size         = 8M                                  # Bigger if innodb_flush_log_at_trx_commit = 0
innodb_log_file_size           = 256M                                # Bigger means more write throughput but longer recovery time

                                                                     # Since MariaDB 10.0 and MySQL 5.6
innodb_monitor_enable = all

#
# * Galera-related settings
#
[galera]
# Mandatory settings
wsrep_on=ON
wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.10.101,192.168.10.102,192.168.10.103"
wsrep_node_name=rhxy-db1
wsrep_node_address=192.168.10.101

binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
#
# Allow server to accept connections on all interfaces.
#
bind-address=0.0.0.0
#
# Optional setting
wsrep_cluster_name=MariaDB-Galera-Cluster
wsrep_slave_threads=4
innodb_flush_log_at_trx_commit=0
innodb_buffer_pool_size=2G
wsrep_sst_method=rsync
wsrep_causal_reads=OFF
# this is only for embedded server
[embedded]

[mariadb]

[mariadb-10.4]

       注意其余节点只需要改wsrep_node_name和wsrep_node_address参数值;

    H. 集群启动

      第一个节点:galera_new_cluster,systemctl enable mariadb;

      其余节点:systemctl start mariadb,systemctl enable mariadb;

    I. 常用命令

      集群状态监控:show global status like 'wsrep_%';

      查看集群节点数:show status like 'wsrep_cluster_size';

        查看集群同步状态:show status like 'wsrep_local_state_comment';

    J. 验证数据同步

  4. Gelera配置参数

    A. wsrep_on:是否启用wsrep复制,默认值为OFF,如果要加入集群,需要开启设置为ON;

    B. wsrep_provider:wsrep库的位置,

    C. wsrep_cluster_address:启动时要连接集群节点的地址;

    D. wsrep_cluster_name:集群的名称,同一集群中所有节点的值都相等;

    E. wsrep_node_name:节点的名称;

    F. wsrep_node_address:节点的网络地址,默认端口4567;

    G. wsrep_sst_method:用于进行状态快照传输的方式,默认值rsync;

    H. wsrep_slave_threads:用于并行应用Gelera写的副本线程数,默认值1;

    I. wsrep_causal_reads:是否在集群中强制执行读提交特性,默认值OFF;

      J. wsrep_start_position:节点应使用的起始位置;

      K. wsrep_recover:默认值为OFF,若设置为ON,在服务器启动时,服务会恢复Galera最近申请的写集的序号,服务将退出;

  5. 常见问题

    问题一

      现象:[ERROR] WSREP: failed to open gcomm backend connection: 110: failed to reach primary view: 110 (Conn;

      原因:发生集群脑裂

      解决方案:删除所有节点的两个缓存文件及/var/lock/subsys目录下的mysql 文件,然后重新启动

        A. 删除mysql文件:rm -rf /var/lock/subsys/mysql;

        B. 删除缓存文件:rm -rf /var/lib/mysql/galera.cache /var/lib/mysql/grastate.dat;

        C. 第一个节点执行:systemctl start mariadb --wsrep-new-cluster;

        D. 其余节点执行:systemctl start mariadb;

    问题二

      现象:执行如下命令,报错

      原因:systemd 允许创建同一服务的多个实例,而不是传递命令行参数;

      解决方案:

        A. 在第一个节点上执行:/usr/bin/mysqld_safe --wsrep-new-cluster,命名在前台执行;

        B. 在其他节点上执行:systemctl start mariadb;

        C. 待集群完全形成后,通过向第一个节点发送 SIGQUIT(在控制台上按 CTRL + \)来停止第一个节点上的 mariadb,(pkill -SIGQUIT mysqld);

        D. 再在第一个节点上执行:systemctl start mariadb; 

    问题三

      现象:虚拟机全部停电,需要重启

      解决方案:

        A. 每台mariadb机器都需要删掉grastate.dat文件;

        B. 重新启动集群 ,在其中一台执行galera_new_cluster,另外几台执行systemctl start mariadb;

    问题四:

      现象:当数据库启动失败后,清理集群文件,再使用systemctl start mariadb或galera_new_cluster,服务卡住无反应且也不报错;

      原因:数据库启动失败后,依然会有wsrep进程,此进程自己不会终止;

      解决方案:ps -ef | grep wsrep,查出进程号后kill -9 pid即可,然后再执行启动命令。

    可参考:Mariadb问题集绵

    

三、Linux Docker单机部署

  1. 问题一:

           现象:docker版mariadb mysql命令进入终端后查询语句无法输入中文;

     原因:容器内LANG不支持中文;

        解决方案:docker exec -it `docker ps | grep mariadb | awk '{ print $1 }'` env LANG=C.UTF-8 bash

 

可参考:MariaDB Gelera Cluster官方文档

    MySQL排查故障

 

posted @ 2021-06-04 13:27  如幻行云  阅读(1397)  评论(0编辑  收藏  举报